From 0f40b6dbc1f341f31c47ee9594b8654d898a9592 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 5 Sep 2023 09:29:11 +0200 Subject: [PATCH 01/52] [Lens] Prevent user to use decimals for custom Percentile rank function in Top values (#165616) ## Summary Fixes #165001 Decimals are still allowed as dimension column: Screenshot 2023-09-04 at 18 20 30 But considered invalid values when used inline in Top values as custom ranking function: Screenshot 2023-09-04 at 18 20 44 ### 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 --- .../definitions/percentile_ranks.test.tsx | 68 +++++++++++++++++++ .../definitions/percentile_ranks.tsx | 8 +-- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx index 28cc1cedcd804..981beede0330f 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx @@ -359,5 +359,73 @@ describe('percentile ranks', () => { .prop('value') ).toEqual('miaou'); }); + + it('should support decimals on dimension edit', () => { + const updateLayerSpy = jest.fn(); + const instance = mount( + + ); + + const input = instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-input"]') + .find(EuiFieldNumber); + + act(() => { + input.prop('onChange')!({ + currentTarget: { value: '10.5' }, + } as React.ChangeEvent); + }); + + instance.update(); + + expect(updateLayerSpy).toHaveBeenCalled(); + }); + + it('should not support decimals on inline edit', () => { + const updateLayerSpy = jest.fn(); + const instance = mount( + + ); + + const input = instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-input"]') + .find(EuiFieldNumber); + + act(() => { + input.prop('onChange')!({ + currentTarget: { value: '10.5' }, + } as React.ChangeEvent); + }); + + instance.update(); + + expect(updateLayerSpy).not.toHaveBeenCalled(); + + expect( + instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-form"]') + .first() + .prop('isInvalid') + ).toEqual(true); + expect( + instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-input"]') + .find(EuiFieldNumber) + .prop('value') + ).toEqual('10.5'); + }); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx index 7e071f8ddbd98..eda66e93765a5 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx @@ -189,7 +189,7 @@ export const percentileRanksOperation: OperationDefinition< }); const onChange = useCallback( (value) => { - if (!isValidNumber(value) || Number(value) === currentColumn.params.value) { + if (!isValidNumber(value, isInline) || Number(value) === currentColumn.params.value) { return; } paramEditorUpdater({ @@ -209,7 +209,7 @@ export const percentileRanksOperation: OperationDefinition< }, } as PercentileRanksIndexPatternColumn); }, - [paramEditorUpdater, currentColumn, indexPattern] + [isInline, currentColumn, paramEditorUpdater, indexPattern] ); const { inputValue, handleInputChange: handleInputChangeWithoutValidation } = useDebouncedValue< string | undefined @@ -220,7 +220,7 @@ export const percentileRanksOperation: OperationDefinition< }, { allowFalsyValue: true } ); - const inputValueIsValid = isValidNumber(inputValue); + const inputValueIsValid = isValidNumber(inputValue, isInline); const handleInputChange: EuiFieldNumberProps['onChange'] = useCallback( (e) => { @@ -250,7 +250,7 @@ export const percentileRanksOperation: OperationDefinition< compressed value={inputValue ?? ''} onChange={handleInputChange} - step="any" + step={isInline ? 1 : 'any'} aria-label={percentileRanksLabel} /> From 528884c5f32cb861f7d11260bd18236ef46d800a Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Tue, 5 Sep 2023 10:15:21 +0200 Subject: [PATCH 02/52] Enabled connector types API (#164689) Resolves: #163751 This PR adds a new API to allow the other plugins to define an **enabled connector types list** in the actions registry. The list is used during the action execution to decide if the action type is executable (enabled). This decision logic sits on the existing two other checks: 1- `isActionTypeEnabled` -> if the connector type is in the `enabledActionTypes` list in the config 2- `isLicenseValidForActionType` -> if the connector type is allowed for the active license As the only user of this feature is just security-solutions for now, we decided to allow the list to be set only once. Screenshot 2023-08-31 at 12 00 10 Screenshot 2023-08-31 at 12 13 38 Screenshot 2023-08-31 at 12 00 01 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/actions/kibana.jsonc | 3 +- x-pack/plugins/actions/server/config.ts | 17 +- x-pack/plugins/actions/server/mocks.ts | 1 + x-pack/plugins/actions/server/plugin.test.ts | 189 +++++++++++++++++++ x-pack/plugins/actions/server/plugin.ts | 41 +++- x-pack/plugins/actions/tsconfig.json | 1 + 6 files changed, 240 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/actions/kibana.jsonc b/x-pack/plugins/actions/kibana.jsonc index 9152e64ba898a..78f66742c2a03 100644 --- a/x-pack/plugins/actions/kibana.jsonc +++ b/x-pack/plugins/actions/kibana.jsonc @@ -21,7 +21,8 @@ "usageCollection", "spaces", "security", - "monitoringCollection" + "monitoringCollection", + "serverless" ], "extraPublicDirs": [ "common" diff --git a/x-pack/plugins/actions/server/config.ts b/x-pack/plugins/actions/server/config.ts index 9a620d1452f23..da45fd40cf925 100644 --- a/x-pack/plugins/actions/server/config.ts +++ b/x-pack/plugins/actions/server/config.ts @@ -64,6 +64,15 @@ const connectorTypeSchema = schema.object({ maxAttempts: schema.maybe(schema.number({ min: MIN_MAX_ATTEMPTS, max: MAX_MAX_ATTEMPTS })), }); +// We leverage enabledActionTypes list by allowing the other plugins to overwrite it by using "setEnabledConnectorTypes" in the plugin setup. +// The list can be overwritten only if it's not already been set in the config. +const enabledConnectorTypesSchema = schema.arrayOf( + schema.oneOf([schema.string(), schema.literal(EnabledActionTypes.Any)]), + { + defaultValue: [AllowedHosts.Any], + } +); + export const configSchema = schema.object({ allowedHosts: schema.arrayOf( schema.oneOf([schema.string({ hostname: true }), schema.literal(AllowedHosts.Any)]), @@ -71,12 +80,7 @@ export const configSchema = schema.object({ defaultValue: [AllowedHosts.Any], } ), - enabledActionTypes: schema.arrayOf( - schema.oneOf([schema.string(), schema.literal(EnabledActionTypes.Any)]), - { - defaultValue: [AllowedHosts.Any], - } - ), + enabledActionTypes: enabledConnectorTypesSchema, preconfiguredAlertHistoryEsIndex: schema.boolean({ defaultValue: false }), preconfigured: schema.recordOf(schema.string(), preconfiguredActionSchema, { defaultValue: {}, @@ -129,6 +133,7 @@ export const configSchema = schema.object({ }); export type ActionsConfig = TypeOf; +export type EnabledConnectorTypes = TypeOf; // It would be nicer to add the proxyBypassHosts / proxyOnlyHosts restriction on // simultaneous usage in the config validator directly, but there's no good way to express diff --git a/x-pack/plugins/actions/server/mocks.ts b/x-pack/plugins/actions/server/mocks.ts index ad26114cf7d07..70a2cfd9f8e85 100644 --- a/x-pack/plugins/actions/server/mocks.ts +++ b/x-pack/plugins/actions/server/mocks.ts @@ -31,6 +31,7 @@ const createSetupMock = () => { getCaseConnectorClass: jest.fn(), getActionsHealth: jest.fn(), getActionsConfigurationUtilities: jest.fn(), + setEnabledConnectorTypes: jest.fn(), }; return mock; }; diff --git a/x-pack/plugins/actions/server/plugin.test.ts b/x-pack/plugins/actions/server/plugin.test.ts index 66d75da5fd7cf..d3bc3be1a9deb 100644 --- a/x-pack/plugins/actions/server/plugin.test.ts +++ b/x-pack/plugins/actions/server/plugin.test.ts @@ -348,6 +348,163 @@ describe('Actions Plugin', () => { expect(pluginSetup.isPreconfiguredConnector('anotherConnectorId')).toEqual(false); }); }); + + describe('setEnabledConnectorTypes (works only on serverless)', () => { + function setup(config: ActionsConfig) { + context = coreMock.createPluginInitializerContext(config); + plugin = new ActionsPlugin(context); + coreSetup = coreMock.createSetup(); + pluginsSetup = { + taskManager: taskManagerMock.createSetup(), + encryptedSavedObjects: encryptedSavedObjectsMock.createSetup(), + licensing: licensingMock.createSetup(), + eventLog: eventLogMock.createSetup(), + usageCollection: usageCollectionPluginMock.createSetupContract(), + features: featuresPluginMock.createSetup(), + serverless: {}, + }; + } + + it('should set connector type enabled', async () => { + setup(getConfig()); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + const coreStart = coreMock.createStart(); + const pluginsStart = { + licensing: licensingMock.createStart(), + taskManager: taskManagerMock.createStart(), + encryptedSavedObjects: encryptedSavedObjectsMock.createStart(), + eventLog: eventLogMock.createStart(), + }; + const pluginStart = plugin.start(coreStart, pluginsStart); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.registerType({ + id: '.slack', + name: 'Slack', + minimumLicenseRequired: 'gold', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.setEnabledConnectorTypes(['.server-log']); + expect(pluginStart.isActionTypeEnabled('.server-log')).toBeTruthy(); + expect(pluginStart.isActionTypeEnabled('.slack')).toBeFalsy(); + }); + + it('should set all the connector types enabled when null or ["*"] passed', async () => { + setup(getConfig()); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + const coreStart = coreMock.createStart(); + const pluginsStart = { + licensing: licensingMock.createStart(), + taskManager: taskManagerMock.createStart(), + encryptedSavedObjects: encryptedSavedObjectsMock.createStart(), + eventLog: eventLogMock.createStart(), + }; + const pluginStart = plugin.start(coreStart, pluginsStart); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.registerType({ + id: '.index', + name: 'Index', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.setEnabledConnectorTypes(['*']); + expect(pluginStart.isActionTypeEnabled('.server-log')).toBeTruthy(); + expect(pluginStart.isActionTypeEnabled('.index')).toBeTruthy(); + }); + + it('should set all the connector types disabled when [] passed', async () => { + setup(getConfig()); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + const coreStart = coreMock.createStart(); + const pluginsStart = { + licensing: licensingMock.createStart(), + taskManager: taskManagerMock.createStart(), + encryptedSavedObjects: encryptedSavedObjectsMock.createStart(), + eventLog: eventLogMock.createStart(), + }; + const pluginStart = plugin.start(coreStart, pluginsStart); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.registerType({ + id: '.index', + name: 'Index', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.setEnabledConnectorTypes([]); + expect(pluginStart.isActionTypeEnabled('.server-log')).toBeFalsy(); + expect(pluginStart.isActionTypeEnabled('.index')).toBeFalsy(); + }); + + it('should throw if the enabledActionTypes is already set by the config', async () => { + setup({ ...getConfig(), enabledActionTypes: ['.email'] }); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + + expect(() => pluginSetup.setEnabledConnectorTypes(['.index'])).toThrow( + "Enabled connector types can be set only if they haven't already been set in the config" + ); + }); + }); }); describe('start()', () => { @@ -396,6 +553,38 @@ describe('Actions Plugin', () => { }; }); + it('should throw when there is an invalid connector type in enabledActionTypes', async () => { + const pluginSetup = await plugin.setup(coreSetup, { + ...pluginsSetup, + encryptedSavedObjects: { + ...pluginsSetup.encryptedSavedObjects, + canEncrypt: true, + }, + serverless: {}, + }); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + + pluginSetup.setEnabledConnectorTypes(['.server-log', 'non-existing']); + + await expect(async () => + plugin.start(coreStart, { ...pluginsStart, serverless: {} }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Action type \\"non-existing\\" is not registered."` + ); + }); + describe('getActionsClientWithRequest()', () => { it('should not throw error when ESO plugin has encryption key', async () => { await plugin.setup(coreSetup, { diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index b8b88b05049ca..415a9e36a1c01 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -40,7 +40,8 @@ import { } from '@kbn/event-log-plugin/server'; import { MonitoringCollectionSetup } from '@kbn/monitoring-collection-plugin/server'; -import { ActionsConfig, getValidatedConfig } from './config'; +import { ServerlessPluginSetup } from '@kbn/serverless/server'; +import { ActionsConfig, AllowedHosts, EnabledConnectorTypes, getValidatedConfig } from './config'; import { resolveCustomHosts } from './lib/custom_host_settings'; import { ActionsClient } from './actions_client/actions_client'; import { ActionTypeRegistry } from './action_type_registry'; @@ -100,10 +101,8 @@ import { createSubActionConnectorFramework } from './sub_action_framework'; import { IServiceAbstract, SubActionConnectorType } from './sub_action_framework/types'; import { SubActionConnector } from './sub_action_framework/sub_action_connector'; import { CaseConnector } from './sub_action_framework/case'; -import { - type IUnsecuredActionsClient, - UnsecuredActionsClient, -} from './unsecured_actions_client/unsecured_actions_client'; +import type { IUnsecuredActionsClient } from './unsecured_actions_client/unsecured_actions_client'; +import { UnsecuredActionsClient } from './unsecured_actions_client/unsecured_actions_client'; import { createBulkUnsecuredExecutionEnqueuerFunction } from './create_unsecured_execute_function'; import { createSystemConnectors } from './create_system_actions'; @@ -130,6 +129,7 @@ export interface PluginSetupContract { getCaseConnectorClass: () => IServiceAbstract; getActionsHealth: () => { hasPermanentEncryptionKey: boolean }; getActionsConfigurationUtilities: () => ActionsConfigurationUtilities; + setEnabledConnectorTypes: (connectorTypes: EnabledConnectorTypes) => void; } export interface PluginStartContract { @@ -169,6 +169,7 @@ export interface ActionsPluginsSetup { features: FeaturesPluginSetup; spaces?: SpacesPluginSetup; monitoringCollection?: MonitoringCollectionSetup; + serverless?: ServerlessPluginSetup; } export interface ActionsPluginsStart { @@ -178,6 +179,7 @@ export interface ActionsPluginsStart { eventLog: IEventLogClientService; spaces?: SpacesPluginStart; security?: SecurityPluginStart; + serverless?: ServerlessPluginSetup; } const includedHiddenTypes = [ @@ -375,6 +377,20 @@ export class ActionsPlugin implements Plugin actionsConfigUtils, + setEnabledConnectorTypes: (connectorTypes) => { + if ( + !!plugins.serverless && + this.actionsConfig.enabledActionTypes.length === 1 && + this.actionsConfig.enabledActionTypes[0] === AllowedHosts.Any + ) { + this.actionsConfig.enabledActionTypes.pop(); + this.actionsConfig.enabledActionTypes.push(...connectorTypes); + } else { + throw new Error( + "Enabled connector types can be set only if they haven't already been set in the config" + ); + } + }, }; } @@ -542,6 +558,8 @@ export class ActionsPlugin implements Plugin { return this.actionTypeRegistry!.isActionTypeEnabled(id, options); @@ -695,6 +713,19 @@ export class ActionsPlugin implements Plugin { + if ( + !!plugins.serverless && + this.actionsConfig.enabledActionTypes.length > 0 && + this.actionsConfig.enabledActionTypes[0] !== AllowedHosts.Any + ) { + this.actionsConfig.enabledActionTypes.forEach((connectorType) => { + // Throws error if action type doesn't exist + this.actionTypeRegistry?.get(connectorType); + }); + } + }; + public stop() { if (this.licenseState) { this.licenseState.clean(); diff --git a/x-pack/plugins/actions/tsconfig.json b/x-pack/plugins/actions/tsconfig.json index 0f4d2faf03e1a..3beeddef429b2 100644 --- a/x-pack/plugins/actions/tsconfig.json +++ b/x-pack/plugins/actions/tsconfig.json @@ -43,6 +43,7 @@ "@kbn/core-saved-objects-api-server-mocks", "@kbn/core-elasticsearch-server-mocks", "@kbn/core-logging-server-mocks", + "@kbn/serverless" ], "exclude": [ "target/**/*", From 531acda76cadb6ab3afd8c6a128fdd5656786660 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 5 Sep 2023 11:17:23 +0200 Subject: [PATCH 03/52] GitHub create-deploy-tag workflow: Allow kibana-operations team to trigger (#165630) --- .github/workflows/create-deploy-tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-deploy-tag.yml b/.github/workflows/create-deploy-tag.yml index ec06f8c11b49d..d91df87fd547a 100644 --- a/.github/workflows/create-deploy-tag.yml +++ b/.github/workflows/create-deploy-tag.yml @@ -19,7 +19,7 @@ concurrency: jobs: create-deploy-tag: # Temporary, we need a way to limit this to a GitHub team instead of specific users - if: contains('["watson","clintandrewhall","kobelb","lukeelmers","thomasneirynck"]', github.triggering_actor) + if: contains('["watson","clintandrewhall","kobelb","lukeelmers","thomasneirynck","jbudz","mistic","delanni","Ikuni17"]', github.triggering_actor) runs-on: ubuntu-latest permissions: contents: write From 835e66a25dcf3894167236c16a821d1317a2d039 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 5 Sep 2023 11:17:45 +0200 Subject: [PATCH 04/52] [Graph] Fix settings tabs when in dark mode (#165614) ## Summary Fixes #165354 Dark mode set at space level/Advanced settings Screenshot 2023-09-04 at 17 56 38 Light mode set at space level Screenshot 2023-09-04 at 17 57 06 Dark mode set as profile setting: Screenshot 2023-09-04 at 17 55 40 Light mode set as profile setting: Screenshot 2023-09-04 at 17 56 05 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../workspace_layout/workspace_top_nav_menu.tsx | 12 +++++------- x-pack/plugins/graph/tsconfig.json | 1 + 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx index 99ec4a3d5ce5f..f4dc33f73176c 100644 --- a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx +++ b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx @@ -12,7 +12,7 @@ import { AppMountParameters, Capabilities, CoreStart } from '@kbn/core/public'; import { useHistory, useLocation } from 'react-router-dom'; import { Start as InspectorPublicPluginStart, RequestAdapter } from '@kbn/inspector-plugin/public'; import { NavigationPublicPluginStart as NavigationStart } from '@kbn/navigation-plugin/public'; -import { toMountPoint, wrapWithTheme } from '@kbn/kibana-react-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { datasourceSelector, hasFieldsSelector } from '../../state_management'; import { GraphSavePolicy, GraphWorkspaceSavedObject, Workspace } from '../../types'; import { AsObservable, Settings, SettingsWorkspaceProps } from '../settings'; @@ -162,12 +162,10 @@ export const WorkspaceTopNavMenu = (props: WorkspaceTopNavMenuProps) => { props.coreStart.overlays.openFlyout( toMountPoint( - wrapWithTheme( - - - , - props.coreStart.theme.theme$ - ) + + + , + { theme: props.coreStart.theme, i18n: props.coreStart.i18n } ), { size: 'm', diff --git a/x-pack/plugins/graph/tsconfig.json b/x-pack/plugins/graph/tsconfig.json index f4dc6a3faaf73..1e8059c99c5d7 100644 --- a/x-pack/plugins/graph/tsconfig.json +++ b/x-pack/plugins/graph/tsconfig.json @@ -46,6 +46,7 @@ "@kbn/content-management-table-list-view-table", "@kbn/content-management-table-list-view", "@kbn/core-ui-settings-browser", + "@kbn/react-kibana-mount", ], "exclude": [ "target/**/*", From a53e3055c0f01ab8290feb059c4a468e81e0195a Mon Sep 17 00:00:00 2001 From: Ramon Butter Date: Tue, 5 Sep 2023 11:19:17 +0200 Subject: [PATCH 05/52] change quality gates notifications (#165646) --- .../quality-gates/pipeline.kibana-tests.yaml | 17 +++++++++++++++++ .../pipeline.tests-production.yaml | 16 ++++++++++++---- .../quality-gates/pipeline.tests-qa.yaml | 16 ++++++++++++---- .../quality-gates/pipeline.tests-staging.yaml | 16 ++++++++++++---- 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml index 27e55dfced9d7..0acdb66f8d5f2 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml @@ -1,4 +1,17 @@ +# This pipeline serves as the entry point for your service's quality gates definitions. When +# properly configured, it will be invoked automatically as part of the automated +# promotion process once a new version was rolled out in one of the various cloud stages. +# +# The updated environment is provided via ENVIRONMENT variable. The seedling +# step will branch and execute pipeline snippets at the following location: +# pipeline.tests-qa.yaml +# pipeline.tests-staging.yaml +# pipeline.tests-production.yaml +# +# Docs: https://docs.elastic.dev/serverless/qualitygates + env: + TEAM_CHANNEL: "#kibana-mission-control" ENVIRONMENT: ${ENVIRONMENT?} steps: @@ -8,3 +21,7 @@ steps: command: "make -C /agent run-environment-tests" agents: image: "docker.elastic.co/ci-agent-images/quality-gate-seedling:0.0.2" + +notify: + - slack: "${TEAM_CHANNEL?}" + if: build.branch == "main" && build.state == "failed" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index f283e2e4f6c9a..1c30a7f734df4 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -1,6 +1,6 @@ -env: - TEAM_CHANNEL: "#kibana-serverless-release" - ENVIRONMENT: "production" +# These pipeline steps constitute the quality gate for your service within the production +# environment. Incorporate any necessary additional logic to validate the service's integrity. +# 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}" @@ -13,9 +13,17 @@ steps: agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":rocket: Run cp e2e tests" + trigger: "ess-k8s-production-e2e-tests" + build: + message: "${BUILDKITE_MESSAGE}" + env: + REGION_ID: aws-us-east-1 + NAME_PREFIX: ci_test_${SERVICE}-promotion_ + - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" agents: - image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.1" + 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 7bb446f5713f0..e03e986f65833 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -1,6 +1,6 @@ -env: - TEAM_CHANNEL: "#kibana-serverless-release" - ENVIRONMENT: "qa" +# These pipeline steps constitute the quality gate for your service within the QA environment. +# Incorporate any necessary additional logic to validate the service's integrity. A failure in +# this pipeline build will prevent further progression to the subsequent stage. steps: - label: ":pipeline::kibana::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" @@ -23,9 +23,17 @@ steps: agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":rocket: Run cp e2e tests" + trigger: "ess-k8s-qa-e2e-tests-daily" + build: + message: "${BUILDKITE_MESSAGE}" + env: + REGION_ID: aws-eu-west-1 + NAME_PREFIX: ci_test_kibana-promotion_ + - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" agents: - image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.1" + 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 2f3e497fc6d31..83bfd0d27e34c 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml @@ -1,6 +1,6 @@ -env: - TEAM_CHANNEL: "#kibana-serverless-release" - ENVIRONMENT: "staging" +# These pipeline steps constitute the quality gate for your service within the staging environment. +# Incorporate any necessary additional logic to validate the service's integrity. 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}" @@ -13,9 +13,17 @@ steps: agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":rocket: Run cp e2e tests" + trigger: "ess-k8s-staging-e2e-tests" + build: + message: "${BUILDKITE_MESSAGE}" + env: + REGION_ID: aws-us-east-1 + NAME_PREFIX: ci_test_kibana-promotion_ + - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" agents: - image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.1" + image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" From 22ae6bc7dbee3764deb8879b0eadaac7c948c270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Tue, 5 Sep 2023 12:00:45 +0200 Subject: [PATCH 06/52] [APM] Move index settings persistence to data access plugn (#165560) Moves persistence of APM Index Settings to the data access plugin --- .../routes/settings/apm_indices/route.ts | 2 +- .../settings/apm_indices/save_apm_indices.ts | 39 ------------------- .../server/saved_objects/apm_indices.ts | 23 +++++++++++ .../saved_objects}/save_apm_indices.test.ts | 2 +- 4 files changed, 25 insertions(+), 41 deletions(-) delete mode 100644 x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts rename x-pack/plugins/{apm/server/routes/settings/apm_indices => apm_data_access/server/saved_objects}/save_apm_indices.test.ts (95%) diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts index 434ae4785ce5a..3698a13a1f2a6 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts @@ -8,12 +8,12 @@ import * as t from 'io-ts'; import { SavedObject } from '@kbn/core/server'; import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; +import { saveApmIndices } from '@kbn/apm-data-access-plugin/server/saved_objects/apm_indices'; import { createApmServerRoute } from '../../apm_routes/create_apm_server_route'; import { getApmIndexSettings, ApmIndexSettingsResponse, } from './get_apm_indices'; -import { saveApmIndices } from './save_apm_indices'; // get list of apm indices and values const apmIndexSettingsRoute = createApmServerRoute({ diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts deleted file mode 100644 index e9d2bd5fbea92..0000000000000 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts +++ /dev/null @@ -1,39 +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 { SavedObjectsClientContract } from '@kbn/core/server'; -import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; -import { - APMIndicesSavedObjectBody, - APM_INDEX_SETTINGS_SAVED_OBJECT_ID, - APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, -} from '@kbn/apm-data-access-plugin/server/saved_objects/apm_indices'; -import { withApmSpan } from '../../../utils/with_apm_span'; - -export function saveApmIndices( - savedObjectsClient: SavedObjectsClientContract, - apmIndices: Partial -) { - return withApmSpan('save_apm_indices', () => - savedObjectsClient.create( - APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, - { apmIndices: removeEmpty(apmIndices), isSpaceAware: true }, - { id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, overwrite: true } - ) - ); -} - -// remove empty/undefined values -function removeEmpty(apmIndices: Partial) { - return Object.entries(apmIndices) - .map(([key, value]) => [key, value?.trim()]) - .filter(([_, value]) => !!value) - .reduce((obj, [key, value]) => { - obj[key] = value; - return obj; - }, {} as Record); -} diff --git a/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts b/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts index 7ab90ef0a605c..96b9c31d6b91c 100644 --- a/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts +++ b/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts @@ -11,6 +11,7 @@ import { schema } from '@kbn/config-schema'; import { SavedObjectsErrorHelpers } from '@kbn/core/server'; import { SavedObjectsClientContract } from '@kbn/core/server'; import { updateApmOssIndexPaths } from './migrations/update_apm_oss_index_paths'; +import { APMIndices } from '..'; export const APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE = 'apm-indices'; export const APM_INDEX_SETTINGS_SAVED_OBJECT_ID = 'apm-indices'; @@ -73,6 +74,28 @@ export const apmIndicesSavedObjectDefinition: SavedObjectsType = { }, }; +export function saveApmIndices( + savedObjectsClient: SavedObjectsClientContract, + apmIndices: Partial +) { + return savedObjectsClient.create( + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + { apmIndices: removeEmpty(apmIndices), isSpaceAware: true }, + { id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, overwrite: true } + ); +} + +// remove empty/undefined values +function removeEmpty(apmIndices: Partial) { + return Object.entries(apmIndices) + .map(([key, value]) => [key, value?.trim()]) + .filter(([_, value]) => !!value) + .reduce((obj, [key, value]) => { + obj[key] = value; + return obj; + }, {} as Record); +} + export async function getApmIndicesSavedObject(savedObjectsClient: SavedObjectsClientContract) { try { const apmIndicesSavedObject = await savedObjectsClient.get>( diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts b/x-pack/plugins/apm_data_access/server/saved_objects/save_apm_indices.test.ts similarity index 95% rename from x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts rename to x-pack/plugins/apm_data_access/server/saved_objects/save_apm_indices.test.ts index e72282ba6275a..22278e6c16b56 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts +++ b/x-pack/plugins/apm_data_access/server/saved_objects/save_apm_indices.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { saveApmIndices } from './save_apm_indices'; +import { saveApmIndices } from './apm_indices'; import { SavedObjectsClientContract } from '@kbn/core/server'; describe('saveApmIndices', () => { From 4ce9d5d6cce65e878d84c63f71ae1852620f3062 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Tue, 5 Sep 2023 12:16:25 +0200 Subject: [PATCH 07/52] [Observability AI Assistant] Body should not be required for Kibana (#165653) --- .../observability_ai_assistant/public/functions/kibana.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts b/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts index 5ad877b2c2bff..a47acdb02d433 100644 --- a/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts +++ b/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts @@ -50,7 +50,7 @@ export function registerKibanaFunction({ description: 'The body of the request', }, }, - required: ['method', 'pathname', 'body'] as const, + required: ['method', 'pathname'] as const, }, }, ({ arguments: { method, pathname, body, query } }, signal) => { From af347a81ff17e618c9c1ef11e87c995cb66ca859 Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Tue, 5 Sep 2023 12:43:54 +0200 Subject: [PATCH 08/52] [Logs onboarding] hardcoded elastic agent version to 8.9.1 (#165659) Relates to https://github.com/elastic/kibana/issues/165657. --- .../observability_onboarding/server/routes/logs/route.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts b/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts index c28c393382930..085f7cece0d8a 100644 --- a/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts +++ b/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts @@ -40,7 +40,7 @@ const installShipperSetupRoute = createObservabilityOnboardingServerRoute({ scriptDownloadUrl: string; elasticAgentVersion: string; }> { - const { core, plugins, kibanaVersion } = resources; + const { core, plugins } = resources; const coreStart = await core.start(); const kibanaUrl = @@ -53,7 +53,7 @@ const installShipperSetupRoute = createObservabilityOnboardingServerRoute({ return { apiEndpoint, scriptDownloadUrl, - elasticAgentVersion: kibanaVersion, + elasticAgentVersion: '8.9.1', }; }, }); From ba5da8dbf831cb4eee00ce6096063ecf30f4e5d4 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 13:19:43 +0100 Subject: [PATCH 09/52] @brokenInServerless tag for cypress suite --- .../cypress/e2e/investigations/timelines/toggle_column.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts index 5cdb4462839c2..dae3b4c52ea66 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts @@ -19,7 +19,7 @@ import { import { HOSTS_URL } from '../../../urls/navigation'; -describe('toggle column in timeline', { tags: ['@ess', '@serverless'] }, () => { +describe('toggle column in timeline', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); cy.intercept('POST', '/api/timeline/_export?file_name=timelines_export.ndjson').as('export'); From b39fc458aa864d15585e290477eab3565e8aa9d1 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 13:30:13 +0100 Subject: [PATCH 10/52] skip flaky suite (#165553) --- .../functional/test_suites/common/security/api_keys.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts b/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts index 99f01f2d19a19..32c12c9b713b4 100644 --- a/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts +++ b/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts @@ -29,7 +29,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const es = getService('es'); const log = getService('log'); - describe('API keys', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165553 + describe.skip('API keys', () => { after(async () => { await clearAllApiKeys(es, log); }); From a9c3ca501c6be7012b29b2d0ce298fde74cf7257 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 13:31:39 +0100 Subject: [PATCH 11/52] fix(NA): eslint check --- .../timelines/toggle_column.cy.ts | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts index dae3b4c52ea66..c2ca620a40554 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts @@ -19,30 +19,34 @@ import { import { HOSTS_URL } from '../../../urls/navigation'; -describe('toggle column in timeline', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - before(() => { - cleanKibana(); - cy.intercept('POST', '/api/timeline/_export?file_name=timelines_export.ndjson').as('export'); - }); - - beforeEach(() => { - login(); - visit(HOSTS_URL); - openTimelineUsingToggle(); - populateTimeline(); - }); - - it('removes the @timestamp field from the timeline when the user un-checks the toggle', () => { - expandFirstTimelineEventDetails(); - clickTimestampToggleField(); - - cy.get(TIMESTAMP_HEADER_FIELD).should('not.exist'); - }); - - it('adds the _id field to the timeline when the user checks the field', () => { - expandFirstTimelineEventDetails(); - clickIdToggleField(); - - cy.get(ID_HEADER_FIELD).should('exist'); - }); -}); +describe( + 'toggle column in timeline', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cleanKibana(); + cy.intercept('POST', '/api/timeline/_export?file_name=timelines_export.ndjson').as('export'); + }); + + beforeEach(() => { + login(); + visit(HOSTS_URL); + openTimelineUsingToggle(); + populateTimeline(); + }); + + it('removes the @timestamp field from the timeline when the user un-checks the toggle', () => { + expandFirstTimelineEventDetails(); + clickTimestampToggleField(); + + cy.get(TIMESTAMP_HEADER_FIELD).should('not.exist'); + }); + + it('adds the _id field to the timeline when the user checks the field', () => { + expandFirstTimelineEventDetails(); + clickIdToggleField(); + + cy.get(ID_HEADER_FIELD).should('exist'); + }); + } +); From 756599f7c2a63ed44fc5cad4c58084590ff56b84 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Tue, 5 Sep 2023 08:20:39 -0500 Subject: [PATCH 12/52] [Search] Include ingest pipeline in Getting Started code snippets (#165412) ## Summary Updated the LanguageDefinition to optionally take the ingest pipeline and document keys in code snippet function arguments. To get the index pipeline info I added a new endpoint that will check for a custom pipeline ### Screenshots cURL ![image](https://github.com/elastic/kibana/assets/1972968/28eca5a3-eeb3-4243-9627-4450cdfcb5e2) python ![image](https://github.com/elastic/kibana/assets/1972968/dbb3f997-3541-463d-a9cb-11f8a501637d) javascript ![image](https://github.com/elastic/kibana/assets/1972968/f65f62b7-b07b-446d-8aa4-7e63adad95c7) PHP ![image](https://github.com/elastic/kibana/assets/1972968/f39ef998-1124-483e-b165-50e259150697) Go ![image](https://github.com/elastic/kibana/assets/1972968/06603634-b135-4a63-b61a-0402224a1efc) Ruby ![image](https://github.com/elastic/kibana/assets/1972968/9f65fd8d-bb54-4035-adc6-f6767be59137) ### 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: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-search-api-panels/types.ts | 2 + .../fetch_index_pipeline_parameters.test.ts | 34 ++++ .../fetch_index_pipeline_parameters.ts | 34 ++++ .../getting_started/getting_started.tsx | 33 +++- .../getting_started/languages/console.ts | 37 ++++ .../getting_started/languages/curl.ts | 23 ++- .../getting_started/languages/go.ts | 25 ++- .../getting_started/languages/helpers.test.ts | 39 +++++ .../getting_started/languages/helpers.ts | 38 ++++ .../getting_started/languages/javascript.ts | 42 +++-- .../getting_started/languages/php.ts | 23 ++- .../getting_started/languages/python.ts | 21 ++- .../getting_started/languages/ruby.ts | 21 ++- .../components/search_index/overview.logic.ts | 25 ++- .../lib/pipelines/get_index_pipeline.test.ts | 164 ++++++++++++++++++ .../lib/pipelines/get_index_pipeline.ts | 43 +++++ .../routes/enterprise_search/indices.ts | 21 +++ 17 files changed, 558 insertions(+), 67 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.ts create mode 100644 x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts create mode 100644 x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts diff --git a/packages/kbn-search-api-panels/types.ts b/packages/kbn-search-api-panels/types.ts index 63edec82c345d..5aba2d7b46bc0 100644 --- a/packages/kbn-search-api-panels/types.ts +++ b/packages/kbn-search-api-panels/types.ts @@ -24,6 +24,8 @@ export interface LanguageDefinitionSnippetArguments { apiKey: string; indexName?: string; cloudId?: string; + ingestPipeline?: string; + extraIngestDocumentValues?: Record; } type CodeSnippet = string | ((args: LanguageDefinitionSnippetArguments) => string); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts new file mode 100644 index 0000000000000..9290289a76b72 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mockHttpValues } from '../../../__mocks__/kea_logic'; + +import { nextTick } from '@kbn/test-jest-helpers'; + +import { fetchIndexPipelineParams } from './fetch_index_pipeline_parameters'; + +describe('FetchIndexPipelineParametersApiLogic', () => { + const { http } = mockHttpValues; + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('fetchIndexPipelineParams', () => { + it('calls correct api', async () => { + const response = { + 'pipeline-name': {}, + }; + const promise = Promise.resolve(response); + http.get.mockReturnValue(promise); + const result = fetchIndexPipelineParams({ indexName: 'index-name' }); + await nextTick(); + expect(http.get).toHaveBeenCalledWith( + '/internal/enterprise_search/indices/index-name/pipeline_parameters' + ); + await expect(result).resolves.toEqual(response); + }); + }); +}); 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 new file mode 100644 index 0000000000000..901a40e5c9e23 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../shared/http'; + +export interface FetchIndexPipelineParametersArgs { + indexName: string; +} +export type FetchIndexPipelineParametersResponse = IngestPipelineParams; + +export const fetchIndexPipelineParams = async ({ indexName }: FetchIndexPipelineParametersArgs) => { + const route = `/internal/enterprise_search/indices/${indexName}/pipeline_parameters`; + + return await HttpLogic.values.http.get(route); +}; + +export const FetchIndexPipelineParametersApiLogic = createApiLogic( + ['fetch_index_pipeline_params_api_logic'], + fetchIndexPipelineParams, + { + showErrorFlash: false, + } +); + +export type FetchIndexPipelineParametersApiLogicActions = Actions< + FetchIndexPipelineParametersArgs, + FetchIndexPipelineParametersResponse +>; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx index 804dd5f09eee1..37f96921227e7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { css } from '@emotion/react'; import dedent from 'dedent'; @@ -29,6 +29,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { SelectClientPanel, LanguageDefinition, + LanguageDefinitionSnippetArguments, LanguageClientPanel, InstallClientPanel, OverviewPanel, @@ -50,6 +51,7 @@ import { IndexViewLogic } from '../../index_view_logic'; import { OverviewLogic } from '../../overview.logic'; import { GenerateApiKeyModal } from '../generate_api_key_modal/modal'; +import { consoleDefinition } from './languages/console'; import { javascriptDefinition } from './languages/javascript'; import { languageDefinitions } from './languages/languages'; @@ -57,17 +59,28 @@ const DEFAULT_URL = 'https://localhost:9200'; export const APIGettingStarted = () => { const { http } = useValues(HttpLogic); - const { apiKey, isGenerateModalOpen } = useValues(OverviewLogic); - const { openGenerateModal, closeGenerateModal } = useActions(OverviewLogic); + const { apiKey, isGenerateModalOpen, indexPipelineParameters } = useValues(OverviewLogic); + const { fetchIndexPipelineParameters, openGenerateModal, closeGenerateModal } = + useActions(OverviewLogic); const { indexName } = useValues(IndexViewLogic); const { services } = useKibana(); const cloudContext = useCloudDetails(); - const codeArgs = { + useEffect(() => { + fetchIndexPipelineParameters({ indexName }); + }, [indexName]); + + const codeArgs: LanguageDefinitionSnippetArguments = { apiKey, cloudId: cloudContext.cloudId, + extraIngestDocumentValues: { + _extract_binary_content: indexPipelineParameters.extract_binary_content, + _reduce_whitespace: indexPipelineParameters.reduce_whitespace, + _run_ml_inference: indexPipelineParameters.run_ml_inference, + }, indexName, + ingestPipeline: indexPipelineParameters.name, url: cloudContext.elasticsearchUrl || DEFAULT_URL, }; const assetBasePath = http.basePath.prepend(`/plugins/${PLUGIN_ID}/assets/client_libraries/`); @@ -344,7 +357,11 @@ export const APIGettingStarted = () => { { 'buildSearchQuery', codeArgs )} - consoleRequest={getConsoleRequest('buildSearchQuery')} + consoleRequest={getLanguageDefinitionCodeSnippet( + consoleDefinition, + 'buildSearchQuery', + codeArgs + )} selectedLanguage={selectedLanguage} setSelectedLanguage={setSelectedLanguage} assetBasePath={assetBasePath} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts new file mode 100644 index 0000000000000..9d395b0a68c67 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LanguageDefinition } from '@kbn/search-api-panels'; + +import { ingestKeysToJSON } from './helpers'; + +export const consoleDefinition: Partial = { + buildSearchQuery: ({ indexName }) => `POST /${indexName ?? 'books'}/_search?pretty + { + "query": { + "query_string": { + "query": "snow" + } + } + }`, + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `POST _bulk?pretty${ingestPipeline ? `&pipeline=${ingestPipeline}` : ''} + { "index" : { "_index" : "${indexName}" } } + {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}}`; + }, +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts index 45c67a02798ec..8bac32d754064 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const curlDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `curl -X POST "\$\{ES_URL\}/${indexName}/_search?pretty" \\ -H "Authorization: ApiKey "\$\{API_KEY\}"" \\ @@ -33,23 +35,28 @@ export API_KEY="${apiKey}"`, }, iconType: 'curl.svg', id: Languages.CURL, - ingestData: ({ indexName }) => `curl -X POST "\$\{ES_URL\}/_bulk?pretty" \\ + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `curl -X POST "\$\{ES_URL\}/_bulk?pretty${ + ingestPipeline ? `&pipeline=${ingestPipeline}` : '' + }" \\ -H "Authorization: ApiKey "\$\{API_KEY\}"" \\ -H "Content-Type: application/json" \\ -d' { "index" : { "_index" : "${indexName}" } } -{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470} +{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585} +{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328} +{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227} +{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} +{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "The Handmaid'"'"'s Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311} -'`, +{"name": "The Handmaid'"'"'s Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}} +'`; + }, ingestDataIndex: '', installClient: `# if cURL is not already installed on your system # then install it with the package manager of your choice diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts index fc3d8226f9a0c..6c504bba26bdc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const goDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `searchResp, err := es.Search( es.Search.WithContext(context.Background()), @@ -56,27 +58,32 @@ if err != nil { }, iconType: 'go.svg', id: Languages.GO, - ingestData: ({ indexName }) => `buf := bytes.NewBufferString(\` + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `buf := bytes.NewBufferString(\` {"index":{"_id":"9780553351927"}} -{"name":"Snow Crash","author":"Neal Stephenson","release_date":"1992-06-01","page_count": 470} +{"name":"Snow Crash","author":"Neal Stephenson","release_date":"1992-06-01","page_count": 470${ingestDocumentKeys}} { "index": { "_id": "9780441017225"}} -{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585} +{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}} { "index": { "_id": "9780451524935"}} -{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328} +{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}} { "index": { "_id": "9781451673319"}} -{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227} +{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}} { "index": { "_id": "9780060850524"}} -{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} +{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}} { "index": { "_id": "9780385490818"}} -{"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311} +{"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}} \`) ingestResult, err := es.Bulk( bytes.NewReader(buf.Bytes()), - es.Bulk.WithIndex("${indexName}"), + es.Bulk.WithIndex("${indexName}"),${ + ingestPipeline ? `\n es.Bulk.WithPipeline("${ingestPipeline}"),` : '' + } ) -fmt.Println(ingestResult, err)`, +fmt.Println(ingestResult, err)`; + }, ingestDataIndex: '', installClient: 'go get github.com/elastic/go-elasticsearch/v8@latest', name: i18n.translate('xpack.enterpriseSearch.languages.go', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts new file mode 100644 index 0000000000000..df13ea273061e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ingestKeysToJSON, ingestKeysToPHP, ingestKeysToRuby } from './helpers'; + +describe('getting started language helpers', () => { + describe('ingestKeysToJSON', () => { + it('return empty string when given undefined', () => { + expect(ingestKeysToJSON(undefined)).toEqual(''); + }); + it('return json keys with quotes when given expected data', () => { + expect(ingestKeysToJSON({ _foo: true, _bar: false })).toEqual( + ', "_foo": true, "_bar": false' + ); + }); + }); + describe('ingestKeysToPHP', () => { + it('return empty string when given undefined', () => { + expect(ingestKeysToPHP(undefined)).toEqual(''); + }); + it('return json keys with quotes when given expected data', () => { + expect(ingestKeysToPHP({ _foo: true, _bar: false })).toEqual( + `\n '_foo' => true,\n '_bar' => false,` + ); + }); + }); + describe('ingestKeysToRuby', () => { + it('return empty string when given undefined', () => { + expect(ingestKeysToRuby(undefined)).toEqual(''); + }); + it('return json keys with quotes when given expected data', () => { + expect(ingestKeysToRuby({ _foo: true, _bar: false })).toEqual(', _foo: true, _bar: false'); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.ts new file mode 100644 index 0000000000000..5d98779a851b3 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.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 { LanguageDefinitionSnippetArguments } from '@kbn/search-api-panels'; + +export const ingestKeysToJSON = ( + extraIngestDocumentValues: LanguageDefinitionSnippetArguments['extraIngestDocumentValues'] +) => + extraIngestDocumentValues + ? Object.entries(extraIngestDocumentValues).reduce((result, value) => { + result += `, "${value[0]}": ${value[1]}`; + return result; + }, '') + : ''; + +export const ingestKeysToPHP = ( + extraIngestDocumentValues: LanguageDefinitionSnippetArguments['extraIngestDocumentValues'] +) => + extraIngestDocumentValues + ? Object.entries(extraIngestDocumentValues).reduce((result, value) => { + result += `\n '${value[0]}' => ${value[1]},`; + return result; + }, '') + : ''; + +export const ingestKeysToRuby = ( + extraIngestDocumentValues: LanguageDefinitionSnippetArguments['extraIngestDocumentValues'] +) => + extraIngestDocumentValues + ? Object.entries(extraIngestDocumentValues).reduce((result, value) => { + result += `, ${value[0]}: ${value[1]}`; + return result; + }, '') + : ''; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts index c73461a1aa396..51d7e4ef68625 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts @@ -10,11 +10,13 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const javascriptDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `// Let's search! const searchResult = await client.search({ index: '${indexName}', - q: '9HY9SWR' + q: 'snow' }); console.log(searchResult.hits.hits) @@ -35,34 +37,38 @@ const client = new Client({ }, iconType: 'javascript.svg', id: Languages.JAVASCRIPT, - ingestData: ({ indexName }) => `// Sample flight data + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `// Sample data books const dataset = [ - {'flight': '9HY9SWR', 'price': 841.2656419677076, 'delayed': false}, - {'flight': 'X98CCZO', 'price': 882.9826615595518, 'delayed': false}, - {'flight': 'UFK2WIZ', 'price': 190.6369038508356, 'delayed': true}, + {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}}, + {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}}, + {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}}, + {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}}, + {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}}, + {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}}, ]; // Index with the bulk helper const result = await client.helpers.bulk({ - datasource: dataset, - onDocument (doc) { - return { index: { _index: '${indexName}' }}; - } + datasource: dataset,${ingestPipeline ? `\n pipeline: "${ingestPipeline}",` : ''} + onDocument: (doc) => ({ index: { _index: '${indexName}' }}), }); console.log(result); /** { - total: 3, + total: 6, failed: 0, retry: 0, - successful: 3, + successful: 6, noop: 0, - time: 421, - bytes: 293, + time: 82, + bytes: 1273, aborted: false } -*/`, +*/`; + }, ingestDataIndex: '', installClient: 'npm install @elastic/elasticsearch@8', name: i18n.translate('xpack.enterpriseSearch.languages.javascript', { @@ -80,10 +86,10 @@ console.log(resp); version: { build_flavor: 'default', build_type: 'docker', - build_hash: 'c94b4700cda13820dad5aa74fae6db185ca5c304', - build_date: '2022-10-24T16:54:16.433628434Z', - build_snapshot: false, - lucene_version: '9.4.1', + build_hash: 'ca3dc3a882d76f14d2765906ce3b1cf421948d19', + build_date: '2023-08-28T11:24:16.383660553Z', + build_snapshot: true, + lucene_version: '9.7.0', minimum_wire_compatibility_version: '7.17.0', minimum_index_compatibility_version: '7.0.0' }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts index 51ea055c23ae8..3146ca60af306 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToPHP } from './helpers'; + export const phpDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `$params = [ 'index' => '${indexName}', @@ -33,7 +35,9 @@ print_r($response->asArray());`, }, iconType: 'php.svg', id: Languages.PHP, - ingestData: ({ indexName }) => `$params = [ + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToPHP(extraIngestDocumentValues) : ''; + return `$params = [${ingestPipeline ? `\n 'pipeline' => '${ingestPipeline}',` : ''} 'body' => [ [ 'index' => [ @@ -45,7 +49,7 @@ print_r($response->asArray());`, 'name' => 'Snow Crash', 'author' => 'Neal Stephenson', 'release_date' => '1992-06-01', - 'page_count' => 470, + 'page_count' => 470,${ingestDocumentKeys} ], [ 'index' => [ @@ -57,7 +61,7 @@ print_r($response->asArray());`, 'name' => 'Revelation Space', 'author' => 'Alastair Reynolds', 'release_date' => '2000-03-15', - 'page_count' => 585, + 'page_count' => 585,${ingestDocumentKeys} ], [ 'index' => [ @@ -69,7 +73,7 @@ print_r($response->asArray());`, 'name' => '1984', 'author' => 'George Orwell', 'release_date' => '1985-06-01', - 'page_count' => 328, + 'page_count' => 328,${ingestDocumentKeys} ], [ 'index' => [ @@ -81,7 +85,7 @@ print_r($response->asArray());`, 'name' => 'Fahrenheit 451', 'author' => 'Ray Bradbury', 'release_date' => '1953-10-15', - 'page_count' => 227, + 'page_count' => 227,${ingestDocumentKeys} ], [ 'index' => [ @@ -93,7 +97,7 @@ print_r($response->asArray());`, 'name' => 'Brave New World', 'author' => 'Aldous Huxley', 'release_date' => '1932-06-01', - 'page_count' => 268, + 'page_count' => 268,${ingestDocumentKeys} ], [ 'index' => [ @@ -102,17 +106,18 @@ print_r($response->asArray());`, ], ], [ - 'name' => 'The Handmaid\'s Tale', + 'name' => 'The Handmaid\\'s Tale', 'author' => 'Margaret Atwood', 'release_date' => '1985-06-01', - 'page_count' => 311, + 'page_count' => 311,${ingestDocumentKeys} ], ], ]; $response = $client->bulk($params); echo $response->getStatusCode(); - echo (string) $response->getBody();`, + echo (string) $response->getBody();`; + }, ingestDataIndex: '', installClient: 'composer require elasticsearch/elasticsearch', name: i18n.translate('xpack.enterpriseSearch.languages.php', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts index 79fb811185f18..24723ba3632da 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const pythonDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `client.search(index="${indexName}", q="snow")`, configureClient: ({ url, apiKey }) => `from elasticsearch import Elasticsearch @@ -27,22 +29,25 @@ client = Elasticsearch( }, iconType: 'python.svg', id: Languages.PYTHON, - ingestData: ({ indexName }) => `documents = [ + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `documents = [ { "index": { "_index": "${indexName}", "_id": "9780553351927"}}, - {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470}, + {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780441017225"}}, - {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585}, + {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780451524935"}}, - {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328}, + {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9781451673319"}}, - {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227}, + {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780060850524"}}, - {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268}, + {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780385490818"}}, - {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311}, + {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}}, ] -client.bulk(operations=documents)`, +client.bulk(operations=documents${ingestPipeline ? `, pipeline="${ingestPipeline}"` : ''})`; + }, ingestDataIndex: '', installClient: `python -m pip install elasticsearch diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts index 779aa3a99f1fb..43a104b0f7a8b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToRuby } from './helpers'; + export const rubyDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `client.search(index: '${indexName}', q: 'snow')`, configureClient: ({ url, apiKey, cloudId }) => `client = Elasticsearch::Client.new( @@ -26,15 +28,18 @@ export const rubyDefinition: LanguageDefinition = { }, iconType: 'ruby.svg', id: Languages.RUBY, - ingestData: ({ indexName }) => `documents = [ - { index: { _index: '${indexName}', data: {name: "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470} } }, - { index: { _index: '${indexName}', data: {name: "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585} } }, - { index: { _index: '${indexName}', data: {name: "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328} } }, - { index: { _index: '${indexName}', data: {name: "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227} } }, - { index: { _index: '${indexName}', data: {name: "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} } }, - { index: { _index: '${indexName}', data: {name: "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311} } } + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToRuby(extraIngestDocumentValues) : ''; + return `documents = [ + { index: { _index: '${indexName}', data: {name: "Snow Crash", author: "Neal Stephenson", release_date: "1992-06-01", page_count: 470${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "The Handmaid's Tale", author: "Margaret Atwood", release_date: "1985-06-01", page_count: 311${ingestDocumentKeys}} } } ] -client.bulk(body: documents)`, +client.bulk(body: documents${ingestPipeline ? `, pipeline: "${ingestPipeline}"` : ''})`; + }, ingestDataIndex: '', installClient: `$ gem install elasticsearch`, name: i18n.translate('xpack.enterpriseSearch.languages.ruby', { 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 34584d394b93a..dbe0610b4a855 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,7 +7,9 @@ import { kea, MakeLogicType } from 'kea'; +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'; @@ -15,6 +17,10 @@ import { CachedFetchIndexApiLogic, CachedFetchIndexApiLogicActions, } from '../../api/index/cached_fetch_index_api_logic'; +import { + FetchIndexPipelineParametersApiLogic, + FetchIndexPipelineParametersApiLogicActions, +} from '../../api/pipelines/fetch_index_pipeline_parameters'; import { SEARCH_INDICES_PATH } from '../../routes'; @@ -22,6 +28,7 @@ interface OverviewLogicActions { apiError: CachedFetchIndexApiLogicActions['apiError']; apiReset: typeof GenerateApiKeyLogic.actions.apiReset; closeGenerateModal: void; + fetchIndexPipelineParameters: FetchIndexPipelineParametersApiLogicActions['makeRequest']; openGenerateModal: void; toggleClientsPopover: void; toggleManageApiKeyPopover: void; @@ -32,6 +39,8 @@ interface OverviewLogicValues { apiKeyData: typeof GenerateApiKeyLogic.values.data; apiKeyStatus: typeof GenerateApiKeyLogic.values.status; indexData: typeof CachedFetchIndexApiLogic.values.indexData; + indexPipelineData: typeof FetchIndexPipelineParametersApiLogic.values.data; + indexPipelineParameters: IngestPipelineParams; isClientsPopoverOpen: boolean; isError: boolean; isGenerateModalOpen: boolean; @@ -48,12 +57,21 @@ export const OverviewLogic = kea ({ @@ -95,6 +113,11 @@ export const OverviewLogic = kea apiKeyStatus === Status.SUCCESS ? apiKeyData.apiKey.encoded : '', ], + indexPipelineParameters: [ + () => [selectors.indexPipelineData], + (indexPipelineData: typeof FetchIndexPipelineParametersApiLogic.values.data) => + indexPipelineData ?? DEFAULT_PIPELINE_VALUES, + ], isError: [() => [selectors.status], (status) => status === Status.ERROR], isLoading: [ () => [selectors.status, selectors.indexData], diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts new file mode 100644 index 0000000000000..58476ed18b741 --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts @@ -0,0 +1,164 @@ +/* + * Copyright 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 { DEFAULT_PIPELINE_VALUES } from '../../../common/constants'; + +import { getIndexPipelineParameters } from './get_index_pipeline'; + +describe('getIndexPipelineParameters', () => { + const defaultMockClient = () => ({ + asCurrentUser: { + get: jest.fn().mockResolvedValue({}), + indices: { + getMapping: jest.fn().mockResolvedValue({}), + }, + ingest: { + getPipeline: jest.fn().mockRejectedValue('Pipeline not found'), + }, + search: jest.fn().mockResolvedValue({ + hits: { + hits: [], + }, + }), + }, + }); + let mockClient = defaultMockClient(); + let client: IScopedClusterClient; + beforeEach(() => { + jest.resetAllMocks(); + + mockClient = defaultMockClient(); + client = mockClient as unknown as IScopedClusterClient; + }); + it('returns default pipeline if custom not found', async () => { + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual( + DEFAULT_PIPELINE_VALUES + ); + }); + it('returns connector pipeline params if found', async () => { + mockClient.asCurrentUser.search = jest.fn().mockResolvedValue({ + hits: { + hits: [ + { + _id: 'unit-test', + _source: {}, + }, + ], + }, + }); + mockClient.asCurrentUser.get = jest.fn().mockResolvedValue({ + _id: 'unit-test', + _source: { + pipeline: { + extract_binary_content: false, + name: 'unit-test-pipeline', + reduce_whitespace: true, + run_ml_inference: true, + }, + }, + }); + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: false, + name: 'unit-test-pipeline', + reduce_whitespace: true, + run_ml_inference: true, + }); + }); + it('returns default pipeline if fetch custom throws', async () => { + mockClient.asCurrentUser.ingest.getPipeline = jest.fn().mockRejectedValue('Boom'); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual( + DEFAULT_PIPELINE_VALUES + ); + }); + it('returns custom pipeline if found', async () => { + mockClient.asCurrentUser.ingest.getPipeline = jest.fn().mockResolvedValueOnce({ + 'my-index': { + fake: 'ingest-pipeline', + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: true, + name: 'my-index', + reduce_whitespace: true, + run_ml_inference: false, + }); + }); + it('returns default connector index pipeline if found in mapping', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockResolvedValueOnce({ + '.elastic-connectors-v1': { + mappings: { + _meta: { + pipeline: { + default_extract_binary_content: false, + default_name: 'my-unit-test-index', + default_reduce_whitespace: false, + default_run_ml_inference: true, + }, + }, + }, + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: false, + name: 'my-unit-test-index', + reduce_whitespace: false, + run_ml_inference: true, + }); + }); + it('returns connector params with custom pipeline name', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockResolvedValueOnce({ + '.elastic-connectors-v1': { + mappings: { + _meta: { + pipeline: { + default_extract_binary_content: false, + default_name: 'my-unit-test-index', + default_reduce_whitespace: false, + default_run_ml_inference: true, + }, + }, + }, + }, + }); + mockClient.asCurrentUser.ingest.getPipeline = jest.fn().mockResolvedValueOnce({ + 'my-index': { + fake: 'ingest-pipeline', + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: false, + name: 'my-index', + reduce_whitespace: false, + run_ml_inference: true, + }); + }); + it('returns defaults if get mapping fails with IndexNotFoundException', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockRejectedValue({ + meta: { + body: { + error: { + type: 'index_not_found_exception', + }, + }, + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual( + DEFAULT_PIPELINE_VALUES + ); + }); + it('throws if get mapping fails with non-IndexNotFoundException', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockRejectedValue('Boom'); + + await expect(getIndexPipelineParameters('my-index', client)).rejects.toEqual('Boom'); + }); +}); 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 new file mode 100644 index 0000000000000..45813a109de76 --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IScopedClusterClient } from '@kbn/core/server'; + +import { IngestPipelineParams } from '../../../common/types/connectors'; +import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; + +import { getDefaultPipeline } from './get_default_pipeline'; + +export const getIndexPipelineParameters = async ( + indexName: string, + client: IScopedClusterClient +): Promise => { + // Get the default pipeline data and check for a custom pipeline in parallel + // 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), + client.asCurrentUser.ingest + .getPipeline({ + id: `${indexName}`, + }) + .catch(() => null), + ]); + if (connector && connector.pipeline) { + return connector.pipeline; + } + let pipelineName = defaultPipeline.name; + + if (customPipelineResp && customPipelineResp[indexName]) { + pipelineName = indexName; + } + + return { + ...defaultPipeline, + name: pipelineName, + }; +}; 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 b41f391fd66f6..25342217e5192 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 @@ -44,6 +44,7 @@ import { startMlModelDownload } from '../../lib/ml/start_ml_model_download'; import { createIndexPipelineDefinitions } from '../../lib/pipelines/create_pipeline_definitions'; import { deleteIndexPipelines } from '../../lib/pipelines/delete_pipelines'; import { getCustomPipelines } from '../../lib/pipelines/get_custom_pipelines'; +import { getIndexPipelineParameters } from '../../lib/pipelines/get_index_pipeline'; import { getPipeline } from '../../lib/pipelines/get_pipeline'; import { getMlInferencePipelines } from '../../lib/pipelines/ml_inference/get_ml_inference_pipelines'; import { revertCustomPipeline } from '../../lib/pipelines/revert_custom_pipeline'; @@ -354,6 +355,26 @@ export function registerIndexRoutes({ }) ); + router.get( + { + path: '/internal/enterprise_search/indices/{indexName}/pipeline_parameters', + validate: { + params: schema.object({ + indexName: schema.string(), + }), + }, + }, + elasticsearchErrorHandler(log, async (context, request, response) => { + const indexName = decodeURIComponent(request.params.indexName); + const { client } = (await context.core).elasticsearch; + const body = await getIndexPipelineParameters(indexName, client); + return response.ok({ + body, + headers: { 'content-type': 'application/json' }, + }); + }) + ); + router.get( { path: '/internal/enterprise_search/indices/{indexName}/ml_inference/pipeline_processors', From 5f00ae97dd3715eef5a1b87e7035f5c7608f829c Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Tue, 5 Sep 2023 06:59:52 -0700 Subject: [PATCH 13/52] [ResponseOps][Alerting] ESQL alerting rule type ( pointed at main) (#165480) Resolves https://github.com/elastic/kibana/issues/153448 ## Summary The same as this [pr](https://github.com/elastic/kibana/pull/164073), but just points at main --------- Co-authored-by: Stratoula Kalafateli Co-authored-by: Alexey Antonov Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Abdon Pijpelink Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Peter Pisljar Co-authored-by: Marco Liberati --- packages/kbn-text-based-editor/index.ts | 1 + .../src/editor_footer.tsx | 46 +-- .../src/fetch_fields_from_esql.ts | 9 +- .../src/text_based_languages_editor.test.tsx | 23 ++ .../src/text_based_languages_editor.tsx | 3 + .../common/esql_query_utils.test.ts | 95 +++++ .../stack_alerts/common/esql_query_utils.ts | 63 ++++ x-pack/plugins/stack_alerts/common/index.ts | 3 + x-pack/plugins/stack_alerts/kibana.jsonc | 3 +- .../public/rule_types/es_query/constants.ts | 7 + .../expression/esql_query_expression.test.tsx | 196 ++++++++++ .../expression/esql_query_expression.tsx | 255 +++++++++++++ .../es_query/expression/expression.test.tsx | 76 +++- .../es_query/expression/expression.tsx | 10 +- .../expression/query_form_type_chooser.tsx | 97 +++-- .../test_query_row/test_query_row.tsx | 20 +- .../test_query_row_table.test.tsx | 79 ++++ .../test_query_row/test_query_row_table.tsx | 90 +++++ .../test_query_row/use_test_query.test.ts | 20 ++ .../es_query/test_query_row/use_test_query.ts | 21 +- .../public/rule_types/es_query/types.ts | 10 + .../public/rule_types/es_query/util.ts | 6 + .../rule_types/es_query/validation.test.ts | 59 +++ .../public/rule_types/es_query/validation.ts | 55 ++- .../es_query/action_context.test.ts | 30 ++ .../rule_types/es_query/action_context.ts | 33 +- .../rule_types/es_query/executor.test.ts | 187 +++++++++- .../server/rule_types/es_query/executor.ts | 52 ++- .../es_query/lib/fetch_esql_query.test.ts | 115 ++++++ .../es_query/lib/fetch_esql_query.ts | 111 ++++++ .../rule_types/es_query/rule_type.test.ts | 154 +++++++- .../server/rule_types/es_query/rule_type.ts | 33 +- .../rule_types/es_query/rule_type_params.ts | 19 +- .../server/rule_types/es_query/types.ts | 15 +- .../server/rule_types/es_query/util.ts | 10 +- x-pack/plugins/stack_alerts/tsconfig.json | 3 + .../plugins/triggers_actions_ui/kibana.jsonc | 1 + .../public/application/app.tsx | 2 + .../public/common/index.ts | 2 +- .../common/lib/kibana/kibana_react.mock.ts | 2 + .../triggers_actions_ui/public/index.ts | 1 + .../triggers_actions_ui/public/plugin.ts | 3 + .../plugins/triggers_actions_ui/tsconfig.json | 1 + .../builtin_alert_types/es_query/esql_only.ts | 340 ++++++++++++++++++ .../builtin_alert_types/es_query/index.ts | 1 + 45 files changed, 2237 insertions(+), 125 deletions(-) create mode 100644 x-pack/plugins/stack_alerts/common/esql_query_utils.test.ts create mode 100644 x-pack/plugins/stack_alerts/common/esql_query_utils.ts create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.test.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.test.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.tsx create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.test.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts create mode 100644 x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts diff --git a/packages/kbn-text-based-editor/index.ts b/packages/kbn-text-based-editor/index.ts index fd7b19839b87f..01f106af6639f 100644 --- a/packages/kbn-text-based-editor/index.ts +++ b/packages/kbn-text-based-editor/index.ts @@ -7,6 +7,7 @@ */ export type { TextBasedLanguagesEditorProps } from './src/text_based_languages_editor'; +export { fetchFieldsFromESQL } from './src/fetch_fields_from_esql'; import { TextBasedLanguagesEditor } from './src/text_based_languages_editor'; // React.lazy support diff --git a/packages/kbn-text-based-editor/src/editor_footer.tsx b/packages/kbn-text-based-editor/src/editor_footer.tsx index 6f1e6cdd0b130..f89a14d06f106 100644 --- a/packages/kbn-text-based-editor/src/editor_footer.tsx +++ b/packages/kbn-text-based-editor/src/editor_footer.tsx @@ -155,6 +155,7 @@ interface EditorFooterProps { detectTimestamp: boolean; onErrorClick: (error: MonacoError) => void; refreshErrors: () => void; + hideRunQueryText?: boolean; } export const EditorFooter = memo(function EditorFooter({ @@ -165,6 +166,7 @@ export const EditorFooter = memo(function EditorFooter({ detectTimestamp, onErrorClick, refreshErrors, + hideRunQueryText, }: EditorFooterProps) { const [isPopoverOpen, setIsPopoverOpen] = useState(false); return ( @@ -235,27 +237,29 @@ export const EditorFooter = memo(function EditorFooter({ - - - - -

- {i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.runQuery', { - defaultMessage: 'Run query', - })} -

-
-
- - {`${COMMAND_KEY} + Enter`} - -
-
+ {!hideRunQueryText && ( + + + + +

+ {i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.runQuery', { + defaultMessage: 'Run query', + })} +

+
+
+ + {`${COMMAND_KEY} + Enter`} + +
+
+ )} ); }); diff --git a/packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts b/packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts index b847e4cb0bb43..7b9ebd66d76c6 100644 --- a/packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts +++ b/packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts @@ -8,7 +8,7 @@ import { pluck } from 'rxjs/operators'; import { lastValueFrom } from 'rxjs'; -import { Query, AggregateQuery } from '@kbn/es-query'; +import { Query, AggregateQuery, TimeRange } from '@kbn/es-query'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import type { Datatable } from '@kbn/expressions-plugin/public'; import { textBasedQueryStateToAstWithValidation } from '@kbn/data-plugin/common'; @@ -20,9 +20,14 @@ interface TextBasedLanguagesErrorResponse { type: 'error'; } -export function fetchFieldsFromESQL(query: Query | AggregateQuery, expressions: ExpressionsStart) { +export function fetchFieldsFromESQL( + query: Query | AggregateQuery, + expressions: ExpressionsStart, + time?: TimeRange +) { return textBasedQueryStateToAstWithValidation({ query, + time, }) .then((ast) => { if (ast) { diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx index 4e3853970d7a2..0be4c38eed749 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx @@ -242,4 +242,27 @@ describe('TextBasedLanguagesEditor', () => { ).toBe('1 line'); }); }); + + it('should render the run query text', async () => { + const newProps = { + ...props, + isCodeEditorExpanded: true, + }; + await act(async () => { + const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps })); + expect(component.find('[data-test-subj="TextBasedLangEditor-run-query"]').length).not.toBe(0); + }); + }); + + it('should not render the run query text if the hideRunQueryText prop is set to true', async () => { + const newProps = { + ...props, + isCodeEditorExpanded: true, + hideRunQueryText: true, + }; + await act(async () => { + const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps })); + expect(component.find('[data-test-subj="TextBasedLangEditor-run-query"]').length).toBe(0); + }); + }); }); 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 5eb83f625493a..3aada71f81ab0 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 @@ -75,6 +75,7 @@ export interface TextBasedLanguagesEditorProps { isDarkMode?: boolean; dataTestSubj?: string; hideMinimizeButton?: boolean; + hideRunQueryText?: boolean; } interface TextBasedEditorDeps { @@ -120,6 +121,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ isDisabled, isDarkMode, hideMinimizeButton, + hideRunQueryText, dataTestSubj, }: TextBasedLanguagesEditorProps) { const { euiTheme } = useEuiTheme(); @@ -781,6 +783,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ onErrorClick={onErrorClick} refreshErrors={onTextLangQuerySubmit} detectTimestamp={detectTimestamp} + hideRunQueryText={hideRunQueryText} /> )} {isCodeEditorExpanded && ( diff --git a/x-pack/plugins/stack_alerts/common/esql_query_utils.test.ts b/x-pack/plugins/stack_alerts/common/esql_query_utils.test.ts new file mode 100644 index 0000000000000..64aad9c156958 --- /dev/null +++ b/x-pack/plugins/stack_alerts/common/esql_query_utils.test.ts @@ -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 { rowToDocument, toEsQueryHits, transformDatatableToEsqlTable } from './esql_query_utils'; + +describe('ESQL query utils', () => { + describe('rowToDocument', () => { + it('correctly converts ESQL row to document', () => { + expect( + rowToDocument( + [ + { name: '@timestamp', type: 'date' }, + { name: 'ecs.version', type: 'keyword' }, + { name: 'error.code', type: 'keyword' }, + ], + ['2023-07-12T13:32:04.174Z', '1.8.0', null] + ) + ).toEqual({ + '@timestamp': '2023-07-12T13:32:04.174Z', + 'ecs.version': '1.8.0', + 'error.code': null, + }); + }); + }); + + describe('toEsQueryHits', () => { + it('correctly converts ESQL table to ES query hits', () => { + expect( + toEsQueryHits({ + columns: [ + { name: '@timestamp', type: 'date' }, + { name: 'ecs.version', type: 'keyword' }, + { name: 'error.code', type: 'keyword' }, + ], + values: [['2023-07-12T13:32:04.174Z', '1.8.0', null]], + }) + ).toEqual({ + hits: [ + { + _id: 'esql_query_document', + _index: '', + _source: { + '@timestamp': '2023-07-12T13:32:04.174Z', + 'ecs.version': '1.8.0', + 'error.code': null, + }, + }, + ], + total: 1, + }); + }); + }); + + describe('transformDatatableToEsqlTable', () => { + it('correctly converts data table to ESQL table', () => { + expect( + transformDatatableToEsqlTable({ + type: 'datatable', + columns: [ + { id: '@timestamp', name: '@timestamp', meta: { type: 'date' } }, + { id: 'ecs.version', name: 'ecs.version', meta: { type: 'string' } }, + { id: 'error.code', name: 'error.code', meta: { type: 'string' } }, + ], + rows: [ + { + '@timestamp': '2023-07-12T13:32:04.174Z', + 'ecs.version': '1.8.0', + 'error.code': null, + }, + ], + }) + ).toEqual({ + columns: [ + { + name: '@timestamp', + type: 'date', + }, + { + name: 'ecs.version', + type: 'string', + }, + { + name: 'error.code', + type: 'string', + }, + ], + values: [['2023-07-12T13:32:04.174Z', '1.8.0', null]], + }); + }); + }); +}); diff --git a/x-pack/plugins/stack_alerts/common/esql_query_utils.ts b/x-pack/plugins/stack_alerts/common/esql_query_utils.ts new file mode 100644 index 0000000000000..c74d3640c7fd7 --- /dev/null +++ b/x-pack/plugins/stack_alerts/common/esql_query_utils.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Datatable } from '@kbn/expressions-plugin/common'; + +type EsqlDocument = Record; + +interface EsqlHit { + _id: string; + _index: string; + _source: EsqlDocument; +} + +interface EsqlResultColumn { + name: string; + type: string; +} + +type EsqlResultRow = Array; + +export interface EsqlTable { + columns: EsqlResultColumn[]; + values: EsqlResultRow[]; +} + +const ESQL_DOCUMENT_ID = 'esql_query_document'; + +export const rowToDocument = (columns: EsqlResultColumn[], row: EsqlResultRow): EsqlDocument => { + return columns.reduce>((acc, column, i) => { + acc[column.name] = row[i]; + + return acc; + }, {}); +}; + +export const toEsQueryHits = (results: EsqlTable) => { + const hits: EsqlHit[] = results.values.map((row) => { + const document = rowToDocument(results.columns, row); + return { + _id: ESQL_DOCUMENT_ID, + _index: '', + _source: document, + }; + }); + + return { + hits, + total: hits.length, + }; +}; + +export const transformDatatableToEsqlTable = (results: Datatable): EsqlTable => { + const columns: EsqlResultColumn[] = results.columns.map((c) => ({ + name: c.id, + type: c.meta.type, + })); + const values: EsqlResultRow[] = results.rows.map((r) => Object.values(r)); + return { columns, values }; +}; diff --git a/x-pack/plugins/stack_alerts/common/index.ts b/x-pack/plugins/stack_alerts/common/index.ts index 4a9be641712f1..afafef61eb76b 100644 --- a/x-pack/plugins/stack_alerts/common/index.ts +++ b/x-pack/plugins/stack_alerts/common/index.ts @@ -12,3 +12,6 @@ export { getHumanReadableComparator, } from './comparator'; export { STACK_ALERTS_FEATURE_ID } from './constants'; + +export type { EsqlTable } from './esql_query_utils'; +export { rowToDocument, transformDatatableToEsqlTable, toEsQueryHits } from './esql_query_utils'; diff --git a/x-pack/plugins/stack_alerts/kibana.jsonc b/x-pack/plugins/stack_alerts/kibana.jsonc index 668d38d291a34..73b81c6dfd352 100644 --- a/x-pack/plugins/stack_alerts/kibana.jsonc +++ b/x-pack/plugins/stack_alerts/kibana.jsonc @@ -22,7 +22,8 @@ "kibanaUtils" ], "requiredBundles": [ - "esUiShared" + "esUiShared", + "textBasedLanguages" ] } } diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts index 55a34c7b92a79..4cce902449d18 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts @@ -48,6 +48,13 @@ export const ONLY_ES_QUERY_EXPRESSION_ERRORS = { timeField: new Array(), }; +export const ONLY_ESQL_QUERY_EXPRESSION_ERRORS = { + esqlQuery: new Array(), + timeField: new Array(), + thresholdComparator: new Array(), + threshold0: new Array(), +}; + const ALL_EXPRESSION_ERROR_ENTRIES = { ...COMMON_EXPRESSION_ERRORS, ...SEARCH_SOURCE_ONLY_EXPRESSION_ERRORS, diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.test.tsx new file mode 100644 index 0000000000000..b9b8ba0dd38f7 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.test.tsx @@ -0,0 +1,196 @@ +/* + * Copyright 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 { fireEvent, render, waitFor } from '@testing-library/react'; +import { I18nProvider } from '@kbn/i18n-react'; + +import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks'; +import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; +import { EsqlQueryExpression } from './esql_query_expression'; +import { EsQueryRuleParams, SearchType } from '../types'; + +jest.mock('../validation', () => ({ + hasExpressionValidationErrors: jest.fn(), +})); +const { hasExpressionValidationErrors } = jest.requireMock('../validation'); + +jest.mock('@kbn/text-based-editor', () => ({ + fetchFieldsFromESQL: jest.fn(), +})); +const { fetchFieldsFromESQL } = jest.requireMock('@kbn/text-based-editor'); + +const AppWrapper: React.FC<{ children: React.ReactElement }> = React.memo(({ children }) => ( + {children} +)); + +const dataMock = dataPluginMock.createStartContract(); +const dataViewMock = dataViewPluginMocks.createStartContract(); +const unifiedSearchMock = unifiedSearchPluginMock.createStartContract(); +const chartsStartMock = chartPluginMock.createStartContract(); + +const defaultEsqlQueryExpressionParams: EsQueryRuleParams = { + size: 100, + thresholdComparator: '>', + threshold: [0], + timeWindowSize: 15, + timeWindowUnit: 's', + index: ['test-index'], + timeField: '@timestamp', + aggType: 'count', + groupBy: 'all', + searchType: SearchType.esqlQuery, + esqlQuery: { esql: '' }, + excludeHitsFromPreviousRun: false, +}; + +describe('EsqlQueryRuleTypeExpression', () => { + beforeEach(() => { + jest.clearAllMocks(); + + hasExpressionValidationErrors.mockReturnValue(false); + }); + + it('should render EsqlQueryRuleTypeExpression with expected components', () => { + const result = render( + {}} + setRuleProperty={() => {}} + errors={{ esqlQuery: [], timeField: [], timeWindowSize: [] }} + data={dataMock} + dataViews={dataViewMock} + defaultActionGroupId="" + actionGroups={[]} + charts={chartsStartMock} + onChangeMetaData={() => {}} + />, + { + wrapper: AppWrapper, + } + ); + + expect(result.getByTestId('queryEsqlEditor')).toBeInTheDocument(); + expect(result.getByTestId('timeFieldSelect')).toBeInTheDocument(); + expect(result.getByTestId('timeWindowSizeNumber')).toBeInTheDocument(); + expect(result.getByTestId('timeWindowUnitSelect')).toBeInTheDocument(); + expect(result.queryByTestId('testQuerySuccess')).not.toBeInTheDocument(); + expect(result.queryByTestId('testQueryError')).not.toBeInTheDocument(); + }); + + test('should render Test Query button disabled if alert params are invalid', async () => { + hasExpressionValidationErrors.mockReturnValue(true); + const result = render( + {}} + setRuleProperty={() => {}} + errors={{ esqlQuery: [], timeField: [], timeWindowSize: [] }} + data={dataMock} + dataViews={dataViewMock} + defaultActionGroupId="" + actionGroups={[]} + charts={chartsStartMock} + onChangeMetaData={() => {}} + />, + { + wrapper: AppWrapper, + } + ); + + const button = result.getByTestId('testQuery'); + expect(button).toBeInTheDocument(); + expect(button).toBeDisabled(); + }); + + test('should show success message if Test Query is successful', async () => { + fetchFieldsFromESQL.mockResolvedValue({ + type: 'datatable', + columns: [ + { id: '@timestamp', name: '@timestamp', meta: { type: 'date' } }, + { id: 'ecs.version', name: 'ecs.version', meta: { type: 'string' } }, + { id: 'error.code', name: 'error.code', meta: { type: 'string' } }, + ], + rows: [ + { + '@timestamp': '2023-07-12T13:32:04.174Z', + 'ecs.version': '1.8.0', + 'error.code': null, + }, + ], + }); + const result = render( + {}} + setRuleProperty={() => {}} + errors={{ esqlQuery: [], timeField: [], timeWindowSize: [] }} + data={dataMock} + dataViews={dataViewMock} + defaultActionGroupId="" + actionGroups={[]} + charts={chartsStartMock} + onChangeMetaData={() => {}} + />, + { + wrapper: AppWrapper, + } + ); + + fireEvent.click(result.getByTestId('testQuery')); + await waitFor(() => expect(fetchFieldsFromESQL).toBeCalled()); + + expect(result.getByTestId('testQuerySuccess')).toBeInTheDocument(); + expect(result.getByText('Query matched 1 documents in the last 15s.')).toBeInTheDocument(); + expect(result.queryByTestId('testQueryError')).not.toBeInTheDocument(); + }); + + test('should show error message if Test Query is throws error', async () => { + fetchFieldsFromESQL.mockRejectedValue('Error getting test results.!'); + const result = render( + {}} + setRuleProperty={() => {}} + errors={{ esqlQuery: [], timeField: [], timeWindowSize: [] }} + data={dataMock} + dataViews={dataViewMock} + defaultActionGroupId="" + actionGroups={[]} + charts={chartsStartMock} + onChangeMetaData={() => {}} + />, + { + wrapper: AppWrapper, + } + ); + + fireEvent.click(result.getByTestId('testQuery')); + await waitFor(() => expect(fetchFieldsFromESQL).toBeCalled()); + + expect(result.queryByTestId('testQuerySuccess')).not.toBeInTheDocument(); + expect(result.getByTestId('testQueryError')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx new file mode 100644 index 0000000000000..5a26839a7b284 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx @@ -0,0 +1,255 @@ +/* + * Copyright 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, Fragment, useEffect, useCallback } from 'react'; +import { get } from 'lodash'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiFieldNumber, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiSelect, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { getFields, RuleTypeParamsExpressionProps } from '@kbn/triggers-actions-ui-plugin/public'; +import { TextBasedLangEditor } from '@kbn/text-based-languages/public'; +import { fetchFieldsFromESQL } from '@kbn/text-based-editor'; +import { AggregateQuery, getIndexPatternFromESQLQuery } from '@kbn/es-query'; +import { parseDuration } from '@kbn/alerting-plugin/common'; +import { + firstFieldOption, + getTimeFieldOptions, + getTimeOptions, + parseAggregationResults, +} from '@kbn/triggers-actions-ui-plugin/public/common'; +import { EsQueryRuleParams, EsQueryRuleMetaData, SearchType } from '../types'; +import { DEFAULT_VALUES } from '../constants'; +import { useTriggerUiActionServices } from '../util'; +import { hasExpressionValidationErrors } from '../validation'; +import { TestQueryRow } from '../test_query_row'; +import { rowToDocument, toEsQueryHits, transformDatatableToEsqlTable } from '../../../../common'; + +export const EsqlQueryExpression: React.FC< + RuleTypeParamsExpressionProps, EsQueryRuleMetaData> +> = ({ ruleParams, setRuleParams, setRuleProperty, errors }) => { + const { expressions, http } = useTriggerUiActionServices(); + const { esqlQuery, timeWindowSize, timeWindowUnit, timeField } = ruleParams; + + const [currentRuleParams, setCurrentRuleParams] = useState< + EsQueryRuleParams + >({ + ...ruleParams, + timeWindowSize: timeWindowSize ?? DEFAULT_VALUES.TIME_WINDOW_SIZE, + timeWindowUnit: timeWindowUnit ?? DEFAULT_VALUES.TIME_WINDOW_UNIT, + // ESQL queries compare conditions within the ES query + // so only 'met' results are returned, therefore the threshold should always be 0 + threshold: [0], + thresholdComparator: DEFAULT_VALUES.THRESHOLD_COMPARATOR, + size: DEFAULT_VALUES.SIZE, + esqlQuery: esqlQuery ?? { esql: '' }, + aggType: DEFAULT_VALUES.AGGREGATION_TYPE, + groupBy: DEFAULT_VALUES.GROUP_BY, + termSize: DEFAULT_VALUES.TERM_SIZE, + searchType: SearchType.esqlQuery, + }); + const [query, setQuery] = useState({ esql: '' }); + const [timeFieldOptions, setTimeFieldOptions] = useState([firstFieldOption]); + const [detectTimestamp, setDetectTimestamp] = useState(false); + + const setParam = useCallback( + (paramField: string, paramValue: unknown) => { + setCurrentRuleParams((currentParams) => ({ + ...currentParams, + [paramField]: paramValue, + })); + setRuleParams(paramField, paramValue); + }, + [setRuleParams] + ); + + const setDefaultExpressionValues = async () => { + setRuleProperty('params', currentRuleParams); + setQuery(esqlQuery ?? { esql: '' }); + if (timeField) { + setTimeFieldOptions([firstFieldOption, { text: timeField, value: timeField }]); + } + }; + useEffect(() => { + setDefaultExpressionValues(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const onTestQuery = useCallback(async () => { + const window = `${timeWindowSize}${timeWindowUnit}`; + const emptyResult = { + testResults: { results: [], truncated: false }, + isGrouped: true, + timeWindow: window, + }; + + if (hasExpressionValidationErrors(currentRuleParams)) { + return emptyResult; + } + const timeWindow = parseDuration(window); + const now = Date.now(); + const table = await fetchFieldsFromESQL(esqlQuery, expressions, { + from: new Date(now - timeWindow).toISOString(), + to: new Date(now).toISOString(), + }); + if (table) { + const esqlTable = transformDatatableToEsqlTable(table); + const hits = toEsQueryHits(esqlTable); + return { + testResults: parseAggregationResults({ + isCountAgg: true, + isGroupAgg: false, + esResult: { + took: 0, + timed_out: false, + _shards: { failed: 0, successful: 0, total: 0 }, + hits, + }, + }), + isGrouped: false, + timeWindow: window, + rawResults: { + cols: esqlTable.columns.map((col) => ({ + id: col.name, + })), + rows: esqlTable.values.slice(0, 5).map((row) => rowToDocument(esqlTable.columns, row)), + }, + }; + } + return emptyResult; + }, [timeWindowSize, timeWindowUnit, currentRuleParams, esqlQuery, expressions]); + + const refreshTimeFields = async (q: AggregateQuery) => { + let hasTimestamp = false; + const indexPattern: string = getIndexPatternFromESQLQuery(get(q, 'esql')); + const currentEsFields = await getFields(http, [indexPattern]); + const timeFields = getTimeFieldOptions(currentEsFields); + setTimeFieldOptions([firstFieldOption, ...timeFields]); + + const timestampField = timeFields.find((field) => field.value === '@timestamp'); + if (timestampField) { + setParam('timeField', timestampField.value); + hasTimestamp = true; + } + setDetectTimestamp(hasTimestamp); + }; + + return ( + + +
+ +
+
+ + + { + setQuery(q); + setParam('esqlQuery', q); + refreshTimeFields(q); + }} + expandCodeEditor={() => true} + isCodeEditorExpanded={true} + onTextLangQuerySubmit={() => {}} + detectTimestamp={detectTimestamp} + hideMinimizeButton={true} + hideRunQueryText={true} + /> + + + +
+ +
+
+ + 0 && timeField !== undefined} + error={errors.timeField} + > + 0 && timeField !== undefined} + fullWidth + name="timeField" + data-test-subj="timeFieldSelect" + value={timeField || ''} + onChange={(e) => { + setParam('timeField', e.target.value); + }} + /> + + + +
+ +
+
+ + + + 0} + error={errors.timeWindowSize} + > + 0} + min={0} + value={timeWindowSize || ''} + onChange={(e) => { + const { value } = e.target; + const timeWindowSizeVal = value !== '' ? parseInt(value, 10) : undefined; + setParam('timeWindowSize', timeWindowSizeVal); + }} + /> + + + + + { + setParam('timeWindowUnit', e.target.value); + }} + options={getTimeOptions(timeWindowSize ?? 1)} + /> + + + + + +
+ ); +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.test.tsx index ecbfd306e1ead..09a4c3da9b5ec 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.test.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.test.tsx @@ -23,7 +23,6 @@ import { EsQueryRuleTypeExpression } from './expression'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { Subject } from 'rxjs'; import { ISearchSource } from '@kbn/data-plugin/common'; -import { IUiSettingsClient } from '@kbn/core/public'; import { findTestSubject } from '@elastic/eui/lib/test'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { act } from 'react-dom/test-utils'; @@ -75,6 +74,20 @@ const defaultSearchSourceRuleParams: EsQueryRuleParams aggType: 'count', }; +const defaultEsqlRuleParams: EsQueryRuleParams = { + size: 100, + thresholdComparator: '>', + threshold: [0], + timeWindowSize: 15, + timeWindowUnit: 's', + index: ['test-index'], + timeField: '@timestamp', + searchType: SearchType.esqlQuery, + esqlQuery: { esql: 'test' }, + excludeHitsFromPreviousRun: true, + aggType: 'count', +}; + const dataViewPluginMock = dataViewPluginMocks.createStartContract(); const chartsStartMock = chartPluginMock.createStartContract(); const unifiedSearchMock = unifiedSearchPluginMock.createStartContract(); @@ -82,7 +95,7 @@ const httpMock = httpServiceMock.createStartContract(); const docLinksMock = docLinksServiceMock.createStartContract(); export const uiSettingsMock = { get: jest.fn(), -} as unknown as IUiSettingsClient; +}; const mockSearchResult = new Subject(); const searchSourceFieldsMock = { @@ -150,7 +163,10 @@ dataMock.query.savedQueries.findSavedQueries = jest.fn(() => (httpMock.post as jest.Mock).mockImplementation(() => Promise.resolve({ fields: [] })); const Wrapper: React.FC<{ - ruleParams: EsQueryRuleParams | EsQueryRuleParams; + ruleParams: + | EsQueryRuleParams + | EsQueryRuleParams + | EsQueryRuleParams; metadata?: EsQueryRuleMetaData; }> = ({ ruleParams, metadata }) => { const [currentRuleParams, setCurrentRuleParams] = useState(ruleParams); @@ -192,7 +208,10 @@ const Wrapper: React.FC<{ }; const setup = ( - ruleParams: EsQueryRuleParams | EsQueryRuleParams, + ruleParams: + | EsQueryRuleParams + | EsQueryRuleParams + | EsQueryRuleParams, metadata?: EsQueryRuleMetaData ) => { return mountWithIntl( @@ -213,11 +232,28 @@ const setup = ( }; describe('EsQueryRuleTypeExpression', () => { + beforeEach(() => { + jest.clearAllMocks(); + + uiSettingsMock.get.mockReturnValue(true); + }); + test('should render options by default', async () => { const wrapper = setup({} as EsQueryRuleParams); expect(findTestSubject(wrapper, 'queryFormTypeChooserTitle').exists()).toBeTruthy(); expect(findTestSubject(wrapper, 'queryFormType_searchSource').exists()).toBeTruthy(); expect(findTestSubject(wrapper, 'queryFormType_esQuery').exists()).toBeTruthy(); + expect(findTestSubject(wrapper, 'queryFormType_esqlQuery').exists()).toBeTruthy(); + expect(findTestSubject(wrapper, 'queryFormTypeChooserCancel').exists()).toBeFalsy(); + }); + + test('should hide ESQL option when not enabled', async () => { + uiSettingsMock.get.mockReturnValueOnce(false); + const wrapper = setup({} as EsQueryRuleParams); + expect(findTestSubject(wrapper, 'queryFormTypeChooserTitle').exists()).toBeTruthy(); + expect(findTestSubject(wrapper, 'queryFormType_searchSource').exists()).toBeTruthy(); + expect(findTestSubject(wrapper, 'queryFormType_esQuery').exists()).toBeTruthy(); + expect(findTestSubject(wrapper, 'queryFormType_esqlQuery').exists()).toBeFalsy(); expect(findTestSubject(wrapper, 'queryFormTypeChooserCancel').exists()).toBeFalsy(); }); @@ -257,6 +293,23 @@ describe('EsQueryRuleTypeExpression', () => { expect(findTestSubject(wrapper, 'queryFormTypeChooserTitle').exists()).toBeTruthy(); }); + test('should switch to ESQL form type on selection and return back on cancel', async () => { + let wrapper = setup({} as EsQueryRuleParams); + await act(async () => { + findTestSubject(wrapper, 'queryFormType_esqlQuery').simulate('click'); + }); + wrapper = await wrapper.update(); + expect(findTestSubject(wrapper, 'queryFormTypeChooserTitle').exists()).toBeFalsy(); + expect(wrapper.exists('[data-test-subj="queryEsqlEditor"]')).toBeTruthy(); + + await act(async () => { + findTestSubject(wrapper, 'queryFormTypeChooserCancel').simulate('click'); + }); + wrapper = await wrapper.update(); + expect(wrapper.exists('[data-test-subj="queryEsqlEditor"]')).toBeFalsy(); + expect(findTestSubject(wrapper, 'queryFormTypeChooserTitle').exists()).toBeTruthy(); + }); + test('should render QueryDSL view without the form type chooser', async () => { let wrapper: ReactWrapper; await act(async () => { @@ -282,4 +335,19 @@ describe('EsQueryRuleTypeExpression', () => { expect(findTestSubject(wrapper!, 'queryFormTypeChooserCancel').exists()).toBeFalsy(); expect(findTestSubject(wrapper!, 'selectDataViewExpression').exists()).toBeTruthy(); }); + + test('should render ESQL view without the form type chooser', async () => { + let wrapper: ReactWrapper; + await act(async () => { + wrapper = setup(defaultEsqlRuleParams, { + adHocDataViewList: [], + isManagementPage: false, + }); + wrapper = await wrapper.update(); + }); + wrapper = await wrapper!.update(); + expect(findTestSubject(wrapper!, 'queryFormTypeChooserTitle').exists()).toBeFalsy(); + expect(findTestSubject(wrapper!, 'queryFormTypeChooserCancel').exists()).toBeFalsy(); + expect(wrapper.exists('[data-test-subj="queryEsqlEditor"]')).toBeTruthy(); + }); }); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.tsx index 30045fee81a29..1653799a233df 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/expression.tsx @@ -15,8 +15,9 @@ import { EsQueryRuleParams, EsQueryRuleMetaData, SearchType } from '../types'; import { SearchSourceExpression, SearchSourceExpressionProps } from './search_source_expression'; import { EsQueryExpression } from './es_query_expression'; import { QueryFormTypeChooser } from './query_form_type_chooser'; -import { isSearchSourceRule } from '../util'; +import { isEsqlQueryRule, isSearchSourceRule } from '../util'; import { ALL_EXPRESSION_ERROR_KEYS } from '../constants'; +import { EsqlQueryExpression } from './esql_query_expression'; function areSearchSourceExpressionPropsEqual( prevProps: Readonly>, @@ -37,6 +38,7 @@ export const EsQueryRuleTypeExpression: React.FunctionComponent< > = (props) => { const { ruleParams, errors, setRuleProperty, setRuleParams } = props; const isSearchSource = isSearchSourceRule(ruleParams); + const isEsqlQuery = isEsqlQueryRule(ruleParams); // metadata provided only when open alert from Discover page const isManagementPage = props.metadata?.isManagementPage ?? true; @@ -95,10 +97,14 @@ export const EsQueryRuleTypeExpression: React.FunctionComponent< )} - {ruleParams.searchType && !isSearchSource && ( + {ruleParams.searchType && !isSearchSource && !isEsqlQuery && ( )} + {ruleParams.searchType && isEsqlQuery && ( + + )} + ); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx index bff6792bdda3f..a2d45c78de9c9 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EuiButtonIcon, EuiFlexGroup, @@ -19,39 +19,7 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { SearchType } from '../types'; - -const FORM_TYPE_ITEMS: Array<{ formType: SearchType; label: string; description: string }> = [ - { - formType: SearchType.searchSource, - label: i18n.translate( - 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.kqlOrLuceneFormTypeLabel', - { - defaultMessage: 'KQL or Lucene', - } - ), - description: i18n.translate( - 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.kqlOrLuceneFormTypeDescription', - { - defaultMessage: 'Use KQL or Lucene to define a text-based query.', - } - ), - }, - { - formType: SearchType.esQuery, - label: i18n.translate( - 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.queryDslFormTypeLabel', - { - defaultMessage: 'Query DSL', - } - ), - description: i18n.translate( - 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.queryDslFormTypeDescription', - { - defaultMessage: 'Use the Elasticsearch Query DSL to define a query.', - } - ), - }, -]; +import { useTriggerUiActionServices } from '../util'; export interface QueryFormTypeProps { searchType: SearchType | null; @@ -62,8 +30,65 @@ export const QueryFormTypeChooser: React.FC = ({ searchType, onFormTypeSelect, }) => { + const { uiSettings } = useTriggerUiActionServices(); + const isEsqlEnabled = uiSettings?.get('discover:enableESQL'); + + const formTypeItems = useMemo(() => { + const items: Array<{ formType: SearchType; label: string; description: string }> = [ + { + formType: SearchType.searchSource, + label: i18n.translate( + 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.kqlOrLuceneFormTypeLabel', + { + defaultMessage: 'KQL or Lucene', + } + ), + description: i18n.translate( + 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.kqlOrLuceneFormTypeDescription', + { + defaultMessage: 'Use KQL or Lucene to define a text-based query.', + } + ), + }, + { + formType: SearchType.esQuery, + label: i18n.translate( + 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.queryDslFormTypeLabel', + { + defaultMessage: 'Query DSL', + } + ), + description: i18n.translate( + 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.queryDslFormTypeDescription', + { + defaultMessage: 'Use the Elasticsearch Query DSL to define a query.', + } + ), + }, + ]; + + if (isEsqlEnabled) { + items.push({ + formType: SearchType.esqlQuery, + label: i18n.translate( + 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.esqlFormTypeLabel', + { + defaultMessage: 'ESQL', + } + ), + description: i18n.translate( + 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.esqlFormTypeDescription', + { + defaultMessage: 'Use ESQL to define a text-based query.', + } + ), + }); + } + return items; + }, [isEsqlEnabled]); + if (searchType) { - const activeFormTypeItem = FORM_TYPE_ITEMS.find((item) => item.formType === searchType); + const activeFormTypeItem = formTypeItems.find((item) => item.formType === searchType); return ( <> @@ -107,7 +132,7 @@ export const QueryFormTypeChooser: React.FC = ({ - {FORM_TYPE_ITEMS.map((item) => ( + {formTypeItems.map((item) => ( Promise<{ @@ -27,14 +29,24 @@ export interface TestQueryRowProps { }>; copyQuery?: () => string; hasValidationErrors: boolean; + showTable?: boolean; } export const TestQueryRow: React.FC = ({ fetch, copyQuery, hasValidationErrors, + showTable, }) => { - const { onTestQuery, testQueryResult, testQueryError, testQueryLoading } = useTestQuery(fetch); + const { + onTestQuery, + testQueryResult, + testQueryError, + testQueryLoading, + testQueryRawResults, + testQueryAlerts, + } = useTestQuery(fetch); + const [copiedMessage, setCopiedMessage] = useState(null); return ( @@ -124,6 +136,12 @@ export const TestQueryRow: React.FC = ({ )} + {showTable && testQueryRawResults && ( + <> + + + + )} ); }; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.test.tsx new file mode 100644 index 0000000000000..54b575be36f11 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.test.tsx @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; 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 { I18nProvider } from '@kbn/i18n-react'; +import { TestQueryRowTable } from './test_query_row_table'; + +const AppWrapper: React.FC<{ children: React.ReactElement }> = React.memo(({ children }) => ( + {children} +)); + +describe('TestQueryRow', () => { + it('should render the datagrid', () => { + const result = render( + , + { + wrapper: AppWrapper, + } + ); + + expect(result.getByTestId('test-query-row-datagrid')).toBeInTheDocument(); + expect(result.getAllByTestId('dataGridRowCell')).toHaveLength(2); + expect(result.queryByText('Alerts generated')).not.toBeInTheDocument(); + expect(result.queryAllByTestId('alert-badge')).toHaveLength(0); + }); + + it('should render the datagrid and alerts if provided', () => { + const result = render( + , + { + wrapper: AppWrapper, + } + ); + + expect(result.getByTestId('test-query-row-datagrid')).toBeInTheDocument(); + expect(result.getAllByTestId('dataGridRowCell')).toHaveLength(2); + expect(result.getByText('Alerts generated')).toBeInTheDocument(); + expect(result.getAllByTestId('alert-badge')).toHaveLength(2); + }); +}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.tsx new file mode 100644 index 0000000000000..504880ee8da43 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.tsx @@ -0,0 +1,90 @@ +/* + * Copyright 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 { css } from '@emotion/react'; +import { + EuiDataGrid, + EuiPanel, + EuiDataGridColumn, + EuiFlexGroup, + EuiFlexItem, + EuiText, + EuiBadge, + EuiSpacer, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +const styles = { + grid: css` + .euiDataGridHeaderCell { + background: none; + } + .euiDataGridHeader .euiDataGridHeaderCell { + border-top: none; + } + `, +}; + +export interface TestQueryRowTableProps { + rawResults: { cols: EuiDataGridColumn[]; rows: Array> }; + alerts: string[] | null; +} + +export const TestQueryRowTable: React.FC = ({ rawResults, alerts }) => { + return ( + + c.id), + setVisibleColumns: () => {}, + }} + rowCount={rawResults.rows.length} + gridStyle={{ + border: 'horizontal', + rowHover: 'none', + }} + renderCellValue={({ rowIndex, columnId }) => rawResults.rows[rowIndex][columnId]} + pagination={{ + pageIndex: 0, + pageSize: 10, + onChangeItemsPerPage: () => {}, + onChangePage: () => {}, + }} + toolbarVisibility={false} + /> + + {alerts && ( + + + +
+ {i18n.translate('xpack.stackAlerts.esQuery.ui.testQueryAlerts', { + defaultMessage: 'Alerts generated', + })} +
+
+
+ {alerts.map((alert, index) => { + return ( + + + {alert} + + + ); + })} +
+ )} +
+ ); +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts index 2067bf816eff7..44c2a1cf55717 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts @@ -20,6 +20,10 @@ describe('useTestQuery', () => { }, isGrouped: false, timeWindow: '1s', + rawResults: { + cols: [{ id: 'ungrouped', name: 'ungrouped', field: 'ungrouped', actions: false }], + rows: [{ ungrouped: 'test' }], + }, }), }); await act(async () => { @@ -29,6 +33,11 @@ describe('useTestQuery', () => { expect(result.current.testQueryError).toBe(null); expect(result.current.testQueryResult).toContain('1s'); expect(result.current.testQueryResult).toContain('1 document'); + expect(result.current.testQueryRawResults).toEqual({ + cols: [{ id: 'ungrouped', name: 'ungrouped', field: 'ungrouped', actions: false }], + rows: [{ ungrouped: 'test' }], + }); + expect(result.current.testQueryAlerts).toEqual(['query matched']); }); test('returning a valid result for grouped result', async () => { @@ -44,6 +53,10 @@ describe('useTestQuery', () => { }, isGrouped: true, timeWindow: '1s', + rawResults: { + cols: [{ id: 'grouped', name: 'grouped', field: 'grouped', actions: false }], + rows: [{ grouped: 'test' }], + }, }), }); await act(async () => { @@ -55,6 +68,11 @@ describe('useTestQuery', () => { expect(result.current.testQueryResult).toContain( 'Grouped query matched 2 groups in the last 1s.' ); + expect(result.current.testQueryRawResults).toEqual({ + cols: [{ id: 'grouped', name: 'grouped', field: 'grouped', actions: false }], + rows: [{ grouped: 'test' }], + }); + expect(result.current.testQueryAlerts).toEqual(['a', 'b']); }); test('returning an error', async () => { @@ -68,5 +86,7 @@ describe('useTestQuery', () => { expect(result.current.testQueryLoading).toBe(false); expect(result.current.testQueryError).toContain(errorMsg); expect(result.current.testQueryResult).toBe(null); + expect(result.current.testQueryRawResults).toBe(null); + expect(result.current.testQueryAlerts).toBe(null); }); }); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.ts index 06f230bafdccb..bac58eb2f0f43 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.ts @@ -8,17 +8,22 @@ import { useState, useCallback, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import type { ParsedAggregationResults } from '@kbn/triggers-actions-ui-plugin/common'; +import { EuiDataGridColumn } from '@elastic/eui'; interface TestQueryResponse { result: string | null; error: string | null; isLoading: boolean; + rawResults: { cols: EuiDataGridColumn[]; rows: Array> } | null; + alerts: string[] | null; } const TEST_QUERY_INITIAL_RESPONSE: TestQueryResponse = { result: null, error: null, isLoading: false, + rawResults: null, + alerts: null, }; /** @@ -30,6 +35,7 @@ export function useTestQuery( testResults: ParsedAggregationResults; isGrouped: boolean; timeWindow: string; + rawResults?: { cols: EuiDataGridColumn[]; rows: Array> }; }> ) { const [testQueryResponse, setTestQueryResponse] = useState( @@ -46,10 +52,12 @@ export function useTestQuery( result: null, error: null, isLoading: true, + rawResults: null, + alerts: null, }); try { - const { testResults, isGrouped, timeWindow } = await fetch(); + const { testResults, isGrouped, timeWindow, rawResults } = await fetch(); if (isGrouped) { setTestQueryResponse({ @@ -62,6 +70,11 @@ export function useTestQuery( }), error: null, isLoading: false, + rawResults: rawResults ?? null, + alerts: + testResults.results.length > 0 + ? testResults.results.map((result) => result.group) + : null, }); } else { const ungroupedQueryResponse = @@ -73,6 +86,8 @@ export function useTestQuery( }), error: null, isLoading: false, + rawResults: rawResults ?? null, + alerts: ungroupedQueryResponse.count > 0 ? ['query matched'] : null, }); } } catch (err) { @@ -85,6 +100,8 @@ export function useTestQuery( values: { message: message ? `${err.message}: ${message}` : err.message }, }), isLoading: false, + rawResults: null, + alerts: null, }); } }, [fetch]); @@ -94,5 +111,7 @@ export function useTestQuery( testQueryResult: testQueryResponse.result, testQueryError: testQueryResponse.error, testQueryLoading: testQueryResponse.isLoading, + testQueryRawResults: testQueryResponse.rawResults, + testQueryAlerts: testQueryResponse.alerts, }; } diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts index d517d23af52b3..c7a298ebce22a 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts @@ -9,10 +9,12 @@ import { RuleTypeParams } from '@kbn/alerting-plugin/common'; import { SerializedSearchSourceFields } from '@kbn/data-plugin/common'; import { EuiComboBoxOptionOption } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; +import { AggregateQuery } from '@kbn/es-query'; export enum SearchType { esQuery = 'esQuery', searchSource = 'searchSource', + esqlQuery = 'esqlQuery', } export interface CommonRuleParams { @@ -38,6 +40,8 @@ export interface EsQueryRuleMetaData { export type EsQueryRuleParams = T extends SearchType.searchSource ? CommonEsQueryRuleParams & OnlySearchSourceRuleParams + : T extends SearchType.esqlQuery + ? CommonEsQueryRuleParams & OnlyEsqlQueryRuleParams : CommonEsQueryRuleParams & OnlyEsQueryRuleParams; export interface OnlyEsQueryRuleParams { @@ -53,4 +57,10 @@ export interface OnlySearchSourceRuleParams { savedQueryId?: string; } +export interface OnlyEsqlQueryRuleParams { + searchType?: 'esqlQuery'; + esqlQuery: AggregateQuery; + timeField: string; +} + export type DataViewOption = EuiComboBoxOptionOption; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/util.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/util.ts index 5568924e845e4..7ca42220c3ebf 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/util.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/util.ts @@ -17,6 +17,12 @@ export const isSearchSourceRule = ( return ruleParams.searchType === 'searchSource'; }; +export const isEsqlQueryRule = ( + ruleParams: EsQueryRuleParams +): ruleParams is EsQueryRuleParams => { + return ruleParams.searchType === 'esqlQuery'; +}; + export const convertFieldSpecToFieldOption = (fieldSpec: FieldSpec[]): FieldOption[] => { return (fieldSpec ?? []) .filter((spec: FieldSpec) => spec.isMapped || spec.runtimeField) diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts index 0b40110f60072..f43adeab3a3a8 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts @@ -278,4 +278,63 @@ describe('expression params validation', () => { expect(validateExpression(initialParams).errors.size.length).toBe(0); expect(hasExpressionValidationErrors(initialParams)).toBe(false); }); + + test('if esqlQuery property is not set should return proper error message', () => { + const initialParams = { + size: 100, + timeWindowSize: 1, + timeWindowUnit: 's', + threshold: [0], + timeField: '@timestamp', + searchType: SearchType.esqlQuery, + } as EsQueryRuleParams; + expect(validateExpression(initialParams).errors.esqlQuery.length).toBeGreaterThan(0); + expect(validateExpression(initialParams).errors.esqlQuery[0]).toBe(`ESQL query is required.`); + }); + + test('if esqlQuery timeField property is not defined should return proper error message', () => { + const initialParams = { + size: 100, + timeWindowSize: 1, + timeWindowUnit: 's', + threshold: [0], + esqlQuery: { esql: 'test' }, + searchType: SearchType.esqlQuery, + } as EsQueryRuleParams; + expect(validateExpression(initialParams).errors.timeField.length).toBeGreaterThan(0); + expect(validateExpression(initialParams).errors.timeField[0]).toBe('Time field is required.'); + }); + + test('if esqlQuery thresholdComparator property is not gt should return proper error message', () => { + const initialParams = { + size: 100, + timeWindowSize: 1, + timeWindowUnit: 's', + threshold: [0], + esqlQuery: { esql: 'test' }, + searchType: SearchType.esqlQuery, + thresholdComparator: '<', + timeField: '@timestamp', + } as EsQueryRuleParams; + expect(validateExpression(initialParams).errors.thresholdComparator.length).toBeGreaterThan(0); + expect(validateExpression(initialParams).errors.thresholdComparator[0]).toBe( + 'Threshold comparator is required to be greater than.' + ); + }); + + test('if esqlQuery threshold property is not 0 should return proper error message', () => { + const initialParams = { + size: 100, + timeWindowSize: 1, + timeWindowUnit: 's', + threshold: [8], + esqlQuery: { esql: 'test' }, + searchType: SearchType.esqlQuery, + timeField: '@timestamp', + } as EsQueryRuleParams; + expect(validateExpression(initialParams).errors.threshold0.length).toBeGreaterThan(0); + expect(validateExpression(initialParams).errors.threshold0[0]).toBe( + 'Threshold is required to be 0.' + ); + }); }); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts index 9e6eaeb7b6de0..7d7c34a76927c 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts @@ -12,11 +12,13 @@ import { builtInComparators, builtInAggregationTypes, builtInGroupByTypes, + COMPARATORS, } from '@kbn/triggers-actions-ui-plugin/public'; import { EsQueryRuleParams, SearchType } from './types'; -import { isSearchSourceRule } from './util'; +import { isEsqlQueryRule, isSearchSourceRule } from './util'; import { COMMON_EXPRESSION_ERRORS, + ONLY_ESQL_QUERY_EXPRESSION_ERRORS, ONLY_ES_QUERY_EXPRESSION_ERRORS, SEARCH_SOURCE_ONLY_EXPRESSION_ERRORS, } from './constants'; @@ -221,6 +223,46 @@ const validateEsQueryParams = (ruleParams: EsQueryRuleParams return errors; }; +const validateEsqlQueryParams = (ruleParams: EsQueryRuleParams) => { + const errors: typeof ONLY_ESQL_QUERY_EXPRESSION_ERRORS = defaultsDeep( + {}, + ONLY_ESQL_QUERY_EXPRESSION_ERRORS + ); + if (!ruleParams.esqlQuery) { + errors.esqlQuery.push( + i18n.translate('xpack.stackAlerts.esqlQuery.ui.validation.error.requiredQueryText', { + defaultMessage: 'ESQL query is required.', + }) + ); + } + if (!ruleParams.timeField) { + errors.timeField.push( + i18n.translate('xpack.stackAlerts.esqlQuery.ui.validation.error.requiredTimeFieldText', { + defaultMessage: 'Time field is required.', + }) + ); + } + if (ruleParams.thresholdComparator !== COMPARATORS.GREATER_THAN) { + errors.thresholdComparator.push( + i18n.translate( + 'xpack.stackAlerts.esqlQuery.ui.validation.error.requiredThresholdComparatorText', + { + defaultMessage: 'Threshold comparator is required to be greater than.', + } + ) + ); + } + if (ruleParams.threshold && ruleParams.threshold[0] !== 0) { + errors.threshold0.push( + i18n.translate('xpack.stackAlerts.esqlQuery.ui.validation.error.requiredThreshold0Text', { + defaultMessage: 'Threshold is required to be 0.', + }) + ); + } + + return errors; +}; + export const validateExpression = (ruleParams: EsQueryRuleParams): ValidationResult => { const validationResult = { errors: {} }; @@ -234,8 +276,7 @@ export const validateExpression = (ruleParams: EsQueryRuleParams): ValidationRes * It's important to report searchSource rule related errors only into errors.searchConfiguration prop. * For example errors.index is a mistake to report searchSource rule related errors. It will lead to issues. */ - const isSearchSource = isSearchSourceRule(ruleParams); - if (isSearchSource) { + if (isSearchSourceRule(ruleParams)) { validationResult.errors = { ...validationResult.errors, ...validateSearchSourceParams(ruleParams), @@ -243,6 +284,14 @@ export const validateExpression = (ruleParams: EsQueryRuleParams): ValidationRes return validationResult; } + if (isEsqlQueryRule(ruleParams)) { + validationResult.errors = { + ...validationResult.errors, + ...validateEsqlQueryParams(ruleParams), + }; + return validationResult; + } + const esQueryErrors = validateEsQueryParams(ruleParams as EsQueryRuleParams); validationResult.errors = { ...validationResult.errors, ...esQueryErrors }; return validationResult; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts index 9936e63aa6ed1..f9f4ab51b660f 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts @@ -167,6 +167,7 @@ describe('getContextConditionsDescription', () => { comparator: Comparator.GT, threshold: [10], aggType: 'count', + searchType: 'esQuery', }); expect(result).toBe(`Number of matching documents is greater than 10`); }); @@ -177,6 +178,7 @@ describe('getContextConditionsDescription', () => { threshold: [10], aggType: 'count', isRecovered: true, + searchType: 'esQuery', }); expect(result).toBe(`Number of matching documents is NOT greater than 10`); }); @@ -187,6 +189,7 @@ describe('getContextConditionsDescription', () => { threshold: [10, 20], aggType: 'count', isRecovered: true, + searchType: 'esQuery', }); expect(result).toBe(`Number of matching documents is NOT between 10 and 20`); }); @@ -197,6 +200,7 @@ describe('getContextConditionsDescription', () => { threshold: [10], aggType: 'count', group: 'host-1', + searchType: 'esQuery', }); expect(result).toBe(`Number of matching documents for group "host-1" is greater than 10`); }); @@ -208,6 +212,7 @@ describe('getContextConditionsDescription', () => { aggType: 'count', isRecovered: true, group: 'host-1', + searchType: 'esQuery', }); expect(result).toBe(`Number of matching documents for group "host-1" is NOT greater than 10`); }); @@ -218,6 +223,7 @@ describe('getContextConditionsDescription', () => { threshold: [10], aggType: 'min', aggField: 'numericField', + searchType: 'esQuery', }); expect(result).toBe( `Number of matching documents where min of numericField is greater than 10` @@ -231,6 +237,7 @@ describe('getContextConditionsDescription', () => { aggType: 'min', aggField: 'numericField', isRecovered: true, + searchType: 'esQuery', }); expect(result).toBe( `Number of matching documents where min of numericField is NOT greater than 10` @@ -244,6 +251,7 @@ describe('getContextConditionsDescription', () => { group: 'host-1', aggType: 'max', aggField: 'numericField', + searchType: 'esQuery', }); expect(result).toBe( `Number of matching documents for group "host-1" where max of numericField is greater than 10` @@ -258,9 +266,31 @@ describe('getContextConditionsDescription', () => { group: 'host-1', aggType: 'max', aggField: 'numericField', + searchType: 'esQuery', }); expect(result).toBe( `Number of matching documents for group "host-1" where max of numericField is NOT greater than 10` ); }); + + it('should return conditions correctly for ESQL search type', () => { + const result = getContextConditionsDescription({ + comparator: Comparator.GT, + threshold: [0], + aggType: 'count', + searchType: 'esqlQuery', + }); + expect(result).toBe(`Query matched documents`); + }); + + it('should return conditions correctly ESQL search type when isRecovered is true', () => { + const result = getContextConditionsDescription({ + comparator: Comparator.GT, + threshold: [0], + aggType: 'count', + isRecovered: true, + searchType: 'esqlQuery', + }); + expect(result).toBe(`Query did NOT match documents`); + }); }); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts index b84601314fbdd..5de1fc15c1120 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts @@ -11,6 +11,7 @@ import { AlertInstanceContext } from '@kbn/alerting-plugin/server'; import { EsQueryRuleParams } from './rule_type_params'; import { Comparator } from '../../../common/comparator_types'; import { getHumanReadableComparator } from '../../../common'; +import { isEsqlQueryRule } from './util'; // rule type context provided to actions export interface ActionContext extends EsQueryRuleActionContext { @@ -79,6 +80,7 @@ export function addMessages({ } interface GetContextConditionsDescriptionOpts { + searchType: 'searchSource' | 'esQuery' | 'esqlQuery'; comparator: Comparator; threshold: number[]; aggType: string; @@ -88,6 +90,7 @@ interface GetContextConditionsDescriptionOpts { } export function getContextConditionsDescription({ + searchType, comparator, threshold, aggType, @@ -95,15 +98,23 @@ export function getContextConditionsDescription({ isRecovered = false, group, }: GetContextConditionsDescriptionOpts) { - return i18n.translate('xpack.stackAlerts.esQuery.alertTypeContextConditionsDescription', { - defaultMessage: - 'Number of matching documents{groupCondition}{aggCondition} is {negation}{thresholdComparator} {threshold}', - values: { - aggCondition: aggType === 'count' ? '' : ` where ${aggType} of ${aggField}`, - groupCondition: group ? ` for group "${group}"` : '', - thresholdComparator: getHumanReadableComparator(comparator), - threshold: threshold.join(' and '), - negation: isRecovered ? 'NOT ' : '', - }, - }); + return isEsqlQueryRule(searchType) + ? i18n.translate('xpack.stackAlerts.esQuery.esqlAlertTypeContextConditionsDescription', { + defaultMessage: 'Query{negation} documents{groupCondition}', + values: { + groupCondition: group ? ` for group "${group}"` : '', + negation: isRecovered ? ' did NOT match' : ' matched', + }, + }) + : i18n.translate('xpack.stackAlerts.esQuery.alertTypeContextConditionsDescription', { + defaultMessage: + 'Number of matching documents{groupCondition}{aggCondition} is {negation}{thresholdComparator} {threshold}', + values: { + aggCondition: aggType === 'count' ? '' : ` where ${aggType} of ${aggField}`, + groupCondition: group ? ` for group "${group}"` : '', + thresholdComparator: getHumanReadableComparator(comparator), + threshold: threshold.join(' and '), + negation: isRecovered ? 'NOT ' : '', + }, + }); } diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts index c33457fab43b1..43f84acf65e78 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts @@ -17,6 +17,7 @@ import { ISearchStartSearchSource } from '@kbn/data-plugin/common'; import { EsQueryRuleParams } from './rule_type_params'; import { FetchEsQueryOpts } from './lib/fetch_es_query'; import { FetchSearchSourceQueryOpts } from './lib/fetch_search_source_query'; +import { FetchEsqlQueryOpts } from './lib/fetch_esql_query'; const logger = loggerMock.create(); const scopedClusterClientMock = elasticsearchServiceMock.createScopedClusterClient(); @@ -44,6 +45,10 @@ jest.mock('./lib/fetch_search_source_query', () => ({ fetchSearchSourceQuery: (...args: [FetchSearchSourceQueryOpts]) => mockFetchSearchSourceQuery(...args), })); +const mockFetchEsqlQuery = jest.fn(); +jest.mock('./lib/fetch_esql_query', () => ({ + fetchEsqlQuery: (...args: [FetchEsqlQueryOpts]) => mockFetchEsqlQuery(...args), +})); const mockGetRecoveredAlerts = jest.fn().mockReturnValue([]); const mockSetLimitReached = jest.fn(); @@ -86,6 +91,8 @@ describe('es_query executor', () => { excludeHitsFromPreviousRun: true, aggType: 'count', groupBy: 'all', + searchConfiguration: {}, + esqlQuery: { esql: 'test-query' }, }; describe('executor', () => { @@ -171,12 +178,12 @@ describe('es_query executor', () => { }); await executor(coreMock, { ...defaultExecutorOptions, - params: { ...defaultProps, searchConfiguration: {}, searchType: 'searchSource' }, + params: { ...defaultProps, searchType: 'searchSource' }, }); expect(mockFetchSearchSourceQuery).toHaveBeenCalledWith({ ruleId: 'test-rule-id', alertLimit: 1000, - params: { ...defaultProps, searchConfiguration: {}, searchType: 'searchSource' }, + params: { ...defaultProps, searchType: 'searchSource' }, latestTimestamp: undefined, services: { searchSourceClient: searchSourceClientMock, @@ -188,6 +195,42 @@ describe('es_query executor', () => { expect(mockFetchEsQuery).not.toHaveBeenCalled(); }); + it('should call fetchEsqlQuery if searchType is esqlQuery', async () => { + mockFetchEsqlQuery.mockResolvedValueOnce({ + parsedResults: { + results: [ + { + group: 'all documents', + count: 491, + hits: [], + }, + ], + truncated: false, + }, + dateStart: new Date().toISOString(), + dateEnd: new Date().toISOString(), + }); + await executor(coreMock, { + ...defaultExecutorOptions, + params: { ...defaultProps, searchType: 'esqlQuery' }, + }); + expect(mockFetchEsqlQuery).toHaveBeenCalledWith({ + ruleId: 'test-rule-id', + alertLimit: 1000, + params: { ...defaultProps, searchType: 'esqlQuery' }, + services: { + scopedClusterClient: scopedClusterClientMock, + logger, + share: undefined, + dataViews: undefined, + }, + spacePrefix: '', + publicBaseUrl: 'https://localhost:5601', + }); + expect(mockFetchEsQuery).not.toHaveBeenCalled(); + expect(mockFetchSearchSourceQuery).not.toHaveBeenCalled(); + }); + it('should not create alert if compare function returns false for ungrouped alert', async () => { mockFetchEsQuery.mockResolvedValueOnce({ parsedResults: { @@ -455,6 +498,78 @@ describe('es_query executor', () => { expect(mockSetLimitReached).toHaveBeenCalledWith(false); }); + it('should create alert if there are hits for ESQL alert', async () => { + mockFetchEsqlQuery.mockResolvedValueOnce({ + parsedResults: { + results: [ + { + group: 'all documents', + count: 198, + hits: [], + }, + ], + truncated: false, + }, + dateStart: new Date().toISOString(), + dateEnd: new Date().toISOString(), + link: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + }); + await executor(coreMock, { + ...defaultExecutorOptions, + params: { + ...defaultProps, + searchType: 'esqlQuery', + threshold: [0], + thresholdComparator: '>=' as Comparator, + }, + }); + + expect(mockReport).toHaveBeenCalledTimes(1); + expect(mockReport).toHaveBeenNthCalledWith(1, { + actionGroup: 'query matched', + context: { + conditions: 'Query matched documents', + date: new Date(mockNow).toISOString(), + hits: [], + link: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + message: `rule 'test-rule-name' is active: + +- Value: 198 +- Conditions Met: Query matched documents over 5m +- Timestamp: ${new Date(mockNow).toISOString()} +- Link: https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id`, + title: "rule 'test-rule-name' matched query", + value: 198, + }, + id: 'query matched', + payload: { + kibana: { + alert: { + evaluation: { + conditions: 'Query matched documents', + value: 198, + }, + reason: `rule 'test-rule-name' is active: + +- Value: 198 +- Conditions Met: Query matched documents over 5m +- Timestamp: ${new Date(mockNow).toISOString()} +- Link: https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id`, + title: "rule 'test-rule-name' matched query", + url: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + }, + }, + }, + state: { + dateEnd: new Date(mockNow).toISOString(), + dateStart: new Date(mockNow).toISOString(), + latestTimestamp: undefined, + }, + }); + expect(mockSetLimitReached).toHaveBeenCalledTimes(1); + expect(mockSetLimitReached).toHaveBeenCalledWith(false); + }); + it('should set limit as reached if results are truncated', async () => { mockFetchEsQuery.mockResolvedValueOnce({ parsedResults: { @@ -670,6 +785,74 @@ describe('es_query executor', () => { - Value: 0 - Conditions Met: Number of matching documents for group \"host-2\" is NOT greater than or equal to 200 over 5m - Timestamp: ${new Date(mockNow).toISOString()} +- Link: https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id`, + title: "rule 'test-rule-name' recovered", + url: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + }, + }, + }, + }); + expect(mockSetLimitReached).toHaveBeenCalledTimes(1); + expect(mockSetLimitReached).toHaveBeenCalledWith(false); + }); + + it('should correctly handle recovered alerts for ESQL alert', async () => { + mockGetRecoveredAlerts.mockReturnValueOnce([ + { + alert: { + getId: () => 'query matched', + }, + }, + ]); + mockFetchEsqlQuery.mockResolvedValueOnce({ + parsedResults: { + results: [], + truncated: false, + }, + dateStart: new Date().toISOString(), + dateEnd: new Date().toISOString(), + link: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + }); + await executor(coreMock, { + ...defaultExecutorOptions, + params: { + ...defaultProps, + searchType: 'esqlQuery', + threshold: [0], + thresholdComparator: '>=' as Comparator, + }, + }); + + expect(mockReport).not.toHaveBeenCalled(); + expect(mockSetAlertData).toHaveBeenCalledTimes(1); + expect(mockSetAlertData).toHaveBeenNthCalledWith(1, { + id: 'query matched', + context: { + conditions: 'Query did NOT match documents', + date: new Date(mockNow).toISOString(), + hits: [], + link: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + message: `rule 'test-rule-name' is recovered: + +- Value: 0 +- Conditions Met: Query did NOT match documents over 5m +- Timestamp: ${new Date(mockNow).toISOString()} +- Link: https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id`, + title: "rule 'test-rule-name' recovered", + value: 0, + }, + payload: { + kibana: { + alert: { + evaluation: { + conditions: 'Query did NOT match documents', + value: 0, + }, + reason: `rule 'test-rule-name' is recovered: + +- Value: 0 +- Conditions Met: Query did NOT match documents over 5m +- Timestamp: ${new Date(mockNow).toISOString()} - Link: https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id`, title: "rule 'test-rule-name' recovered", url: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', 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 ae8ae99ba26a2..ac2f619228996 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 @@ -19,15 +19,22 @@ import { EsQueryRuleActionContext, getContextConditionsDescription, } from './action_context'; -import { ExecutorOptions, OnlyEsQueryRuleParams, OnlySearchSourceRuleParams } from './types'; +import { + ExecutorOptions, + OnlyEsQueryRuleParams, + OnlySearchSourceRuleParams, + OnlyEsqlQueryRuleParams, +} from './types'; import { ActionGroupId, ConditionMetAlertInstanceId } from './constants'; import { fetchEsQuery } from './lib/fetch_es_query'; import { EsQueryRuleParams } from './rule_type_params'; import { fetchSearchSourceQuery } from './lib/fetch_search_source_query'; -import { isEsQueryRule } from './util'; +import { isEsqlQueryRule, isSearchSourceRule } from './util'; +import { fetchEsqlQuery } from './lib/fetch_esql_query'; export async function executor(core: CoreSetup, options: ExecutorOptions) { - const esQueryRule = isEsQueryRule(options.params.searchType); + const searchSourceRule = isSearchSourceRule(options.params.searchType); + const esqlQueryRule = isEsqlQueryRule(options.params.searchType); const { rule: { id: ruleId, name }, services, @@ -54,34 +61,47 @@ export async function executor(core: CoreSetup, options: ExecutorOptions = {}; for (const result of parsedResults.results) { const alertId = result.group; @@ -105,6 +125,7 @@ export async function executor(core: CoreSetup, options: ExecutorOptions { + const id = 'test-id'; + const { + type, + version, + attributes: { timeFieldName, fields, title }, + } = stubbedSavedObjectIndexPattern(id); + + return new DataView({ + spec: { id, type, version, timeFieldName, fields: JSON.parse(fields), title }, + fieldFormats: fieldFormatsMock, + shortDotsEnable: false, + metaFields: ['_id', '_type', '_score'], + }); +}; + +const defaultParams: OnlyEsqlQueryRuleParams = { + size: 100, + timeWindowSize: 5, + timeWindowUnit: 'm', + thresholdComparator: Comparator.GT, + threshold: [0], + esqlQuery: { esql: 'from test' }, + excludeHitsFromPreviousRun: false, + searchType: 'esqlQuery', + aggType: 'count', + groupBy: 'all', + timeField: 'time', +}; + +describe('fetchEsqlQuery', () => { + describe('getEsqlQuery', () => { + const dataViewMock = createDataView(); + afterAll(() => { + jest.resetAllMocks(); + }); + + const fakeNow = new Date('2020-02-09T23:15:41.941Z'); + + beforeAll(() => { + jest.resetAllMocks(); + global.Date.now = jest.fn(() => fakeNow.getTime()); + }); + + it('should generate the correct query', async () => { + const params = defaultParams; + const { query, dateStart, dateEnd } = getEsqlQuery(dataViewMock, params, undefined); + + expect(query).toMatchInlineSnapshot(` + Object { + "filter": Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "time": Object { + "format": "strict_date_optional_time", + "gt": "2020-02-09T23:10:41.941Z", + "lte": "2020-02-09T23:15:41.941Z", + }, + }, + }, + ], + }, + }, + "query": "from test", + } + `); + expect(dateStart).toMatch('2020-02-09T23:10:41.941Z'); + expect(dateEnd).toMatch('2020-02-09T23:15:41.941Z'); + }); + + it('should generate the correct query with the alertLimit', async () => { + const params = defaultParams; + const { query, dateStart, dateEnd } = getEsqlQuery(dataViewMock, params, 100); + + expect(query).toMatchInlineSnapshot(` + Object { + "filter": Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "time": Object { + "format": "strict_date_optional_time", + "gt": "2020-02-09T23:10:41.941Z", + "lte": "2020-02-09T23:15:41.941Z", + }, + }, + }, + ], + }, + }, + "query": "from test | limit 100", + } + `); + expect(dateStart).toMatch('2020-02-09T23:10:41.941Z'); + expect(dateEnd).toMatch('2020-02-09T23:15:41.941Z'); + }); + }); +}); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts new file mode 100644 index 0000000000000..07192254ca34f --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts @@ -0,0 +1,111 @@ +/* + * Copyright 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 { DataView, DataViewsContract, getTime } from '@kbn/data-plugin/common'; +import { parseAggregationResults } from '@kbn/triggers-actions-ui-plugin/common'; +import { SharePluginStart } from '@kbn/share-plugin/server'; +import { IScopedClusterClient, Logger } from '@kbn/core/server'; +import { OnlyEsqlQueryRuleParams } from '../types'; +import { EsqlTable, toEsQueryHits } from '../../../../common'; + +export interface FetchEsqlQueryOpts { + ruleId: string; + alertLimit: number | undefined; + params: OnlyEsqlQueryRuleParams; + spacePrefix: string; + publicBaseUrl: string; + services: { + logger: Logger; + scopedClusterClient: IScopedClusterClient; + share: SharePluginStart; + dataViews: DataViewsContract; + }; +} + +export async function fetchEsqlQuery({ + ruleId, + alertLimit, + params, + services, + spacePrefix, + publicBaseUrl, +}: FetchEsqlQueryOpts) { + const { logger, scopedClusterClient, dataViews } = services; + const esClient = scopedClusterClient.asCurrentUser; + const dataView = await dataViews.create({ + timeFieldName: params.timeField, + }); + + const { query, dateStart, dateEnd } = getEsqlQuery(dataView, params, alertLimit); + + logger.debug(`ESQL query rule (${ruleId}) query: ${JSON.stringify(query)}`); + + const response = await esClient.transport.request({ + method: 'POST', + path: '/_esql', + body: query, + }); + + const link = `${publicBaseUrl}${spacePrefix}/app/management/insightsAndAlerting/triggersActions/rule/${ruleId}`; + + return { + link, + numMatches: Number(response.values.length), + parsedResults: parseAggregationResults({ + isCountAgg: true, + isGroupAgg: false, + esResult: { + took: 0, + timed_out: false, + _shards: { failed: 0, successful: 0, total: 0 }, + hits: toEsQueryHits(response), + }, + resultLimit: alertLimit, + }), + dateStart, + dateEnd, + }; +} + +export const getEsqlQuery = ( + dataView: DataView, + params: OnlyEsqlQueryRuleParams, + alertLimit: number | undefined +) => { + const timeRange = { + from: `now-${params.timeWindowSize}${params.timeWindowUnit}`, + to: 'now', + }; + const timerangeFilter = getTime(dataView, timeRange); + const dateStart = timerangeFilter?.query.range[params.timeField].gte; + const dateEnd = timerangeFilter?.query.range[params.timeField].lte; + const rangeFilter: unknown[] = [ + { + range: { + [params.timeField]: { + lte: dateEnd, + gt: dateStart, + format: 'strict_date_optional_time', + }, + }, + }, + ]; + + const query = { + query: alertLimit ? `${params.esqlQuery.esql} | limit ${alertLimit}` : params.esqlQuery.esql, + filter: { + bool: { + filter: rangeFilter, + }, + }, + }; + return { + query, + dateStart, + dateEnd, + }; +}; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts index 199aa47240c54..6adb6e092d56f 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts @@ -19,7 +19,11 @@ import type { ESSearchResponse, ESSearchRequest } from '@kbn/es-types'; import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { coreMock } from '@kbn/core/server/mocks'; import { ActionGroupId, ConditionMetAlertInstanceId } from './constants'; -import { OnlyEsQueryRuleParams, OnlySearchSourceRuleParams } from './types'; +import { + OnlyEsqlQueryRuleParams, + OnlyEsQueryRuleParams, + OnlySearchSourceRuleParams, +} from './types'; import { searchSourceInstanceMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import { Comparator } from '../../../common/comparator_types'; import { DEFAULT_FLAPPING_SETTINGS } from '@kbn/alerting-plugin/common/rules_settings'; @@ -108,6 +112,10 @@ describe('ruleType', () => { "description": "The indices the rule queries.", "name": "index", }, + Object { + "description": "ESQL query field used to fetch data from Elasticsearch.", + "name": "esqlQuery", + }, ], } `); @@ -596,10 +604,6 @@ describe('ruleType', () => { groupBy: 'all', }; - afterAll(() => { - jest.resetAllMocks(); - }); - it('validator succeeds with valid search source params', async () => { expect(ruleType.validate.params.validate(defaultParams)).toBeTruthy(); }); @@ -710,6 +714,144 @@ describe('ruleType', () => { ); }); }); + + describe('ESQL query', () => { + const dataViewMock = { + id: 'test-id', + title: 'test-title', + timeFieldName: 'time-field', + fields: [ + { + name: 'message', + type: 'string', + displayName: 'message', + scripted: false, + filterable: false, + aggregatable: false, + }, + { + name: 'timestamp', + type: 'date', + displayName: 'timestamp', + scripted: false, + filterable: false, + aggregatable: false, + }, + ], + toSpec: () => { + return { id: 'test-id', title: 'test-title', timeFieldName: 'timestamp', fields: [] }; + }, + }; + const defaultParams: OnlyEsqlQueryRuleParams = { + size: 100, + timeWindowSize: 5, + timeWindowUnit: 'm', + thresholdComparator: Comparator.GT, + threshold: [0], + esqlQuery: { esql: 'test' }, + timeField: 'timestamp', + searchType: 'esqlQuery', + excludeHitsFromPreviousRun: true, + aggType: 'count', + groupBy: 'all', + }; + + it('validator succeeds with valid ESQL query params', async () => { + expect(ruleType.validate.params.validate(defaultParams)).toBeTruthy(); + }); + + it('validator fails with invalid ESQL query params - esQuery provided', async () => { + const paramsSchema = ruleType.validate.params; + const params: Partial> = { + size: 100, + timeWindowSize: 5, + timeWindowUnit: 'm', + thresholdComparator: Comparator.LT, + threshold: [0], + esQuery: '', + searchType: 'esqlQuery', + aggType: 'count', + groupBy: 'all', + }; + + expect(() => paramsSchema.validate(params)).toThrowErrorMatchingInlineSnapshot( + `"[esQuery]: a value wasn't expected to be present"` + ); + }); + + it('rule executor handles no documents returned by ES', async () => { + const params = defaultParams; + const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); + + (ruleServices.dataViews.create as jest.Mock).mockResolvedValueOnce({ + ...dataViewMock.toSpec(), + toSpec: () => dataViewMock.toSpec(), + }); + + const searchResult = { + columns: [ + { name: 'timestamp', type: 'date' }, + { name: 'message', type: 'keyword' }, + ], + values: [], + }; + ruleServices.scopedClusterClient.asCurrentUser.transport.request.mockResolvedValueOnce( + searchResult + ); + + await invokeExecutor({ params, ruleServices }); + expect(ruleServices.alertsClient.report).not.toHaveBeenCalled(); + }); + + it('rule executor schedule actions when condition met', async () => { + const params = defaultParams; + const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); + + (ruleServices.dataViews.create as jest.Mock).mockResolvedValueOnce({ + ...dataViewMock.toSpec(), + toSpec: () => dataViewMock.toSpec(), + }); + + const searchResult = { + columns: [ + { name: 'timestamp', type: 'date' }, + { name: 'message', type: 'keyword' }, + ], + values: [ + ['timestamp', 'message'], + ['timestamp', 'message'], + ['timestamp', 'message'], + ], + }; + ruleServices.scopedClusterClient.asCurrentUser.transport.request.mockResolvedValueOnce( + searchResult + ); + + await invokeExecutor({ params, ruleServices }); + + expect(ruleServices.alertsClient.report).toHaveBeenCalledTimes(1); + + expect(ruleServices.alertsClient.report).toHaveBeenCalledWith( + expect.objectContaining({ + actionGroup: 'query matched', + id: 'query matched', + payload: expect.objectContaining({ + kibana: { + alert: { + url: expect.any(String), + reason: expect.any(String), + title: "rule 'rule-name' matched query", + evaluation: { + conditions: 'Query matched documents', + value: 3, + }, + }, + }, + }), + }) + ); + }); + }); }); function generateResults( @@ -756,7 +898,7 @@ async function invokeExecutor({ ruleServices, state, }: { - params: OnlySearchSourceRuleParams | OnlyEsQueryRuleParams; + params: OnlySearchSourceRuleParams | OnlyEsQueryRuleParams | OnlyEsqlQueryRuleParams; ruleServices: RuleExecutorServicesMock; state?: EsQueryRuleState; }) { 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 01d6ee1497b3c..eabe7bf346669 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 @@ -25,7 +25,7 @@ import { STACK_ALERTS_FEATURE_ID } from '../../../common'; import { ExecutorOptions } from './types'; import { ActionGroupId, ES_QUERY_ID } from './constants'; import { executor } from './executor'; -import { isEsQueryRule } from './util'; +import { isSearchSourceRule } from './util'; export function getRuleType( core: CoreSetup @@ -134,6 +134,13 @@ export function getRuleType( } ); + const actionVariableEsqlQueryLabel = i18n.translate( + 'xpack.stackAlerts.esQuery.actionVariableContextEsqlQueryLabel', + { + defaultMessage: 'ESQL query field used to fetch data from Elasticsearch.', + } + ); + const actionVariableContextLinkLabel = i18n.translate( 'xpack.stackAlerts.esQuery.actionVariableContextLinkLabel', { @@ -179,25 +186,27 @@ export function getRuleType( { name: 'searchConfiguration', description: actionVariableSearchConfigurationLabel }, { name: 'esQuery', description: actionVariableContextQueryLabel }, { name: 'index', description: actionVariableContextIndexLabel }, + { name: 'esqlQuery', description: actionVariableEsqlQueryLabel }, ], }, useSavedObjectReferences: { extractReferences: (params) => { - if (isEsQueryRule(params.searchType)) { - return { params: params as EsQueryRuleParamsExtractedParams, references: [] }; + if (isSearchSourceRule(params.searchType)) { + const [searchConfiguration, references] = extractReferences(params.searchConfiguration); + const newParams = { ...params, searchConfiguration } as EsQueryRuleParamsExtractedParams; + return { params: newParams, references }; } - const [searchConfiguration, references] = extractReferences(params.searchConfiguration); - const newParams = { ...params, searchConfiguration } as EsQueryRuleParamsExtractedParams; - return { params: newParams, references }; + + return { params: params as EsQueryRuleParamsExtractedParams, references: [] }; }, injectReferences: (params, references) => { - if (isEsQueryRule(params.searchType)) { - return params; + if (isSearchSourceRule(params.searchType)) { + return { + ...params, + searchConfiguration: injectReferences(params.searchConfiguration, references), + }; } - return { - ...params, - searchConfiguration: injectReferences(params.searchConfiguration, references), - }; + return params; }, }, minimumLicenseRequired: 'basic', diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts index b9380eeafe304..1897ebad6c1ee 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts @@ -18,6 +18,7 @@ import { SerializedSearchSourceFields } from '@kbn/data-plugin/common'; import { ComparatorFnNames } from '../../../common'; import { Comparator } from '../../../common/comparator_types'; import { getComparatorSchemaType } from '../lib/comparator'; +import { isEsqlQueryRule, isSearchSourceRule } from './util'; export const ES_QUERY_MAX_HITS_PER_EXECUTION = 10000; @@ -50,9 +51,12 @@ const EsQueryRuleParamsSchemaProperties = { termField: schema.maybe(schema.string({ minLength: 1 })), // limit on number of groups returned termSize: schema.maybe(schema.number({ min: 1 })), - searchType: schema.oneOf([schema.literal('searchSource'), schema.literal('esQuery')], { - defaultValue: 'esQuery', - }), + searchType: schema.oneOf( + [schema.literal('searchSource'), schema.literal('esQuery'), schema.literal('esqlQuery')], + { + defaultValue: 'esQuery', + } + ), timeField: schema.conditional( schema.siblingRef('searchType'), schema.literal('esQuery'), @@ -79,6 +83,13 @@ const EsQueryRuleParamsSchemaProperties = { schema.arrayOf(schema.string({ minLength: 1 }), { minSize: 1 }), schema.never() ), + // esqlQuery rule params only + esqlQuery: schema.conditional( + schema.siblingRef('searchType'), + schema.literal('esqlQuery'), + schema.object({ esql: schema.string({ minLength: 1 }) }), + schema.never() + ), }; export const EsQueryRuleParamsSchema = schema.object(EsQueryRuleParamsSchemaProperties, { @@ -142,7 +153,7 @@ function validateParams(anyParams: unknown): string | undefined { } } - if (searchType === 'searchSource') { + if (isSearchSourceRule(searchType) || isEsqlQueryRule(searchType)) { return; } diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/types.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/types.ts index b20f52f03ebe5..5f3ec1ba5e240 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/types.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/types.ts @@ -11,15 +11,26 @@ import { ActionContext } from './action_context'; import { EsQueryRuleParams, EsQueryRuleState } from './rule_type_params'; import { ActionGroupId } from './constants'; -export type OnlyEsQueryRuleParams = Omit & { +export type OnlyEsQueryRuleParams = Omit & { searchType: 'esQuery'; timeField: string; }; -export type OnlySearchSourceRuleParams = Omit & { +export type OnlySearchSourceRuleParams = Omit< + EsQueryRuleParams, + 'esQuery' | 'index' | 'esqlQuery' +> & { searchType: 'searchSource'; }; +export type OnlyEsqlQueryRuleParams = Omit< + EsQueryRuleParams, + 'esQuery' | 'index' | 'searchConfiguration' +> & { + searchType: 'esqlQuery'; + timeField: string; +}; + export type ExecutorOptions

= RuleExecutorOptions< P, EsQueryRuleState, diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/util.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/util.ts index 064a7f64b4c32..d10218fea7d4f 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/util.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/util.ts @@ -8,5 +8,13 @@ import { EsQueryRuleParams } from './rule_type_params'; export function isEsQueryRule(searchType: EsQueryRuleParams['searchType']) { - return searchType !== 'searchSource'; + return searchType === 'esQuery'; +} + +export function isSearchSourceRule(searchType: EsQueryRuleParams['searchType']) { + return searchType === 'searchSource'; +} + +export function isEsqlQueryRule(searchType: EsQueryRuleParams['searchType']) { + return searchType === 'esqlQuery'; } diff --git a/x-pack/plugins/stack_alerts/tsconfig.json b/x-pack/plugins/stack_alerts/tsconfig.json index 207e883aa8902..08a4f0ca99e9c 100644 --- a/x-pack/plugins/stack_alerts/tsconfig.json +++ b/x-pack/plugins/stack_alerts/tsconfig.json @@ -44,6 +44,9 @@ "@kbn/discover-plugin", "@kbn/rule-data-utils", "@kbn/alerts-as-data-utils", + "@kbn/text-based-languages", + "@kbn/text-based-editor", + "@kbn/expressions-plugin", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/triggers_actions_ui/kibana.jsonc b/x-pack/plugins/triggers_actions_ui/kibana.jsonc index 653c105772711..eb660c0bbe383 100644 --- a/x-pack/plugins/triggers_actions_ui/kibana.jsonc +++ b/x-pack/plugins/triggers_actions_ui/kibana.jsonc @@ -24,6 +24,7 @@ "actions", "dashboard", "licensing", + "expressions" ], "optionalPlugins": [ "cloud", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx index 263c13ccd4981..a8d58e2e627f3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx @@ -30,6 +30,7 @@ import { ActionsPublicPluginSetup } from '@kbn/actions-plugin/public'; import { ruleDetailsRoute } from '@kbn/rule-data-utils'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { DashboardStart } from '@kbn/dashboard-plugin/public'; +import { ExpressionsStart } from '@kbn/expressions-plugin/public'; import { suspendedComponentWithProps } from './lib/suspended_component_with_props'; import { ActionTypeRegistryContract, @@ -70,6 +71,7 @@ export interface TriggersAndActionsUiServices extends CoreStart { theme$: Observable; unifiedSearch: UnifiedSearchPublicPluginStart; licensing: LicensingPluginStart; + expressions: ExpressionsStart; } export const renderApp = (deps: TriggersAndActionsUiServices) => { diff --git a/x-pack/plugins/triggers_actions_ui/public/common/index.ts b/x-pack/plugins/triggers_actions_ui/public/common/index.ts index f9b3cc7c8654c..52b39919227ea 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/common/index.ts @@ -24,7 +24,7 @@ export { export { connectorDeprecatedMessage, deprecatedMessage } from './connectors_selection'; export type { IOption } from './index_controls'; export { getFields, getIndexOptions, firstFieldOption } from './index_controls'; -export { getTimeFieldOptions, useKibana } from './lib'; +export { getTimeFieldOptions, getTimeOptions, useKibana } from './lib'; export type { Comparator, AggregationType, diff --git a/x-pack/plugins/triggers_actions_ui/public/common/lib/kibana/kibana_react.mock.ts b/x-pack/plugins/triggers_actions_ui/public/common/lib/kibana/kibana_react.mock.ts index 28e3c29d377b3..5cc996ea997ec 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/lib/kibana/kibana_react.mock.ts +++ b/x-pack/plugins/triggers_actions_ui/public/common/lib/kibana/kibana_react.mock.ts @@ -21,6 +21,7 @@ import { AlertsTableConfigurationRegistryContract, } from '../../../types'; import { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; +import { expressionsPluginMock } from '@kbn/expressions-plugin/public/mocks'; export const createStartServicesMock = (): TriggersAndActionsUiServices => { const core = coreMock.createStart(); @@ -70,6 +71,7 @@ export const createStartServicesMock = (): TriggersAndActionsUiServices => { } as unknown as HTMLElement, theme$: themeServiceMock.createTheme$(), licensing: licensingPluginMock, + expressions: expressionsPluginMock.createStartContract(), } as TriggersAndActionsUiServices; }; diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index 3bc8ef4b9f75b..a13df899ec3cf 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -116,6 +116,7 @@ export { getIndexOptions, firstFieldOption, getTimeFieldOptions, + getTimeOptions, GroupByExpression, COMPARATORS, connectorDeprecatedMessage, diff --git a/x-pack/plugins/triggers_actions_ui/public/plugin.ts b/x-pack/plugins/triggers_actions_ui/public/plugin.ts index 6f66f38e8541a..689d841b9c1f5 100644 --- a/x-pack/plugins/triggers_actions_ui/public/plugin.ts +++ b/x-pack/plugins/triggers_actions_ui/public/plugin.ts @@ -26,6 +26,7 @@ import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/ import { triggersActionsRoute } from '@kbn/rule-data-utils'; import { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { LicensingPluginStart } from '@kbn/licensing-plugin/public'; +import { ExpressionsStart } from '@kbn/expressions-plugin/public'; import type { AlertsSearchBarProps } from './application/sections/alerts_search_bar'; import { TypeRegistry } from './application/type_registry'; @@ -161,6 +162,7 @@ interface PluginsStart { spaces?: SpacesPluginStart; navigateToApp: CoreStart['application']['navigateToApp']; features: FeaturesPluginStart; + expressions: ExpressionsStart; unifiedSearch: UnifiedSearchPublicPluginStart; licensing: LicensingPluginStart; } @@ -287,6 +289,7 @@ export class Plugin alertsTableConfigurationRegistry, kibanaFeatures, licensing: pluginsStart.licensing, + expressions: pluginsStart.expressions, }); }, }); diff --git a/x-pack/plugins/triggers_actions_ui/tsconfig.json b/x-pack/plugins/triggers_actions_ui/tsconfig.json index 42e53b4f313b2..3bfe7239fac2c 100644 --- a/x-pack/plugins/triggers_actions_ui/tsconfig.json +++ b/x-pack/plugins/triggers_actions_ui/tsconfig.json @@ -54,6 +54,7 @@ "@kbn/core-ui-settings-common", "@kbn/dashboard-plugin", "@kbn/licensing-plugin", + "@kbn/expressions-plugin", ], "exclude": ["target/**/*"] } diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts new file mode 100644 index 0000000000000..eee79e38a2dac --- /dev/null +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts @@ -0,0 +1,340 @@ +/* + * Copyright 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 { Spaces } from '../../../../../scenarios'; +import { FtrProviderContext } from '../../../../../../common/ftr_provider_context'; +import { getUrlPrefix, ObjectRemover } from '../../../../../../common/lib'; +import { + createConnector, + ES_GROUPS_TO_WRITE, + ES_TEST_DATA_STREAM_NAME, + ES_TEST_INDEX_REFERENCE, + ES_TEST_INDEX_SOURCE, + ES_TEST_OUTPUT_INDEX_NAME, + getRuleServices, + RULE_INTERVALS_TO_WRITE, + RULE_INTERVAL_MILLIS, + RULE_INTERVAL_SECONDS, + RULE_TYPE_ID, +} from './common'; +import { createDataStream, deleteDataStream } from '../../../create_test_data'; + +// eslint-disable-next-line import/no-default-export +export default function ruleTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const { + es, + esTestIndexTool, + esTestIndexToolOutput, + esTestIndexToolDataStream, + createEsDocumentsInGroups, + removeAllAADDocs, + getAllAADDocs, + } = getRuleServices(getService); + + describe('rule', async () => { + let endDate: string; + let connectorId: string; + const objectRemover = new ObjectRemover(supertest); + + beforeEach(async () => { + await esTestIndexTool.destroy(); + await esTestIndexTool.setup(); + + await esTestIndexToolOutput.destroy(); + await esTestIndexToolOutput.setup(); + + connectorId = await createConnector(supertest, objectRemover, ES_TEST_OUTPUT_INDEX_NAME); + + // write documents in the future, figure out the end date + const endDateMillis = Date.now() + (RULE_INTERVALS_TO_WRITE - 1) * RULE_INTERVAL_MILLIS; + endDate = new Date(endDateMillis).toISOString(); + + await createDataStream(es, ES_TEST_DATA_STREAM_NAME); + }); + + afterEach(async () => { + await objectRemover.removeAll(); + await esTestIndexTool.destroy(); + await esTestIndexToolOutput.destroy(); + await deleteDataStream(es, ES_TEST_DATA_STREAM_NAME); + await removeAllAADDocs(); + }); + + it('runs correctly: threshold on ungrouped hit count < >', async () => { + // write documents from now to the future end date in groups + await createEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); + await createRule({ + name: 'never fire', + esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c < 0', + size: 100, + }); + await createRule({ + name: 'always fire', + esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c > -1', + size: 100, + }); + + const docs = await waitForDocs(2); + const messagePattern = + /rule 'always fire' is active:\n\n- Value: \d+\n- Conditions Met: Query matched documents over 20s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\n- Link:/; + + for (let i = 0; i < docs.length; i++) { + const doc = docs[i]; + const { hits } = doc._source; + const { name, title, message } = doc._source.params; + + expect(name).to.be('always fire'); + expect(title).to.be(`rule 'always fire' matched query`); + expect(message).to.match(messagePattern); + expect(hits).not.to.be.empty(); + } + + const aadDocs = await getAllAADDocs(1); + + const alertDoc = aadDocs.body.hits.hits[0]._source.kibana.alert; + expect(alertDoc.reason).to.match(messagePattern); + expect(alertDoc.title).to.be("rule 'always fire' matched query"); + expect(alertDoc.evaluation.conditions).to.be('Query matched documents'); + expect(alertDoc.evaluation.value).greaterThan(0); + expect(alertDoc.url).to.contain('/s/space1/app/'); + }); + + it('runs correctly: use epoch millis - threshold on hit count < >', async () => { + // write documents from now to the future end date in groups + const endDateMillis = Date.now() + (RULE_INTERVALS_TO_WRITE - 1) * RULE_INTERVAL_MILLIS; + endDate = new Date(endDateMillis).toISOString(); + await createEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); + await createRule({ + name: 'never fire', + esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c < 0', + size: 100, + timeField: 'date_epoch_millis', + }); + await createRule({ + name: 'always fire', + esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c > -1', + size: 100, + timeField: 'date_epoch_millis', + }); + + const docs = await waitForDocs(2); + for (let i = 0; i < docs.length; i++) { + const doc = docs[i]; + const { hits } = doc._source; + const { name, title, message } = doc._source.params; + + expect(name).to.be('always fire'); + expect(title).to.be(`rule 'always fire' matched query`); + const messagePattern = + /rule 'always fire' is active:\n\n- Value: \d+\n- Conditions Met: Query matched documents over 20s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\n- Link:/; + expect(message).to.match(messagePattern); + expect(hits).not.to.be.empty(); + } + }); + + it('runs correctly: no matches', async () => { + await createRule({ + name: 'always fire', + esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c < 1', + size: 100, + }); + + const docs = await waitForDocs(1); + for (let i = 0; i < docs.length; i++) { + const doc = docs[i]; + const { hits } = doc._source; + const { name, title, message } = doc._source.params; + + expect(name).to.be('always fire'); + expect(title).to.be(`rule 'always fire' matched query`); + const messagePattern = + /rule 'always fire' is active:\n\n- Value: \d+\n- Conditions Met: Query matched documents over 20s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\n- Link:/; + expect(message).to.match(messagePattern); + expect(hits).not.to.be.empty(); + } + }); + + it('runs correctly and populates recovery context', async () => { + // This rule should be active initially when the number of documents is below the threshold + // and then recover when we add more documents. + await createRule({ + name: 'fire then recovers', + esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c < 1', + size: 100, + notifyWhen: 'onActionGroupChange', + timeWindowSize: RULE_INTERVAL_SECONDS, + }); + + let docs = await waitForDocs(1); + const activeDoc = docs[0]; + const { + name: activeName, + title: activeTitle, + value: activeValue, + message: activeMessage, + } = activeDoc._source.params; + + expect(activeName).to.be('fire then recovers'); + expect(activeTitle).to.be(`rule 'fire then recovers' matched query`); + expect(activeValue).to.be('1'); + expect(activeMessage).to.match( + /rule 'fire then recovers' is active:\n\n- Value: \d+\n- Conditions Met: Query matched documents over 4s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\n- Link:/ + ); + await createEsDocumentsInGroups(1, endDate); + docs = await waitForDocs(2); + const recoveredDoc = docs[1]; + const { + name: recoveredName, + title: recoveredTitle, + message: recoveredMessage, + } = recoveredDoc._source.params; + + expect(recoveredName).to.be('fire then recovers'); + expect(recoveredTitle).to.be(`rule 'fire then recovers' recovered`); + expect(recoveredMessage).to.match( + /rule 'fire then recovers' is recovered:\n\n- Value: \d+\n- Conditions Met: Query did NOT match documents over 4s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\n- Link:/ + ); + }); + + it('runs correctly over a data stream: threshold on hit count < >', async () => { + // write documents from now to the future end date in groups + await createEsDocumentsInGroups( + ES_GROUPS_TO_WRITE, + endDate, + esTestIndexToolDataStream, + ES_TEST_DATA_STREAM_NAME + ); + await createRule({ + name: 'never fire', + esqlQuery: 'from test-data-stream | stats c = count(@timestamp) | where c < 0', + size: 100, + }); + await createRule({ + name: 'always fire', + esqlQuery: 'from test-data-stream | stats c = count(@timestamp) | where c > -1', + size: 100, + }); + + const docs = await waitForDocs(2); + for (let i = 0; i < docs.length; i++) { + const doc = docs[i]; + const { hits } = doc._source; + const { name, title, message } = doc._source.params; + + expect(name).to.be('always fire'); + expect(title).to.be(`rule 'always fire' matched query`); + const messagePattern = + /rule 'always fire' is active:\n\n- Value: \d+\n- Conditions Met: Query matched documents over 20s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\n- Link:/; + expect(message).to.match(messagePattern); + expect(hits).not.to.be.empty(); + } + }); + + async function waitForDocs(count: number): Promise { + return await esTestIndexToolOutput.waitForDocs( + ES_TEST_INDEX_SOURCE, + ES_TEST_INDEX_REFERENCE, + count + ); + } + + interface CreateRuleParams { + name: string; + size: number; + esqlQuery: string; + timeWindowSize?: number; + timeField?: string; + notifyWhen?: string; + aggType?: string; + aggField?: string; + groupBy?: string; + termField?: string; + termSize?: number; + } + + async function createRule(params: CreateRuleParams): Promise { + const action = { + id: connectorId, + group: 'query matched', + params: { + documents: [ + { + source: ES_TEST_INDEX_SOURCE, + reference: ES_TEST_INDEX_REFERENCE, + params: { + name: '{{{rule.name}}}', + value: '{{{context.value}}}', + title: '{{{context.title}}}', + message: '{{{context.message}}}', + }, + hits: '{{context.hits}}', + date: '{{{context.date}}}', + previousTimestamp: '{{{state.latestTimestamp}}}', + }, + ], + }, + }; + + const recoveryAction = { + id: connectorId, + group: 'recovered', + params: { + documents: [ + { + source: ES_TEST_INDEX_SOURCE, + reference: ES_TEST_INDEX_REFERENCE, + params: { + name: '{{{rule.name}}}', + value: '{{{context.value}}}', + title: '{{{context.title}}}', + message: '{{{context.message}}}', + }, + hits: '{{context.hits}}', + date: '{{{context.date}}}', + }, + ], + }, + }; + + const { body: createdRule } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send({ + name: params.name, + consumer: 'alerts', + enabled: true, + rule_type_id: RULE_TYPE_ID, + schedule: { interval: `${RULE_INTERVAL_SECONDS}s` }, + actions: [action, recoveryAction], + notify_when: params.notifyWhen || 'onActiveAlert', + params: { + size: params.size, + timeWindowSize: params.timeWindowSize || RULE_INTERVAL_SECONDS * 5, + timeWindowUnit: 's', + thresholdComparator: '>', + threshold: [0], + searchType: 'esqlQuery', + aggType: params.aggType, + groupBy: params.groupBy, + aggField: params.aggField, + termField: params.termField, + termSize: params.termSize, + timeField: params.timeField || 'date', + esqlQuery: { esql: params.esqlQuery }, + }, + }) + .expect(200); + + const ruleId = createdRule.id; + objectRemover.add(Spaces.space1.id, ruleId, 'rule', 'alerting'); + + return ruleId; + } + }); +} diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/index.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/index.ts index a584753db7c25..758737d9749b6 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/index.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/index.ts @@ -12,5 +12,6 @@ export default function alertingTests({ loadTestFile }: FtrProviderContext) { describe('es_query', () => { loadTestFile(require.resolve('./rule')); loadTestFile(require.resolve('./query_dsl_only')); + loadTestFile(require.resolve('./esql_only')); }); } From 0fa2223cff970280a10804e90b344398f75771aa Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Tue, 5 Sep 2023 15:12:30 +0100 Subject: [PATCH 14/52] Remove deprecated styles and components from static error pages (#165513) Resolves #160122 ## Summary Remove deprecated styles and components from static error pages ## Screenshot Screenshot 2023-09-01 at 19 45 13 ## Testing - Create a user without any roles and try to login --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 1 + renovate.json | 3 +- .../__snapshots__/prompt_page.test.tsx.snap | 4 +-- .../unauthenticated_page.test.tsx.snap | 4 +-- .../reset_session_page.test.tsx.snap | 4 +-- .../authorization/reset_session_page.tsx | 5 +++ .../plugins/security/server/prompt_page.tsx | 33 +++++++------------ yarn.lock | 2 +- 8 files changed, 26 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 06e36a7baf297..a26b2479e9816 100644 --- a/package.json +++ b/package.json @@ -841,6 +841,7 @@ "core-js": "^3.31.0", "cronstrue": "^1.51.0", "css-box-model": "^1.2.1", + "css.escape": "^1.5.1", "cuid": "^2.1.8", "cytoscape": "^3.10.0", "cytoscape-dagre": "^2.2.2", diff --git a/renovate.json b/renovate.json index cab03197e4c42..7d6ccf6a22c88 100644 --- a/renovate.json +++ b/renovate.json @@ -278,6 +278,7 @@ { "groupName": "platform security modules", "matchPackageNames": [ + "css.escape", "node-forge", "formik", "@types/node-forge", @@ -610,4 +611,4 @@ "enabled": true } ] -} +} \ No newline at end of file diff --git a/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap b/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap index b6e5caaf0d95d..b5486ba5d649d 100644 --- a/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap +++ b/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PromptPage renders as expected with additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; +exports[`PromptPage renders as expected with additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; -exports[`PromptPage renders as expected without additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; +exports[`PromptPage renders as expected without additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; diff --git a/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap b/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap index 27612db490f4b..a752facec0213 100644 --- a/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap +++ b/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UnauthenticatedPage renders as expected 1`] = `"ElasticMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; +exports[`UnauthenticatedPage renders as expected 1`] = `"ElasticMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; -exports[`UnauthenticatedPage renders as expected with custom title 1`] = `"My Company NameMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; +exports[`UnauthenticatedPage renders as expected with custom title 1`] = `"My Company NameMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; diff --git a/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap b/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap index a6b592367d47b..cc55a03d84555 100644 --- a/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap +++ b/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`ResetSessionPage renders as expected 1`] = `"ElasticMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; +exports[`ResetSessionPage renders as expected 1`] = `"ElasticMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; -exports[`ResetSessionPage renders as expected with custom page title 1`] = `"My Company NameMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; +exports[`ResetSessionPage renders as expected with custom page title 1`] = `"My Company NameMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; diff --git a/x-pack/plugins/security/server/authorization/reset_session_page.tsx b/x-pack/plugins/security/server/authorization/reset_session_page.tsx index 9cb85f324fab9..85c78ddfcbaec 100644 --- a/x-pack/plugins/security/server/authorization/reset_session_page.tsx +++ b/x-pack/plugins/security/server/authorization/reset_session_page.tsx @@ -15,6 +15,11 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { PromptPage } from '../prompt_page'; +/** + * Static error page (rendered server-side) when user does not have permission to access the requested page. + * + * To trigger this error create a user without any roles and try to login. + */ export function ResetSessionPage({ logoutUrl, buildNumber, diff --git a/x-pack/plugins/security/server/prompt_page.tsx b/x-pack/plugins/security/server/prompt_page.tsx index 31c1f057942de..c0947aed8477b 100644 --- a/x-pack/plugins/security/server/prompt_page.tsx +++ b/x-pack/plugins/security/server/prompt_page.tsx @@ -5,13 +5,8 @@ * 2.0. */ -import { - EuiEmptyPrompt, - EuiPage, - EuiPageBody, - EuiPageContent_Deprecated as EuiPageContent, - EuiProvider, -} from '@elastic/eui'; +import 'css.escape'; // Polyfill required to render `EuiPageTemplate` server-side +import { EuiPageTemplate, EuiProvider } from '@elastic/eui'; // @ts-expect-error no definitions in component folder import { icon as EuiIconWarning } from '@elastic/eui/lib/components/icon/assets/warning'; // @ts-expect-error no definitions in component folder @@ -61,19 +56,15 @@ export function PromptPage({ const content = ( - - - - {title}} - body={body} - actions={actions} - /> - - - + + {title}} + body={body} + actions={actions} + /> + ); @@ -88,8 +79,6 @@ export function PromptPage({ const styleSheetPaths = [ `${regularBundlePath}/kbn-ui-shared-deps-src/${UiSharedDepsSrc.cssDistFilename}`, `${regularBundlePath}/kbn-ui-shared-deps-npm/${UiSharedDepsNpm.lightCssDistFilename('v8')}`, - `${basePath.serverBasePath}/node_modules/@kbn/ui-framework/dist/kui_light.css`, - `${basePath.serverBasePath}/ui/legacy_light_theme.css`, ]; return ( diff --git a/yarn.lock b/yarn.lock index 47f2d2206ecd9..006b36f36eb02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13639,7 +13639,7 @@ css-what@^6.0.1, css-what@^6.1.0: css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== css@2.X, css@^2.2.1, css@^2.2.4: version "2.2.4" From 5cb092d583d09949fc0e728d678f6c91d9bca3d7 Mon Sep 17 00:00:00 2001 From: Stavros Kroustouris Date: Tue, 5 Sep 2023 16:23:27 +0200 Subject: [PATCH 15/52] TLS-626 make sure that all the gpctl triggers are running the tests (#165594) ## Summary After chatting with the team, i realized that https://github.com/elastic/kibana/pull/165334 did not include the file this PR is updating. ## Note Another approach would be to keep the pipeline triggers as they are, but make sure the e2e tests have been run in parallel with any other tests during the CI process. This would potentially shorten the CI times since the e2e tests take around 40 minutes to run. --- .buildkite/pipelines/pipeline.kibana-serverless-release.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.buildkite/pipelines/pipeline.kibana-serverless-release.yaml b/.buildkite/pipelines/pipeline.kibana-serverless-release.yaml index 6bceff183662a..0eec18471e2be 100644 --- a/.buildkite/pipelines/pipeline.kibana-serverless-release.yaml +++ b/.buildkite/pipelines/pipeline.kibana-serverless-release.yaml @@ -2,8 +2,11 @@ steps: - label: ":releasethekraken: Release kibana" # https://regex101.com/r/tY52jo/1 if: build.tag =~ /^deploy@\d+\$/ - trigger: gpctl-promote + trigger: gpctl-promote-with-e2e-tests build: env: SERVICE_COMMIT_HASH: "${BUILDKITE_COMMIT:0:12}" REMOTE_SERVICE_CONFIG: https://raw.githubusercontent.com/elastic/serverless-gitops/main/gen/gpctl/kibana/config.yaml + SERVICE: kibana-controller + NAMESPACE: kibana-ci + IMAGE_NAME: kibana-serverless From 74f3ba26cfac4d6ce832be01ca22371dcf3c8a80 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Tue, 5 Sep 2023 10:25:13 -0400 Subject: [PATCH 16/52] [Response Ops] Unskip serverless alerting rule tests (#165514) Resolves https://github.com/elastic/kibana/issues/165145 ## Summary Serverless alerting tests are now working, likely after the PR to support datastreams in AAD, so tests can be unskipped. Can see the test being run as part of the [serverless security tests](https://buildkite.com/elastic/kibana-pull-request/builds/155830#018a5221-26e0-4c9c-aada-a1f0bb53a22f/279-908), the [serverless search tests](https://buildkite.com/elastic/kibana-pull-request/builds/155830#018a5221-26e0-4c9c-aada-a1f0bb53a22f/279-908) and the [serverless observability tests](https://buildkite.com/elastic/kibana-pull-request/builds/155830#018a5264-9b1d-4bf3-9b91-13ea86d86737/279-940) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../api_integration/test_suites/common/alerting/rules.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts index 1ad798758b45a..bfce78384f601 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts @@ -35,8 +35,7 @@ export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); const esDeleteAllIndices = getService('esDeleteAllIndices'); - // Issue: https://github.com/elastic/kibana/issues/165145 - describe.skip('Alerting rules', () => { + describe('Alerting rules', () => { const RULE_TYPE_ID = '.es-query'; const ALERT_ACTION_INDEX = 'alert-action-es-query'; let actionId: string; From d1c317da401ff70698e48a4d9b968b670c135f39 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Tue, 5 Sep 2023 10:25:37 -0400 Subject: [PATCH 17/52] [Response Ops][Actions] Improve error handling in ES Index action response (#164841) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves https://github.com/elastic/kibana/issues/162989 ## Summary Updates error parsing for bulk index action in ES index connector. Previously, we were parsing for the `index.error` key within the returned bulk response but it looks like since switching to `op_type: create`, the response is actually returned inside the `create` key. This PR updates the error handling to key off of the `errors` flag in the bulk response and then parse out the error from within the items array, regardless of of the key. Bulk API with sample responses can be found here: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html#bulk-api-response-body. 🙏 Check for any edge cases I may have missed while parsing the error response ## To Verify Create an ES index connector that writes to an existing mapped index (I loaded the `kibana_sample_data_logs` dataset). Test the connector and try to index a field with an incompatible mapping (example, index a string into a `long` field) and verify that the failure to index is correct returned as an action execution error. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../connector_types/es_index/index.test.ts | 187 +++++++++++++++++- .../server/connector_types/es_index/index.ts | 38 +++- 2 files changed, 213 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.test.ts index d2961d4725d39..900f7cd334241 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.test.ts @@ -609,6 +609,21 @@ describe('execute()', () => { took: 0, errors: true, items: [ + { + create: { + _index: 'indexme', + _id: '7buTjHQB0SuNSiS9Hayt', + status: 400, + error: { + type: 'document_parsing_exception', + reason: `[1:10] failed to parse field [bytes] of type [long] in document with id '39XQLIoB8kAjguvyIMeJ'. Preview of field's value: 'foo'`, + caused_by: { + type: 'illegal_argument_exception', + reason: `For input string: \"foo\"`, + }, + }, + }, + }, { index: { _index: 'indexme', @@ -633,7 +648,175 @@ describe('execute()', () => { config, secrets, params, - services, + services: { ...services, scopedClusterClient }, + configurationUtilities, + logger: mockedLogger, + }) + ).toMatchInlineSnapshot(` + Object { + "actionId": "some-id", + "message": "error indexing documents", + "serviceMessage": "[1:10] failed to parse field [bytes] of type [long] in document with id '39XQLIoB8kAjguvyIMeJ'. Preview of field's value: 'foo';failed to parse (For input string: \\"foo\\";field name cannot be an empty string)", + "status": "error", + } + `); + }); + + test('resolves with an error when an error occurs in the indexing operation - malformed response', async () => { + const secrets = {}; + // minimal params + const config = { index: 'index-value', refresh: false, executionTimeField: null }; + const params = { + documents: [{ '': 'bob' }], + indexOverride: null, + }; + + const actionId = 'some-id'; + const scopedClusterClient = elasticsearchClientMock + .createClusterClient() + .asScoped().asCurrentUser; + // @ts-expect-error + scopedClusterClient.bulk.mockResponse({ + took: 0, + errors: true, + }); + + expect( + await connectorType.executor({ + actionId, + config, + secrets, + params, + services: { ...services, scopedClusterClient }, + configurationUtilities, + logger: mockedLogger, + }) + ).toMatchInlineSnapshot(` + Object { + "actionId": "some-id", + "message": "error indexing documents", + "serviceMessage": "Indexing error but no reason returned.", + "status": "error", + } + `); + }); + + test('resolves with an error when an error occurs in the indexing operation - malformed error response', async () => { + const secrets = {}; + // minimal params + const config = { index: 'index-value', refresh: false, executionTimeField: null }; + const params = { + documents: [{ '': 'bob' }], + indexOverride: null, + }; + + const actionId = 'some-id'; + const scopedClusterClient = elasticsearchClientMock + .createClusterClient() + .asScoped().asCurrentUser; + scopedClusterClient.bulk.mockResponse({ + took: 0, + errors: true, + items: [ + { + create: { + _index: 'indexme', + _id: '7buTjHQB0SuNSiS9Hayt', + status: 400, + error: { + type: 'document_parsing_exception', + reason: `[1:10] failed to parse field [bytes] of type [long] in document with id '39XQLIoB8kAjguvyIMeJ'. Preview of field's value: 'foo'`, + caused_by: { + type: 'illegal_argument_exception', + reason: `For input string: \"foo\"`, + }, + }, + }, + }, + { + index: { + _index: 'indexme', + _id: '7buTjHQB0SuNSiS9Hayt', + status: 400, + }, + }, + ], + }); + + expect( + await connectorType.executor({ + actionId, + config, + secrets, + params, + services: { ...services, scopedClusterClient }, + configurationUtilities, + logger: mockedLogger, + }) + ).toMatchInlineSnapshot(` + Object { + "actionId": "some-id", + "message": "error indexing documents", + "serviceMessage": "[1:10] failed to parse field [bytes] of type [long] in document with id '39XQLIoB8kAjguvyIMeJ'. Preview of field's value: 'foo' (For input string: \\"foo\\")", + "status": "error", + } + `); + }); + + test('resolves with an error when an error occurs in the indexing operation - error with no reason', async () => { + const secrets = {}; + // minimal params + const config = { index: 'index-value', refresh: false, executionTimeField: null }; + const params = { + documents: [{ '': 'bob' }], + indexOverride: null, + }; + + const actionId = 'some-id'; + const scopedClusterClient = elasticsearchClientMock + .createClusterClient() + .asScoped().asCurrentUser; + scopedClusterClient.bulk.mockResponse({ + took: 0, + errors: true, + items: [ + { + create: { + _index: 'indexme', + _id: '7buTjHQB0SuNSiS9Hayt', + status: 400, + error: { + type: 'document_parsing_exception', + caused_by: { + type: 'illegal_argument_exception', + }, + }, + }, + }, + { + index: { + _index: 'indexme', + _id: '7buTjHQB0SuNSiS9Hayt', + status: 400, + error: { + type: 'mapper_parsing_exception', + reason: 'failed to parse', + caused_by: { + type: 'illegal_argument_exception', + }, + }, + }, + }, + ], + }); + + expect( + await connectorType.executor({ + actionId, + config, + secrets, + params, + services: { ...services, scopedClusterClient }, configurationUtilities, logger: mockedLogger, }) @@ -641,7 +824,7 @@ describe('execute()', () => { Object { "actionId": "some-id", "message": "error indexing documents", - "serviceMessage": "Cannot read properties of undefined (reading 'items')", + "serviceMessage": "failed to parse", "status": "error", } `); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.ts index b4ee9ff01e474..5057fdb5d8312 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/es_index/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { find } from 'lodash'; +import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; import { schema, TypeOf } from '@kbn/config-schema'; import { Logger } from '@kbn/core/server'; @@ -25,6 +25,10 @@ import { ALERT_HISTORY_PREFIX, buildAlertHistoryDocument, } from '@kbn/actions-plugin/common'; +import { + BulkOperationType, + BulkResponseItem, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; export type ESIndexConnectorType = ConnectorType< ConnectorTypeConfigType, @@ -124,15 +128,29 @@ async function executor( try { const result = await services.scopedClusterClient.bulk(bulkParams); - const err = find(result.items, 'index.error.reason'); - if (err) { - return wrapErr( - `${err.index?.error?.reason}${ - err.index?.error?.caused_by ? ` (${err.index?.error?.caused_by?.reason})` : '' - }`, - actionId, - logger - ); + if (result.errors) { + const errReason: string[] = []; + const errCausedBy: string[] = []; + // extract error reason and caused by + (result.items ?? []).forEach((item: Partial>) => { + for (const [_, responseItem] of Object.entries(item)) { + const reason = get(responseItem, 'error.reason'); + const causedBy = get(responseItem, 'error.caused_by.reason'); + if (reason) { + errReason.push(reason); + } + if (causedBy) { + errCausedBy.push(causedBy); + } + } + }); + + const errMessage = + errReason.length > 0 + ? `${errReason.join(';')}${errCausedBy.length > 0 ? ` (${errCausedBy.join(';')})` : ''}` + : `Indexing error but no reason returned.`; + + return wrapErr(errMessage, actionId, logger); } return { status: 'ok', data: result, actionId }; From 7907f9f4ecc4b7a42739fe214cba8a24779abca2 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Tue, 5 Sep 2023 09:28:31 -0500 Subject: [PATCH 18/52] [Search] update default getting started language to curl (#165341) ## Summary Updated the default language for the dedicated getting started page from Javascript to cURL --- .../components/getting_started/getting_started.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx index 37f96921227e7..5d0a53f93d013 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx @@ -52,7 +52,7 @@ import { OverviewLogic } from '../../overview.logic'; import { GenerateApiKeyModal } from '../generate_api_key_modal/modal'; import { consoleDefinition } from './languages/console'; -import { javascriptDefinition } from './languages/javascript'; +import { curlDefinition } from './languages/curl'; import { languageDefinitions } from './languages/languages'; const DEFAULT_URL = 'https://localhost:9200'; @@ -85,8 +85,7 @@ export const APIGettingStarted = () => { }; const assetBasePath = http.basePath.prepend(`/plugins/${PLUGIN_ID}/assets/client_libraries/`); - const [selectedLanguage, setSelectedLanguage] = - useState(javascriptDefinition); + const [selectedLanguage, setSelectedLanguage] = useState(curlDefinition); return ( <> {isGenerateModalOpen && ( From 258b50facdb67733bd63db868d0aa9ecfd1879a0 Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Tue, 5 Sep 2023 16:40:09 +0200 Subject: [PATCH 19/52] Fix Non exported APIs in observability plugin (#165576) Fixes #165571 ## Summary The number of items is reduced from 15 to ~~11~~ 13. (There were some params that it seems they are using in devdocs, such as [RuleDetailsLocatorParams](https://github.com/elastic/kibana/blob/main/api_docs/observability.devdocs.json#L4503) and [SloDetailsLocatorParams](https://github.com/elastic/kibana/blob/main/api_docs/observability.devdocs.json#L4513C10-L4513C33)) **Command** ``` node scripts/build_api_docs --plugin observability --stats exports ``` The rest of the items cannot be fixed as they are used as type in other files, I started a [discussion](https://elastic.slack.com/archives/C5TQ33ND8/p1693822625635619) to see how we can remove them from the report. --- .../public/pages/alert_details/components/alert_summary.tsx | 2 +- .../pages/overview/components/date_picker/date_picker.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability/public/pages/alert_details/components/alert_summary.tsx b/x-pack/plugins/observability/public/pages/alert_details/components/alert_summary.tsx index a4ca36772217b..bef504ed330ea 100644 --- a/x-pack/plugins/observability/public/pages/alert_details/components/alert_summary.tsx +++ b/x-pack/plugins/observability/public/pages/alert_details/components/alert_summary.tsx @@ -11,7 +11,7 @@ export interface AlertSummaryField { label: ReactNode | string; value: ReactNode | string | number; } -export interface AlertSummaryProps { +interface AlertSummaryProps { alertSummaryFields?: AlertSummaryField[]; } diff --git a/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx b/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx index 1de12b64e6dfb..e3bb21a460067 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx @@ -26,7 +26,7 @@ export interface TimePickerTimeDefaults { to: string; } -export interface DatePickerProps { +interface DatePickerProps { rangeFrom?: string; rangeTo?: string; refreshPaused?: boolean; From 7e826077c450d8e32a87629177055e214d5c77f2 Mon Sep 17 00:00:00 2001 From: Karl Godard Date: Tue, 5 Sep 2023 07:44:54 -0700 Subject: [PATCH 20/52] =?UTF-8?q?[Cloud=20Security]=20added=20missing=20bi?= =?UTF-8?q?ts=20for=20backend=20route=20check=20(similar=20to=20csp),=20al?= =?UTF-8?q?so=20add=E2=80=A6=20(#165376)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …ed d4c manage policies link to the list of excluded links when user does not have permission to read policies in security solution ## Summary Fixes: https://github.com/elastic/kibana/issues/163562 --- .../features/src/constants.ts | 3 +++ .../features/src/security/kibana_features.ts | 18 +++++++++++++----- .../public/management/links.test.ts | 7 +++++-- .../public/management/links.ts | 1 + 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/x-pack/packages/security-solution/features/src/constants.ts b/x-pack/packages/security-solution/features/src/constants.ts index 2054749d0eabb..c92376fd36209 100644 --- a/x-pack/packages/security-solution/features/src/constants.ts +++ b/x-pack/packages/security-solution/features/src/constants.ts @@ -15,6 +15,9 @@ export const ASSISTANT_FEATURE_ID = 'securitySolutionAssistant' as const; // Same as the plugin id defined by Cloud Security Posture export const CLOUD_POSTURE_APP_ID = 'csp' as const; +// Same as the plugin id defined by Defend for containers (cloud_defend) +export const CLOUD_DEFEND_APP_ID = 'cloudDefend' as const; + /** * Id for the notifications alerting type * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function diff --git a/x-pack/packages/security-solution/features/src/security/kibana_features.ts b/x-pack/packages/security-solution/features/src/security/kibana_features.ts index 34252ec1a35be..f4176dfa53719 100644 --- a/x-pack/packages/security-solution/features/src/security/kibana_features.ts +++ b/x-pack/packages/security-solution/features/src/security/kibana_features.ts @@ -18,7 +18,13 @@ import { THRESHOLD_RULE_TYPE_ID, } from '@kbn/securitysolution-rules'; import type { BaseKibanaFeatureConfig } from '../types'; -import { APP_ID, SERVER_APP_ID, LEGACY_NOTIFICATIONS_ID, CLOUD_POSTURE_APP_ID } from '../constants'; +import { + APP_ID, + SERVER_APP_ID, + LEGACY_NOTIFICATIONS_ID, + CLOUD_POSTURE_APP_ID, + CLOUD_DEFEND_APP_ID, +} from '../constants'; import type { SecurityFeatureParams } from './types'; const SECURITY_RULE_TYPES = [ @@ -44,7 +50,7 @@ export const getSecurityBaseKibanaFeature = ({ ), order: 1100, category: DEFAULT_APP_CATEGORIES.security, - app: [APP_ID, CLOUD_POSTURE_APP_ID, 'kibana'], + app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], catalogue: [APP_ID], management: { insightsAndAlerting: ['triggersActions'], @@ -52,7 +58,7 @@ export const getSecurityBaseKibanaFeature = ({ alerting: SECURITY_RULE_TYPES, privileges: { all: { - app: [APP_ID, CLOUD_POSTURE_APP_ID, 'kibana'], + app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], catalogue: [APP_ID], api: [ APP_ID, @@ -62,6 +68,8 @@ export const getSecurityBaseKibanaFeature = ({ 'rac', 'cloud-security-posture-all', 'cloud-security-posture-read', + 'cloud-defend-all', + 'cloud-defend-read', ], savedObject: { all: ['alert', ...savedObjects], @@ -81,9 +89,9 @@ export const getSecurityBaseKibanaFeature = ({ ui: ['show', 'crud'], }, read: { - app: [APP_ID, CLOUD_POSTURE_APP_ID, 'kibana'], + app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], catalogue: [APP_ID], - api: [APP_ID, 'lists-read', 'rac', 'cloud-security-posture-read'], + api: [APP_ID, 'lists-read', 'rac', 'cloud-security-posture-read', 'cloud-defend-read'], savedObject: { all: [], read: [...savedObjects], diff --git a/x-pack/plugins/security_solution/public/management/links.test.ts b/x-pack/plugins/security_solution/public/management/links.test.ts index 17116530e6467..28d3c727ce2a4 100644 --- a/x-pack/plugins/security_solution/public/management/links.test.ts +++ b/x-pack/plugins/security_solution/public/management/links.test.ts @@ -93,7 +93,8 @@ describe('links', () => { SecurityPageName.hostIsolationExceptions, SecurityPageName.policies, SecurityPageName.responseActionsHistory, - SecurityPageName.trustedApps + SecurityPageName.trustedApps, + SecurityPageName.cloudDefendPolicies ) ); }); @@ -234,7 +235,9 @@ describe('links', () => { const filteredLinks = await getManagementFilteredLinks(coreMockStarted, getPlugins()); - expect(filteredLinks).toEqual(getLinksWithout(SecurityPageName.policies)); + expect(filteredLinks).toEqual( + getLinksWithout(SecurityPageName.policies, SecurityPageName.cloudDefendPolicies) + ); }); }); diff --git a/x-pack/plugins/security_solution/public/management/links.ts b/x-pack/plugins/security_solution/public/management/links.ts index 309e9a093979b..60c4c93d43fa6 100644 --- a/x-pack/plugins/security_solution/public/management/links.ts +++ b/x-pack/plugins/security_solution/public/management/links.ts @@ -235,6 +235,7 @@ export const getManagementFilteredLinks = async ( if (!canReadPolicyManagement) { linksToExclude.push(SecurityPageName.policies); + linksToExclude.push(SecurityPageName.cloudDefendPolicies); } if (!canReadActionsLogManagement) { From 0fe614f1895b815cd9a8f8eba7534532e05e1b43 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 5 Sep 2023 16:49:51 +0200 Subject: [PATCH 21/52] GitHub create-deploy-tag workflow: Add more useful links (#165654) --- .github/workflows/create-deploy-tag.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/create-deploy-tag.yml b/.github/workflows/create-deploy-tag.yml index d91df87fd547a..b230f2a929287 100644 --- a/.github/workflows/create-deploy-tag.yml +++ b/.github/workflows/create-deploy-tag.yml @@ -63,7 +63,7 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": "A new has been promoted to QA 🎉\n\nOnce promotion is complete, please begin any required manual testing.\n\n*Remember:* Promotion to Staging is currently a manual process and will proceed once the build is signed off in QA." + "text": "Promotion of a new to QA has been initiated 🎉\n\nOnce promotion is complete, please begin any required manual testing.\n\n*Remember:* Promotion to Staging is currently a manual process and will proceed once the build is signed off in QA." } }, { @@ -73,10 +73,6 @@ jobs: "type": "mrkdwn", "text": "*Initiated by:*\n" }, - { - "type": "mrkdwn", - "text": "*Workflow run:*\n" - }, { "type": "mrkdwn", "text": "*Commit:*\n" @@ -107,7 +103,7 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": "*Useful links:*\n\n • \n • " + "text": "*Useful links:*\n\n • \n • \n • \n • \n • " } }, { @@ -153,7 +149,7 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": "Promotion of to QA failed ⛔️" + "text": "Creation of deploy tag on failed ⛔️" } }, { @@ -163,10 +159,6 @@ jobs: "type": "mrkdwn", "text": "*Initiated by:*\n" }, - { - "type": "mrkdwn", - "text": "*Workflow run:*\n" - }, { "type": "mrkdwn", "text": "*Commit:*\n" @@ -177,7 +169,7 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": "*Useful links:*\n\n • " + "text": "*Useful links:*\n\n • \n • " } } ] From 6b6dcdb7c304fe2b071ecaace8c7c8bf3a41c64e Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 5 Sep 2023 08:15:22 -0700 Subject: [PATCH 22/52] [DOCS] Move preconfigured Opsgenie connector details (#165258) --- .../connectors/action-types/opsgenie.asciidoc | 28 ------------------- .../pre-configured-connectors.asciidoc | 21 ++++++++++++++ docs/settings/alert-action-settings.asciidoc | 22 +++++++++++++++ 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/docs/management/connectors/action-types/opsgenie.asciidoc b/docs/management/connectors/action-types/opsgenie.asciidoc index 453aa8c00b811..817acdfb135d4 100644 --- a/docs/management/connectors/action-types/opsgenie.asciidoc +++ b/docs/management/connectors/action-types/opsgenie.asciidoc @@ -28,34 +28,6 @@ URL:: The Opsgenie URL. For example, https://api.opsgenie.com or https://api.eu. NOTE: If you are using the <> setting, make sure the hostname is added to the allowed hosts. API Key:: The Opsgenie API authentication key for HTTP Basic authentication. For more details about generating Opsgenie API keys, refer to https://support.atlassian.com/opsgenie/docs/create-a-default-api-integration/[Opsgenie documentation]. -[float] -[[preconfigured-opsgenie-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-opsgenie: - name: preconfigured-opsgenie-connector-type - actionTypeId: .opsgenie - config: - apiUrl: https://api.opsgenie.com - secrets: - apiKey: apikey --- - -Config defines information for the connector type. - -`apiUrl`:: A string that corresponds to *URL*. - -Secrets defines sensitive information for the connector type. - -`apiKey`:: A string that corresponds to *API Key*. - [float] [[opsgenie-action-configuration]] === Test connectors diff --git a/docs/management/connectors/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc index 3584207a88364..ceaf771a58f9e 100644 --- a/docs/management/connectors/pre-configured-connectors.asciidoc +++ b/docs/management/connectors/pre-configured-connectors.asciidoc @@ -83,9 +83,30 @@ configuration. [float] === Examples +* <> * <> * <> +[float] +[[preconfigured-opsgenie-configuration]] +==== {opsgenie} connectors + +The following example creates an <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-opsgenie: + name: preconfigured-opsgenie-connector-type + actionTypeId: .opsgenie + config: + apiUrl: https://api.opsgenie.com <1> + secrets: + apiKey: apikey <2> +-- +<1> The {opsgenie} URL. +<2> The {opsgenie} API authentication key for HTTP basic authentication. + [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 c48483224ec52..9ab4058d35e30 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -252,9 +252,31 @@ Specifies configuration details that are specific to the type of preconfigured c The type of preconfigured connector. For example: `.email`, `.index`, `.opsgenie`, `.server-log`, `.resilient`, `.slack`, and `.webhook`. +`xpack.actions.preconfigured..config.apiUrl`:: +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`. + +NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. +-- + `xpack.actions.preconfigured..name`:: The name of the preconfigured connector. +`xpack.actions.preconfigured..secrets`:: +Sensitive configuration details, such as username, password, and keys, which are specific to the connector type. ++ +TIP: Sensitive properties, such as passwords, should be stored in the <>. + +`xpack.actions.preconfigured..secrets.apikey`:: +An API key secret that varies by connector: ++ +-- +* For an <>, specifies the {opsgenie} API authentication key for HTTP basic authentication. +-- + + [float] [[alert-settings]] === Alerting settings From addb5b7eacf4e2d19560769ba3a953c6ef965e34 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 5 Sep 2023 17:37:07 +0200 Subject: [PATCH 23/52] [Synthetics] Summary doc viewer in pings list (#163926) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Abdul Zahid --- x-pack/plugins/synthetics/kibana.jsonc | 3 +- .../common/components/view_document.tsx | 93 +++++++++++++++++++ .../hooks/use_monitor_errors.tsx | 9 +- .../monitor_summary/test_runs_table.tsx | 22 +++++ .../simple/ping_list/columns/expand_row.tsx | 5 + .../contexts/synthetics_data_view_context.tsx | 25 +++++ .../public/apps/synthetics/synthetics_app.tsx | 55 +++++------ x-pack/plugins/synthetics/tsconfig.json | 2 + 8 files changed, 183 insertions(+), 31 deletions(-) create mode 100644 x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx create mode 100644 x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx diff --git a/x-pack/plugins/synthetics/kibana.jsonc b/x-pack/plugins/synthetics/kibana.jsonc index 511666996f829..d03d0d384938f 100644 --- a/x-pack/plugins/synthetics/kibana.jsonc +++ b/x-pack/plugins/synthetics/kibana.jsonc @@ -41,7 +41,8 @@ "kibanaUtils", "observability", "spaces", - "indexLifecycleManagement" + "indexLifecycleManagement", + "unifiedDocViewer" ] } } diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx new file mode 100644 index 0000000000000..a37a5d8afd17e --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx @@ -0,0 +1,93 @@ +/* + * Copyright 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 { EuiButtonIcon, EuiFlyout, EuiFlyoutBody, EuiFlyoutHeader, EuiTitle } from '@elastic/eui'; +import React, { useState } from 'react'; +import { useUnifiedDocViewerServices } from '@kbn/unified-doc-viewer-plugin/public'; +import { buildDataTableRecord } from '@kbn/discover-utils'; +import { UnifiedDocViewer } from '@kbn/unified-doc-viewer-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { useFetcher } from '@kbn/observability-shared-plugin/public'; +import { DataTableRecord } from '@kbn/discover-utils/src/types'; +import { useDateFormat } from '../../../../../hooks/use_date_format'; +import { LoadingState } from '../../monitors_page/overview/overview/monitor_detail_flyout'; +import { useSyntheticsDataView } from '../../../contexts/synthetics_data_view_context'; +import { SYNTHETICS_INDEX_PATTERN } from '../../../../../../common/constants'; +import { Ping } from '../../../../../../common/runtime_types'; + +export const ViewDocument = ({ ping }: { ping: Ping }) => { + const { data } = useUnifiedDocViewerServices(); + const [isFlyoutVisible, setIsFlyoutVisible] = useState(false); + + const dataView = useSyntheticsDataView(); + const formatter = useDateFormat(); + + const { data: hit } = useFetcher>(async () => { + if (!dataView?.id || !isFlyoutVisible) return; + const response = await data.search + .search({ + params: { + index: SYNTHETICS_INDEX_PATTERN, + body: { + query: { + ids: { + values: [ping.docId], + }, + }, + fields: ['*'], + _source: false, + }, + }, + }) + .toPromise(); + const docs = response?.rawResponse?.hits?.hits ?? []; + if (docs.length > 0) { + return buildDataTableRecord(docs[0], dataView); + } + }, [data, dataView, ping.docId, isFlyoutVisible]); + + return ( + <> + { + setIsFlyoutVisible(true); + }} + /> + {isFlyoutVisible && ( + setIsFlyoutVisible(false)} ownFocus={true}> + + +

+ {INDEXED_AT} {formatter(ping.timestamp)} +

+
+
+ + {dataView?.id && hit ? ( + + ) : ( + + )} + +
+ )} + + ); +}; + +const INDEXED_AT = i18n.translate('xpack.synthetics.monitorDetails.summary.indexedAt', { + defaultMessage: 'Indexed at', +}); + +export const INSPECT_DOCUMENT = i18n.translate( + 'xpack.synthetics.monitorDetails.action.inspectDocument', + { + defaultMessage: 'Inspect document', + } +); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_monitor_errors.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_monitor_errors.tsx index 4e4f9a6c61b17..969e98a21c36c 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_monitor_errors.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_monitor_errors.tsx @@ -8,7 +8,7 @@ import { useTimeZone } from '@kbn/observability-shared-plugin/public'; import { useParams } from 'react-router-dom'; import { useMemo } from 'react'; import { useSelectedLocation } from './use_selected_location'; -import { PingState } from '../../../../../../common/runtime_types'; +import { Ping, PingState } from '../../../../../../common/runtime_types'; import { EXCLUDE_RUN_ONCE_FILTER, SUMMARY_FILTER, @@ -113,10 +113,11 @@ export function useMonitorErrors(monitorIdArg?: string) { return prev; }, defaultValues) ?? defaultValues; + const hits = data?.aggregations?.latest.hits.hits ?? []; + const hasActiveError: boolean = - data?.aggregations?.latest.hits.hits.length === 1 && - (data?.aggregations?.latest.hits.hits[0]._source as { monitor: { status: string } }).monitor - .status === 'down' && + hits.length === 1 && + (hits[0]?._source as Ping).monitor?.status === 'down' && !!errorStates?.length; return { diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/test_runs_table.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/test_runs_table.tsx index 97b5f2b521716..0bbbd3a5f247b 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/test_runs_table.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/test_runs_table.tsx @@ -21,6 +21,7 @@ import { } from '@elastic/eui'; import { Criteria } from '@elastic/eui/src/components/basic_table/basic_table'; import { EuiTableSortingType } from '@elastic/eui/src/components/basic_table/table_types'; +import { INSPECT_DOCUMENT, ViewDocument } from '../../common/components/view_document'; import { ExpandRowColumn, toggleDetails, @@ -206,6 +207,20 @@ export const TestRunsTable = ({ show: false, }, }, + { + align: 'right' as const, + actions: [ + { + 'data-test-subj': 'syntheticsViewPingDocument', + isPrimary: true, + name: INSPECT_DOCUMENT, + description: INSPECT_DOCUMENT, + icon: 'inspect' as const, + type: 'button' as const, + render: (ping: Ping) => , + }, + ], + }, ...(!isBrowserMonitor ? [ { @@ -229,10 +244,17 @@ export const TestRunsTable = ({ 'data-test-subj': `row-${item.monitor.check_group}`, onClick: (evt: MouseEvent) => { const targetElem = evt.target as HTMLElement; + const isTableRow = + targetElem.parentElement?.classList.contains('euiTableCellContent') || + targetElem.parentElement?.classList.contains('euiTableCellContent__text') || + targetElem?.classList.contains('euiTableCellContent') || + targetElem?.classList.contains('euiBadge__text'); // we dont want to capture image click event if ( + isTableRow && targetElem.tagName !== 'IMG' && targetElem.tagName !== 'path' && + targetElem.tagName !== 'BUTTON' && !targetElem.parentElement?.classList.contains('euiLink') ) { if (item.monitor.type !== MONITOR_TYPES.BROWSER) { diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/simple/ping_list/columns/expand_row.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/simple/ping_list/columns/expand_row.tsx index b756cfb082cb5..9ef5ceacc6183 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/simple/ping_list/columns/expand_row.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/simple/ping_list/columns/expand_row.tsx @@ -16,6 +16,11 @@ export const toggleDetails = ( expandedRows: Record, setExpandedRows: (update: Record) => any ) => { + // prevent expanding on row click if not expandable + if (!rowShouldExpand(ping)) { + return; + } + // If already expanded, collapse if (expandedRows[ping.docId]) { delete expandedRows[ping.docId]; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx new file mode 100644 index 0000000000000..4e38a3de25388 --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx @@ -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 React, { createContext, useContext } from 'react'; +import { useFetcher } from '@kbn/observability-shared-plugin/public'; +import { DataViewsPublicPluginStart, DataView } from '@kbn/data-views-plugin/public'; +import { SYNTHETICS_INDEX_PATTERN } from '../../../../common/constants'; + +export const SyntheticsDataViewContext = createContext({} as DataView); + +export const SyntheticsDataViewContextProvider: React.FC<{ + dataViews: DataViewsPublicPluginStart; +}> = ({ children, dataViews }) => { + const { data } = useFetcher>(async () => { + return dataViews.create({ title: SYNTHETICS_INDEX_PATTERN }); + }, []); + + return ; +}; + +export const useSyntheticsDataView = () => useContext(SyntheticsDataViewContext); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx index f9b37b64df403..bac16812f1bf2 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx @@ -18,6 +18,7 @@ import { import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import { InspectorContextProvider } from '@kbn/observability-shared-plugin/public'; import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public'; +import { SyntheticsDataViewContextProvider } from './contexts/synthetics_data_view_context'; import { SyntheticsAppProps } from './contexts'; import { @@ -99,32 +100,34 @@ const Application = (props: SyntheticsAppProps) => { fleet: startPlugins.fleet, }} > - - - - - - - -
- - - - - - - -
-
-
-
-
-
-
-
+ + + + + + + + +
+ + + + + + + +
+
+
+
+
+
+
+
+
diff --git a/x-pack/plugins/synthetics/tsconfig.json b/x-pack/plugins/synthetics/tsconfig.json index 12bc371fef915..ff288ec3cee97 100644 --- a/x-pack/plugins/synthetics/tsconfig.json +++ b/x-pack/plugins/synthetics/tsconfig.json @@ -77,6 +77,8 @@ "@kbn/core-saved-objects-server-mocks", "@kbn/shared-ux-page-kibana-template", "@kbn/observability-ai-assistant-plugin", + "@kbn/unified-doc-viewer-plugin", + "@kbn/discover-utils", ], "exclude": [ "target/**/*", From 0f927b8863b941bb27869a419801dc501c0f0944 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 5 Sep 2023 11:49:35 -0400 Subject: [PATCH 24/52] skip failing test suite (#165623) --- .../functional/test_suites/common/examples/search/warnings.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 026fa9f2efd25..b1e5be5f9f835 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 @@ -24,7 +24,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const esArchiver = getService('esArchiver'); - describe('handling warnings with search source fetch', function () { + // Failing: See https://github.com/elastic/kibana/issues/165623 + 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'; const toTime = 'Jun 23, 2022 @ 00:00:00.000'; From 212a4a0a1219f41b20af081f361a3fbc8d59a7f5 Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Tue, 5 Sep 2023 17:51:59 +0200 Subject: [PATCH 25/52] [APM] Fix certificate issue with serverless tests (#165682) ## Summary Resolves skipped APM serverless tests. tests were failing due to certificate issue. https://github.com/elastic/kibana/issues/165138 --- .../common/apm_api_supertest.ts | 27 +++++++++---------- .../apm_api_integration/feature_flags.ts | 6 ++--- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts index c31ee37a93b94..ac324b3fda087 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts @@ -4,15 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type { ApmUsername } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/authentication'; -import { format, UrlObject } from 'url'; +import { format } from 'url'; import supertest from 'supertest'; import request from 'superagent'; import type { APIReturnType, APIClientRequestParamsOf, } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { kbnTestConfig } from '@kbn/test'; +import { Config, kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; import type { APIEndpoint } from '@kbn/apm-plugin/server'; import { formatRequest } from '@kbn/server-route-repository'; import { InheritedFtrProviderContext } from '../../../../services'; @@ -93,19 +92,19 @@ Body: ${JSON.stringify(res.body)}` } } -async function getApmApiClient({ - kibanaServer, - username, -}: { - kibanaServer: UrlObject; - username: ApmUsername | 'elastic'; -}) { +async function getApmApiClient({ svlSharedConfig }: { svlSharedConfig: Config }) { + const kibanaServer = svlSharedConfig.get('servers.kibana'); + const cAuthorities = svlSharedConfig.get('servers.kibana.certificateAuthorities'); + + const username = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).username; + const password = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).password; + const url = format({ ...kibanaServer, - auth: `${username}:${kbnTestConfig.getUrlParts().password}`, + auth: `${username}:${password}`, }); - return createApmApiClient(supertest(url)); + return createApmApiClient(supertest.agent(url, { ca: cAuthorities })); } export interface SupertestReturnType { @@ -120,12 +119,10 @@ export async function getApmApiClientService({ getService, }: InheritedFtrProviderContext): Promise { const svlSharedConfig = getService('config'); - const kibanaServer = svlSharedConfig.get('servers.kibana'); return { slsUser: await getApmApiClient({ - kibanaServer, - username: 'elastic', + svlSharedConfig, }), }; } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts index 93c621c72af74..279a1e0970b57 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts @@ -7,6 +7,7 @@ import expect from 'expect'; import { APMFtrContextProvider } from './common/services'; +import { ApmApiClient } from './common/apm_api_supertest'; const fleetMigrationResponse = { statusCode: 404, @@ -48,7 +49,7 @@ const SAMPLE_SOURCEMAP = { mappings: 'A,AAAB;;ABCDE;', }; -async function uploadSourcemap(apmApiClient: any) { +async function uploadSourcemap(apmApiClient: ApmApiClient) { const response = await apmApiClient.slsUser({ endpoint: 'POST /api/apm/sourcemaps 2023-10-31', type: 'form-data', @@ -67,8 +68,7 @@ async function uploadSourcemap(apmApiClient: any) { export default function ({ getService }: APMFtrContextProvider) { const apmApiClient = getService('apmApiClient'); - // Issue: https://github.com/elastic/kibana/issues/165138 - describe.skip('apm feature flags', () => { + describe('apm feature flags', () => { describe('fleet migrations', () => { it('rejects requests to save apm server schema', async () => { try { From db591a7223f2fd4cabcaf30ddf919fa2ca3fd5c8 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 5 Sep 2023 19:00:19 +0200 Subject: [PATCH 26/52] [Synthetics] Fix duration trends labels (#165430) --- .../shared/exploratory_view/configurations/lens_attributes.ts | 1 + .../configurations/test_data/mobile_test_attribute.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts index f7503acf77179..10225de1a1ad4 100644 --- a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts +++ b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts @@ -424,6 +424,7 @@ export class LensAttributes { operationType: capitalize(operationType), }, }), + customLabel: true, filter: columnFilter, operationType, params: diff --git a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/mobile_test_attribute.ts b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/mobile_test_attribute.ts index c083962b0e21b..7e479fad1db0d 100644 --- a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/mobile_test_attribute.ts +++ b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/mobile_test_attribute.ts @@ -48,6 +48,7 @@ export const testMobileKPIAttr = { params: {}, scale: 'ratio', sourceField: 'system.memory.usage', + customLabel: true, dataType: 'number', filter: { query: From c54acc3b1b5f1a0e6cd63edcc6a31e5323269aac Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Tue, 5 Sep 2023 19:12:04 +0200 Subject: [PATCH 27/52] [Security Solution] Fix osquery Cypress CI build (#165677) ## Summary It fixes Osquery Cypress CI build step by rolling back the changes. ## Details https://github.com/elastic/kibana/pull/165541 broke Osquery build step by running junit transformation command while Osquery Cypress tests don't produce any reports. The fix just removes junit transformation command. --- .buildkite/scripts/steps/functional/osquery_cypress.sh | 3 +-- .buildkite/scripts/steps/functional/osquery_cypress_burn.sh | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.buildkite/scripts/steps/functional/osquery_cypress.sh b/.buildkite/scripts/steps/functional/osquery_cypress.sh index eab0f808b7352..da27c27559a45 100755 --- a/.buildkite/scripts/steps/functional/osquery_cypress.sh +++ b/.buildkite/scripts/steps/functional/osquery_cypress.sh @@ -14,5 +14,4 @@ echo "--- Osquery Cypress tests" cd x-pack/plugins/osquery -set +e -yarn cypress:run; status=$?; yarn junit:merge && exit $status +yarn --cwd x-pack/plugins/osquery cypress:run \ No newline at end of file diff --git a/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh b/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh index ed59007086e16..8aa5f28ce67cd 100755 --- a/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh +++ b/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh @@ -14,5 +14,4 @@ buildkite-agent meta-data set "${BUILDKITE_JOB_ID}_is_test_execution_step" 'fals echo "--- Osquery Cypress tests, burning changed specs (Chrome)" -set +e -yarn cypress:changed-specs-only; status=$?; yarn junit:merge && exit $status \ No newline at end of file +yarn --cwd x-pack/plugins/osquery cypress:changed-specs-only \ No newline at end of file From d13fd3b98cbf246fd6286274958b723d513710ba Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 18:16:21 +0100 Subject: [PATCH 28/52] skip flaky suite (#165694) --- .../test_suites/common/security/navigation/avatar_menu.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/security/navigation/avatar_menu.ts b/x-pack/test_serverless/functional/test_suites/common/security/navigation/avatar_menu.ts index b8647d0423e02..0a58a580b81dd 100644 --- a/x-pack/test_serverless/functional/test_suites/common/security/navigation/avatar_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/common/security/navigation/avatar_menu.ts @@ -11,7 +11,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlCommonPage = getPageObject('svlCommonPage'); const svlCommonNavigation = getService('svlCommonNavigation'); - describe('Avatar menu', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165694 + describe.skip('Avatar menu', function () { it('is displayed', async () => { await svlCommonNavigation.navigateToKibanaHome(); await svlCommonPage.assertUserAvatarExists(); From 3fe39c0953da701875c80600c0c3ab4ca181997d Mon Sep 17 00:00:00 2001 From: Bena Kansara <69037875+benakansara@users.noreply.github.com> Date: Tue, 5 Sep 2023 19:19:02 +0200 Subject: [PATCH 29/52] Fixes preview chart when KQL filter is not used in APM rules (#165706) Fixes https://github.com/elastic/kibana/issues/165711 Fixes preview chart when normal filters are used and KQL filter is not selected in APM rules. --- .../alerting/rule_types/error_count_rule_type/index.tsx | 4 +++- .../rule_types/transaction_duration_rule_type/index.tsx | 4 +++- .../rule_types/transaction_error_rate_rule_type/index.tsx | 4 +++- .../rule_types/error_count/register_error_count_rule_type.ts | 2 +- .../register_transaction_duration_rule_type.ts | 2 +- .../register_transaction_error_rate_rule_type.ts | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/apm/public/components/alerting/rule_types/error_count_rule_type/index.tsx b/x-pack/plugins/apm/public/components/alerting/rule_types/error_count_rule_type/index.tsx index b42a3eb3b528f..e8fa1b130b2d7 100644 --- a/x-pack/plugins/apm/public/components/alerting/rule_types/error_count_rule_type/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/rule_types/error_count_rule_type/index.tsx @@ -106,7 +106,9 @@ export function ErrorCountRuleType(props: Props) { start, end, groupBy: params.groupBy, - searchConfiguration: JSON.stringify(params.searchConfiguration), + searchConfiguration: params.searchConfiguration?.query?.query + ? JSON.stringify(params.searchConfiguration) + : undefined, }, }, } diff --git a/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_duration_rule_type/index.tsx b/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_duration_rule_type/index.tsx index 900f90253a6e1..cd8abf26c74d4 100644 --- a/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_duration_rule_type/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_duration_rule_type/index.tsx @@ -136,7 +136,9 @@ export function TransactionDurationRuleType(props: Props) { start, end, groupBy: params.groupBy, - searchConfiguration: JSON.stringify(params.searchConfiguration), + searchConfiguration: params.searchConfiguration?.query?.query + ? JSON.stringify(params.searchConfiguration) + : undefined, }, }, } diff --git a/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_error_rate_rule_type/index.tsx b/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_error_rate_rule_type/index.tsx index cf1132e58b9e0..dd37092a260ef 100644 --- a/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_error_rate_rule_type/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/rule_types/transaction_error_rate_rule_type/index.tsx @@ -108,7 +108,9 @@ export function TransactionErrorRateRuleType(props: Props) { start, end, groupBy: params.groupBy, - searchConfiguration: JSON.stringify(params.searchConfiguration), + searchConfiguration: params.searchConfiguration?.query?.query + ? JSON.stringify(params.searchConfiguration) + : undefined, }, }, } diff --git a/x-pack/plugins/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts b/x-pack/plugins/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts index f0843516e4c9a..ba33057e99190 100644 --- a/x-pack/plugins/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts +++ b/x-pack/plugins/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts @@ -117,7 +117,7 @@ export function registerErrorCountRuleType({ const indices = await getApmIndices(savedObjectsClient); - const termFilterQuery = !ruleParams.searchConfiguration + const termFilterQuery = !ruleParams.searchConfiguration?.query?.query ? [ ...termQuery(SERVICE_NAME, ruleParams.serviceName, { queryEmptyString: false, diff --git a/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts b/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts index 7a1beb3ba9f9e..3570b93cd7039 100644 --- a/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts +++ b/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts @@ -135,7 +135,7 @@ export function registerTransactionDurationRuleType({ searchAggregatedTransactions ); - const termFilterQuery = !ruleParams.searchConfiguration + const termFilterQuery = !ruleParams.searchConfiguration?.query?.query ? [ ...termQuery(SERVICE_NAME, ruleParams.serviceName, { queryEmptyString: false, diff --git a/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts b/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts index 7015862db8d9e..764e251edd6a7 100644 --- a/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts +++ b/x-pack/plugins/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts @@ -137,7 +137,7 @@ export function registerTransactionErrorRateRuleType({ ? indices.metric : indices.transaction; - const termFilterQuery = !ruleParams.searchConfiguration + const termFilterQuery = !ruleParams.searchConfiguration?.query?.query ? [ ...termQuery(SERVICE_NAME, ruleParams.serviceName, { queryEmptyString: false, From 8ca63adbb7ab7ef3f26dc68b9db08620b3d714e4 Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Tue, 5 Sep 2023 19:29:12 +0200 Subject: [PATCH 30/52] [Fleet] Introduce API versioning for serverless (#163570) ## Summary Add versioning to Fleet APIs in preparation for serverless. All the Fleet endpoints were made public by default in https://github.com/elastic/kibana/pull/163345. - Modify the fleet router to use the new `Router.versioned` provided by Kibana core. Our router is a wrapper around it so I had to do some modifications to use the new APIs. - Modify all the endpoints to use the new API. They'll now follow this format: ``` router.versioned. .post({ access: 'internal', // Specified only if the access is internal, otherwise all the endpoints are public path: '/api/my-app/foo/{id?}', fleetAuthz: { fleet: { all: true }, }, options: { timeout: { payload: 60000 } }, // optional }) // introduces first version .addVersion( { version: '2023-10-31', // The public version of this API validate: { request: endpointValidationSchema }, }, endpointHandler, ) ``` If a new version will be released, a new `addVersion` block can be added to the previous. - Introduce constants for the versions. These versions will be replaced in the future when new versions of the apis will be released: - Public endpoints will use version `API_VERSIONS.public.v1 = 2023-10-31` - Private endpoints will use version `API_VERSIONS.internal.v1 = 1` - Mark deprecated endpoints as private. List: - `GET /api/fleet/agent-status` - `GET /api/fleet/enrollment-api-keys` - `POST /api/fleet/enrollment-api-keys` - `GET /api/fleet/enrollment-api-keys/{keyId}` - `DELETE /api/fleet/enrollment-api-keys/{keyId}` - `POST /api/fleet/service-tokens` - `PUT /api/fleet/epm/packages/{pkgkey}` - `DELETE /api/fleet/epm/packages/{pkgkey}` - Pass these versions through the headers wherever the fleet apis are called (UI, other plugins, tests, etc). These headers have this format: ``` { Elastic-Api-Version: '2023-10-31' } ``` - All the browsers calls now specify the headers with the versions ### Notes 1. In dev the request of passing the headers is always enforced, to avoid it it's needed the following flag when starting the env: ``` server.versioned.versionResolution: oldest ``` This prevents the router to enforce the headers presence for all the public endpoints; internal endpoints however will need it regardless of this flag. 2. The kibana dev tools still don't accept the new headers, the api calls can be only tested through `curl` or equivalent for now 3. These deprecated endpoints are still marked as public because if we mark them as internal the router would always choose them over the correspondent public routes. ``` - `POST /api/fleet/epm/packages/{pkgkey}` - `GET /api/fleet/epm/packages/{pkgkey}` ``` ## Testing - Load Fleet in dev - The UI should work as normal and you should be able to see the new headers in the dev tools - API calls (via curl) should work as normal, with and without headers for public endpoints ### Checklist - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Nicolas Chaulet --- .../plugins/fleet/common/constants/routes.ts | 13 + .../fleet/cypress/e2e/a11y/home_page.cy.ts | 6 +- .../e2e/agent_binary_download_source.cy.ts | 6 +- .../fleet/cypress/e2e/agents/agent_list.cy.ts | 4 +- .../fleet/cypress/e2e/enrollment_token.cy.ts | 4 +- .../cypress/e2e/fleet_agent_flyout.cy.ts | 4 +- .../fleet/cypress/e2e/integrations_real.cy.ts | 3 +- ...e_policy_pipelines_and_mappings_real.cy.ts | 14 +- .../fleet/cypress/e2e/uninstall_token.cy.ts | 4 +- x-pack/plugins/fleet/cypress/plugins/index.ts | 8 +- x-pack/plugins/fleet/cypress/tasks/cleanup.ts | 7 +- .../fleet/cypress/tasks/fleet_server.ts | 4 +- .../fleet/cypress/tasks/integrations.ts | 6 +- .../agent_policy_delete_provider.tsx | 2 + .../package_policy_delete_provider.tsx | 3 +- .../public/hooks/use_request/agent_policy.ts | 13 + .../fleet/public/hooks/use_request/agents.ts | 30 +- .../fleet/public/hooks/use_request/app.ts | 5 + .../public/hooks/use_request/data_stream.ts | 2 + .../hooks/use_request/download_source.ts | 6 + .../hooks/use_request/enrollment_api_keys.ts | 8 + .../fleet/public/hooks/use_request/epm.ts | 26 +- .../public/hooks/use_request/fleet_proxies.ts | 17 +- .../hooks/use_request/fleet_server_hosts.ts | 7 + .../public/hooks/use_request/health_check.ts | 2 + .../fleet/public/hooks/use_request/k8s.ts | 2 + .../fleet/public/hooks/use_request/outputs.ts | 6 + .../hooks/use_request/package_policy.ts | 16 + .../public/hooks/use_request/settings.ts | 6 + .../fleet/public/hooks/use_request/setup.ts | 4 + .../hooks/use_request/uninstall_tokens.ts | 5 + x-pack/plugins/fleet/public/plugin.ts | 10 +- .../scripts/create_agents/create_agents.ts | 3 + .../get_all_packages/get_all_packages.ts | 3 + .../install_all_packages.ts | 5 + .../reset_preconfiguration.test.ts | 25 +- .../fleet/server/routes/agent/index.ts | 426 ++++++++++------- .../fleet/server/routes/agent_policy/index.ts | 179 +++++--- .../plugins/fleet/server/routes/app/index.ts | 52 ++- .../fleet/server/routes/data_streams/index.ts | 18 +- .../server/routes/download_source/index.tsx | 84 ++-- .../server/routes/enrollment_api_key/index.ts | 134 ++++-- .../plugins/fleet/server/routes/epm/index.ts | 433 +++++++++++------- .../server/routes/fleet_proxies/index.ts | 81 ++-- .../server/routes/fleet_server_hosts/index.ts | 82 ++-- .../fleet/server/routes/health_check/index.ts | 17 +- .../routes/message_signing_service/index.ts | 17 +- .../fleet/server/routes/output/index.ts | 98 ++-- .../routes/package_policy/handlers.test.ts | 6 +- .../server/routes/package_policy/index.ts | 162 ++++--- .../server/routes/preconfiguration/index.ts | 43 +- .../fleet/server/routes/settings/index.ts | 33 +- .../server/routes/setup/handlers.test.ts | 3 + .../fleet/server/routes/setup/index.ts | 50 +- .../routes/uninstall_token/handlers.test.ts | 45 +- .../server/routes/uninstall_token/index.ts | 34 +- .../services/security/fleet_router.test.ts | 122 +++-- .../server/services/security/fleet_router.ts | 172 +++++-- .../fleet/server/services/security/types.ts | 71 ++- x-pack/plugins/fleet/tsconfig.json | 2 +- .../apis/agent_policy/agent_policy.ts | 66 ++- .../fleet_api_integration/apis/agents/list.ts | 1 + .../apis/agents/status.ts | 8 +- .../apis/enrollment_api_keys/crud.ts | 15 +- .../fleet_api_integration/apis/epm/get.ts | 5 +- .../apis/epm/install_prerelease.ts | 13 +- .../apis/package_policy/get.ts | 29 +- .../input_package_create_upgrade.ts | 2 +- .../apis/package_policy/update.ts | 6 +- .../apis/package_policy/upgrade.ts | 2 +- .../apis/service_tokens.ts | 7 +- .../functional/services/ml/test_resources.ts | 9 +- 72 files changed, 1869 insertions(+), 947 deletions(-) diff --git a/x-pack/plugins/fleet/common/constants/routes.ts b/x-pack/plugins/fleet/common/constants/routes.ts index e40b9f8606fdb..d675b1b42bb36 100644 --- a/x-pack/plugins/fleet/common/constants/routes.ts +++ b/x-pack/plugins/fleet/common/constants/routes.ts @@ -204,3 +204,16 @@ export const DOWNLOAD_SOURCE_API_ROUTES = { UPDATE_PATTERN: `${API_ROOT}/agent_download_sources/{sourceId}`, DELETE_PATTERN: `${API_ROOT}/agent_download_sources/{sourceId}`, }; + +// API versioning constants +export const API_VERSIONS = { + public: { + v1: '2023-10-31', + }, + internal: { + v1: '1', + }, +}; + +export const PUBLIC_API_ACCESS = 'public'; +export const INTERNAL_API_ACCESS = 'internal'; diff --git a/x-pack/plugins/fleet/cypress/e2e/a11y/home_page.cy.ts b/x-pack/plugins/fleet/cypress/e2e/a11y/home_page.cy.ts index 39debfc94662a..7af771d60f9ef 100644 --- a/x-pack/plugins/fleet/cypress/e2e/a11y/home_page.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/a11y/home_page.cy.ts @@ -33,6 +33,8 @@ import { AGENT_POLICY_NAME_LINK } from '../../screens/integrations'; import { cleanupAgentPolicies, unenrollAgent } from '../../tasks/cleanup'; import { setFleetServerHost } from '../../tasks/fleet_server'; +import { API_VERSIONS } from '../../../common/constants'; + describe('Home page', () => { before(() => { setFleetServerHost('https://fleetserver:8220'); @@ -152,7 +154,7 @@ describe('Home page', () => { method: 'POST', url: '/api/fleet/agent_policies', body: { name: 'Agent policy for A11y test', namespace: 'default', id: 'agent-policy-a11y' }, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); beforeEach(() => { @@ -164,7 +166,7 @@ describe('Home page', () => { method: 'POST', url: '/api/fleet/agent_policies/delete', body: { agentPolicyId: 'agent-policy-a11y' }, - headers: { 'kbn-xsrf': 'kibana' }, + headers: { 'kbn-xsrf': 'kibana', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); it('Uninstall Tokens Table', () => { diff --git a/x-pack/plugins/fleet/cypress/e2e/agent_binary_download_source.cy.ts b/x-pack/plugins/fleet/cypress/e2e/agent_binary_download_source.cy.ts index 095a87a28e130..3d5fa3f98fe25 100644 --- a/x-pack/plugins/fleet/cypress/e2e/agent_binary_download_source.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/agent_binary_download_source.cy.ts @@ -15,6 +15,8 @@ import { cleanupDownloadSources } from '../tasks/cleanup'; import { FLEET, navigateTo } from '../tasks/navigation'; import { CONFIRM_MODAL } from '../screens/navigation'; +import { API_VERSIONS } from '../../common/constants'; + describe('Agent binary download source section', () => { beforeEach(() => { cleanupDownloadSources(); @@ -80,7 +82,7 @@ describe('Agent binary download source section', () => { id: 'fleet-local-registry', host: 'https://new-custom-host.co', }, - headers: { 'kbn-xsrf': 'kibana' }, + headers: { 'kbn-xsrf': 'kibana', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); cy.request({ method: 'POST', @@ -93,7 +95,7 @@ describe('Agent binary download source section', () => { id: 'new-agent-policy', download_source_id: 'fleet-local-registry', }, - headers: { 'kbn-xsrf': 'kibana' }, + headers: { 'kbn-xsrf': 'kibana', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }).then((response: any) => { navigateTo('app/fleet/policies/new-agent-policy/settings'); cy.getBySel(AGENT_POLICY_FORM.DOWNLOAD_SOURCE_SELECT).contains('Custom Host'); diff --git a/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts b/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts index fd85e05e51aec..1e3bf95bb2356 100644 --- a/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts @@ -13,6 +13,8 @@ import { deleteFleetServerDocs, deleteAgentDocs, cleanupAgentPolicies } from '.. import type { CreateAgentPolicyRequest } from '../../../common/types'; import { setUISettings } from '../../tasks/ui_settings'; +import { API_VERSIONS } from '../../../common/constants'; + const createAgentDocs = (kibanaVersion: string) => [ createAgentDoc('agent-1', 'policy-1'), // this agent will have upgrade available createAgentDoc('agent-2', 'policy-2', 'error', kibanaVersion), @@ -66,7 +68,7 @@ function createAgentPolicy(body: CreateAgentPolicyRequest['body']) { cy.request({ method: 'POST', url: '/api/fleet/agent_policies', - headers: { 'kbn-xsrf': 'xx' }, + headers: { 'kbn-xsrf': 'xx', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, body, }); } diff --git a/x-pack/plugins/fleet/cypress/e2e/enrollment_token.cy.ts b/x-pack/plugins/fleet/cypress/e2e/enrollment_token.cy.ts index 84b910c856dfb..57149b435e433 100644 --- a/x-pack/plugins/fleet/cypress/e2e/enrollment_token.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/enrollment_token.cy.ts @@ -8,6 +8,8 @@ import { cleanupAgentPolicies } from '../tasks/cleanup'; import { ENROLLMENT_TOKENS } from '../screens/fleet'; +import { API_VERSIONS } from '../../common/constants'; + describe('Enrollment token page', () => { before(() => { cy.request({ @@ -20,7 +22,7 @@ describe('Enrollment token page', () => { monitoring_enabled: ['logs', 'metrics'], id: 'agent-policy-1', }, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); diff --git a/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts b/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts index b907fb8ef4c79..6ca1eb669da19 100644 --- a/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts @@ -11,6 +11,8 @@ import { createAgentDoc } from '../tasks/agents'; import { setFleetServerHost } from '../tasks/fleet_server'; import { FLEET, navigateTo } from '../tasks/navigation'; +import { API_VERSIONS } from '../../common/constants'; + const FLEET_SERVER_POLICY_ID = 'fleet-server-policy'; function cleanUp() { @@ -28,7 +30,7 @@ describe('Fleet add agent flyout', () => { cy.request({ method: 'POST', url: '/api/fleet/agent_policies', - headers: { 'kbn-xsrf': 'xx' }, + headers: { 'kbn-xsrf': 'xx', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, body: { id: FLEET_SERVER_POLICY_ID, name: 'Fleet Server policy', diff --git a/x-pack/plugins/fleet/cypress/e2e/integrations_real.cy.ts b/x-pack/plugins/fleet/cypress/e2e/integrations_real.cy.ts index c3f7f117f8f36..1ce6636198fe7 100644 --- a/x-pack/plugins/fleet/cypress/e2e/integrations_real.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/integrations_real.cy.ts @@ -31,6 +31,7 @@ import { import { LOADING_SPINNER, CONFIRM_MODAL } from '../screens/navigation'; import { ADD_PACKAGE_POLICY_BTN } from '../screens/fleet'; import { cleanupAgentPolicies } from '../tasks/cleanup'; +import { API_VERSIONS } from '../../common/constants'; function setupIntegrations() { cy.intercept( @@ -135,7 +136,7 @@ describe('Add Integration - Real API', () => { namespace: 'default', monitoring_enabled: ['logs', 'metrics'], }, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); cy.request('/api/fleet/agent_policies').then((response: any) => { diff --git a/x-pack/plugins/fleet/cypress/e2e/package_policy_pipelines_and_mappings_real.cy.ts b/x-pack/plugins/fleet/cypress/e2e/package_policy_pipelines_and_mappings_real.cy.ts index 3fed3fef1d94b..60c75327f06ad 100644 --- a/x-pack/plugins/fleet/cypress/e2e/package_policy_pipelines_and_mappings_real.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/package_policy_pipelines_and_mappings_real.cy.ts @@ -17,6 +17,8 @@ const INPUT_TEST_PACKAGE = 'input_package-1.0.0'; const INTEGRATION_TEST_PACKAGE = 'logs_integration-1.0.0'; const INTEGRATION_TEST_PACKAGE_NO_DATASET = 'logs_int_no_dataset-1.0.0'; +import { API_VERSIONS } from '../../common/constants'; + describe('Input package create and edit package policy', () => { const agentPolicyId = 'test-input-package-policy'; const agentPolicyName = 'Test input package policy'; @@ -45,7 +47,7 @@ describe('Input package create and edit package policy', () => { namespace: 'default', monitoring_enabled: [], }, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); after(() => { @@ -53,7 +55,7 @@ describe('Input package create and edit package policy', () => { cy.request({ method: 'POST', url: `/api/fleet/agent_policies/delete`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, body: JSON.stringify({ agentPolicyId, }), @@ -120,7 +122,7 @@ describe('Integration package with custom dataset create and edit package policy namespace: 'default', monitoring_enabled: [], }, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); after(() => { @@ -128,7 +130,7 @@ describe('Integration package with custom dataset create and edit package policy cy.request({ method: 'POST', url: `/api/fleet/agent_policies/delete`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, body: JSON.stringify({ agentPolicyId, }), @@ -184,7 +186,7 @@ describe('Integration package with fixed dataset create and edit package policy' namespace: 'default', monitoring_enabled: [], }, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); after(() => { @@ -192,7 +194,7 @@ describe('Integration package with fixed dataset create and edit package policy' cy.request({ method: 'POST', url: `/api/fleet/agent_policies/delete`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, body: JSON.stringify({ agentPolicyId, }), diff --git a/x-pack/plugins/fleet/cypress/e2e/uninstall_token.cy.ts b/x-pack/plugins/fleet/cypress/e2e/uninstall_token.cy.ts index 212e7aa0b3a9e..3832feefe10e1 100644 --- a/x-pack/plugins/fleet/cypress/e2e/uninstall_token.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/uninstall_token.cy.ts @@ -11,6 +11,8 @@ import { cleanupAgentPolicies } from '../tasks/cleanup'; import { UNINSTALL_TOKENS } from '../screens/fleet'; import type { GetUninstallTokenResponse } from '../../common/types/rest_spec/uninstall_token'; +import { API_VERSIONS } from '../../common/constants'; + describe('Uninstall token page', () => { before(() => { cleanupAgentPolicies(); @@ -78,7 +80,7 @@ describe('Uninstall token page', () => { method: 'POST', url: '/api/fleet/agent_policies', body: { name: `Agent policy ${i}00`, namespace: 'default', id: `agent-policy-${i}00` }, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); } }; diff --git a/x-pack/plugins/fleet/cypress/plugins/index.ts b/x-pack/plugins/fleet/cypress/plugins/index.ts index ee01dd20c470c..23f50d0e23197 100644 --- a/x-pack/plugins/fleet/cypress/plugins/index.ts +++ b/x-pack/plugins/fleet/cypress/plugins/index.ts @@ -12,6 +12,8 @@ import fs from 'fs'; import fetch from 'node-fetch'; import { createEsClientForTesting } from '@kbn/test'; +import { API_VERSIONS } from '../../common/constants'; + const plugin: Cypress.PluginConfig = (on, config) => { const client = createEsClientForTesting({ esUrl: config.env.ELASTICSEARCH_URL, @@ -22,8 +24,9 @@ const plugin: Cypress.PluginConfig = (on, config) => { path: string; body?: any; contentType?: string; + version?: string; }) { - const { method, path, body, contentType } = opts; + const { method, path, body, contentType, version } = opts; const Authorization = `Basic ${Buffer.from( `elastic:${config.env.ELASTICSEARCH_PASSWORD}` ).toString('base64')}`; @@ -35,6 +38,7 @@ const plugin: Cypress.PluginConfig = (on, config) => { 'kbn-xsrf': 'cypress', 'Content-Type': contentType || 'application/json', Authorization, + ...(version ? { 'Elastic-Api-Version': version } : {}), }, ...(body ? { body } : {}), }); @@ -75,6 +79,7 @@ const plugin: Cypress.PluginConfig = (on, config) => { path: '/api/fleet/epm/packages', body: Buffer.from(zipContent, 'base64'), contentType: 'application/zip', + version: API_VERSIONS.public.v1, }); }, @@ -82,6 +87,7 @@ const plugin: Cypress.PluginConfig = (on, config) => { return kibanaFetch({ method: 'DELETE', path: `/api/fleet/epm/packages/${packageName}`, + version: API_VERSIONS.public.v1, }); }, }); diff --git a/x-pack/plugins/fleet/cypress/tasks/cleanup.ts b/x-pack/plugins/fleet/cypress/tasks/cleanup.ts index 2a1e57271f08a..8ca9a1cb32d25 100644 --- a/x-pack/plugins/fleet/cypress/tasks/cleanup.ts +++ b/x-pack/plugins/fleet/cypress/tasks/cleanup.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { API_VERSIONS } from '../../common/constants'; export function cleanupAgentPolicies() { cy.request('/api/fleet/agent_policies').then((response: any) => { @@ -14,7 +15,7 @@ export function cleanupAgentPolicies() { method: 'POST', url: '/api/fleet/agent_policies/delete', body: { agentPolicyId: policy.id }, - headers: { 'kbn-xsrf': 'kibana' }, + headers: { 'kbn-xsrf': 'kibana', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); }); @@ -28,7 +29,7 @@ export function unenrollAgent() { method: 'POST', url: `api/fleet/agents/${agent.id}/unenroll`, body: { revoke: true }, - headers: { 'kbn-xsrf': 'kibana' }, + headers: { 'kbn-xsrf': 'kibana', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); } @@ -43,7 +44,7 @@ export function cleanupDownloadSources() { cy.request({ method: 'DELETE', url: `/api/fleet/agent_download_sources/${ds.id}`, - headers: { 'kbn-xsrf': 'kibana' }, + headers: { 'kbn-xsrf': 'kibana', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); }); }); diff --git a/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts b/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts index 2b696f7d7edfb..4f9df31eeba60 100644 --- a/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts +++ b/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts @@ -4,6 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { API_VERSIONS } from '../../common/constants'; + import { createAgentDoc } from './agents'; const FLEET_SERVER_POLICY_ID = 'fleet-server-policy'; @@ -66,7 +68,7 @@ export function setFleetServerHost(host = 'https://fleetserver:8220') { cy.request({ method: 'POST', url: '/api/fleet/fleet_server_hosts', - headers: { 'kbn-xsrf': 'xx' }, + headers: { 'kbn-xsrf': 'xx', 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, body: { name: 'Default host', host_urls: [host], diff --git a/x-pack/plugins/fleet/cypress/tasks/integrations.ts b/x-pack/plugins/fleet/cypress/tasks/integrations.ts index cef6322985d06..1cbb68cd58bff 100644 --- a/x-pack/plugins/fleet/cypress/tasks/integrations.ts +++ b/x-pack/plugins/fleet/cypress/tasks/integrations.ts @@ -15,6 +15,8 @@ import { import { AGENT_POLICY_SYSTEM_MONITORING_CHECKBOX, EXISTING_HOSTS_TAB } from '../screens/fleet'; import { TOAST_CLOSE_BTN, CONFIRM_MODAL } from '../screens/navigation'; +import { API_VERSIONS } from '../../common/constants'; + export const addIntegration = ({ useExistingPolicy } = { useExistingPolicy: false }) => { cy.getBySel(ADD_INTEGRATION_POLICY_BTN).click(); if (useExistingPolicy) { @@ -54,7 +56,7 @@ export const deleteIntegrations = async () => { response.body.items.forEach((policy: any) => ids.push(policy.id)); 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)}, "force": true }`, method: 'POST', }); @@ -64,7 +66,7 @@ export const deleteIntegrations = async () => { 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/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx index 96bbc5b82565e..5a1ca420a6227 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx @@ -12,6 +12,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { AGENTS_PREFIX } from '../../../constants'; import { sendDeleteAgentPolicy, useStartServices, useConfig, sendRequest } from '../../../hooks'; +import { API_VERSIONS } from '../../../../../../common/constants'; interface Props { children: (deleteAgentPolicy: DeleteAgentPolicy) => React.ReactElement; @@ -104,6 +105,7 @@ export const AgentPolicyDeleteProvider: React.FunctionComponent = ({ query: { kuery: `${AGENTS_PREFIX}.policy_id : ${agentPolicyToCheck}`, }, + version: API_VERSIONS.public.v1, }); setAgentsCount(data?.total || 0); setIsLoadingAgentsCount(false); diff --git a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx index 683ba398f6669..5e5a657e0d4b8 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { useStartServices, sendRequest, sendDeletePackagePolicy, useConfig } from '../hooks'; -import { AGENT_API_ROUTES, AGENTS_PREFIX } from '../../common/constants'; +import { AGENT_API_ROUTES, AGENTS_PREFIX, API_VERSIONS } from '../../common/constants'; import type { AgentPolicy } from '../types'; interface Props { @@ -55,6 +55,7 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent = ({ perPage: 1, kuery: `${AGENTS_PREFIX}.policy_id : ${agentPolicy.id}`, }, + version: API_VERSIONS.public.v1, }); setAgentsCount(data?.total || 0); setIsLoadingAgentsCount(false); diff --git a/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts b/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts index 39372fcc5c508..ee0481bd373af 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts @@ -7,6 +7,7 @@ import { useQuery } from '@tanstack/react-query'; import { agentPolicyRouteService } from '../../services'; +import { API_VERSIONS } from '../../../common/constants'; import type { GetAgentPoliciesRequest, @@ -31,6 +32,7 @@ export const useGetAgentPolicies = (query?: GetAgentPoliciesRequest['query']) => path: agentPolicyRouteService.getListPath(), method: 'get', query, + version: API_VERSIONS.public.v1, }); }; @@ -40,6 +42,7 @@ export const useGetAgentPoliciesQuery = (query?: GetAgentPoliciesRequest['query' path: agentPolicyRouteService.getListPath(), method: 'get', query, + version: API_VERSIONS.public.v1, }) ); }; @@ -49,6 +52,7 @@ export const sendGetAgentPolicies = (query?: GetAgentPoliciesRequest['query']) = path: agentPolicyRouteService.getListPath(), method: 'get', query, + version: API_VERSIONS.public.v1, }); }; @@ -57,6 +61,7 @@ export const useGetOneAgentPolicy = (agentPolicyId: string | undefined) => { path: agentPolicyId ? agentPolicyRouteService.getInfoPath(agentPolicyId) : undefined, method: 'get', shouldSendRequest: !!agentPolicyId, + version: API_VERSIONS.public.v1, } as SendConditionalRequestConfig); }; @@ -64,6 +69,7 @@ export const useGetOneAgentPolicyFull = (agentPolicyId: string) => { return useRequest({ path: agentPolicyRouteService.getInfoFullPath(agentPolicyId), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -75,6 +81,7 @@ export const sendGetOneAgentPolicyFull = ( path: agentPolicyRouteService.getInfoFullPath(agentPolicyId), method: 'get', query, + version: API_VERSIONS.public.v1, }); }; @@ -82,6 +89,7 @@ export const sendGetOneAgentPolicy = (agentPolicyId: string) => { return sendRequest({ path: agentPolicyRouteService.getInfoPath(agentPolicyId), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -94,6 +102,7 @@ export const sendCreateAgentPolicy = ( method: 'post', body: JSON.stringify(body), query: withSysMonitoring ? { sys_monitoring: true } : {}, + version: API_VERSIONS.public.v1, }); }; @@ -105,6 +114,7 @@ export const sendUpdateAgentPolicy = ( path: agentPolicyRouteService.getUpdatePath(agentPolicyId), method: 'put', body: JSON.stringify(body), + version: API_VERSIONS.public.v1, }); }; @@ -124,6 +134,7 @@ export const sendDeleteAgentPolicy = (body: DeleteAgentPolicyRequest['body']) => path: agentPolicyRouteService.getDeletePath(), method: 'post', body: JSON.stringify(body), + version: API_VERSIONS.public.v1, }); }; @@ -132,6 +143,7 @@ export const sendResetOnePreconfiguredAgentPolicy = (agentPolicyId: string) => { path: agentPolicyRouteService.getResetOnePreconfiguredAgentPolicyPath(agentPolicyId), method: 'post', body: JSON.stringify({}), + version: API_VERSIONS.internal.v1, }); }; @@ -140,5 +152,6 @@ export const sendResetAllPreconfiguredAgentPolicies = () => { path: agentPolicyRouteService.getResetAllPreconfiguredAgentPolicyPath(), method: 'post', body: JSON.stringify({}), + version: API_VERSIONS.internal.v1, }); }; diff --git a/x-pack/plugins/fleet/public/hooks/use_request/agents.ts b/x-pack/plugins/fleet/public/hooks/use_request/agents.ts index f6a132e2090f1..9b43a600b62b8 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/agents.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/agents.ts @@ -18,6 +18,8 @@ import type { UpdateAgentRequest, } from '../../../common/types'; +import { API_VERSIONS } from '../../../common/constants'; + import { agentRouteService } from '../../services'; import type { @@ -62,6 +64,7 @@ export function useGetOneAgent( return useRequest({ path: agentRouteService.getInfoPath(agentId), method: 'get', + version: API_VERSIONS.public.v1, ...options, }); } @@ -70,22 +73,25 @@ export function useGetAgents(query: GetAgentsRequest['query'], options?: Request return useRequest({ method: 'get', path: agentRouteService.getListPath(), + version: API_VERSIONS.public.v1, query, ...options, }); } - export function useGetAgentsQuery( query: GetAgentsRequest['query'], options: Partial<{ enabled: boolean }> = {} ) { - return useQuery(['agents', query], () => sendGetAgents(query), { enabled: options.enabled }); + return useQuery(['agents', query], () => sendGetAgents(query), { + enabled: options.enabled, + }); } export function sendGetAgents(query: GetAgentsRequest['query'], options?: RequestOptions) { return sendRequest({ method: 'get', path: agentRouteService.getListPath(), + version: API_VERSIONS.public.v1, query, ...options, }); @@ -95,6 +101,7 @@ export function useGetAgentStatus(query: GetAgentStatusRequest['query'], options return useRequest({ method: 'get', path: agentRouteService.getStatusPath(), + version: API_VERSIONS.public.v1, query, ...options, }); @@ -104,6 +111,7 @@ export function sendGetAgentIncomingData(query: GetAgentIncomingDataRequest['que method: 'get', path: agentRouteService.getIncomingDataPath(), query, + version: API_VERSIONS.public.v1, }); } @@ -115,6 +123,7 @@ export function sendGetAgentStatus( method: 'get', path: agentRouteService.getStatusPath(), query, + version: API_VERSIONS.public.v1, ...options, }); } @@ -124,6 +133,7 @@ export function sendGetAgentTags(query: GetAgentsRequest['query'], options?: Req method: 'get', path: agentRouteService.getListTagsPath(), query, + version: API_VERSIONS.public.v1, ...options, }); } @@ -137,6 +147,7 @@ export function sendPostAgentReassign( method: 'post', path: agentRouteService.getReassignPath(agentId), body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -149,6 +160,7 @@ export function sendPostBulkAgentReassign( method: 'post', path: agentRouteService.getBulkReassignPath(), body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -162,6 +174,7 @@ export function sendPostAgentUnenroll( path: agentRouteService.getUnenrollPath(agentId), method: 'post', body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -174,6 +187,7 @@ export function sendPostBulkAgentUnenroll( path: agentRouteService.getBulkUnenrollPath(), method: 'post', body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -187,6 +201,7 @@ export function sendPostAgentUpgrade( path: agentRouteService.getUpgradePath(agentId), method: 'post', body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -195,6 +210,7 @@ export function sendPostRequestDiagnostics(agentId: string, options?: RequestOpt return sendRequest({ path: agentRouteService.getRequestDiagnosticsPath(agentId), method: 'post', + version: API_VERSIONS.public.v1, ...options, }); } @@ -207,6 +223,7 @@ export function sendPostBulkRequestDiagnostics( path: agentRouteService.getBulkRequestDiagnosticsPath(), method: 'post', body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -223,6 +240,7 @@ export const useGetAgentUploads = (agentId: string, options?: RequestOptions) => return useRequest({ path: agentRouteService.getListAgentUploads(agentId), method: 'get', + version: API_VERSIONS.public.v1, ...options, }); }; @@ -236,6 +254,7 @@ export function sendPostAgentAction( path: agentRouteService.getCreateActionPath(agentId), method: 'post', body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -248,6 +267,7 @@ export function sendPostBulkAgentUpgrade( path: agentRouteService.getBulkUpgradePath(), method: 'post', body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -256,6 +276,7 @@ export function sendGetActionStatus() { return sendRequest({ path: agentRouteService.getActionStatusPath(), method: 'get', + version: API_VERSIONS.public.v1, }); } @@ -263,6 +284,7 @@ export function sendPostCancelAction(actionId: string) { return sendRequest({ path: agentRouteService.getCancelActionPath(actionId), method: 'post', + version: API_VERSIONS.public.v1, }); } @@ -270,6 +292,7 @@ export function sendPostRetrieveAgentsByActions(body: PostRetrieveAgentsByAction return sendRequest({ path: agentRouteService.getAgentsByActionsPath(), method: 'post', + version: API_VERSIONS.public.v1, body, }); } @@ -283,6 +306,7 @@ export function sendPutAgentTagsUpdate( method: 'put', path: agentRouteService.getUpdatePath(agentId), body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -295,6 +319,7 @@ export function sendPostBulkAgentTagsUpdate( method: 'post', path: agentRouteService.getBulkUpdateTagsPath(), body, + version: API_VERSIONS.public.v1, ...options, }); } @@ -303,5 +328,6 @@ export function sendGetAgentsAvailableVersions() { return sendRequest({ method: 'get', path: agentRouteService.getAvailableVersionsPath(), + version: API_VERSIONS.public.v1, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/app.ts b/x-pack/plugins/fleet/public/hooks/use_request/app.ts index 5236356180d83..321e296a1e584 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/app.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/app.ts @@ -9,6 +9,7 @@ import { useQuery } from '@tanstack/react-query'; import { appRoutesService } from '../../services'; import type { CheckPermissionsResponse, GenerateServiceTokenResponse } from '../../types'; +import { API_VERSIONS } from '../../../common/constants'; import { sendRequest, sendRequestForRq, useRequest } from './use_request'; @@ -17,6 +18,7 @@ export const sendGetPermissionsCheck = (fleetServerSetup?: boolean) => { path: appRoutesService.getCheckPermissionsPath(), method: 'get', query: { fleetServerSetup }, + version: API_VERSIONS.public.v1, }); }; @@ -24,6 +26,7 @@ export const sendGenerateServiceToken = () => { return sendRequest({ path: appRoutesService.getRegenerateServiceTokenPath(), method: 'post', + version: API_VERSIONS.public.v1, }); }; @@ -34,6 +37,7 @@ export const usePermissionCheckQuery = () => { sendRequestForRq({ path: appRoutesService.getCheckPermissionsPath(), method: 'get', + version: API_VERSIONS.public.v1, }) ); }; @@ -42,5 +46,6 @@ export const usePermissionCheck = () => { return useRequest({ path: appRoutesService.getCheckPermissionsPath(), method: 'get', + version: API_VERSIONS.public.v1, }); }; diff --git a/x-pack/plugins/fleet/public/hooks/use_request/data_stream.ts b/x-pack/plugins/fleet/public/hooks/use_request/data_stream.ts index 25215b6e623b1..7f136f628bafc 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/data_stream.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/data_stream.ts @@ -7,6 +7,7 @@ import { dataStreamRouteService } from '../../services'; import type { GetDataStreamsResponse } from '../../types'; +import { API_VERSIONS } from '../../../common/constants'; import { useRequest, sendRequest } from './use_request'; @@ -14,6 +15,7 @@ export const useGetDataStreams = () => { return useRequest({ path: dataStreamRouteService.getListPath(), method: 'get', + version: API_VERSIONS.public.v1, }); }; diff --git a/x-pack/plugins/fleet/public/hooks/use_request/download_source.ts b/x-pack/plugins/fleet/public/hooks/use_request/download_source.ts index 2b213501170e1..672fc6beddf09 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/download_source.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/download_source.ts @@ -12,12 +12,15 @@ import type { PutDownloadSourceRequest, } from '../../types'; +import { API_VERSIONS } from '../../../common/constants'; + import { useRequest, sendRequest } from './use_request'; export function useGetDownloadSources() { return useRequest({ method: 'get', path: downloadSourceRoutesService.getListPath(), + version: API_VERSIONS.public.v1, }); } @@ -35,6 +38,7 @@ export function sendPutDownloadSource( return sendRequest({ method: 'put', path: downloadSourceRoutesService.getUpdatePath(downloadSourceId), + version: API_VERSIONS.public.v1, body, }); } @@ -43,6 +47,7 @@ export function sendPostDownloadSource(body: PostDownloadSourceRequest['body']) return sendRequest({ method: 'post', path: downloadSourceRoutesService.getCreatePath(), + version: API_VERSIONS.public.v1, body, }); } @@ -51,5 +56,6 @@ export function sendDeleteDownloadSource(downloadSourceId: string) { return sendRequest({ method: 'delete', path: downloadSourceRoutesService.getDeletePath(downloadSourceId), + version: API_VERSIONS.public.v1, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/enrollment_api_keys.ts b/x-pack/plugins/fleet/public/hooks/use_request/enrollment_api_keys.ts index 7b3ddaada8001..c63360a73474d 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/enrollment_api_keys.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/enrollment_api_keys.ts @@ -15,6 +15,8 @@ import type { PostEnrollmentAPIKeyResponse, } from '../../types'; +import { API_VERSIONS } from '../../../common/constants'; + import { useRequest, sendRequest, useConditionalRequest } from './use_request'; import type { UseRequestConfig, SendConditionalRequestConfig } from './use_request'; @@ -25,6 +27,7 @@ export function useGetOneEnrollmentAPIKey(keyId: string | undefined) { method: 'get', path: keyId ? enrollmentAPIKeyRouteService.getInfoPath(keyId) : undefined, shouldSendRequest: !!keyId, + version: API_VERSIONS.public.v1, } as SendConditionalRequestConfig); } @@ -32,6 +35,7 @@ export function sendGetOneEnrollmentAPIKey(keyId: string, options?: RequestOptio return sendRequest({ method: 'get', path: enrollmentAPIKeyRouteService.getInfoPath(keyId), + version: API_VERSIONS.public.v1, ...options, }); } @@ -40,6 +44,7 @@ export function sendDeleteOneEnrollmentAPIKey(keyId: string, options?: RequestOp return sendRequest({ method: 'delete', path: enrollmentAPIKeyRouteService.getDeletePath(keyId), + version: API_VERSIONS.public.v1, ...options, }); } @@ -51,6 +56,7 @@ export function sendGetEnrollmentAPIKeys( return sendRequest({ method: 'get', path: enrollmentAPIKeyRouteService.getListPath(), + version: API_VERSIONS.public.v1, query, ...options, }); @@ -63,6 +69,7 @@ export function useGetEnrollmentAPIKeys( return useRequest({ method: 'get', path: enrollmentAPIKeyRouteService.getListPath(), + version: API_VERSIONS.public.v1, query, ...options, }); @@ -72,6 +79,7 @@ export function sendCreateEnrollmentAPIKey(body: PostEnrollmentAPIKeyRequest['bo return sendRequest({ method: 'post', path: enrollmentAPIKeyRouteService.getCreatePath(), + version: API_VERSIONS.public.v1, body, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/epm.ts b/x-pack/plugins/fleet/public/hooks/use_request/epm.ts index 35871c27f1dac..24a36f969247d 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/epm.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/epm.ts @@ -28,6 +28,7 @@ import type { GetVerificationKeyIdResponse, } from '../../types'; import type { FleetErrorResponse, GetStatsResponse } from '../../../common/types'; +import { API_VERSIONS } from '../../../common/constants'; import { getCustomIntegrations } from '../../services/custom_integrations'; @@ -56,6 +57,7 @@ export function useGetCategoriesQuery(query: GetCategoriesRequest['query'] = {}) path: epmRouteService.getCategoriesPath(), method: 'get', query, + version: API_VERSIONS.public.v1, }) ); } @@ -64,6 +66,7 @@ export const sendGetCategories = (query: GetCategoriesRequest['query'] = {}) => return sendRequest({ path: epmRouteService.getCategoriesPath(), method: 'get', + version: API_VERSIONS.public.v1, query, }); }; @@ -72,6 +75,7 @@ export const useGetPackages = (query: GetPackagesRequest['query'] = {}) => { return useRequest({ path: epmRouteService.getListPath(), method: 'get', + version: API_VERSIONS.public.v1, query, }); }; @@ -81,6 +85,7 @@ export const useGetPackagesQuery = (query: GetPackagesRequest['query']) => { sendRequestForRq({ path: epmRouteService.getListPath(), method: 'get', + version: API_VERSIONS.public.v1, query, }) ); @@ -90,6 +95,7 @@ export const sendGetPackages = (query: GetPackagesRequest['query'] = {}) => { return sendRequest({ path: epmRouteService.getListPath(), method: 'get', + version: API_VERSIONS.public.v1, query, }); }; @@ -98,6 +104,7 @@ export const useGetLimitedPackages = () => { return useRequest({ path: epmRouteService.getListLimitedPath(), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -128,6 +135,7 @@ export const useGetPackageInfoByKeyQuery = ( sendRequestForRq({ path: epmRouteService.getInfoPath(pkgName, pkgVersion), method: 'get', + version: API_VERSIONS.public.v1, query: { ...options, ...(ignoreUnverifiedQueryParam && { ignoreUnverified: ignoreUnverifiedQueryParam }), @@ -155,6 +163,7 @@ export const useGetPackageStats = (pkgName: string) => { return useRequest({ path: epmRouteService.getStatsPath(pkgName), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -165,6 +174,7 @@ export const useGetPackageVerificationKeyId = () => { sendRequestForRq({ path: epmRouteService.getVerificationKeyIdPath(), method: 'get', + version: API_VERSIONS.public.v1, }) ); @@ -186,6 +196,7 @@ export const sendGetPackageInfoByKey = ( return sendRequest({ path: epmRouteService.getInfoPath(pkgName, pkgVersion), method: 'get', + version: API_VERSIONS.public.v1, query: options, }); }; @@ -194,12 +205,17 @@ export const useGetFileByPath = (filePath: string) => { return useRequest({ path: epmRouteService.getFilePath(filePath), method: 'get', + version: API_VERSIONS.public.v1, }); }; export const useGetFileByPathQuery = (filePath: string) => { return useQuery, RequestError>(['get-file', filePath], () => - sendRequest({ path: epmRouteService.getFilePath(filePath), method: 'get' }) + sendRequest({ + path: epmRouteService.getFilePath(filePath), + method: 'get', + version: API_VERSIONS.public.v1, + }) ); }; @@ -207,6 +223,7 @@ export const sendGetFileByPath = (filePath: string) => { return sendRequest({ path: epmRouteService.getFilePath(filePath), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -215,6 +232,7 @@ export const sendInstallPackage = (pkgName: string, pkgVersion: string, force: b return sendRequest({ path: epmRouteService.getInstallPath(pkgName, pkgVersion), method: 'post', + version: API_VERSIONS.public.v1, body, }); }; @@ -225,6 +243,7 @@ export const sendBulkInstallPackages = ( return sendRequest({ path: epmRouteService.getBulkInstallPath(), method: 'post', + version: API_VERSIONS.public.v1, body: { packages, }, @@ -235,6 +254,7 @@ export const sendRemovePackage = (pkgName: string, pkgVersion: string, force: bo return sendRequest({ path: epmRouteService.getRemovePath(pkgName, pkgVersion), method: 'delete', + version: API_VERSIONS.public.v1, body: { force, }, @@ -249,6 +269,7 @@ export const sendRequestReauthorizeTransforms = ( return sendRequest({ path: epmRouteService.getReauthorizeTransformsPath(pkgName, pkgVersion), method: 'post', + version: API_VERSIONS.public.v1, body: { transforms }, }); }; @@ -265,6 +286,7 @@ export const useUpdatePackageMutation = () => { sendRequestForRq({ path: epmRouteService.getUpdatePath(pkgName, pkgVersion), method: 'put', + version: API_VERSIONS.public.v1, body, }) ); @@ -278,6 +300,7 @@ export const sendUpdatePackage = ( return sendRequest({ path: epmRouteService.getUpdatePath(pkgName, pkgVersion), method: 'put', + version: API_VERSIONS.public.v1, body, }); }; @@ -286,6 +309,7 @@ export const sendGetBulkAssets = (body: GetBulkAssetsRequest['body']) => { return sendRequest({ path: epmRouteService.getBulkAssetsPath(), method: 'post', + version: API_VERSIONS.public.v1, body, }); }; diff --git a/x-pack/plugins/fleet/public/hooks/use_request/fleet_proxies.ts b/x-pack/plugins/fleet/public/hooks/use_request/fleet_proxies.ts index 0e058f900c442..9cb09486980d3 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/fleet_proxies.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/fleet_proxies.ts @@ -6,6 +6,8 @@ */ import { fleetProxiesRoutesService } from '../../../common/services'; +import { API_VERSIONS } from '../../../common/constants'; + import type { GetFleetProxiesResponse, PostFleetProxiesRequest, @@ -18,21 +20,32 @@ export function useGetFleetProxies() { return useRequest({ method: 'get', path: fleetProxiesRoutesService.getListPath(), + version: API_VERSIONS.public.v1, }); } export function sendDeleteFleetProxy(proxyId: string) { - return sendRequest({ method: 'delete', path: fleetProxiesRoutesService.getDeletePath(proxyId) }); + return sendRequest({ + method: 'delete', + path: fleetProxiesRoutesService.getDeletePath(proxyId), + version: API_VERSIONS.public.v1, + }); } export function sendPostFleetProxy(body: PostFleetProxiesRequest['body']) { - return sendRequest({ method: 'post', path: fleetProxiesRoutesService.getCreatePath(), body }); + return sendRequest({ + method: 'post', + path: fleetProxiesRoutesService.getCreatePath(), + body, + version: API_VERSIONS.public.v1, + }); } export function sendPutFleetProxy(proxyId: string, body: PutFleetProxiesRequest['body']) { return sendRequest({ method: 'put', path: fleetProxiesRoutesService.getUpdatePath(proxyId), + version: API_VERSIONS.public.v1, body, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/fleet_server_hosts.ts b/x-pack/plugins/fleet/public/hooks/use_request/fleet_server_hosts.ts index f066da66dba12..db1968332d6b4 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/fleet_server_hosts.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/fleet_server_hosts.ts @@ -6,6 +6,9 @@ */ import { fleetServerHostsRoutesService } from '../../../common/services'; + +import { API_VERSIONS } from '../../../common/constants'; + import type { GetFleetServerHostsResponse, PostFleetServerHostsRequest, @@ -19,6 +22,7 @@ export function useGetFleetServerHosts() { return useRequest({ method: 'get', path: fleetServerHostsRoutesService.getListPath(), + version: API_VERSIONS.public.v1, }); } @@ -26,6 +30,7 @@ export function sendDeleteFleetServerHost(itemId: string) { return sendRequest({ method: 'delete', path: fleetServerHostsRoutesService.getDeletePath(itemId), + version: API_VERSIONS.public.v1, }); } @@ -33,6 +38,7 @@ export function sendPutFleetServerHost(itemId: string, body: PutFleetServerHosts return sendRequest({ method: 'put', path: fleetServerHostsRoutesService.getUpdatePath(itemId), + version: API_VERSIONS.public.v1, body, }); } @@ -41,6 +47,7 @@ export function sendPostFleetServerHost(body: PostFleetServerHostsRequest['body' return sendRequest({ method: 'post', path: fleetServerHostsRoutesService.getCreatePath(), + version: API_VERSIONS.public.v1, body, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/health_check.ts b/x-pack/plugins/fleet/public/hooks/use_request/health_check.ts index c5fdc7886faac..e9cfe36c66062 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/health_check.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/health_check.ts @@ -7,6 +7,7 @@ import type { PostHealthCheckRequest, PostHealthCheckResponse } from '../../types'; import { appRoutesService } from '../../services'; +import { API_VERSIONS } from '../../../common/constants'; import { sendRequest } from './use_request'; @@ -14,6 +15,7 @@ export function sendPostHealthCheck(body: PostHealthCheckRequest['body']) { return sendRequest({ method: 'post', path: appRoutesService.postHealthCheckPath(), + version: API_VERSIONS.public.v1, body, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/k8s.ts b/x-pack/plugins/fleet/public/hooks/use_request/k8s.ts index 2102fe6f5fe93..1f725ea3e8c5a 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/k8s.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/k8s.ts @@ -8,6 +8,7 @@ import { agentPolicyRouteService } from '../../services'; import type { GetFullAgentManifestResponse } from '../../../common/types'; +import { API_VERSIONS } from '../../../common/constants'; import { sendRequest } from './use_request'; @@ -15,6 +16,7 @@ export const sendGetK8sManifest = (query: { fleetServer?: string; enrolToken?: s return sendRequest({ path: agentPolicyRouteService.getK8sInfoPath(), method: 'get', + version: API_VERSIONS.public.v1, query, }); }; diff --git a/x-pack/plugins/fleet/public/hooks/use_request/outputs.ts b/x-pack/plugins/fleet/public/hooks/use_request/outputs.ts index 24b36df68a5fa..ccd6f2364250c 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/outputs.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/outputs.ts @@ -13,6 +13,8 @@ import type { PostLogstashApiKeyResponse, } from '../../types'; +import { API_VERSIONS } from '../../../common/constants'; + import { sendRequest, useRequest } from './use_request'; export function useGetOutputs() { @@ -33,6 +35,7 @@ export function sendPutOutput(outputId: string, body: PutOutputRequest['body']) return sendRequest({ method: 'put', path: outputRoutesService.getUpdatePath(outputId), + version: API_VERSIONS.public.v1, body, }); } @@ -41,6 +44,7 @@ export function sendPostLogstashApiKeys() { return sendRequest({ method: 'post', path: outputRoutesService.getCreateLogstashApiKeyPath(), + version: API_VERSIONS.public.v1, }); } @@ -48,6 +52,7 @@ export function sendPostOutput(body: PostOutputRequest['body']) { return sendRequest({ method: 'post', path: outputRoutesService.getCreatePath(), + version: API_VERSIONS.public.v1, body, }); } @@ -56,5 +61,6 @@ export function sendDeleteOutput(outputId: string) { return sendRequest({ method: 'delete', path: outputRoutesService.getDeletePath(outputId), + version: API_VERSIONS.public.v1, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/package_policy.ts b/x-pack/plugins/fleet/public/hooks/use_request/package_policy.ts index 4a573bb5e5883..fb23f740ed0bc 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/package_policy.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/package_policy.ts @@ -24,6 +24,8 @@ import type { UpgradePackagePolicyResponse, } from '../../../common/types/rest_spec'; +import { API_VERSIONS } from '../../../common/constants'; + import type { RequestError } from './use_request'; import { sendRequest, sendRequestForRq, useRequest } from './use_request'; @@ -31,6 +33,7 @@ export const sendCreatePackagePolicy = (body: CreatePackagePolicyRequest['body'] return sendRequest({ path: packagePolicyRouteService.getCreatePath(), method: 'post', + version: API_VERSIONS.public.v1, body: JSON.stringify(body), }); }; @@ -42,6 +45,7 @@ export const sendUpdatePackagePolicy = ( return sendRequest({ path: packagePolicyRouteService.getUpdatePath(packagePolicyId), method: 'put', + version: API_VERSIONS.public.v1, body: JSON.stringify(body), }); }; @@ -50,6 +54,7 @@ export const sendDeletePackagePolicy = (body: DeletePackagePoliciesRequest['body return sendRequest({ path: packagePolicyRouteService.getDeletePath(), method: 'post', + version: API_VERSIONS.public.v1, body: JSON.stringify(body), }); }; @@ -58,6 +63,7 @@ export function useGetPackagePoliciesQuery(query: GetPackagePoliciesRequest['que return useQuery(['packagePolicies'], () => sendRequestForRq({ method: 'get', + version: API_VERSIONS.public.v1, path: packagePolicyRouteService.getListPath(), query, }) @@ -67,6 +73,7 @@ export function useGetPackagePoliciesQuery(query: GetPackagePoliciesRequest['que export function useGetPackagePolicies(query: GetPackagePoliciesRequest['query']) { return useRequest({ method: 'get', + version: API_VERSIONS.public.v1, path: packagePolicyRouteService.getListPath(), query, }); @@ -75,6 +82,7 @@ export function useGetPackagePolicies(query: GetPackagePoliciesRequest['query']) export const sendGetPackagePolicies = (query: GetPackagePoliciesRequest['query']) => { return sendRequest({ method: 'get', + version: API_VERSIONS.public.v1, path: packagePolicyRouteService.getListPath(), query, }); @@ -86,6 +94,7 @@ export const useGetOnePackagePolicyQuery = (packagePolicyId: string) => { () => sendRequestForRq({ method: 'get', + version: API_VERSIONS.public.v1, path: packagePolicyRouteService.getInfoPath(packagePolicyId), }) ); @@ -95,6 +104,7 @@ export const useGetOnePackagePolicy = (packagePolicyId: string) => { return useRequest({ path: packagePolicyRouteService.getInfoPath(packagePolicyId), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -102,6 +112,7 @@ export const sendGetOnePackagePolicy = (packagePolicyId: string) => { return sendRequest({ path: packagePolicyRouteService.getInfoPath(packagePolicyId), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -124,6 +135,7 @@ export function useUpgradePackagePolicyDryRunQuery( sendRequestForRq({ path: packagePolicyRouteService.getDryRunPath(), method: 'post', + version: API_VERSIONS.public.v1, body: JSON.stringify(body), }), { enabled } @@ -145,6 +157,7 @@ export function sendUpgradePackagePolicyDryRun( return sendRequest({ path: packagePolicyRouteService.getDryRunPath(), method: 'post', + version: API_VERSIONS.public.v1, body: JSON.stringify(body), }); } @@ -158,6 +171,7 @@ export function useUpgradePackagePoliciesMutation() { sendRequestForRq({ path: packagePolicyRouteService.getUpgradePath(), method: 'post', + version: API_VERSIONS.public.v1, body: JSON.stringify({ packagePolicyIds, }), @@ -169,6 +183,7 @@ export function sendUpgradePackagePolicy(packagePolicyIds: string[]) { return sendRequest({ path: packagePolicyRouteService.getUpgradePath(), method: 'post', + version: API_VERSIONS.public.v1, body: JSON.stringify({ packagePolicyIds, }), @@ -179,5 +194,6 @@ export function sendGetOrphanedIntegrationPolicies() { return sendRequest({ path: packagePolicyRouteService.getOrphanedIntegrationPoliciesPath(), method: 'get', + version: API_VERSIONS.public.v1, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/settings.ts b/x-pack/plugins/fleet/public/hooks/use_request/settings.ts index 41131a32593de..d074644a9d26a 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/settings.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/settings.ts @@ -10,6 +10,8 @@ import { useQuery } from '@tanstack/react-query'; import { settingsRoutesService } from '../../services'; import type { PutSettingsResponse, PutSettingsRequest, GetSettingsResponse } from '../../types'; +import { API_VERSIONS } from '../../../common/constants'; + import type { RequestError } from './use_request'; import { sendRequest, sendRequestForRq, useRequest } from './use_request'; @@ -18,6 +20,7 @@ export function useGetSettingsQuery() { sendRequestForRq({ method: 'get', path: settingsRoutesService.getInfoPath(), + version: API_VERSIONS.public.v1, }) ); } @@ -26,6 +29,7 @@ export function useGetSettings() { return useRequest({ method: 'get', path: settingsRoutesService.getInfoPath(), + version: API_VERSIONS.public.v1, }); } @@ -33,6 +37,7 @@ export function sendGetSettings() { return sendRequest({ method: 'get', path: settingsRoutesService.getInfoPath(), + version: API_VERSIONS.public.v1, }); } @@ -40,6 +45,7 @@ export function sendPutSettings(body: PutSettingsRequest['body']) { return sendRequest({ method: 'put', path: settingsRoutesService.getUpdatePath(), + version: API_VERSIONS.public.v1, body, }); } diff --git a/x-pack/plugins/fleet/public/hooks/use_request/setup.ts b/x-pack/plugins/fleet/public/hooks/use_request/setup.ts index 67d631d5d55bc..59e5692df966f 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/setup.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/setup.ts @@ -7,6 +7,7 @@ import { setupRouteService, fleetSetupRouteService } from '../../services'; import type { GetFleetStatusResponse } from '../../types'; +import { API_VERSIONS } from '../../../common/constants'; import { sendRequest } from './use_request'; @@ -14,6 +15,7 @@ export const sendSetup = () => { return sendRequest({ path: setupRouteService.getSetupPath(), method: 'post', + version: API_VERSIONS.public.v1, }); }; @@ -21,6 +23,7 @@ export const sendGetFleetStatus = () => { return sendRequest({ path: fleetSetupRouteService.getFleetSetupPath(), method: 'get', + version: API_VERSIONS.public.v1, }); }; @@ -28,6 +31,7 @@ export const sendPostFleetSetup = ({ forceRecreate }: { forceRecreate: boolean } return sendRequest({ method: 'post', path: fleetSetupRouteService.postFleetSetupPath(), + version: API_VERSIONS.public.v1, body: { forceRecreate, }, diff --git a/x-pack/plugins/fleet/public/hooks/use_request/uninstall_tokens.ts b/x-pack/plugins/fleet/public/hooks/use_request/uninstall_tokens.ts index a851c572cf21d..5ba60daea0cc1 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/uninstall_tokens.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/uninstall_tokens.ts @@ -9,6 +9,8 @@ import { useQuery } from '@tanstack/react-query'; import { uninstallTokensRouteService } from '../../../common/services'; +import { API_VERSIONS } from '../../../common/constants'; + import type { GetUninstallTokensMetadataRequest, GetUninstallTokensMetadataResponse, @@ -23,6 +25,7 @@ export const useGetUninstallTokens = (query: GetUninstallTokensMetadataRequest[' sendRequestForRq({ method: 'get', path: uninstallTokensRouteService.getListPath(), + version: API_VERSIONS.public.v1, query, }) ); @@ -34,6 +37,7 @@ export const useGetUninstallToken = (uninstallTokenId: string) => sendRequestForRq({ method: 'get', path: uninstallTokensRouteService.getInfoPath(uninstallTokenId), + version: API_VERSIONS.public.v1, }) ); @@ -41,4 +45,5 @@ export const sendGetUninstallToken = (uninstallTokenId: string) => sendRequest({ method: 'get', path: uninstallTokensRouteService.getInfoPath(uninstallTokenId), + version: API_VERSIONS.public.v1, }); diff --git a/x-pack/plugins/fleet/public/plugin.ts b/x-pack/plugins/fleet/public/plugin.ts index ecef1c469e954..eb087b257bc1e 100644 --- a/x-pack/plugins/fleet/public/plugin.ts +++ b/x-pack/plugins/fleet/public/plugin.ts @@ -16,6 +16,7 @@ import type { import { i18n } from '@kbn/i18n'; import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import type { CustomIntegrationsStart, @@ -60,6 +61,8 @@ import type { ExperimentalFeatures } from '../common/experimental_features'; import type { FleetConfigType } from '../common/types'; +import { API_VERSIONS } from '../common/constants'; + import { CUSTOM_LOGS_INTEGRATION_NAME, INTEGRATIONS_BASE_PATH } from './constants'; import { licenseService } from './hooks'; import { setHttpClient } from './hooks/use_request'; @@ -287,7 +290,12 @@ export class FleetPlugin implements Plugin - core.http.get(appRoutesService.getCheckPermissionsPath()) + core.http.fetch(appRoutesService.getCheckPermissionsPath(), { + headers: { + [ELASTIC_HTTP_VERSION_HEADER]: API_VERSIONS.public.v1, + }, + version: API_VERSIONS.public.v1, + }) ); // Set up license service 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 d8dc5bc4ba13e..206d30cabbb79 100644 --- a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts +++ b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts @@ -34,6 +34,7 @@ const printUsage = () => const DEFAULT_KIBANA_URL = 'http://localhost:5601'; const DEFAULT_KIBANA_USERNAME = 'elastic'; const DEFAULT_KIBANA_PASSWORD = 'changeme'; +const PUBLIC_VERSION_V1 = '2023-10-31'; const DEFAULT_UNENROLL_TIMEOUT = 300; // 5 minutes const ES_URL = 'http://localhost:9200'; @@ -300,6 +301,8 @@ async function createAgentPolicy(id: string, name: string) { 'Content-Type': 'application/json', 'kbn-xsrf': 'kibana', 'x-elastic-product-origin': 'fleet', + // Note: version can change in the future + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, }); const data = await res.json(); diff --git a/x-pack/plugins/fleet/scripts/get_all_packages/get_all_packages.ts b/x-pack/plugins/fleet/scripts/get_all_packages/get_all_packages.ts index b29709190f15d..e8950be1a57b8 100644 --- a/x-pack/plugins/fleet/scripts/get_all_packages/get_all_packages.ts +++ b/x-pack/plugins/fleet/scripts/get_all_packages/get_all_packages.ts @@ -19,6 +19,7 @@ const KIBANA_URL = 'http://localhost:5601'; const KIBANA_USERNAME = 'elastic'; const KIBANA_PASSWORD = 'changeme'; const KIBANA_VERSION = kibanaPackageJson.version; +const PUBLIC_VERSION_V1 = '2023-10-31'; const { base = '', prerelease = false, batchSize = 1 } = yargs(process.argv).argv; @@ -50,6 +51,8 @@ async function getPackage(name: string, version: string, full: boolean = false) 'kbn-xsrf': 'xyz', Authorization: 'Basic ' + Buffer.from(`${KIBANA_USERNAME}:${KIBANA_PASSWORD}`).toString('base64'), + // Note: version can change in the future + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, method: 'GET', } diff --git a/x-pack/plugins/fleet/scripts/install_all_packages/install_all_packages.ts b/x-pack/plugins/fleet/scripts/install_all_packages/install_all_packages.ts index 3ff907ceff761..afd874264a7f4 100644 --- a/x-pack/plugins/fleet/scripts/install_all_packages/install_all_packages.ts +++ b/x-pack/plugins/fleet/scripts/install_all_packages/install_all_packages.ts @@ -15,6 +15,7 @@ const DEFAULT_KIBANA_URL = 'http://localhost:5601'; const DEFAULT_KIBANA_USERNAME = 'elastic'; const DEFAULT_KIBANA_PASSWORD = 'changeme'; const KIBANA_VERSION = kibanaPackageJson.version; +const PUBLIC_VERSION_V1 = '2023-10-31'; const logger = new ToolingLog({ level: 'info', @@ -59,6 +60,8 @@ async function installPackage(name: string, version: string) { 'content-type': 'application/json', 'kbn-xsrf': 'xyz', Authorization, + // Note: version can change in the future + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, body: JSON.stringify({ force: true }), method: 'POST', @@ -77,6 +80,8 @@ async function deletePackage(name: string, version: string) { 'content-type': 'application/json', 'kbn-xsrf': 'xyz', Authorization, + // Note: version can change in the future + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, method: 'DELETE', }); diff --git a/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts b/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts index a30f0a47304a3..97a5af5f8b6d5 100644 --- a/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts @@ -16,6 +16,7 @@ import { import type { AgentPolicySOAttributes } from '../types'; import { PRECONFIGURATION_DELETION_RECORD_SAVED_OBJECT_TYPE } from '../../common'; +import { API_VERSIONS } from '../../common/constants'; import { useDockerRegistry, waitForFleetSetup, getSupertestWithAdminUser } from './helpers'; @@ -184,7 +185,11 @@ describe('Fleet preconfiguration reset', () => { 'post', '/internal/fleet/reset_preconfigured_agent_policies' ); - await resetAPI.set('kbn-sxrf', 'xx').expect(200).send(); + await resetAPI + .set('kbn-sxrf', 'xx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200) + .send(); const agentPolicies = await kbnServer.coreStart.savedObjects .createInternalRepository() @@ -226,7 +231,11 @@ describe('Fleet preconfiguration reset', () => { 'post', '/internal/fleet/reset_preconfigured_agent_policies/test-12345' ); - await resetAPI.set('kbn-sxrf', 'xx').expect(200).send(); + await resetAPI + .set('kbn-sxrf', 'xx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200) + .send(); const agentPolicies = await kbnServer.coreStart.savedObjects .createInternalRepository() @@ -260,7 +269,11 @@ describe('Fleet preconfiguration reset', () => { 'post', '/internal/fleet/reset_preconfigured_agent_policies/test-12345' ); - await resetAPI.set('kbn-sxrf', 'xx').expect(200).send(); + await resetAPI + .set('kbn-sxrf', 'xx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200) + .send(); const agentPolicies = await soClient.find({ type: 'ingest-agent-policies', @@ -292,7 +305,11 @@ describe('Fleet preconfiguration reset', () => { 'post', `/internal/fleet/reset_preconfigured_agent_policies/${POLICY_ID}` ); - await resetAPI.set('kbn-sxrf', 'xx').expect(200).send(); + await resetAPI + .set('kbn-sxrf', 'xx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200) + .send(); const agentPolicies = await kbnServer.coreStart.savedObjects .createInternalRepository() diff --git a/x-pack/plugins/fleet/server/routes/agent/index.ts b/x-pack/plugins/fleet/server/routes/agent/index.ts index 44a43ccb732bf..0d261fc24a16e 100644 --- a/x-pack/plugins/fleet/server/routes/agent/index.ts +++ b/x-pack/plugins/fleet/server/routes/agent/index.ts @@ -6,6 +6,7 @@ */ import type { FleetAuthz } from '../../../common'; +import { API_VERSIONS, INTERNAL_API_ACCESS } from '../../../common/constants'; import { getRouteRequiredAuthz, type FleetAuthzRouter } from '../../services/security'; @@ -72,297 +73,406 @@ import { export const registerAPIRoutes = (router: FleetAuthzRouter, config: FleetConfigType) => { // Get one - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.INFO_PATTERN, - validate: GetOneAgentRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getAgentHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneAgentRequestSchema }, + }, + getAgentHandler + ); + // Update - router.put( - { + router.versioned + .put({ path: AGENT_API_ROUTES.UPDATE_PATTERN, - validate: UpdateAgentRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - updateAgentHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: UpdateAgentRequestSchema }, + }, + updateAgentHandler + ); + // Bulk Update Tags - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.BULK_UPDATE_AGENT_TAGS_PATTERN, - validate: PostBulkUpdateAgentTagsRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - bulkUpdateAgentTagsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostBulkUpdateAgentTagsRequestSchema }, + }, + bulkUpdateAgentTagsHandler + ); + // Delete - router.delete( - { + router.versioned + .delete({ path: AGENT_API_ROUTES.DELETE_PATTERN, - validate: DeleteAgentRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteAgentHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeleteAgentRequestSchema }, + }, + deleteAgentHandler + ); + // List - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.LIST_PATTERN, - validate: GetAgentsRequestSchema, + fleetAuthz: { fleet: { all: true }, }, - }, - getAgentsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetAgentsRequestSchema }, + }, + getAgentsHandler + ); + // List Agent Tags - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.LIST_TAGS_PATTERN, - validate: GetTagsRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getAgentTagsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetTagsRequestSchema }, + }, + getAgentTagsHandler + ); // Agent actions - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.ACTIONS_PATTERN, - validate: PostNewAgentActionRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postNewAgentActionHandlerBuilder({ - getAgent: AgentService.getAgentById, - cancelAgentAction: AgentService.cancelAgentAction, - createAgentAction: AgentService.createAgentAction, - getAgentActions: AgentService.getAgentActions, }) - ); + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostNewAgentActionRequestSchema }, + }, + postNewAgentActionHandlerBuilder({ + getAgent: AgentService.getAgentById, + cancelAgentAction: AgentService.cancelAgentAction, + createAgentAction: AgentService.createAgentAction, + getAgentActions: AgentService.getAgentActions, + }) + ); - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.CANCEL_ACTIONS_PATTERN, - validate: PostCancelActionRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postCancelActionHandlerBuilder({ - getAgent: AgentService.getAgentById, - cancelAgentAction: AgentService.cancelAgentAction, - createAgentAction: AgentService.createAgentAction, - getAgentActions: AgentService.getAgentActions, }) - ); + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostCancelActionRequestSchema }, + }, + postCancelActionHandlerBuilder({ + getAgent: AgentService.getAgentById, + cancelAgentAction: AgentService.cancelAgentAction, + createAgentAction: AgentService.createAgentAction, + getAgentActions: AgentService.getAgentActions, + }) + ); + // Get agents by Action_Ids - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.LIST_PATTERN, - validate: PostRetrieveAgentsByActionsRequestSchema, fleetAuthz: { fleet: { all: true }, // Authorizations? }, - }, - postRetrieveAgentsByActionsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostRetrieveAgentsByActionsRequestSchema }, + }, + postRetrieveAgentsByActionsHandler + ); - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.UNENROLL_PATTERN, - validate: PostAgentUnenrollRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postAgentUnenrollHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostAgentUnenrollRequestSchema }, + }, + postAgentUnenrollHandler + ); // mark as deprecated - router.put( - { + router.versioned + .put({ path: AGENT_API_ROUTES.REASSIGN_PATTERN, - validate: PutAgentReassignRequestSchemaDeprecated, fleetAuthz: { fleet: { all: true }, }, - }, - putAgentsReassignHandlerDeprecated - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PutAgentReassignRequestSchemaDeprecated }, + }, + putAgentsReassignHandlerDeprecated + ); - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.REASSIGN_PATTERN, - validate: PostAgentReassignRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postAgentsReassignHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostAgentReassignRequestSchema }, + }, + postAgentsReassignHandler + ); - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.REQUEST_DIAGNOSTICS_PATTERN, - validate: PostRequestDiagnosticsActionRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - requestDiagnosticsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostRequestDiagnosticsActionRequestSchema }, + }, + requestDiagnosticsHandler + ); - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.BULK_REQUEST_DIAGNOSTICS_PATTERN, - validate: PostBulkRequestDiagnosticsActionRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - bulkRequestDiagnosticsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostBulkRequestDiagnosticsActionRequestSchema }, + }, + bulkRequestDiagnosticsHandler + ); - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.LIST_UPLOADS_PATTERN, - validate: ListAgentUploadsRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getAgentUploadsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: ListAgentUploadsRequestSchema }, + }, + getAgentUploadsHandler + ); - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.GET_UPLOAD_FILE_PATTERN, - validate: GetAgentUploadFileRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getAgentUploadFileHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetAgentUploadFileRequestSchema }, + }, + getAgentUploadFileHandler + ); // Get agent status for policy - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.STATUS_PATTERN, - validate: GetAgentStatusRequestSchema, fleetAuthz: (fleetAuthz: FleetAuthz): boolean => calculateRouteAuthz( fleetAuthz, getRouteRequiredAuthz('get', AGENT_API_ROUTES.STATUS_PATTERN) ).granted, - }, - getAgentStatusForAgentPolicyHandler - ); - router.get( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetAgentStatusRequestSchema }, + }, + getAgentStatusForAgentPolicyHandler + ); + router.versioned + .get({ + access: INTERNAL_API_ACCESS, path: AGENT_API_ROUTES.STATUS_PATTERN_DEPRECATED, - validate: GetAgentStatusRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getAgentStatusForAgentPolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: GetAgentStatusRequestSchema }, + }, + getAgentStatusForAgentPolicyHandler + ); // Agent data - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.DATA_PATTERN, - validate: GetAgentDataRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getAgentDataHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetAgentDataRequestSchema }, + }, + getAgentDataHandler + ); // upgrade agent - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.UPGRADE_PATTERN, - validate: PostAgentUpgradeRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postAgentUpgradeHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostAgentUpgradeRequestSchema }, + }, + postAgentUpgradeHandler + ); // bulk upgrade - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.BULK_UPGRADE_PATTERN, - validate: PostBulkAgentUpgradeRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postBulkAgentsUpgradeHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostBulkAgentUpgradeRequestSchema }, + }, + postBulkAgentsUpgradeHandler + ); // Current actions - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.ACTION_STATUS_PATTERN, - validate: GetActionStatusRequestSchema, + fleetAuthz: { fleet: { all: true }, }, - }, - getActionStatusHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetActionStatusRequestSchema }, + }, + getActionStatusHandler + ); // Bulk reassign - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.BULK_REASSIGN_PATTERN, - validate: PostBulkAgentReassignRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postBulkAgentsReassignHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostBulkAgentReassignRequestSchema }, + }, + postBulkAgentsReassignHandler + ); // Bulk unenroll - router.post( - { + router.versioned + .post({ path: AGENT_API_ROUTES.BULK_UNENROLL_PATTERN, - validate: PostBulkAgentUnenrollRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postBulkAgentsUnenrollHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostBulkAgentUnenrollRequestSchema }, + }, + postBulkAgentsUnenrollHandler + ); // Available versions for upgrades - router.get( - { + router.versioned + .get({ path: AGENT_API_ROUTES.AVAILABLE_VERSIONS_PATTERN, - validate: false, fleetAuthz: { fleet: { all: true }, }, - }, - getAvailableVersionsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + getAvailableVersionsHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/index.ts b/x-pack/plugins/fleet/server/routes/agent_policy/index.ts index 4482d02119887..7ca3409f72b88 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/index.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/index.ts @@ -7,6 +7,8 @@ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; + import { AGENT_POLICY_API_ROUTES } from '../../constants'; import { GetAgentPoliciesRequestSchema, @@ -38,135 +40,178 @@ import { export const registerRoutes = (router: FleetAuthzRouter) => { // List - Fleet Server needs access to run setup - router.get( - { + router.versioned + .get({ path: AGENT_POLICY_API_ROUTES.LIST_PATTERN, - validate: GetAgentPoliciesRequestSchema, - options: { access: 'public' }, fleetAuthz: { fleet: { readAgentPolicies: true }, }, - }, - getAgentPoliciesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetAgentPoliciesRequestSchema }, + }, + getAgentPoliciesHandler + ); // Bulk GET - router.post( - { + router.versioned + .post({ path: AGENT_POLICY_API_ROUTES.BULK_GET_PATTERN, - validate: BulkGetAgentPoliciesRequestSchema, fleetAuthz: { fleet: { readAgentPolicies: true }, }, - }, - bulkGetAgentPoliciesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: BulkGetAgentPoliciesRequestSchema }, + }, + bulkGetAgentPoliciesHandler + ); // Get one - router.get( - { + router.versioned + .get({ path: AGENT_POLICY_API_ROUTES.INFO_PATTERN, - validate: GetOneAgentPolicyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getOneAgentPolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneAgentPolicyRequestSchema }, + }, + getOneAgentPolicyHandler + ); // Create - router.post( - { + router.versioned + .post({ path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, - validate: CreateAgentPolicyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - createAgentPolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: CreateAgentPolicyRequestSchema }, + }, + createAgentPolicyHandler + ); // Update - router.put( - { + router.versioned + .put({ path: AGENT_POLICY_API_ROUTES.UPDATE_PATTERN, - validate: UpdateAgentPolicyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - updateAgentPolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: UpdateAgentPolicyRequestSchema }, + }, + updateAgentPolicyHandler + ); // Copy - router.post( - { + router.versioned + .post({ path: AGENT_POLICY_API_ROUTES.COPY_PATTERN, - validate: CopyAgentPolicyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - copyAgentPolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: CopyAgentPolicyRequestSchema }, + }, + copyAgentPolicyHandler + ); // Delete - router.post( - { + router.versioned + .post({ path: AGENT_POLICY_API_ROUTES.DELETE_PATTERN, - validate: DeleteAgentPolicyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteAgentPoliciesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeleteAgentPolicyRequestSchema }, + }, + deleteAgentPoliciesHandler + ); // Get one full agent policy - router.get( - { + router.versioned + .get({ path: AGENT_POLICY_API_ROUTES.FULL_INFO_PATTERN, - validate: GetFullAgentPolicyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getFullAgentPolicy - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetFullAgentPolicyRequestSchema }, + }, + getFullAgentPolicy + ); // Download one full agent policy - router.get( - { + router.versioned + .get({ path: AGENT_POLICY_API_ROUTES.FULL_INFO_DOWNLOAD_PATTERN, - validate: GetFullAgentPolicyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - downloadFullAgentPolicy - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetFullAgentPolicyRequestSchema }, + }, + downloadFullAgentPolicy + ); // Get agent manifest - router.get( - { + router.versioned + .get({ path: K8S_API_ROUTES.K8S_INFO_PATTERN, - validate: GetK8sManifestRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getK8sManifest - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetK8sManifestRequestSchema }, + }, + getK8sManifest + ); // Download agent manifest - router.get( - { + router.versioned + .get({ path: K8S_API_ROUTES.K8S_DOWNLOAD_PATTERN, - validate: GetK8sManifestRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - downloadK8sManifest - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetK8sManifestRequestSchema }, + }, + downloadK8sManifest + ); }; diff --git a/x-pack/plugins/fleet/server/routes/app/index.ts b/x-pack/plugins/fleet/server/routes/app/index.ts index cb0c12f9211aa..cb7b5f284962d 100644 --- a/x-pack/plugins/fleet/server/routes/app/index.ts +++ b/x-pack/plugins/fleet/server/routes/app/index.ts @@ -11,6 +11,8 @@ import type { TypeOf } from '@kbn/config-schema'; import type { FleetAuthzRouter } from '../../services/security'; import { APP_API_ROUTES } from '../../constants'; +import { API_VERSIONS, INTERNAL_API_ACCESS } from '../../../common/constants'; + import { appContextService } from '../../services'; import type { CheckPermissionsResponse, GenerateServiceTokenResponse } from '../../../common/types'; import { defaultFleetErrorHandler, GenerateServiceTokenError } from '../../errors'; @@ -87,33 +89,47 @@ export const generateServiceTokenHandler: RequestHandler = async (context, reque }; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: APP_API_ROUTES.CHECK_PERMISSIONS_PATTERN, - validate: CheckPermissionsRequestSchema, - }, - getCheckPermissionsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: CheckPermissionsRequestSchema }, + }, + getCheckPermissionsHandler + ); - router.post( - { + router.versioned + .post({ path: APP_API_ROUTES.GENERATE_SERVICE_TOKEN_PATTERN, - validate: {}, fleetAuthz: { fleet: { all: true }, }, - }, - generateServiceTokenHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: {}, + }, - router.post( - { + generateServiceTokenHandler + ); + + router.versioned + .post({ path: APP_API_ROUTES.GENERATE_SERVICE_TOKEN_PATTERN_DEPRECATED, - validate: {}, fleetAuthz: { fleet: { all: true }, }, - }, - generateServiceTokenHandler - ); + access: INTERNAL_API_ACCESS, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: {}, + }, + generateServiceTokenHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/data_streams/index.ts b/x-pack/plugins/fleet/server/routes/data_streams/index.ts index 861ade8771922..cb2af8be110f8 100644 --- a/x-pack/plugins/fleet/server/routes/data_streams/index.ts +++ b/x-pack/plugins/fleet/server/routes/data_streams/index.ts @@ -7,20 +7,26 @@ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; + import { DATA_STREAM_API_ROUTES } from '../../constants'; import { getListHandler } from './handlers'; export const registerRoutes = (router: FleetAuthzRouter) => { // List of data streams - router.get( - { + router.versioned + .get({ path: DATA_STREAM_API_ROUTES.LIST_PATTERN, - validate: false, fleetAuthz: { fleet: { all: true }, }, - }, - getListHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + getListHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/download_source/index.tsx b/x-pack/plugins/fleet/server/routes/download_source/index.tsx index 135cbf5700784..a307d5a3296da 100644 --- a/x-pack/plugins/fleet/server/routes/download_source/index.tsx +++ b/x-pack/plugins/fleet/server/routes/download_source/index.tsx @@ -7,6 +7,8 @@ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; + import { DOWNLOAD_SOURCE_API_ROUTES } from '../../constants'; import { getDownloadSourcesRequestSchema, @@ -25,56 +27,78 @@ import { } from './handler'; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: DOWNLOAD_SOURCE_API_ROUTES.LIST_PATTERN, - validate: getDownloadSourcesRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getDownloadSourcesHandler - ); - router.get( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: getDownloadSourcesRequestSchema }, + }, + getDownloadSourcesHandler + ); + + router.versioned + .get({ path: DOWNLOAD_SOURCE_API_ROUTES.INFO_PATTERN, - validate: GetOneDownloadSourcesRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getOneDownloadSourcesHandler - ); - router.put( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneDownloadSourcesRequestSchema }, + }, + getOneDownloadSourcesHandler + ); + + router.versioned + .put({ path: DOWNLOAD_SOURCE_API_ROUTES.UPDATE_PATTERN, - validate: PutDownloadSourcesRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - putDownloadSourcesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PutDownloadSourcesRequestSchema }, + }, + putDownloadSourcesHandler + ); - router.post( - { + router.versioned + .post({ path: DOWNLOAD_SOURCE_API_ROUTES.CREATE_PATTERN, - validate: PostDownloadSourcesRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postDownloadSourcesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostDownloadSourcesRequestSchema }, + }, + postDownloadSourcesHandler + ); - router.delete( - { + router.versioned + .delete({ path: DOWNLOAD_SOURCE_API_ROUTES.DELETE_PATTERN, - validate: DeleteDownloadSourcesRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteDownloadSourcesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeleteDownloadSourcesRequestSchema }, + }, + deleteDownloadSourcesHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts b/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts index 496ec7ae705ce..222e5752abe49 100644 --- a/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts +++ b/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts @@ -8,6 +8,8 @@ import type { FleetAuthzRouter } from '../../services/security'; import { ENROLLMENT_API_KEY_ROUTES } from '../../constants'; +import { API_VERSIONS, INTERNAL_API_ACCESS } from '../../../common/constants'; + import { GetEnrollmentAPIKeysRequestSchema, GetOneEnrollmentAPIKeyRequestSchema, @@ -23,91 +25,127 @@ import { } from './handler'; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: ENROLLMENT_API_KEY_ROUTES.INFO_PATTERN, - validate: GetOneEnrollmentAPIKeyRequestSchema, fleetAuthz: { fleet: { readEnrollmentTokens: true }, }, - }, - getOneEnrollmentApiKeyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneEnrollmentAPIKeyRequestSchema }, + }, + getOneEnrollmentApiKeyHandler + ); - router.delete( - { + router.versioned + .delete({ path: ENROLLMENT_API_KEY_ROUTES.DELETE_PATTERN, - validate: DeleteEnrollmentAPIKeyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteEnrollmentApiKeyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeleteEnrollmentAPIKeyRequestSchema }, + }, + deleteEnrollmentApiKeyHandler + ); - router.get( - { + router.versioned + .get({ path: ENROLLMENT_API_KEY_ROUTES.LIST_PATTERN, - validate: GetEnrollmentAPIKeysRequestSchema, fleetAuthz: { fleet: { readEnrollmentTokens: true }, }, - }, - getEnrollmentApiKeysHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetEnrollmentAPIKeysRequestSchema }, + }, + getEnrollmentApiKeysHandler + ); - router.post( - { + router.versioned + .post({ path: ENROLLMENT_API_KEY_ROUTES.CREATE_PATTERN, - validate: PostEnrollmentAPIKeyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postEnrollmentApiKeyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostEnrollmentAPIKeyRequestSchema }, + }, + postEnrollmentApiKeyHandler + ); - router.get( - { + router.versioned + .get({ path: ENROLLMENT_API_KEY_ROUTES.INFO_PATTERN_DEPRECATED, - validate: GetOneEnrollmentAPIKeyRequestSchema, fleetAuthz: { fleet: { readEnrollmentTokens: true }, }, - }, - getOneEnrollmentApiKeyHandler - ); + access: INTERNAL_API_ACCESS, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: GetOneEnrollmentAPIKeyRequestSchema }, + }, + getOneEnrollmentApiKeyHandler + ); - router.delete( - { + router.versioned + .delete({ path: ENROLLMENT_API_KEY_ROUTES.DELETE_PATTERN_DEPRECATED, - validate: DeleteEnrollmentAPIKeyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteEnrollmentApiKeyHandler - ); + access: INTERNAL_API_ACCESS, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: DeleteEnrollmentAPIKeyRequestSchema }, + }, + deleteEnrollmentApiKeyHandler + ); - router.get( - { + router.versioned + .get({ path: ENROLLMENT_API_KEY_ROUTES.LIST_PATTERN_DEPRECATED, - validate: GetEnrollmentAPIKeysRequestSchema, fleetAuthz: { fleet: { readEnrollmentTokens: true }, }, - }, - getEnrollmentApiKeysHandler - ); + access: INTERNAL_API_ACCESS, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: GetEnrollmentAPIKeysRequestSchema }, + }, + getEnrollmentApiKeysHandler + ); - router.post( - { + router.versioned + .post({ path: ENROLLMENT_API_KEY_ROUTES.CREATE_PATTERN_DEPRECATED, - validate: PostEnrollmentAPIKeyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postEnrollmentApiKeyHandler - ); + access: INTERNAL_API_ACCESS, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: PostEnrollmentAPIKeyRequestSchema }, + }, + postEnrollmentApiKeyHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/epm/index.ts b/x-pack/plugins/fleet/server/routes/epm/index.ts index 11dc43edbc4d8..4f354ae77d7f0 100644 --- a/x-pack/plugins/fleet/server/routes/epm/index.ts +++ b/x-pack/plugins/fleet/server/routes/epm/index.ts @@ -7,6 +7,8 @@ import type { IKibanaResponse } from '@kbn/core/server'; +import { API_VERSIONS, INTERNAL_API_ACCESS } from '../../../common/constants'; + import type { FleetAuthz } from '../../../common'; import { @@ -78,107 +80,146 @@ export const READ_PACKAGE_INFO_AUTHZ: FleetAuthzRouteConfig['fleetAuthz'] = { }; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.CATEGORIES_PATTERN, - validate: GetCategoriesRequestSchema, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getCategoriesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetCategoriesRequestSchema }, + }, + getCategoriesHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.LIST_PATTERN, - validate: GetPackagesRequestSchema, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getListHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetPackagesRequestSchema }, + }, + getListHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.INSTALLED_LIST_PATTERN, - validate: GetInstalledPackagesRequestSchema, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getInstalledListHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetInstalledPackagesRequestSchema }, + }, + getInstalledListHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.LIMITED_LIST_PATTERN, - validate: false, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getLimitedListHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + getLimitedListHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.STATS_PATTERN, - validate: GetStatsRequestSchema, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getStatsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetStatsRequestSchema }, + }, + getStatsHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.FILEPATH_PATTERN, - validate: GetFileRequestSchema, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getFileHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetFileRequestSchema }, + }, + getFileHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.INFO_PATTERN, - validate: GetInfoRequestSchema, fleetAuthz: (fleetAuthz: FleetAuthz): boolean => calculateRouteAuthz(fleetAuthz, getRouteRequiredAuthz('get', EPM_API_ROUTES.INFO_PATTERN)) .granted, - }, - getInfoHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetInfoRequestSchema }, + }, + getInfoHandler + ); - router.put( - { + router.versioned + .put({ path: EPM_API_ROUTES.INFO_PATTERN, - validate: UpdatePackageRequestSchema, fleetAuthz: { integrations: { upgradePackages: true, writePackageSettings: true }, }, - }, - updatePackageHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: UpdatePackageRequestSchema }, + }, + updatePackageHandler + ); - router.post( - { + router.versioned + .post({ path: EPM_API_ROUTES.INSTALL_FROM_REGISTRY_PATTERN, - validate: InstallPackageFromRegistryRequestSchema, fleetAuthz: INSTALL_PACKAGES_AUTHZ, - }, - installPackageFromRegistryHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: InstallPackageFromRegistryRequestSchema }, + }, + installPackageFromRegistryHandler + ); - router.post( - { + router.versioned + .post({ path: EPM_API_ROUTES.BULK_INSTALL_PATTERN, - validate: BulkInstallPackagesFromRegistryRequestSchema, fleetAuthz: { integrations: { installPackages: true, upgradePackages: true }, }, - }, - bulkInstallPackagesFromRegistryHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: BulkInstallPackagesFromRegistryRequestSchema }, + }, + bulkInstallPackagesFromRegistryHandler + ); // Only allow upload for superuser - router.post( - { + router.versioned + .post({ path: EPM_API_ROUTES.INSTALL_BY_UPLOAD_PATTERN, - validate: InstallPackageByUploadRequestSchema, options: { body: { accepts: ['application/gzip', 'application/zip'], @@ -189,157 +230,202 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { integrations: { uploadPackages: true }, }, - }, - installPackageByUploadHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: InstallPackageByUploadRequestSchema }, + }, + installPackageByUploadHandler + ); - router.post( - { + router.versioned + .post({ path: EPM_API_ROUTES.CUSTOM_INTEGRATIONS_PATTERN, - validate: CreateCustomIntegrationRequestSchema, fleetAuthz: INSTALL_PACKAGES_AUTHZ, - }, - createCustomIntegrationHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: CreateCustomIntegrationRequestSchema }, + }, + createCustomIntegrationHandler + ); - router.delete( - { + router.versioned + .delete({ path: EPM_API_ROUTES.DELETE_PATTERN, - validate: DeletePackageRequestSchema, fleetAuthz: { integrations: { removePackages: true }, }, - }, - deletePackageHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeletePackageRequestSchema }, + }, + + deletePackageHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.VERIFICATION_KEY_ID, - validate: false, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getVerificationKeyIdHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + getVerificationKeyIdHandler + ); - router.get( - { + router.versioned + .get({ path: EPM_API_ROUTES.DATA_STREAMS_PATTERN, - validate: GetDataStreamsRequestSchema, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getDataStreamsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetDataStreamsRequestSchema }, + }, + getDataStreamsHandler + ); - router.post( - { + router.versioned + .post({ path: EPM_API_ROUTES.BULK_ASSETS_PATTERN, - validate: GetBulkAssetsRequestSchema, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, - }, - getBulkAssetsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetBulkAssetsRequestSchema }, + }, + getBulkAssetsHandler + ); // deprecated since 8.0 - router.get( - { + // This endpoint should be marked as internal but the router selects this endpoint over the new GET one + // For now keeping it public + router.versioned + .get({ path: EPM_API_ROUTES.INFO_PATTERN_DEPRECATED, - validate: GetInfoRequestSchemaDeprecated, fleetAuthz: (fleetAuthz: FleetAuthz): boolean => calculateRouteAuthz( fleetAuthz, getRouteRequiredAuthz('get', EPM_API_ROUTES.INFO_PATTERN_DEPRECATED) ).granted, - }, - async (context, request, response) => { - const newRequest = { ...request, params: splitPkgKey(request.params.pkgkey) } as any; - const resp: IKibanaResponse = await getInfoHandler( - context, - newRequest, - response - ); - if (resp.payload?.item) { - // returning item as well here, because pkgVersion is optional in new GET endpoint, and if not specified, the router selects the deprecated route - return response.ok({ body: { item: resp.payload.item, response: resp.payload.item } }); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetInfoRequestSchemaDeprecated }, + }, + async (context, request, response) => { + const newRequest = { ...request, params: splitPkgKey(request.params.pkgkey) } as any; + const resp: IKibanaResponse = await getInfoHandler( + context, + newRequest, + response + ); + if (resp.payload?.item) { + // returning item as well here, because pkgVersion is optional in new GET endpoint, and if not specified, the router selects the deprecated route + return response.ok({ body: { item: resp.payload.item, response: resp.payload.item } }); + } + return resp; } - return resp; - } - ); + ); - router.put( - { + router.versioned + .put({ path: EPM_API_ROUTES.INFO_PATTERN_DEPRECATED, - validate: UpdatePackageRequestSchemaDeprecated, + fleetAuthz: { integrations: { upgradePackages: true, writePackageSettings: true }, }, - }, - async (context, request, response) => { - const newRequest = { ...request, params: splitPkgKey(request.params.pkgkey) } as any; - const resp: IKibanaResponse = await updatePackageHandler( - context, - newRequest, - response - ); - if (resp.payload?.item) { - return response.ok({ body: { response: resp.payload.item } }); + access: INTERNAL_API_ACCESS, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: UpdatePackageRequestSchemaDeprecated }, + }, + async (context, request, response) => { + const newRequest = { ...request, params: splitPkgKey(request.params.pkgkey) } as any; + const resp: IKibanaResponse = await updatePackageHandler( + context, + newRequest, + response + ); + if (resp.payload?.item) { + return response.ok({ body: { response: resp.payload.item } }); + } + return resp; } - return resp; - } - ); + ); - router.post( - { + // This endpoint should be marked as internal but the router selects this endpoint over the new POST + router.versioned + .post({ path: EPM_API_ROUTES.INSTALL_FROM_REGISTRY_PATTERN_DEPRECATED, - validate: InstallPackageFromRegistryRequestSchemaDeprecated, fleetAuthz: INSTALL_PACKAGES_AUTHZ, - }, - async (context, request, response) => { - const newRequest = { - ...request, - params: splitPkgKey(request.params.pkgkey), - query: request.query, - } as any; - const resp: IKibanaResponse = await installPackageFromRegistryHandler( - context, - newRequest, - response - ); - if (resp.payload?.items) { - return response.ok({ body: { ...resp.payload, response: resp.payload.items } }); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: InstallPackageFromRegistryRequestSchemaDeprecated }, + }, + async (context, request, response) => { + const newRequest = { + ...request, + params: splitPkgKey(request.params.pkgkey), + query: request.query, + } as any; + const resp: IKibanaResponse = + await installPackageFromRegistryHandler(context, newRequest, response); + if (resp.payload?.items) { + return response.ok({ body: { ...resp.payload, response: resp.payload.items } }); + } + return resp; } - return resp; - } - ); + ); - router.delete( - { + router.versioned + .delete({ path: EPM_API_ROUTES.DELETE_PATTERN_DEPRECATED, - validate: DeletePackageRequestSchemaDeprecated, + fleetAuthz: { integrations: { removePackages: true }, }, - }, - async (context, request, response) => { - const newRequest = { ...request, params: splitPkgKey(request.params.pkgkey) } as any; - const resp: IKibanaResponse = await deletePackageHandler( - context, - newRequest, - response - ); - if (resp.payload?.items) { - return response.ok({ body: { response: resp.payload.items } }); + access: INTERNAL_API_ACCESS, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: DeletePackageRequestSchemaDeprecated }, + }, + async (context, request, response) => { + const newRequest = { ...request, params: splitPkgKey(request.params.pkgkey) } as any; + const resp: IKibanaResponse = await deletePackageHandler( + context, + newRequest, + response + ); + if (resp.payload?.items) { + return response.ok({ body: { response: resp.payload.items } }); + } + return resp; } - return resp; - } - ); + ); // Update transforms with es-secondary-authorization headers, // append authorized_by to transform's _meta, and start transforms - router.post( - { + router.versioned + .post({ path: EPM_API_ROUTES.REAUTHORIZE_TRANSFORMS, - validate: ReauthorizeTransformRequestSchema, fleetAuthz: { ...INSTALL_PACKAGES_AUTHZ, packagePrivileges: { @@ -352,7 +438,12 @@ export const registerRoutes = (router: FleetAuthzRouter) => { }, }, }, - }, - reauthorizeTransformsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: ReauthorizeTransformRequestSchema }, + }, + reauthorizeTransformsHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts b/x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts index 079b475e4f533..5cd35e027275a 100644 --- a/x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts +++ b/x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts @@ -5,6 +5,7 @@ * 2.0. */ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; import { FLEET_PROXY_API_ROUTES } from '../../../common/constants'; import { @@ -22,58 +23,78 @@ import { } from './handler'; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: FLEET_PROXY_API_ROUTES.LIST_PATTERN, - validate: false, fleetAuthz: { fleet: { all: true }, }, - }, - getAllFleetProxyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + getAllFleetProxyHandler + ); - router.post( - { + router.versioned + .post({ path: FLEET_PROXY_API_ROUTES.CREATE_PATTERN, - validate: PostFleetProxyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postFleetProxyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostFleetProxyRequestSchema }, + }, + postFleetProxyHandler + ); - router.put( - { + router.versioned + .put({ path: FLEET_PROXY_API_ROUTES.UPDATE_PATTERN, - validate: PutFleetProxyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - putFleetProxyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PutFleetProxyRequestSchema }, + }, + putFleetProxyHandler + ); - router.get( - { + router.versioned + .get({ path: FLEET_PROXY_API_ROUTES.DELETE_PATTERN, - validate: GetOneFleetProxyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getFleetProxyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneFleetProxyRequestSchema }, + }, + getFleetProxyHandler + ); - router.delete( - { + router.versioned + .delete({ path: FLEET_PROXY_API_ROUTES.DELETE_PATTERN, - validate: GetOneFleetProxyRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteFleetProxyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneFleetProxyRequestSchema }, + }, + deleteFleetProxyHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts index 6132216846824..5dddc693206b0 100644 --- a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts +++ b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts @@ -7,6 +7,8 @@ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; + import { FLEET_SERVER_HOST_API_ROUTES } from '../../../common/constants'; import { GetAllFleetServerHostRequestSchema, @@ -24,54 +26,74 @@ import { } from './handler'; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: FLEET_SERVER_HOST_API_ROUTES.LIST_PATTERN, - validate: GetAllFleetServerHostRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getAllFleetServerHostsHandler - ); - router.post( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetAllFleetServerHostRequestSchema }, + }, + getAllFleetServerHostsHandler + ); + router.versioned + .post({ path: FLEET_SERVER_HOST_API_ROUTES.CREATE_PATTERN, - validate: PostFleetServerHostRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postFleetServerHost - ); - router.get( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostFleetServerHostRequestSchema }, + }, + postFleetServerHost + ); + router.versioned + .get({ path: FLEET_SERVER_HOST_API_ROUTES.INFO_PATTERN, - validate: GetOneFleetServerHostRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getFleetServerHostHandler - ); - router.delete( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneFleetServerHostRequestSchema }, + }, + getFleetServerHostHandler + ); + router.versioned + .delete({ path: FLEET_SERVER_HOST_API_ROUTES.DELETE_PATTERN, - validate: GetOneFleetServerHostRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteFleetServerHostHandler - ); - router.put( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneFleetServerHostRequestSchema }, + }, + deleteFleetServerHostHandler + ); + router.versioned + .put({ path: FLEET_SERVER_HOST_API_ROUTES.UPDATE_PATTERN, - validate: PutFleetServerHostRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - putFleetServerHostHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PutFleetServerHostRequestSchema }, + }, + putFleetServerHostHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/health_check/index.ts b/x-pack/plugins/fleet/server/routes/health_check/index.ts index 55bd4bf7029ee..44f26e2a66167 100644 --- a/x-pack/plugins/fleet/server/routes/health_check/index.ts +++ b/x-pack/plugins/fleet/server/routes/health_check/index.ts @@ -9,6 +9,7 @@ import https from 'https'; import type { TypeOf } from '@kbn/config-schema'; import fetch from 'node-fetch'; +import { API_VERSIONS } from '../../../common/constants'; import type { FleetAuthzRouter } from '../../services/security'; import { APP_API_ROUTES } from '../../constants'; @@ -18,16 +19,20 @@ import { PostHealthCheckRequestSchema } from '../../types'; export const registerRoutes = (router: FleetAuthzRouter) => { // get fleet server health check by host - router.post( - { + router.versioned + .post({ path: APP_API_ROUTES.HEALTH_CHECK_PATTERN, - validate: PostHealthCheckRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postHealthCheckHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostHealthCheckRequestSchema }, + }, + postHealthCheckHandler + ); }; export const postHealthCheckHandler: FleetRequestHandler< diff --git a/x-pack/plugins/fleet/server/routes/message_signing_service/index.ts b/x-pack/plugins/fleet/server/routes/message_signing_service/index.ts index 56c64fb2b4ddf..c2d7f125bd082 100644 --- a/x-pack/plugins/fleet/server/routes/message_signing_service/index.ts +++ b/x-pack/plugins/fleet/server/routes/message_signing_service/index.ts @@ -6,6 +6,7 @@ */ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; import { MESSAGE_SIGNING_SERVICE_API_ROUTES } from '../../constants'; import { RotateKeyPairSchema } from '../../types'; @@ -13,14 +14,18 @@ import { rotateKeyPairHandler } from './handlers'; export const registerRoutes = (router: FleetAuthzRouter) => { // Rotate fleet message signing key pair - router.post( - { + router.versioned + .post({ path: MESSAGE_SIGNING_SERVICE_API_ROUTES.ROTATE_KEY_PAIR, - validate: RotateKeyPairSchema, fleetAuthz: { fleet: { all: true }, }, - }, - rotateKeyPairHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: RotateKeyPairSchema }, + }, + rotateKeyPairHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/output/index.ts b/x-pack/plugins/fleet/server/routes/output/index.ts index 330d9f57cc653..3b769118da5a3 100644 --- a/x-pack/plugins/fleet/server/routes/output/index.ts +++ b/x-pack/plugins/fleet/server/routes/output/index.ts @@ -7,6 +7,8 @@ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; + import { OUTPUT_API_ROUTES } from '../../constants'; import { DeleteOutputRequestSchema, @@ -26,67 +28,91 @@ import { } from './handler'; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: OUTPUT_API_ROUTES.LIST_PATTERN, - validate: GetOutputsRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getOutputsHandler - ); - router.get( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOutputsRequestSchema }, + }, + getOutputsHandler + ); + router.versioned + .get({ path: OUTPUT_API_ROUTES.INFO_PATTERN, - validate: GetOneOutputRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getOneOuputHandler - ); - router.put( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOneOutputRequestSchema }, + }, + getOneOuputHandler + ); + router.versioned + .put({ path: OUTPUT_API_ROUTES.UPDATE_PATTERN, - validate: PutOutputRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - putOutputHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PutOutputRequestSchema }, + }, + putOutputHandler + ); - router.post( - { + router.versioned + .post({ path: OUTPUT_API_ROUTES.CREATE_PATTERN, - validate: PostOutputRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - postOutputHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PostOutputRequestSchema }, + }, + postOutputHandler + ); - router.delete( - { + router.versioned + .delete({ path: OUTPUT_API_ROUTES.DELETE_PATTERN, - validate: DeleteOutputRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - deleteOutputHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeleteOutputRequestSchema }, + }, + deleteOutputHandler + ); - router.post( - { + router.versioned + .post({ path: OUTPUT_API_ROUTES.LOGSTASH_API_KEY_PATTERN, - validate: false, fleetAuthz: { fleet: { all: true }, }, - }, - postLogstashApiKeyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + postLogstashApiKeyHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts index 92ab414eab2b1..b4fb34ef377fa 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts @@ -187,9 +187,13 @@ describe('When calling package policy', () => { }; beforeEach(() => { - [routeConfig, routeHandler] = routerMock.put.mock.calls.find(([{ path }]) => + // @ts-ignore + const putMock = routerMock.versioned.put.mock; + // @ts-ignore + routeConfig = putMock.calls.find(([{ path }]) => path.startsWith(PACKAGE_POLICY_API_ROUTES.UPDATE_PATTERN) )!; + routeHandler = putMock.results[0].value.addVersion.mock.calls[0][1]; }); beforeEach(() => { diff --git a/x-pack/plugins/fleet/server/routes/package_policy/index.ts b/x-pack/plugins/fleet/server/routes/package_policy/index.ts index 393bbb2fd982b..893eb37a9b1bc 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/index.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/index.ts @@ -10,6 +10,7 @@ import { getRouteRequiredAuthz } from '../../services/security'; import type { FleetAuthzRouter } from '../../services/security'; import type { FleetAuthz } from '../../../common'; +import { API_VERSIONS } from '../../../common/constants'; import { PACKAGE_POLICY_API_ROUTES } from '../../constants'; import { GetPackagePoliciesRequestSchema, @@ -39,125 +40,166 @@ import { export const registerRoutes = (router: FleetAuthzRouter) => { // List - router.get( - { + router.versioned + .get({ path: PACKAGE_POLICY_API_ROUTES.LIST_PATTERN, - validate: GetPackagePoliciesRequestSchema, fleetAuthz: (fleetAuthz: FleetAuthz): boolean => calculateRouteAuthz( fleetAuthz, getRouteRequiredAuthz('get', PACKAGE_POLICY_API_ROUTES.LIST_PATTERN) ).granted, - }, - getPackagePoliciesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetPackagePoliciesRequestSchema }, + }, + getPackagePoliciesHandler + ); // Get bulk - router.post( - { + router.versioned + .post({ path: PACKAGE_POLICY_API_ROUTES.BULK_GET_PATTERN, - validate: BulkGetPackagePoliciesRequestSchema, fleetAuthz: (fleetAuthz: FleetAuthz): boolean => calculateRouteAuthz( fleetAuthz, getRouteRequiredAuthz('post', PACKAGE_POLICY_API_ROUTES.BULK_GET_PATTERN) ).granted, - }, - bulkGetPackagePoliciesHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: BulkGetPackagePoliciesRequestSchema }, + }, + bulkGetPackagePoliciesHandler + ); // Get one - router.get( - { + router.versioned + .get({ path: PACKAGE_POLICY_API_ROUTES.INFO_PATTERN, - validate: GetOnePackagePolicyRequestSchema, fleetAuthz: (fleetAuthz: FleetAuthz): boolean => calculateRouteAuthz( fleetAuthz, getRouteRequiredAuthz('get', PACKAGE_POLICY_API_ROUTES.INFO_PATTERN) ).granted, - }, - getOnePackagePolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetOnePackagePolicyRequestSchema }, + }, + getOnePackagePolicyHandler + ); - router.get( - { + router.versioned + .get({ path: PACKAGE_POLICY_API_ROUTES.ORPHANED_INTEGRATION_POLICIES, - validate: {}, fleetAuthz: { integrations: { readIntegrationPolicies: true }, }, - }, - getOrphanedPackagePolicies - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: {}, + }, + getOrphanedPackagePolicies + ); // Create - router.post( - { + router.versioned + .post({ path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, - validate: CreatePackagePolicyRequestSchema, - }, - createPackagePolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: CreatePackagePolicyRequestSchema }, + }, + createPackagePolicyHandler + ); // Update - router.put( - { + router.versioned + .put({ path: PACKAGE_POLICY_API_ROUTES.UPDATE_PATTERN, - validate: UpdatePackagePolicyRequestSchema, fleetAuthz: (fleetAuthz: FleetAuthz): boolean => calculateRouteAuthz( fleetAuthz, getRouteRequiredAuthz('put', PACKAGE_POLICY_API_ROUTES.UPDATE_PATTERN) ).granted, - }, - updatePackagePolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: UpdatePackagePolicyRequestSchema }, + }, + + updatePackagePolicyHandler + ); // Delete (bulk) - router.post( - { + router.versioned + .post({ path: PACKAGE_POLICY_API_ROUTES.DELETE_PATTERN, - validate: DeletePackagePoliciesRequestSchema, fleetAuthz: { integrations: { writeIntegrationPolicies: true }, }, - }, - deletePackagePolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeletePackagePoliciesRequestSchema }, + }, + deletePackagePolicyHandler + ); - router.delete( - { + router.versioned + .delete({ path: PACKAGE_POLICY_API_ROUTES.INFO_PATTERN, - validate: DeleteOnePackagePolicyRequestSchema, fleetAuthz: { integrations: { writeIntegrationPolicies: true }, }, - }, - deleteOnePackagePolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DeleteOnePackagePolicyRequestSchema }, + }, + deleteOnePackagePolicyHandler + ); // Upgrade - router.post( - { + router.versioned + .post({ path: PACKAGE_POLICY_API_ROUTES.UPGRADE_PATTERN, - validate: UpgradePackagePoliciesRequestSchema, fleetAuthz: { integrations: { writeIntegrationPolicies: true }, }, - }, - upgradePackagePolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: UpgradePackagePoliciesRequestSchema }, + }, + upgradePackagePolicyHandler + ); // Upgrade - DryRun - router.post( - { + router.versioned + .post({ path: PACKAGE_POLICY_API_ROUTES.DRYRUN_PATTERN, - validate: DryRunPackagePoliciesRequestSchema, fleetAuthz: { integrations: { readIntegrationPolicies: true }, }, - }, - dryRunUpgradePackagePolicyHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: DryRunPackagePoliciesRequestSchema }, + }, + dryRunUpgradePackagePolicyHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/preconfiguration/index.ts b/x-pack/plugins/fleet/server/routes/preconfiguration/index.ts index 2d46599988f1a..e78396005d4c2 100644 --- a/x-pack/plugins/fleet/server/routes/preconfiguration/index.ts +++ b/x-pack/plugins/fleet/server/routes/preconfiguration/index.ts @@ -7,36 +7,43 @@ import type { FleetAuthzRouter } from '../../services/security'; +import { API_VERSIONS } from '../../../common/constants'; + import { PRECONFIGURATION_API_ROUTES } from '../../constants'; import { PostResetOnePreconfiguredAgentPoliciesSchema } from '../../types'; import { resetPreconfigurationHandler, resetOnePreconfigurationHandler } from './handler'; export const registerRoutes = (router: FleetAuthzRouter) => { - router.post( - { + router.versioned + .post({ path: PRECONFIGURATION_API_ROUTES.RESET_PATTERN, - validate: false, - options: { - access: 'internal', - }, + access: 'internal', fleetAuthz: { fleet: { all: true }, }, - }, - resetPreconfigurationHandler - ); - router.post( - { - path: PRECONFIGURATION_API_ROUTES.RESET_ONE_PATTERN, - validate: PostResetOnePreconfiguredAgentPoliciesSchema, - options: { - access: 'internal', + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: false, }, + + resetPreconfigurationHandler + ); + router.versioned + .post({ + path: PRECONFIGURATION_API_ROUTES.RESET_ONE_PATTERN, + access: 'internal', fleetAuthz: { fleet: { all: true }, }, - }, - resetOnePreconfigurationHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { request: PostResetOnePreconfiguredAgentPoliciesSchema }, + }, + resetOnePreconfigurationHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/settings/index.ts b/x-pack/plugins/fleet/server/routes/settings/index.ts index 881541b569805..89da7496dc0c2 100644 --- a/x-pack/plugins/fleet/server/routes/settings/index.ts +++ b/x-pack/plugins/fleet/server/routes/settings/index.ts @@ -7,6 +7,7 @@ import type { TypeOf } from '@kbn/config-schema'; +import { API_VERSIONS } from '../../../common/constants'; import type { FleetAuthzRouter } from '../../services/security'; import { SETTINGS_API_ROUTES } from '../../constants'; @@ -65,24 +66,32 @@ export const putSettingsHandler: FleetRequestHandler< }; export const registerRoutes = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: SETTINGS_API_ROUTES.INFO_PATTERN, - validate: GetSettingsRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getSettingsHandler - ); - router.put( - { + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetSettingsRequestSchema }, + }, + getSettingsHandler + ); + router.versioned + .put({ path: SETTINGS_API_ROUTES.UPDATE_PATTERN, - validate: PutSettingsRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - putSettingsHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PutSettingsRequestSchema }, + }, + putSettingsHandler + ); }; diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts index acf5b1a301a60..3a38d30b1da9f 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts @@ -9,6 +9,7 @@ import type { AwaitedProperties } from '@kbn/utility-types'; import { httpServerMock, savedObjectsClientMock, coreMock } from '@kbn/core/server/mocks'; import type { PostFleetSetupResponse } from '../../../common/types'; +import { API_VERSIONS } from '../../../common/constants'; import { RegistryError } from '../../errors'; import { createAppContextStartContractMock, @@ -62,6 +63,7 @@ describe('FleetSetupHandler', () => { request = httpServerMock.createKibanaRequest({ method: 'post', path: '/api/fleet/setup', + headers: { 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); // prevents `Logger not set.` and other appContext errors appContextService.start(createAppContextStartContractMock()); @@ -145,6 +147,7 @@ describe('FleetStatusHandler', () => { request = httpServerMock.createKibanaRequest({ method: 'post', path: '/api/fleet/status', + headers: { 'Elastic-Api-Version': `${API_VERSIONS.public.v1}` }, }); // prevents `Logger not set.` and other appContext errors appContextService.start(createAppContextStartContractMock()); diff --git a/x-pack/plugins/fleet/server/routes/setup/index.ts b/x-pack/plugins/fleet/server/routes/setup/index.ts index b4470e648dcab..f09ff70e145aa 100644 --- a/x-pack/plugins/fleet/server/routes/setup/index.ts +++ b/x-pack/plugins/fleet/server/routes/setup/index.ts @@ -8,48 +8,62 @@ import type { FleetAuthzRouter } from '../../services/security'; import { AGENTS_SETUP_API_ROUTES, SETUP_API_ROUTE } from '../../constants'; +import { API_VERSIONS } from '../../../common/constants'; + import type { FleetConfigType } from '../../../common/types'; import { getFleetStatusHandler, fleetSetupHandler } from './handlers'; export const registerFleetSetupRoute = (router: FleetAuthzRouter) => { - router.post( - { + router.versioned + .post({ path: SETUP_API_ROUTE, - validate: false, fleetAuthz: { fleet: { setup: true }, }, - }, - fleetSetupHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + fleetSetupHandler + ); }; // That route is used by agent to setup Fleet export const registerCreateFleetSetupRoute = (router: FleetAuthzRouter) => { - router.post( - { + router.versioned + .post({ path: AGENTS_SETUP_API_ROUTES.CREATE_PATTERN, - validate: false, fleetAuthz: { fleet: { setup: true }, }, - }, - fleetSetupHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + fleetSetupHandler + ); }; export const registerGetFleetStatusRoute = (router: FleetAuthzRouter) => { - router.get( - { + router.versioned + .get({ path: AGENTS_SETUP_API_ROUTES.INFO_PATTERN, - validate: false, fleetAuthz: { fleet: { setup: true }, }, - }, - getFleetStatusHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: false, + }, + getFleetStatusHandler + ); }; export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType) => { diff --git a/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts b/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts index d69cef4a14042..3767c9a8d66ee 100644 --- a/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts @@ -6,11 +6,12 @@ */ import type { TypeOf } from '@kbn/config-schema'; -import type { KibanaRequest } from '@kbn/core-http-server'; -import { httpServerMock, coreMock } from '@kbn/core/server/mocks'; +import type { KibanaRequest, VersionedRouter } from '@kbn/core-http-server'; +import { httpServerMock, coreMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import type { RequestHandler } from '@kbn/core/server'; -import type { RouterMock } from '@kbn/core-http-router-server-mocks'; -import { mockRouter } from '@kbn/core-http-router-server-mocks'; +import { makeRouterWithFleetAuthz } from '../../services/security/fleet_router'; +import type { FleetAuthzRouter } from '../../services/security/types'; import type { UninstallToken, @@ -185,30 +186,44 @@ describe('uninstall token handlers', () => { describe('Agent Tamper Protection feature flag', () => { let config: { enableExperimental: string[] }; - let router: RouterMock; + let fakeRouter: jest.Mocked>; + let fleetAuthzRouter: FleetAuthzRouter; beforeEach(() => { - router = mockRouter.create(); + fakeRouter = { + versioned: { + get: jest.fn().mockImplementation(() => { + return { + addVersion: jest + .fn() + .mockImplementation((options: any, handler: RequestHandler) => Promise.resolve()), + }; + }), + }, + } as unknown as jest.Mocked>; + + const mockLogger = loggingSystemMock.createLogger(); + fleetAuthzRouter = makeRouterWithFleetAuthz(fakeRouter as any, mockLogger); }); it('should register handlers if feature flag is enabled', () => { config = { enableExperimental: ['agentTamperProtectionEnabled'] }; - registerRoutes(router, config); + registerRoutes(fleetAuthzRouter, config); + const wrappedHandler = + // @ts-ignore + fakeRouter.versioned.get.mock.results[0].value.addVersion; - expect(router.get).toHaveBeenCalledWith( - expect.any(Object), - getUninstallTokensMetadataHandler - ); - expect(router.get).toHaveBeenCalledWith(expect.any(Object), getUninstallTokenHandler); + expect(wrappedHandler).toHaveBeenCalled(); }); it('should NOT register handlers if feature flag is disabled', async () => { config = { enableExperimental: [] }; + registerRoutes(fleetAuthzRouter, config); + // @ts-ignore + const mockGet = fakeRouter.versioned.get; - registerRoutes(router, config); - - expect(router.get).not.toHaveBeenCalled(); + expect(mockGet).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/fleet/server/routes/uninstall_token/index.ts b/x-pack/plugins/fleet/server/routes/uninstall_token/index.ts index f22d77f70385e..a7214607cb309 100644 --- a/x-pack/plugins/fleet/server/routes/uninstall_token/index.ts +++ b/x-pack/plugins/fleet/server/routes/uninstall_token/index.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { UNINSTALL_TOKEN_ROUTES } from '../../../common/constants'; +import { UNINSTALL_TOKEN_ROUTES, API_VERSIONS } from '../../../common/constants'; import type { FleetConfigType } from '../../config'; import type { FleetAuthzRouter } from '../../services/security'; @@ -20,26 +20,34 @@ export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType const experimentalFeatures = parseExperimentalConfigValue(config.enableExperimental); if (experimentalFeatures.agentTamperProtectionEnabled) { - router.get( - { + router.versioned + .get({ path: UNINSTALL_TOKEN_ROUTES.LIST_PATTERN, - validate: GetUninstallTokensMetadataRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getUninstallTokensMetadataHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetUninstallTokensMetadataRequestSchema }, + }, + getUninstallTokensMetadataHandler + ); - router.get( - { + router.versioned + .get({ path: UNINSTALL_TOKEN_ROUTES.INFO_PATTERN, - validate: GetUninstallTokenRequestSchema, fleetAuthz: { fleet: { all: true }, }, - }, - getUninstallTokenHandler - ); + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetUninstallTokenRequestSchema }, + }, + getUninstallTokenHandler + ); } }; diff --git a/x-pack/plugins/fleet/server/services/security/fleet_router.test.ts b/x-pack/plugins/fleet/server/services/security/fleet_router.test.ts index bb6ea59eeec82..1e7d09f261603 100644 --- a/x-pack/plugins/fleet/server/services/security/fleet_router.test.ts +++ b/x-pack/plugins/fleet/server/services/security/fleet_router.test.ts @@ -6,7 +6,8 @@ */ import type { CheckPrivilegesDynamically } from '@kbn/security-plugin/server/authorization/check_privileges_dynamically'; -import type { IRouter, RequestHandler, RouteConfig } from '@kbn/core/server'; +import type { RequestHandler } from '@kbn/core/server'; +import type { VersionedRouter } from '@kbn/core-http-server'; import { loggingSystemMock } from '@kbn/core/server/mocks'; import type { AuthenticatedUser } from '@kbn/security-plugin/common'; @@ -17,6 +18,8 @@ import type { CheckPrivilegesPayload } from '@kbn/security-plugin/server'; import type { CheckPrivilegesResponse } from '@kbn/security-plugin/server/authorization/types'; +import { API_VERSIONS } from '../../../common/constants'; + import type { FleetRequestHandlerContext } from '../..'; import { createAppContextStartContractMock } from '../../mocks'; import { appContextService } from '..'; @@ -64,8 +67,16 @@ describe('FleetAuthzRouter', () => { routeConfig?: any; }) => { const fakeRouter = { - get: jest.fn(), - } as unknown as jest.Mocked>; + versioned: { + get: jest.fn().mockImplementation(() => { + return { + addVersion: jest + .fn() + .mockImplementation((options: any, handler: RequestHandler) => Promise.resolve()), + }; + }), + }, + } as unknown as jest.Mocked>; const fakeHandler: RequestHandler = jest.fn((ctx, req, res) => res.ok()); const mockContext = createAppContextStartContractMock(); @@ -92,10 +103,15 @@ describe('FleetAuthzRouter', () => { appContextService.start(mockContext); - const fleetAuthzRouter = makeRouterWithFleetAuthz(fakeRouter, mockLogger); - fleetAuthzRouter.get({ ...routeConfig } as RouteConfig, fakeHandler); - const wrappedHandler = fakeRouter.get.mock.calls[0][1]; - const wrappedRouteConfig = fakeRouter.get.mock.calls[0][0]; + const fleetAuthzRouter = makeRouterWithFleetAuthz(fakeRouter as any, mockLogger); + fleetAuthzRouter.versioned + .get({ ...routeConfig }) + .addVersion({ version: API_VERSIONS.public.v1, validate: false }, fakeHandler); + // @ts-ignore + const wrappedRouteConfig = fakeRouter.versioned.get.mock.calls[0][0]; + const wrappedHandler = + // @ts-ignore + fakeRouter.versioned.get.mock.results[0].value.addVersion.mock.calls[0][1]; const resFactory = { forbidden: jest.fn(() => 'forbidden'), ok: jest.fn(() => 'ok') }; const fakeReq = { @@ -203,15 +219,48 @@ describe('FleetAuthzRouter', () => { }); describe('default access', () => { - let fakeRouter: jest.Mocked>; + let fakeRouter: jest.Mocked>; + beforeEach(() => { fakeRouter = { - get: jest.fn(), - post: jest.fn(), - delete: jest.fn(), - put: jest.fn(), - patch: jest.fn(), - } as unknown as jest.Mocked>; + versioned: { + get: jest.fn().mockImplementation(() => { + return { + addVersion: jest + .fn() + .mockImplementation((options: any, handler: RequestHandler) => Promise.resolve()), + }; + }), + post: jest.fn().mockImplementation(() => { + return { + addVersion: jest + .fn() + .mockImplementation((options: any, handler: RequestHandler) => Promise.resolve()), + }; + }), + delete: jest.fn().mockImplementation(() => { + return { + addVersion: jest + .fn() + .mockImplementation((options: any, handler: RequestHandler) => Promise.resolve()), + }; + }), + put: jest.fn().mockImplementation(() => { + return { + addVersion: jest + .fn() + .mockImplementation((options: any, handler: RequestHandler) => Promise.resolve()), + }; + }), + patch: jest.fn().mockImplementation(() => { + return { + addVersion: jest + .fn() + .mockImplementation((options: any, handler: RequestHandler) => Promise.resolve()), + }; + }), + }, + } as unknown as jest.Mocked>; }); const METHODS: Array<'get' | 'post' | 'delete' | 'put' | 'patch'> = [ @@ -225,37 +274,30 @@ describe('FleetAuthzRouter', () => { for (const method of METHODS) { describe(`${method}`, () => { it('should set default access to public', () => { - const fleetAuthzRouter = makeRouterWithFleetAuthz(fakeRouter, mockLogger); - fleetAuthzRouter[method]( - { - path: '/test', - validate: false, - }, - (() => {}) as any - ); - expect(fakeRouter[method]).toBeCalledWith( + const fleetAuthzRouter = makeRouterWithFleetAuthz(fakeRouter as any, mockLogger); + + fleetAuthzRouter.versioned[method]({ + path: '/test', + }); + // @ts-ignore + expect(fakeRouter.versioned[method]).toBeCalledWith( expect.objectContaining({ - options: { access: 'public' }, - }), - expect.anything() + access: 'public', + }) ); }); - it('should not allow to define internal routes', () => { - const fleetAuthzRouter = makeRouterWithFleetAuthz(fakeRouter, mockLogger); - fleetAuthzRouter[method]( - { - path: '/test', - validate: false, - options: { access: 'internal' }, - }, - (() => {}) as any - ); - expect(fakeRouter[method]).toBeCalledWith( + it('should allow to define internal routes when called with access: internal', () => { + const fleetAuthzRouter = makeRouterWithFleetAuthz(fakeRouter as any, mockLogger); + fleetAuthzRouter.versioned[method]({ + path: '/test', + access: 'internal', + }); + // @ts-ignore + expect(fakeRouter.versioned[method]).toBeCalledWith( expect.objectContaining({ - options: { access: 'internal' }, - }), - expect.anything() + access: 'internal', + }) ); }); }); diff --git a/x-pack/plugins/fleet/server/services/security/fleet_router.ts b/x-pack/plugins/fleet/server/services/security/fleet_router.ts index a956f1522161c..f8e374c458344 100644 --- a/x-pack/plugins/fleet/server/services/security/fleet_router.ts +++ b/x-pack/plugins/fleet/server/services/security/fleet_router.ts @@ -13,38 +13,40 @@ import type { Logger, RequestHandler, RouteMethod, - RouteConfig, - RouteConfigOptions, } from '@kbn/core/server'; +import type { VersionedRouteConfig } from '@kbn/core-http-server'; + +import { PUBLIC_API_ACCESS } from '../../../common/constants'; import type { FleetRequestHandlerContext } from '../..'; import { getRequestStore } from '../request_store'; -import type { FleetAuthzRouteConfig, FleetAuthzRouter } from './types'; +import type { FleetVersionedRouteConfig } from './types'; + +import type { + FleetAuthzRouteConfig, + FleetAuthzRouter, + FleetAddVersionOpts, + FleetHandler, +} from './types'; import { checkSecurityEnabled, getAuthzFromRequest, doesNotHaveRequiredFleetAuthz, } from './security'; -function withDefaultPublicAccess( - routeConfig: RouteConfig -): RouteConfig { - let newOptions: RouteConfigOptions; - if (routeConfig?.options) { - newOptions = { ...routeConfig?.options }; +function withDefaultPublicAccess( + options: FleetVersionedRouteConfig +): VersionedRouteConfig { + if (options?.access) { + return options as VersionedRouteConfig; } else { - newOptions = {}; - } - - if (!newOptions.access) { - newOptions.access = 'public'; + return { + ...options, + access: PUBLIC_API_ACCESS, + }; } - return { - ...routeConfig, - options: newOptions, - }; } export function makeRouterWithFleetAuthz( @@ -126,35 +128,113 @@ export function makeRouterWithFleetAuthz = { - get: ({ fleetAuthz: hasRequiredAuthz, ...options }, handler) => { - router.get(withDefaultPublicAccess(options), (context, request, response) => - fleetHandlerWrapper({ context, request, response, handler, hasRequiredAuthz }) - ); - }, - delete: ({ fleetAuthz: hasRequiredAuthz, ...options }, handler) => { - router.delete(withDefaultPublicAccess(options), (context, request, response) => - fleetHandlerWrapper({ context, request, response, handler, hasRequiredAuthz }) - ); - }, - post: ({ fleetAuthz: hasRequiredAuthz, ...options }, handler) => { - router.post(withDefaultPublicAccess(options), (context, request, response) => - fleetHandlerWrapper({ context, request, response, handler, hasRequiredAuthz }) - ); - }, - put: ({ fleetAuthz: hasRequiredAuthz, ...options }, handler) => { - router.put(withDefaultPublicAccess(options), (context, request, response) => - fleetHandlerWrapper({ context, request, response, handler, hasRequiredAuthz }) - ); - }, - patch: ({ fleetAuthz: hasRequiredAuthz, ...options }, handler) => { - router.patch(withDefaultPublicAccess(options), (context, request, response) => - fleetHandlerWrapper({ context, request, response, handler, hasRequiredAuthz }) - ); + versioned: { + get: ({ fleetAuthz, ...options }) => { + const res = router.versioned.get(withDefaultPublicAccess(options)); + const originalAddVersion = res.addVersion.bind(res); + + function addVersion( + { fleetAuthz: versionAuthz, ...opts }: FleetAddVersionOpts, + handler: FleetHandler + ) { + originalAddVersion({ ...opts }, (context, request, response) => + fleetHandlerWrapper({ + context, + request, + response, + handler, + hasRequiredAuthz: versionAuthz || fleetAuthz, + }) + ); + return { addVersion }; + } + return { addVersion }; + }, + delete: ({ fleetAuthz, ...options }) => { + const res = router.versioned.delete(withDefaultPublicAccess(options)); + const originalAddVersion = res.addVersion.bind(res); + + function addVersion( + { fleetAuthz: versionAuthz, ...opts }: FleetAddVersionOpts, + handler: FleetHandler + ) { + originalAddVersion({ ...opts }, (context, request, response) => + fleetHandlerWrapper({ + context, + request, + response, + handler, + hasRequiredAuthz: versionAuthz || fleetAuthz, + }) + ); + return { addVersion }; + } + return { addVersion }; + }, + put: ({ fleetAuthz, ...options }) => { + const res = router.versioned.put(withDefaultPublicAccess(options)); + const originalAddVersion = res.addVersion.bind(res); + + function addVersion( + { fleetAuthz: versionAuthz, ...opts }: FleetAddVersionOpts, + handler: FleetHandler + ) { + originalAddVersion({ ...opts }, (context, request, response) => + fleetHandlerWrapper({ + context, + request, + response, + handler, + hasRequiredAuthz: versionAuthz || fleetAuthz, + }) + ); + return { addVersion }; + } + return { addVersion }; + }, + post: ({ fleetAuthz, ...options }) => { + const res = router.versioned.post(withDefaultPublicAccess(options)); + const originalAddVersion = res.addVersion.bind(res); + + function addVersion( + { fleetAuthz: versionAuthz, ...opts }: FleetAddVersionOpts, + handler: FleetHandler + ) { + originalAddVersion({ ...opts }, (context, request, response) => + fleetHandlerWrapper({ + context, + request, + response, + handler, + hasRequiredAuthz: versionAuthz || fleetAuthz, + }) + ); + return { addVersion }; + } + return { addVersion }; + }, + patch: ({ fleetAuthz, ...options }) => { + const res = router.versioned.patch(withDefaultPublicAccess(options)); + const originalAddVersion = res.addVersion.bind(res); + + function addVersion( + { fleetAuthz: versionAuthz, ...opts }: FleetAddVersionOpts, + handler: FleetHandler + ) { + originalAddVersion({ ...opts }, (context, request, response) => + fleetHandlerWrapper({ + context, + request, + response, + handler, + hasRequiredAuthz: versionAuthz || fleetAuthz, + }) + ); + return { addVersion }; + } + return { addVersion }; + }, }, - handleLegacyErrors: (handler) => router.handleLegacyErrors(handler), - getRoutes: () => router.getRoutes(), - routerPath: router.routerPath, - versioned: router.versioned, }; return fleetAuthzRouter; diff --git a/x-pack/plugins/fleet/server/services/security/types.ts b/x-pack/plugins/fleet/server/services/security/types.ts index 8559ee57b35e8..258872388c505 100644 --- a/x-pack/plugins/fleet/server/services/security/types.ts +++ b/x-pack/plugins/fleet/server/services/security/types.ts @@ -5,9 +5,16 @@ * 2.0. */ -import type { RouteConfig, RouteMethod } from '@kbn/core-http-server'; +import type { + RouteMethod, + VersionedRouteConfig, + AddVersionOpts, + IKibanaResponse, + RouteConfigOptions, +} from '@kbn/core-http-server'; import type { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; -import type { IRouter, RequestHandler } from '@kbn/core/server'; +import type { RequestHandler } from '@kbn/core/server'; +import type { MaybePromise } from '@kbn/utility-types'; import type { FleetRequestHandlerContext } from '../..'; @@ -19,10 +26,7 @@ type FleetAuthzRouterConfigParam = FleetAuthzRequirements | ((userAuthz: FleetAu type FleetAuthzRouteRegistrar< Method extends RouteMethod, Context extends RequestHandlerContext = RequestHandlerContext -> = ( - route: FleetRouteConfig, - handler: RequestHandler -) => void; +> = (config: FleetRouteConfig) => FleetVersionedRoute; export interface FleetAuthzRouteConfig< T extends FleetAuthzRouterConfigParam = FleetAuthzRouterConfigParam @@ -30,13 +34,27 @@ export interface FleetAuthzRouteConfig< fleetAuthz?: T; } -export type FleetRouteConfig = RouteConfig & +/** + * Internal type necessary to make access in VersionedRouteConfig optional + */ +export type FleetVersionedRouteConfig = Omit< + VersionedRouteConfig, + 'access' +> & { + access?: Exclude['access'], undefined>; +}; +/** + * Interface replacing the native VersionedRouteConfig to accept fleetAuthz + */ +export type FleetRouteConfig = FleetVersionedRouteConfig & FleetAuthzRouteConfig; -// Fleet router that allow to add required access when registering route -export interface FleetAuthzRouter< +/** + * Interface replacing the native VersionedRouter to handle fleetAuthz + */ +export interface FleetVersionedRouter< TContext extends FleetRequestHandlerContext = FleetRequestHandlerContext -> extends IRouter { +> { get: FleetAuthzRouteRegistrar<'get', TContext>; delete: FleetAuthzRouteRegistrar<'delete', TContext>; post: FleetAuthzRouteRegistrar<'post', TContext>; @@ -44,6 +62,15 @@ export interface FleetAuthzRouter< patch: FleetAuthzRouteRegistrar<'patch', TContext>; } +/** + * Fleet router that handles versions and authorizations when registering routes + */ +export interface FleetAuthzRouter< + TContext extends FleetRequestHandlerContext = FleetRequestHandlerContext +> { + versioned: FleetVersionedRouter; +} + type DeepPartialTruthy = { [P in keyof T]?: T[P] extends boolean ? true : DeepPartialTruthy; }; @@ -60,3 +87,27 @@ export type FleetRouteRequiredAuthz = Partial<{ any: FleetAuthzRequirements; all: FleetAuthzRequirements; }>; + +/** + * Interface used to extend Core native addVersionOpts interface to accept fleetAuthz + */ +export interface FleetAddVersionOpts extends AddVersionOpts { + fleetAuthz?: FleetAuthzRouteConfig['fleetAuthz']; +} + +export type FleetHandler = ( + ...params: Parameters> +) => MaybePromise; + +/** + * Interface that redefines Core native VersionedRoute interface to accept Fleet custom types + */ +export interface FleetVersionedRoute< + Method extends RouteMethod = RouteMethod, + Context extends RequestHandlerContext = RequestHandlerContext +> { + addVersion

( + options: FleetAddVersionOpts, + handler: FleetHandler + ): FleetVersionedRoute; +} diff --git a/x-pack/plugins/fleet/tsconfig.json b/x-pack/plugins/fleet/tsconfig.json index e0d261d7b7e72..b3f8a96417f9a 100644 --- a/x-pack/plugins/fleet/tsconfig.json +++ b/x-pack/plugins/fleet/tsconfig.json @@ -97,9 +97,9 @@ "@kbn/core-http-router-server-internal", "@kbn/safer-lodash-set", "@kbn/shared-ux-file-types", - "@kbn/core-http-router-server-mocks", "@kbn/core-application-browser", "@kbn/core-saved-objects-base-server-internal", + "@kbn/core-http-common", "@kbn/dashboard-plugin", ] } diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts index 4c52547e67aef..6cf131939807c 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts @@ -19,6 +19,22 @@ export default function (providerContext: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const es = getService('es'); + const getPackage = async (pkgName: string) => { + const getPkgRes = await supertest + .get(`/api/fleet/epm/packages/${pkgName}`) + .set('kbn-xsrf', 'xxxx') + .expect(200); + return getPkgRes; + }; + const epmInstall = async (pkgName: string, pkgVersion: string) => { + const getPkgRes = await supertest + .post(`/api/fleet/epm/packages/${pkgName}/${pkgVersion}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) + .expect(200); + return getPkgRes; + }; + describe('fleet_agent_policies', () => { skipIfNoDockerRegistry(providerContext); @@ -89,7 +105,7 @@ export default function (providerContext: FtrProviderContext) { let packagePoliciesToDeleteIds: string[] = []; after(async () => { if (systemPkgVersion) { - await supertest.delete(`/api/fleet/epm/packages/system-${systemPkgVersion}`); + await supertest.delete(`/api/fleet/epm/packages/system/${systemPkgVersion}`); } if (packagePoliciesToDeleteIds.length > 0) { await kibanaServer.savedObjects.bulkDelete({ @@ -297,21 +313,14 @@ export default function (providerContext: FtrProviderContext) { .expect(409); }); - it('should allow to create policy with the system integration policy and increment correctly the name if there is more than 10 package policy', async () => { + it('should allow to create policy with the system integration policy and increment correctly the name if package policies are more than 10', async () => { // load a bunch of fake system integration policy const policyIds = new Array(10).fill(null).map((_, i) => `package-policy-test-${i}`); packagePoliciesToDeleteIds = packagePoliciesToDeleteIds.concat(policyIds); - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); systemPkgVersion = getPkRes.body.item.version; // we must first force install the system package to override package verification error on policy create - const installPromise = supertest - .post(`/api/fleet/epm/packages/system-${systemPkgVersion}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + const installPromise = await epmInstall('system', `${systemPkgVersion}`); await Promise.all([ installPromise, @@ -419,7 +428,7 @@ export default function (providerContext: FtrProviderContext) { await Promise.all(deletedPromises); await esArchiver.unload('x-pack/test/functional/es_archives/fleet/agents'); if (systemPkgVersion) { - await supertest.delete(`/api/fleet/epm/packages/system-${systemPkgVersion}`); + await supertest.delete(`/api/fleet/epm/packages/system/${systemPkgVersion}`); } if (packagePoliciesToDeleteIds.length > 0) { await kibanaServer.savedObjects.bulkDelete({ @@ -591,17 +600,10 @@ export default function (providerContext: FtrProviderContext) { const policyId = 'package-policy-test-'; packagePoliciesToDeleteIds.push(policyId); - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); systemPkgVersion = getPkRes.body.item.version; // we must first force install the system package to override package verification error on policy create - const installPromise = supertest - .post(`/api/fleet/epm/packages/system-${systemPkgVersion}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + const installPromise = await epmInstall('system', `${systemPkgVersion}`); await Promise.all([ installPromise, @@ -682,17 +684,10 @@ export default function (providerContext: FtrProviderContext) { it('should work with package policy with space in name', async () => { const policyId = 'package-policy-test-1'; packagePoliciesToDeleteIds.push(policyId); - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); systemPkgVersion = getPkRes.body.item.version; // we must first force install the system package to override package verification error on policy create - const installPromise = supertest - .post(`/api/fleet/epm/packages/system-${systemPkgVersion}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + const installPromise = await epmInstall('system', `${systemPkgVersion}`); await Promise.all([ installPromise, @@ -1192,17 +1187,10 @@ export default function (providerContext: FtrProviderContext) { }); setupFleetAndAgents(providerContext); before(async () => { - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); // we must first force install the system package to override package verification error on policy create - await supertest - .post(`/api/fleet/epm/packages/system-${getPkRes.body.item.version}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await epmInstall('system', `${getPkRes.body.item.version}`); const { body: { item: createdPolicy }, diff --git a/x-pack/test/fleet_api_integration/apis/agents/list.ts b/x-pack/test/fleet_api_integration/apis/agents/list.ts index 328e4a240e77c..845a0b1a83659 100644 --- a/x-pack/test/fleet_api_integration/apis/agents/list.ts +++ b/x-pack/test/fleet_api_integration/apis/agents/list.ts @@ -216,6 +216,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return a status summary if getStatusSummary provided', async () => { const { body: apiResponse } = await supertest .get('/api/fleet/agents?getStatusSummary=true&perPage=0') + .set('kbn-xsrf', 'xxxx') .expect(200); expect(apiResponse.items).to.eql([]); diff --git a/x-pack/test/fleet_api_integration/apis/agents/status.ts b/x-pack/test/fleet_api_integration/apis/agents/status.ts index 498fbe7c42bce..b0879afc5ccb7 100644 --- a/x-pack/test/fleet_api_integration/apis/agents/status.ts +++ b/x-pack/test/fleet_api_integration/apis/agents/status.ts @@ -8,6 +8,8 @@ import expect from '@kbn/expect'; import { INGEST_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; + import { AGENTS_INDEX } from '@kbn/fleet-plugin/common'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { testUsers } from '../test_users'; @@ -230,7 +232,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('should work with deprecated api', async () => { - await supertest.get(`/api/fleet/agent-status`).expect(200); + await supertest + .get(`/api/fleet/agent-status`) + .set('kbn-xsrf', 'xxxx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200); }); it('should work with adequate package privileges', async () => { diff --git a/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts b/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts index d717c6e285c04..47c4d7ecd9f7b 100644 --- a/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts +++ b/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts @@ -7,6 +7,7 @@ import expect from '@kbn/expect'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { setupFleetAndAgents, getEsClientForAPIKey } from '../agents/services'; import { skipIfNoDockerRegistry } from '../../helpers'; @@ -324,6 +325,7 @@ export default function (providerContext: FtrProviderContext) { const { body: apiResponse } = await supertest .post(`/api/fleet/enrollment-api-keys`) .set('kbn-xsrf', 'xxx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) .send({ policy_id: 'policy1', }) @@ -332,11 +334,20 @@ export default function (providerContext: FtrProviderContext) { }); it('should get and delete with deprecated API', async () => { - await supertest.get(`/api/fleet/enrollment-api-keys`).expect(200); - await supertest.get(`/api/fleet/enrollment-api-keys/${ENROLLMENT_KEY_ID}`).expect(200); + await supertest + .get(`/api/fleet/enrollment-api-keys`) + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .set('kbn-xsrf', 'xxx') + .expect(200); + await supertest + .get(`/api/fleet/enrollment-api-keys/${ENROLLMENT_KEY_ID}`) + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .set('kbn-xsrf', 'xxx') + .expect(200); await supertest .delete(`/api/fleet/enrollment-api-keys/${keyId}`) + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) .set('kbn-xsrf', 'xxx') .expect(200); }); diff --git a/x-pack/test/fleet_api_integration/apis/epm/get.ts b/x-pack/test/fleet_api_integration/apis/epm/get.ts index fb15de6847952..2ca984ceb67dd 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/get.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/get.ts @@ -200,7 +200,10 @@ export default function (providerContext: FtrProviderContext) { it('returns package info in item field when calling without version', async function () { // this will install through the registry by default await installPackage(testPkgName, testPkgVersion); - const res = await supertest.get(`/api/fleet/epm/packages/${testPkgName}`).expect(200); + const res = await supertest + .get(`/api/fleet/epm/packages/${testPkgName}`) + .set('kbn-xsrf', 'xxxx') + .expect(200); const packageInfo = res.body.item; // the uploaded version will have this description expect(packageInfo.name).to.equal('apache'); diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts b/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts index f9d72c62e2738..7b300c271e304 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts @@ -22,7 +22,6 @@ export default function (providerContext: FtrProviderContext) { await supertest.delete(`/api/fleet/epm/packages/${pkg}/${version}`).set('kbn-xsrf', 'xxxx'); }; - // Failing: See https://github.com/elastic/kibana/issues/150343 describe('installs package that has a prerelease version', async () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -70,13 +69,21 @@ export default function (providerContext: FtrProviderContext) { expect(response.body.items.find((item: any) => item.id.includes(gaVersion))); }); - it('should install the beta package when no version is provided and prerelease is true', async function () { + it('should install the beta package when prerelease is true', async function () { const response = await supertest - .post(`/api/fleet/epm/packages/${testPackage}?prerelease=true`) + .post(`/api/fleet/epm/packages/${testPackage}/${testPackageVersion}?prerelease=true`) .set('kbn-xsrf', 'xxxx') .send({ force: true }) // using force to ignore package verification error .expect(200); + expect(response.body.items.find((item: any) => item.id.includes(betaVersion))); + }); + it('should install the beta package when no version is provided and prerelease is true', async function () { + const response = await supertest + .post(`/api/fleet/epm/packages/${testPackage}/${testPackageVersion}?prerelease=true`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) // using force to ignore package verification error + .expect(200); expect(response.body.items.find((item: any) => item.id.includes(betaVersion))); }); diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/get.ts b/x-pack/test/fleet_api_integration/apis/package_policy/get.ts index ce0a7a1f219c6..6801c3908e658 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/get.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/get.ts @@ -24,6 +24,14 @@ export default function (providerContext: FtrProviderContext) { // because `this` has to point to the Mocha context // see https://mochajs.org/#arrow-functions + const deleteEndpointPackage = async () => { + await supertest + .delete(`/api/fleet/epm/packages/endpoint/8.6.1`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) + .expect(200); + }; + describe('Package Policy APIs', () => { skipIfNoDockerRegistry(providerContext); @@ -111,12 +119,7 @@ export default function (providerContext: FtrProviderContext) { .send({ packagePolicyIds: [packagePolicyId, endpointPackagePolicyId] }) .expect(200); - // uninstall endpoint package - await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await deleteEndpointPackage(); }); it('should succeed with a valid id', async function () { @@ -254,12 +257,7 @@ export default function (providerContext: FtrProviderContext) { .send({ packagePolicyIds: [packagePolicyId, endpointPackagePolicyId] }) .expect(200); - // uninstall endpoint package - await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await deleteEndpointPackage(); }); it('should succeed with valid ids', async function () { @@ -476,12 +474,7 @@ export default function (providerContext: FtrProviderContext) { .send({ packagePolicyIds: [endpointPackagePolicyId] }) .expect(200); - // uninstall endpoint package - await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await deleteEndpointPackage(); }); it('should return 200 if the passed kuery is correct', async () => { diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts index 263b9ac88adac..a1e6fe5d5556f 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts @@ -33,7 +33,7 @@ export default function (providerContext: FtrProviderContext) { }; const getInstallationSavedObject = async (name: string, version: string) => { - const res = await supertest.get(`/api/fleet/epm/packages/${name}-${version}`).expect(200); + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); return res.body.item.savedObject.attributes; }; diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/update.ts b/x-pack/test/fleet_api_integration/apis/package_policy/update.ts index 15ad0a82b4359..865341abc5bcc 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/update.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/update.ts @@ -25,7 +25,7 @@ export default function (providerContext: FtrProviderContext) { }; const getInstallationSavedObject = async (name: string, version: string) => { - const res = await supertest.get(`/api/fleet/epm/packages/${name}-${version}`).expect(200); + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); return res.body.item.savedObject.attributes; }; @@ -229,11 +229,11 @@ export default function (providerContext: FtrProviderContext) { .send({ agentPolicyId }); // uninstall endpoint package await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) + .delete(`/api/fleet/epm/packages/endpoint/8.6.1`) .set('kbn-xsrf', 'xxxx') .expect(200); await supertest - .delete(`/api/fleet/epm/packages/input_package-1.0.0`) + .delete(`/api/fleet/epm/packages/input_package/1.0.0`) .set('kbn-xsrf', 'xxxx') .expect(200); }); diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts b/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts index 557d5a9b4d9b2..c5c3d6a67a829 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts @@ -36,7 +36,7 @@ export default function (providerContext: FtrProviderContext) { } const getInstallationSavedObject = async (name: string, version: string) => { - const res = await supertest.get(`/api/fleet/epm/packages/${name}-${version}`).expect(200); + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); return res.body.item.savedObject.attributes; }; diff --git a/x-pack/test/fleet_api_integration/apis/service_tokens.ts b/x-pack/test/fleet_api_integration/apis/service_tokens.ts index bd13c3f5b8ca8..e1830a8ac7f97 100644 --- a/x-pack/test/fleet_api_integration/apis/service_tokens.ts +++ b/x-pack/test/fleet_api_integration/apis/service_tokens.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; import { FtrProviderContext } from '../../api_integration/ftr_provider_context'; export default function (providerContext: FtrProviderContext) { @@ -46,7 +47,11 @@ export default function (providerContext: FtrProviderContext) { }); it('should work with deprecated api', async () => { - await supertest.post(`/api/fleet/service-tokens`).set('kbn-xsrf', 'xxxx').expect(200); + await supertest + .post(`/api/fleet/service-tokens`) + .set('kbn-xsrf', 'xxxx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200); }); }); } diff --git a/x-pack/test/functional/services/ml/test_resources.ts b/x-pack/test/functional/services/ml/test_resources.ts index bf5f6aed44789..a256c623adbe0 100644 --- a/x-pack/test/functional/services/ml/test_resources.ts +++ b/x-pack/test/functional/services/ml/test_resources.ts @@ -8,6 +8,7 @@ import expect from '@kbn/expect'; import { ProvidedType } from '@kbn/test'; import { JobType } from '@kbn/ml-plugin/common/types/saved_objects'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; import { savedSearches, dashboards } from './test_resources_data'; import { getCommonRequestHeader } from './common_api'; import { MlApi } from './api'; @@ -567,7 +568,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(2 * 60 * 1000, async () => { const { body, status } = await supertest .post(`/api/fleet/setup`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); }); log.debug(` > Setup done`); @@ -581,7 +582,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(30 * 1000, async () => { const { body, status } = await supertest .post(`/api/fleet/epm/packages/${packageName}/${version}`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); }); @@ -595,7 +596,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(30 * 1000, async () => { const { body, status } = await supertest .delete(`/api/fleet/epm/packages/${packageName}/${version}`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); }); @@ -609,7 +610,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(10 * 1000, async () => { const { body, status } = await supertest .get(`/api/fleet/epm/packages?experimental=true`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); packageVersion = From 2c6b2f9ee5f7d153db97c9db1bdca30745cc5a80 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 18:54:15 +0100 Subject: [PATCH 31/52] skip flaky suite (#165643) --- .../rule_management/rules_table/rules_table_selection.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts index ae28214315a40..782e70dec8379 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts @@ -33,7 +33,8 @@ const RULE_2 = createRuleAssetSavedObject({ rule_id: 'rule_2', }); -describe('Rules table: selection', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165643 +describe.skip('Rules table: selection', { tags: ['@ess', '@serverless'] }, () => { before(() => { cleanKibana(); }); From 330cc8b215b0f61c91820d76a1ef35ac95fb1745 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 5 Sep 2023 13:57:48 -0400 Subject: [PATCH 32/52] skip failing test suite (#164017) --- .../api_integration/test_suites/common/alerting/rules.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts index bfce78384f601..64c8fda9d6089 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts @@ -35,7 +35,8 @@ export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); const esDeleteAllIndices = getService('esDeleteAllIndices'); - describe('Alerting rules', () => { + // Failing: See https://github.com/elastic/kibana/issues/164017 + describe.skip('Alerting rules', () => { const RULE_TYPE_ID = '.es-query'; const ALERT_ACTION_INDEX = 'alert-action-es-query'; let actionId: string; From 5a206e2c2e64fe8b7390b71c36c8d67302743473 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 18:58:43 +0100 Subject: [PATCH 33/52] chore(NA): reduce parallelism number on Serverless Security Cypress Tests (#165681) This PR reduces the parallel number of workers that will run the Serverless Security Cypress Tests as at least for now I don't think we need `16`. --- .buildkite/pipelines/pull_request/base.yml | 2 +- .buildkite/pipelines/serverless.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 522d2e34e5682..e36a1434bee88 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -140,7 +140,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 40 - parallelism: 16 + parallelism: 12 soft_fail: true retry: automatic: diff --git a/.buildkite/pipelines/serverless.yml b/.buildkite/pipelines/serverless.yml index 10d1090521adb..e7b5dbc299722 100644 --- a/.buildkite/pipelines/serverless.yml +++ b/.buildkite/pipelines/serverless.yml @@ -105,7 +105,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 40 - parallelism: 16 + parallelism: 12 retry: automatic: - exit_status: '*' From 22e288ead2f6fa03647e87ba874f9dd8cd1b67f8 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:02:54 -0400 Subject: [PATCH 34/52] skip failing test suite (#165730) --- .../common/examples/search_examples/search_example.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 0e5584d656c98..5638afc5b106d 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 @@ -15,7 +15,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const comboBox = getService('comboBox'); const toasts = getService('toasts'); - describe('Search example', () => { + // Failing: See https://github.com/elastic/kibana/issues/165730 + describe.skip('Search example', () => { describe('with bfetch', () => { testSearchExample(); }); From d44bf0a315e6c29dbaf2ff2de92660938547dede Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 19:41:09 +0100 Subject: [PATCH 35/52] skip flaky suite (#146223) --- test/functional/apps/discover/group1/_discover.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/discover/group1/_discover.ts b/test/functional/apps/discover/group1/_discover.ts index a3cf7b2d29fcf..286a30a6bb227 100644 --- a/test/functional/apps/discover/group1/_discover.ts +++ b/test/functional/apps/discover/group1/_discover.ts @@ -31,7 +31,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { defaultIndex: 'logstash-*', }; - describe('discover test', function describeIndexTests() { + // FLAKY: https://github.com/elastic/kibana/issues/146223 + describe.skip('discover test', function describeIndexTests() { before(async function () { log.debug('load kibana index with default index pattern'); await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); From ad43fc037ee3c755b55e8d39d258987ab6d14c4c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 19:42:55 +0100 Subject: [PATCH 36/52] skip flaky suite (#165461) --- .../apps/dashboard/group2/dashboard_lens_by_value.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 2604b942f7313..aec34ba0d5d9e 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,7 +16,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const dashboardPanelActions = getService('dashboardPanelActions'); const kibanaServer = getService('kibanaServer'); - describe('dashboard lens by value', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165461 + describe.skip('dashboard lens by value', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( From ccfb713ee4ae68d9ad04c9a0d1a7742e7255152b Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 19:56:58 +0100 Subject: [PATCH 37/52] skip flaky suite (#165746) --- .../test_suites/common/index_management/index_templates.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts b/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts index 26feb519a39a8..1b1ee91fd0891 100644 --- a/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts +++ b/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts @@ -15,7 +15,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); const retry = getService('retry'); - describe('Index Templates', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165746 + describe.skip('Index Templates', function () { before(async () => { await security.testUser.setRoles(['index_management_user']); await pageObjects.common.navigateToApp('indexManagement'); From 33dcda7b7007bdc390455eb1f6879c73b3ce1c52 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 5 Sep 2023 12:18:28 -0700 Subject: [PATCH 38/52] [DOCS] Automate PagerDuty connector screenshots (#165413) ## Summary This PR automates two screenshots in https://www.elastic.co/guide/en/kibana/master/pagerduty-action-type.html --- .../action-types/pagerduty.asciidoc | 2 ++ .../connectors/images/pagerduty-connector.png | Bin 136276 -> 143862 bytes .../images/pagerduty-params-test.png | Bin 188743 -> 132427 bytes .../stack_connectors/connector_types.ts | 15 +++++++++++++++ 4 files changed, 17 insertions(+) diff --git a/docs/management/connectors/action-types/pagerduty.asciidoc b/docs/management/connectors/action-types/pagerduty.asciidoc index ed98e4259d0eb..a82a9639beee6 100644 --- a/docs/management/connectors/action-types/pagerduty.asciidoc +++ b/docs/management/connectors/action-types/pagerduty.asciidoc @@ -15,6 +15,7 @@ or as needed when you're creating a rule. For example: [role="screenshot"] image::management/connectors/images/pagerduty-connector.png[PagerDuty connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[pagerduty-connector-configuration]] @@ -63,6 +64,7 @@ as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/pagerduty-params-test.png[PagerDuty params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. PagerDuty actions have the following properties. diff --git a/docs/management/connectors/images/pagerduty-connector.png b/docs/management/connectors/images/pagerduty-connector.png index 2e5d240f42c11016d9ff962e7e3dbbf099973549..6613c1321f6b5cd90b88a05f7b05617d33938b16 100644 GIT binary patch literal 143862 zcmeEuS6EY9xGkW7qM+LX(gajcy3%_QQHp@ldl5+Jpb&Z}qM*`2Ksrbj0-?760a1GB zMFCyWei3{+H9 zjG7vc^r@)mfmBpy<<8Mj&Uo?qs!&l;J2|VVJ=0WE<9_za6X5LTNJVuo5tIni?s|4D z3eMbV!ujaC`uzwsdM@`#m%r#OP%_uJp3RTlc=4cu=kYhyv{UKV5&HCh$-!jK>n`zC zQg_zpWD2-n-}yO*TlKp{@M{YHRk|(XYjN=d@9?~(rfc)OV#P@|Q{;wSMuG>2{DqlK zx|$FdEHRj`5HtR%1^ac+^Fjy#`K~Rf-n?0sj6~JQ5fJujWuhCbaadI+8<`-C><7WG zCzTg@kMn+%;i8vkAO8s$_00KFghA-sL-wG!s8UZ?KLH_9}JN+^c=X418d_aoFQ6@N4j0K^JSK zzZu73e&1Hyn~aC{u~+DpV;Js!jAgD^+Oc9PntTXVUGp`V92Iqx zGu2tj5jEw-MtMTYhWP?=; z!Jpfhwa(Ypm@uidzUrx{MJ(ZZQ^^ehq5}P#QXng71t3Rthsg~zb*<*E#aG$e|MGhk!?XBIS*M_R!aKJgO_~hMy`sROtm;Tv zk>{BzUR6XpsHWnosmu4D_Y7Y9h*b7d)^s@T3d{k5w5<#mV9fBm@_4Vyz7 zI)~(l#B;`ln~^Wfv;m<%)HqlKOjRDo+_=^JYVDWjm2yWhp#67s`+se&jHdehAV!i1 z9C5jC64COqFOOFy(-1D3CH-#`_l@u(*Qfd#TSRNksTwN`bPYiz+{FgtH;DhYhtT(M zk@5syVcq8)5wjruLJgjyUni{}E=L`=%QlP@R0iKi@OPOz6j@ROIl`O>sz=r zMEvAxkw)UfS8Id(0l2lq)_^^Yjj^ITVB&r?CZapdc=6;?WY4Fh< z&-T`&;p5f5Y>Tl%&8zrRiAVo5$Rfb-YiOP3Eb1ow1)8oWF-d8}R<^rwPt(OTOX9YQ z3XaN+>$S3oFVJuPx@TDEkafvNdpfhwyM*Z#LUQua8T`LcdLZ@d+98oND|d<4wWm(f zzT5Yp?R!a19jQtFw4eXVs)tsZj^5f^jA&ae7RlZ!dqfCW>HW*B*`Mof>`ep<7Bx%YjAlWl`l5PGqiE)6}Dp7=vI9jD6u{6Y-7 zv?{TE6t&CY39Bz}9hLUDEhgjpl=ly7Dd7#RKHpDo^u*QX4k9Ca;gey~%D4B)?~k9# zwmC7xuq&&Y*SQH|rz+wBjk^oeqXj)nCpS2#!Ur@LS2S}@(#B8L%>Vk^MZv8=8Ofir zqXG}ZR|QYS%#2QM&1KFfm4(r*d18G_I1~dVzF5>#$%h04Uw#Zpfz_K5c`&4Z>J*dA%yp%}x@wXy}iOWmiXM9D6KXqDDrTbO#^R zPn4UOm^Zqxw!R1b6A~`gT;-Mtnwj5QxArQ2n!Yjv%=!2`MqCiZzuY>8y+=h|9LiAw zn*#>3c-f^rk}513`_>Sdj?UrQ@&Nd#2(t1rd=fGf9J()i&J}oS;LT9`E*O zPQ8?J`*Dx52$Rbz%kG)jSUoQ@ti1D<;d)JrjMuNc;M1cUJ=x!T6Wmk5QUmD(D6 zwC;2}@gNBKKn4rqJlb1L9xC>P?sdg0n-NC7=wxG|$yzCu4N{0)a+J_9PS4d0ZsOs% z(+=KSNFbb%nwAb<{cs)nk@f=lBPx`9+cuNjujq&3-54*yK|fTt`fkakALBmWI55wz zocDl9I&j6w%Nyp%`wbD>DG$q%a(f=&9eg@=d?#y`S;(}5IAm0AuC8Ak6YLYz7BwDn zq%#FE6GS$8HpU%LIA;c0HH6=?Dd8xD-;$3(Fk@vXq`CU(1l&3K zF(oc~OfQo>N3gAi!#ZS~E$bhmlE%x0Yd0?6PXlnL_41@(n!HD?prne_s6(oYib{lB z{s*Sp!P8cancVZjIjX#jEyiW~UDfhi_EUp4E3lpRG*X~EP~H<+v(V_7e`{OylPLV~ z&f_(R=My+>Tc}P(!!^$C9~H;@U1x2oCOnowoU?#cl=gSQMUWmL$Z^a8ZHsn=;;Xmw z@#40N+yOxy+*UE5fN~p~=A$(cTaN53BN zsiaCb$r)n0jJOErR<lJQOBETC8@adkT~j^^{I-K}bgV!2tn#@1GPok9Wt-H@c!`0_{3q+P~{h zA1?`@3ng3DnLf@4x*{NmQhG}AbsvmYZj5esS~P0Sk*)@N1ad~X|2>}#Q@I!3Yf${~ zU=Tl`#SOwtjOD3XO}kEYL;`YY(~QcEwYRXC0i0;-HA==tI^3@nEqq)dw|8kuz}SlF}{ou=?r3YrrLZYh&XaxueUD7I4s%FUwxp#n63&Lq)8gL7CCsZhb zv>o~^aGs#@gLKF_*66?V?R;~i$xcGJ*}UC$E2_wNt3}LtY`Fcz9+sCraY^B@6iB(j ziNR^zY|jRoUq3n2Q197}w=a)!17*U^whST`cS7%5vPnDtg%?*RjPDdLh|WuAskCet zh|bIf_+1(xj^uZlU*A#JnSkjaHNuefhW*n>`##sP z^3lFG)WfRL*|r{($+S0K*jMS^Dz*Nr2a(a3v?cHBFX=t!i{E4w?7%iXxG88M;R$eL zZQ*<H_3SN)Qwxd6KO&Uw%mk8t77@%jf^%+QIQc7(*9l0GJ&6LQF6br)7RYg?z zqS!1iUN4}pp=6xQPl3u&kW& zg!C>UOJOW)6ayEy(5R#kw1lfgXr`{?cI#24TCRM(U%7$cN$k2OZ^LRuBYn3o%fKok z#PfR~TqCZCest5XdqC_CW5EJ+58mk=%XM;t)Bg@X`hwkJvqvH{%6gyU%4 z%+JPz9M&pJTRTz7k9dM!+4GNGLvutd`tDMNS_DxENknhBhs z*e>rG9*}v6EM@D#-?Y<2E=DZc&}=J`{D+}lT$i|mG$b^{C!}hNxUCOQX8#d zYKk?PWyW8G&Ma)-bv%BZ_M7K5Y{@m#<*#MRIz~h@dCIySmM&t#Kqoz?X{6SBlV!$< z`y1l}d)EaWI>I`qvZAROyG%!I`*5P|E3^6$#u4<434sTg!`bzb?|O;{kYkM4qm6`o zu6}S^pjL*2b1>-}Apdz6oqqnqfW8dL=*=J1;#28O)w0H&uW1!BDT-T`xb9M4ZA+v`PPJ~qxn*l*6o)NRLgn{iariiS` z=@+*iZpXDBFG?Oa%`&ozX;gkOMjXeDnXzVbed2l7Rx>PFZZIsE6^8s?3#&4$d33%R zJA~v_>%Iu^SoaniI{Q(wYrOpUfS|13;=>Q+i$m@o2hJna_DL0dM99%zd3BuoR=?wb zNiRa$ui6Bh3vDH~c+NQgOi3f(ZS;c~=@)4^x=#&~sn5{&jS!+_C0RIWtfC4lpS1^f z;1dg!@PlQO-JXO{HOw>=hyX#lJT3*Jtwy;a7NfF}Bm(SL+wYj`8DhfOe-ta7EuJjz zhv7a$f0oH;lbktb-?sOm@jYD`DtK8EMZPpuVIfL<_`1Dy$=DiP0gX8cj6tp?9GpLz zyBHuQ@wa&uRk*`lN_IXoKlTQmrU`&! zBLCeN)RQd>=pvStkTkdZ*>I^QA@jN)-lfwtN4NnKn-IPtt(5&O^Fj@~pfR#*1~66arq6Fh2RV;WT@F>(9rw@Gy=ubr^A1Jcsj-ypWEN zeB;V8|DslRnmH5e=RAhvrS8*%PK;yCw7b4L?Gl}4Z7Mb@y`n!bK0n)ib=h^Suv5}a z^uUtggz*x+o^yqw)~(-)8ZS&TJ`EEZ6AL-^%Yn6@Ol4A2FK^D&_O&U(w0B>8U)kO! z$ZeOWuURyDB!5yc@Rm0UmCC@FXZ?Ga(~a+|7q|2vYx z1iI0)^{)048&%WR!yl_{LV4<;71yhBPm6Pc@XpC**;YQfMkQh%bAH8$?~9NHXth23 zrHjktM(sMgH>4ce-aq{qeIaz{XwUox)Lf^da}47a|9NV*zI z5BDTa1KY3}hjHO|_9!r!4y2dt6B>_wUif>*$>2)7X~a%5=fl zqA(_BIs0x%7~B(4mF;=Szb8W)pL4TKAtEoZX()S^6qhk@)_ZLzou}MHB#jYk-2eG4 zZk6R~(=lN4M!MW;$&GNcpdQQS`KXVRVT&`hz^&pb^v5sbG*b~K)*(mV!@`oHgzZ+=FYawl;2_-(&vzyggNWT{p9 zQ2vjDDdg>KC>SPH$@Plw2Y}(@Ur4>)itaSH@0K^=n)w|9|Jjggd zU8iYJUZWn!ko?hNq`k{fdbpDp{?jJp1OXSYZGPSrNsa9kWSf{+j5eoFn=H2n(9$>V z+Jvrc+!Zn)x4bdOGb}g^etM9vdwU_SfVwBsvwifUr2LQF8**tb2bk%zZkb}=Pk6(9 zs|VQ*c1)u-K>Z4h$hlCsHvrPsmVIQ^LMuerQMQ%73T-Z|e@?=?gWV%oeBRk}hL}ca z`3lHo5oE=Ms>zr8b+$R>sOb>prO5wAgMN^z!vMtTScPu2N#&uf6B(wydk69Z`U!Hx0o~v-$4!0O}p9Q=hIHu_8Ly}$3{rr%Mk57t% zJ-TIB1^&LC&uw<$a+c0iBVo)Y3sBRB#|-f3J&MT8l=4iicb)1JxEf;#4~bwk2bH`1 zsN!Fld+(9GBav?Hu^P#4{%(i|W0WE7%I52Z?+B0X6e>}IR&v~^@^)Efb{cPfVQB=1UiP!$_IhT5+tc8)>qTz63%12k}~C_4bLaF8(sXTY6jn4q~`0bGNmdk8{gJ;x-y}T0YA2#u0t>Gd)4IQ z-Zbs(o*>^(s76)A8Ow$o``5L++60orPuhu13!*kpc3Us^-_g4v>b)|wd>S)l>sM-j zXtPul=t0aqGw_E{6L8KlB%V6seo$aPt7?5hx z8UAC!d9Bhy)=kV;EhUtEB5imTg*W7h)WA!|c=7nZn>Yu1KRw?{lNh-8EdAYX;H&4` zmQhl^g5xE_HB!zEwL@PphCV~fWkv$>?hG&y5JsZXJ)Tp3twp$j-ABZv@f9V9Zq#Wf zUcIYJOwDGdXeC&~YzXFa%Jn>h@$_CX=*zh0FE6#M@6|d^@kp(W9$= z-i|2eoCY2K5QMfq6fkbp|B#Vy4kI)TS7#d(0eV^(Gn*A-ctqPG)tQv6OCckv!Wr~C zSIQ6SoUi&(X`_uf?|W5YB{${@)5Uu{Zv3bP4maaV*yC=-T2qbTRG8SKuM4`+ny?64 zU$MuoJglZKeqQNmSv(A#6y6HK%vZ%HpX>g}JaUZVJ$w zVC^zddUH-e7i-OzzqUSk2Kw?7VMZzc>)Q)6(ZRR=HnvmIyw{@C*gm&#ruFo#E1$wr z(oPAjK5(>155n4;UvBFeg=m+!lyCc8&6*tS?oSbvZIBH5=hH0W{HO*vI{DA}S= zlhmc}(X#GZW1!z<@T}iu1T;v(WA1)8o|5kMl;WVK4Q|br&pQK#UNE)L@{)@;(XYD8Fu6n{PmyG}KF zFMoSFH=5a^fTM{MJKB@;kykrS)+0yRuh?JFgwt=YbOQJ}vkz?(%&(_-^r=bluFsEU z(eB{YSs0+v;O}DyRrt4i6wrLXTX_fPZC)Q3i@mYevpnH3Q z(1E|Ant>pVS?Pt%9l5h#EOIF&y7h)W?_Qhvjm1v2-?_r`#J2p_@*l)^Y(#OzU2bd!O4j<$HJz{Q z5wdP=^0X*;%oseNdw~ml{NAA6sL^iuak|_V%k-8toOL=oX+4rphYgl<)Da%>%{9&_ z+W`NTh183%f@uy11r3Z3D~LifQ9UCBl@V7l)J4DVCO2O$AaV8a%+3-@(8VuV~Q~Z0$iaX&ljl&S%8?l~q7AoWi z%3z|;gIUk{7M<>Kh zYY^F2+j9XZ9;VEoT95faGuIg7O3N*_;QcLIW`>nv(P1Ur$55k=8oC>Vp=_3CK&Vqy z9XN{Ju_Nr1Z@ezcDNHNs!c<57xYt*Fh;^=(zj8BmD#|w9b88ph;k+QrdO)+rjMbQta=5XH7(1 zX#ZJw!VV`bJYzi=bt0FAtv+THr5jP37X>#sdl4p0tgnz!5loJAwdfP-6C%{G(g&mx z6qFgt<(qxdY}=Xpx!|$`0+Yo#|Ba_$VZlUMGP*JE{JH5b-ff}vgE`{Uv&_#}>&9fh zY167A%+&u-6us5_enLq;wSO2+e#%(o26y}M3%I@(~-^`Tz9G@jul3Gvfm`P;+$OkGBAR1jCc65?TKv(7lT3NP zcJ#0AI@!G7YU+om5!Nq!cQB@2iX!Sr&#(J0@M@>}K&G|8%+>}44HE8S zy$qYF;?tAZh3$4ct2p2z(ql^?P|0JJFIhMk%{jkPRxV&ZdyKz~w z4er9$T}y%69G%@9Gqpi7Kkw4_?g(ow%q;cgT_u;`{AM#%JtXF)*Lm*{*MeEH>)bAUFZuzm5$^^h*U7~ z%Uy@D!d%5%Ty?+&+XsO&%i=YZ9aE*IwR538U5^NJHs|g5ebEWaTwBJ4)-9KBL zUdSo`h&i|t?2bq{k(VqrK+Bc5^tAjg!%mS*8az=`p_AUt>Nr3S^7hP+lN?wfAQqFj z$!5>BRi4D!F4eT2@biRpaGh~Xy+C32ut2})RgsfVN+EIN;xvKoQp~KZUt4oD_9PG& zJN?-gzR!wDeQ!SDun>sg+zPEGKE0GfZ)W3l!$oYfz)0zEQE`|>;4_GW_$Q;_ElN#> z{R;<4T__Jn|M*JBgx#|P(T1YtJ~xh&-FK$60uo`6F2N`I5?7x_VPafa9cXSP(uphw zZfX!jT_X!}c9Dh~BTB~?M}fHkVpCDBGoPF5TtI3N!Z_!CdnEf)^9HwoUV90*XUY!j z?s;9j=)PomNJF*rM*$-NR@uF-ch-Erlyxb5fAt8RgNHJhPEjP8ucp7Mpenvfv`;SOYM;+d?DAEQjHNPQF;E z53tKK-~IK!9;|)6*cj0r%hq4W1y3HzmU}a|dP>?(iC1RhNf&>T%KJ&g%3RRtbLXVS z2RiuU*u(ppj6euMKSD4$glMgmhQGNc@#9hLd7y4CUkay~R0I;!LI;UrVqK}@hqO>q z(0738w+22#!_U;k8M=&0=g-6o?yGoFMh=x<{u#XqY#g$4hJQmY71ZIc_Za}FiG zd;tl8ot`jqNljd|C;9g-AMPY`q)Ap0$1h#I#gOHKuVHhsH9k{dt&V2Rkz4I~M?)Y| z%uEH518s_;Lw{j?g%~T92#_FKR4DxV0C~^mK)A6bzvx&Dr2nWh6bv|(bFY~jsd)=k zX8t3g68KH14uCOj@rz<^jvWX z`8%OEg72XMKV19S1|KWd5v0g{GN=&U3p#AlzGZRd*+T&kZy`U}7V{AXTfMhYV&l(r zp|Z1)-E;GvmB%JWc~}dRS~-0FyLM_n3x%87#2oeG*d+3TdN><3Gp8zUg*1P~QH8MA z0tPUR%uS_ePDIkE{X5`E_L~enlc@L{@t~Hcq*a!qy#eT%H923oVTy!qF-+eEoDFT_ zeG2cC@%=`o%b;Sj^>3nt+rb$LeTSJ;SsA*T%oV#xAxP= zE0O(aqIboC$1lu+@iQ!xcHzwplZ-_D-U`4+8idyLj`AO2k%5MPC^PAr?nm#Z3pAub zj#`RTl_k#ECa@bLO(N)eX4H}7G?dUuA6$GuV5C_K;yAwZGE0=XcrR&}5IWOYA zGj=t?3g+8K@pP|lHrEP=^ZsN45aVJxGw|MI)Y?{0e=;={GK(Vt&(G?>R%qT05Qex~p*_D|w9yPvXFpsMgt(X}@g$2ycG z(rGL8_7mT}T+!TX0+#oTJD0uUHRb;hwYl3V9m4d#Buy4%pO+nt%aj zeq%@}B@6Dw%{>N7m|Oc-$J=LSNR|yWdA5nuarzaCnK4{sSJEf89%o?dH||d&G9+Kl z57GUhqu*q&N#X1b`d@oZ!)dEVE^Di|IjiHGJPvX1pA5vud(Vy9_mk+tmGhE}> zebO2a+5m_;QTQxLcOwxfg3L~&I)-~yDAiLC`l4T0icdYVsRCTBIfZN@muSOOLg*Ier z9w;h@#XuaOmXgG))w_=>)+jUl@=($-NbK7BNk^Ah$k%UGl}~E{ET<1lY5<5U#zAa< zFSY-NnxV4COffdJ?(8^*f+(y$8Gx|RmQkJds#ZF2`1m{Y&8^jGKc@NZ;JZ@P9|cyA zSO~C?1G#be2C@Cag;ScPs75Q`P*GC(K#E}6)8lRS-*M4U=rI#Hti#RlPBP$b=%*vc zE@3_81DWs{uWF~LKgcVTVQ{>q;)NG$9!K|7M8Z%JQX@a+Xla&{ zbT^@c;vsXGuC$^oHshH(=UNWs5KH~yr~H)DNgT4TG$^u9MVJL;s$5x*k-7MX{P#a) z8X%&AFkRG~9cP(sBDKuz9%zwmPghaCI`^rPv?H z&wtMwuZ^=w>R$M<-Da+%Z|~3S^$(&~(8A;M?A3pY6#w0?2s_2Cvg=gL%^H-`885aP9pp@dSlRh2x>R6X@Q)e^_$=x$ce`3gb}QS50iLP+Z%w7+5z3_oM1%^g5~z1<-D; z;azRdY1EF~->|RK7Pwxbmzy~0Ds5VldDm~K@YQS<@DoiCfir<(NHwdVsHXxHFEOL{ za5TdB82s|y9&Mt8RDz@z{*^+ zHxHB;4ZW-J_Epj9n#k6j(Dp;{O{itP@nC_G7;wm;ZRN_|iqjvYRmvV#2<<0tDW=9o z!-f}PkWt$&mJroXZCPm#T)U%Yr0g=YDWPw{-&KQB_>Fp1;bTPm<%O8z$(b9JsF{W) zPwU~gloP7%_KjXXXJCt;Q+8N{bydKvV1zf#CbqSa2hdu9-*|F>wQd=7VH865=1dYw zI!(#1_SYW-Y#};p$Q`O=%s|KtN+|k#3|(62(~>8!~%Rs1zXDvHSuf4mnQ-OPkmkPys-bx94NK1?h6-Rx)n;?Ag#F$(|*cU z44SGj2S&P+$6_vfbzhvWj8hx@wWg;uE7*+_u>~6c7w-MP(Dp7#rKUG4Hc36JC7^ir zb`qca;3i~Imtumu6OFGtSJ}RTtzA3bmX9jA**5&(+4EA{kbu+lD0T7k^^n7$lq^R3 zbI)yhgt!yFo%Ojls}cDqZf9TuWxM<0?P}<-vcOCYpqi;f^r;)FTCn|6wgX8oMIdEe z9O98}zSk`{tnnr3d+_w$X_el}#Fz1Q(4TT4%5}dJ4R=VC&3vf;Eluyo2|y>)Z1yAk zdAk+iAbiQSL)*+AB)&9$4?1ochXBwMX(0DT=lD?WZ$B#vTeyo;PU*!c3ZBDr$Fh&)m7oIrcKD=Fb%R-Yv)nDhmRD1%p z@Al0+jgzZ$=iveq>+7)?No)m`gO_rkXb9Q98X^I=K-4MvZZ;h#3L2CZPBga{OFF#z zrF4pIA-{gB?KqmWT7wKmOI|P%$GT3I3OEjYycQ~WqDwC*(*9rn1puS1o6dkt$^v>f zILX-&r#S~O>k?g^J`M@XTJZ5A@GFrq(_wV!dX3K!iZ3rv>m~*qe_&aKjKZZ;FgIW+ zF=+KY(7OIH^+*SPv-v`y-AQzp373q&Mz_vkA7-04D>-P1EaHG!S9!e`ve=EU--`3F zf&eqw$TH66DnTc@amW5KMrm>&m*$hHp{YIT)A z>s#{Q8*wSY^A2mc!(Um7qUfu%{wJ^NyBLNl<(ovFXFU5Nnw-pHtfbRzKTo+P;MJ3zIXFtqcc-{yWX2Cy157;gIz`;b`*o02zou#W7Jf{yeYLcoj zbTp06=X9Ox>E+!aqzAs0b)^uOVeMzD5j-Ro5?X{$*tl1H7 zPg!c0d%r`J$VBaCNEdi^)jPTQhI5A+0jvD$B&-9%1S>m1cJa6-l#n|vy*N9%xr{Ao z2nZUvUoN0V+}Ho?|5so7@aK%<9nN`|OKc)jh_j2o}P5n-%+7sFx=JEqQ zB{JV*+XjuFucrcLr@yFvZ5#vzUZ1b*^qPM{7|z{!F;zq7y})()<=C~Mr{Pf`7Xym` zceD3u6;lb?6R1efWi#BzH0biH`Qg!6J73~WuI<@@crYn82kNxjW&r3v4ikybKR3MwZ<0VVV zLT!y1C9B-YH|w$i3oaC6AOQK5+w^$2GwE(jvUiTz`bE9v+o{`mFI6Fi$b#39mz=W-k*x>+zIz-SPX`)toiqy z-jfwuO)2ORxwwq=t?n6Yt$knN;}RNiG1#vOWS(*GCEc>ZLMjn6ZCFFY{WA*+=walP znq?V*eSXNA%;{U;*=xu+3nqS-Zr`lF^f;JLQ~{UZI?Yx!Dx`n_jBi>CXCMw2=nK?q zgC#$Grsh(Nvubch@h6w)HkwpG+KC|7_d}dz>f#3y>?UVECo&(5y2--k93#ahd3?82 zl9{52E+|#wF!Nd`!j>|3^DFCf{65gz5`KrT#r$8aN=5iRF=nmbmhQ+uOlBHwaLzvtqS3o5tiCUVL0lSvxf~1y-G-n(NKv)~md@FQ#GiJh>SY{f#*jm5>dAvMIGWd+=CZSA-K9Nd zUEHT_o#J7z3@ZEQ*brCpRlZZ9;bHmXh%c9vN9NfwW$Ku=l23wwwTZ$mX2H8@DVKMhRTCcT_aB3Zr$1EM7if^Gn)l za~iSF^s2(Bon+ewrd$_bkF(cOxV0aVrnV)Qj$^xh86c=ph-I^!+t`s7q>YB$*Y+^A|7OJeZP?_r?4^aH+QWHo?{Qa*?2TdXH(!A zG4RlGCxZN|L2iOlvHj_`_1QahmbbE}fmE#wG6l-tF9)%m^_Z-w-jOc^$+7Gf38n3E z#OG36qNf)s%T&|Fcxmpne9C_~IJ)-1(F1lGc!?Ye7c8z< zVRci=8*5pP{Lp^;?bvLBh&KT*LN&R|i3Y z!kN-_A>-D#nwBlBaW3j&id&i*zytF}Bv4qg+@yi2oO+#CoBZJ=L;18@m9_B*qe(h2 zFO)7IrrYq(G2Z2OjMw2|sS&su;S)LW^I~;?wSKWi@V*Y)WFkv0*tDMxL0jI1#2lA^ zNpK*oYp66eJ7R@F1V?U?xwBCr?dOAVgN=$_Fg#P|QKY%t5|>$)kymczyWMi*)3`U$ zdzZmAnW;Ij$K7fZK%F~Np`Cy){Y5fQPI7jXy`E8w9ELd|l~7Tq616C_ zB#r~A9#N7pda`)p*GJ9?y0b`2MOi|C;nYd<$)D|#GA?Pf#i6je=6ubVj>!?zyMJNagT}4U+ zSr6vNq7NsJE=6o2-_!m{ZVkV4+lz;o?4Ub+^k`UnP$l1c;1H_lvuAsQUQ?lSWiffO z`3`6up%xYQ3DT@y9?{j>Nu5!T1|`!)DXCOwtk@HfPG7SG~oW$&u8Ei zvT&AS&;wV0627A&H`Jn0MR(hhr8b#-LRk9sEzrZ)OY=-5{(jdfcy?ggu;LC*VXd(a z`IdA9m2F^p(&~w#7W6uTp)MDe=;rur6|00tha(mrvn@_`9FCd}MX<(_@~HFvBU3N* zw({MW>-Gyg#l5B*2D8T6Bk9LFpcZ|}$Q}91Q9Nby#7m7zJVP%h?%MSAf< zpSEW{-=P&o%37x zl6v4cbW`pxIT?yas@T6JdlYMYMg);DQG4oRt;6YpYfSh4ev@c;#;-t$?e;vPs@7L_ ziRB)+4F&V9N290QHa81NkR4!z#e^r4VVs9U%#h9>h zxm_H9NJ}Z7K6?F?Nk_4KtV9ppGOzq=Yqr-;O=4SZRqJ}i)5mSP+1N2<8LaZeOGMtq z6(7>S34ppF8AQ$8@VSXVG!`icgkPS;F=b0d!Tp`HQAD+OXAbGTQjcKH_tUX zMb=p{q^C)>egJIB(E>rIj>h_{K>Vion-H4KkM16 z-0NQJalV4||I%~2lsf0xV%wcL3b12YY3=G{AHb20hwUjaFF4j+KWIVf0ulT%FH52vnp4o6Kb?>qXlmvSJNJc$= zUKxS>2)W!?a%GSx8Z*Sn+`}#cttG5UGE4on*xz2qj?X{PjL;}2(U$r_#j1rcvE%U^ zOn)9am%dQ^lYmv5C)cxgX6|?qifiFJ4=XCV%I%lae~|euSbElj1Hhue&Zmb$TH;7^ zn@c_ZJUrbtQf(1lg^p&{$x?LN)!mE3sYl16Et4xs^`l;G`(~PG3WYv3CyGPHF5j+b zeWhA~L;}Ie4nR-crf?yqRx7iIV(H%Zb(~P4gGF{a-A zepyq}zVL5~@ZwUh(@Gou3ShFlqk7mm{p}d4D1}%}QuwL(+OO)|VOqAt?Z2It(Hy_~ zY)d)uxb72cltM({h%1YFjJBhe8G1RIbEed~N3C=7ajflc^ugCVeRC`;;)2pBQw@3P zPv@!=`#=nm^8wGqZ6$p63=1Sj->ouyuV-lVA+W8FduYmY5UtmqB)tS({KU=y2tYq> zf5ofl+Bq*@3s!)PaWz8aE04-B zKi3}eiJ@${6Q2OJayODY(~8gb?rZaOK>3;2vHW3daOl z_%rIN8iHH}zKi+&a^m`#lggqeq>%k~AHoWX$C&k&CrPMK_LIXsiTq9o1(wMQWyJ?e zL*x@aJ=8UXW$Y_V6{bQB*5qB1>mPN8sk)Bc9DWc-)CX%TatwD%^}h+>m90JQ%SqP% zQ3CMWxk@?1?4LvqzD)}<2C9oumzLihf?p8&5<~VxpHD0geJo|n9bMGUJF4T|ld(-|0Tw^_I z(>9?Ui&=FyQPtyfhQ?h2>7e&0Y# zypRG~vQU3@h^BvF&0abEVY1`{CqfoEZ*ieYr98?S|5zKvMZ3Xf-%iwekaJ)!tAe*KEeRcDo^x^8=ea z2J!ZTFCwkFSLU-ezsM6#;jdMK{E2>rG{v9FoIor=wSA=fkdv=3teAiaK|2PbHf z9RrM)4n$qcE^fPQux+S5;8 zu+>pUYAaU78pe7iIT6GA8~xYzmOV=xAw1-udp4ote6 zgZWTSa#*6rU4CzATUva}Lf){k?j7rwu=axJPpu+uNcdNaffp61~i;;BcV%5Ej3 zyJd|RA?vOhBeWoFQZeEFDte*g26?i_Zh83@#s7S1xPfUS?pT`Wjv}|4d(91>_CNV6 z9ly2@$nO3;T7@eQrqRVG<52vef&a_tE|3Z?Sy$?LBLear?h`fBuE%h}PY zFyyM-=^3^7@m6a&numpxVs2R_V-SaW5_$T;k!4C+OFQtYH&Y)H$l zzYANq8@-aI`nakAUf|Q+TL3Vc0NbubPY^R{M-b~&6mvPh>zlp&>1zTvw|xKJpt3v@ ziJu)GHM@(rnqHaq?phnq-72F+z3TA+hoJPvW>1CU_dLh$Jtt|6Ze8}q=2qBQ(w&nF ziMO82X}Gi9b!74K?RFiM*uocVVrZOg;D>6xQfdRGhZ2Fj&QtEc^)_yFs=}?{Ox)5) zX>Pdslo+eZF>!AiV!J(g_D2uxnUr1yp{KoGfgKPT5E$sh==zbJ@RYXt?ykLbpSH?iDEa^^BaqarGB5)`bxa?y^JmDyIB>}+;g+dAmQX_ z(HtqQXinVN!Xw;GotbDpqL+@|j~ze&yACnjB7MlgL?7o!_ZSDh&b?aO7bl&Ox&q&c z3_DYO;ht+HIf|u`8p?E_O<*wYf&{YcE4-NS+6A@FszcSQ#ylX_-9LIN}^+7e+iRiL>nb?@Zm`8kfR^r4%6$KEY7yE2A?$E05y zKd~BGcx>BJ<)%Oa&?FB+okwFtuU#)Gf^4T+Jc)GM!KzQX;v0*F)NO~PHugG9tcL}{ zWwve(vFrhS!cNeo0Sz_QVC=x;vYzn250u!GDz#skj*%Ts-$f|)kndc6N~pYT@0AdN zx2*$O-bZMh_UG*PRqISEc^^Ko8ReTU8m**ubdgM?1B45V*^|kE z*U^VOoNWV24F#E-m2EOWVQ7WBUd|!t$wGIF(Qf;&;?8P2(Mt)0qf7iE;vh#oG}`vp*JlePvTD8`kAnoL0}EYY9)pRera} z>G%zKw;NLEwRuh|mjYEbf?)1z!2di!YQQ{Nf&u`v)giRTbV*>M8Jh$B?$=A-8+aeWHF^x^ad9AY8u9tw>`MA}W1=Dq|`zv31OteC?%S?D!F`U;Ph<=Cg(l{sbLW()3Tz1UM4hvSVt#(#! zdm+J?qZ&;coX|OIeI#IMT(9)~EsH#+nwb)0Y@Xx1TYKW|BiyZG%`x0BdAj(YmYSVE zdC@lS-Qs?^$4%7z^|!k3{64R&KY#wJ;XC>4$lqkY_UC@al)9EV`THAc)6AM*zQAut zldQjiIa)izayoMWFoZP++0^jh=u_gwPwpyPyYhFQEkpz-|KcLRDYpnq$i%X zU{EU&tm|=WCsh1ZL1V5OcU;WZl;2aGugs-cl`{vwXJ&thoW1zf1uigsmw2^SvWdXB z;jxEL*Q%fGdZB;cwe`Yor$+gOic>H9Mx${Axh1~uUg#fRyh_n22bz{biNBN{`mevu z(P^Izxovmy`_K6gQN9>C2rO5W`lsFRVxRx`LZ|!`z|52Kk>vfaO;ev40cCa0^&**E z|Ly+28Ui$@whh$%+uvDQ|3gmt`tkoX(CY}h(&e4eljmeF*tcJPC9hlfV(t4xl|K;s z-)zrX9|Xl`smj>nf{%Li=ghm@zt*dFj?nv^YMy^tnom(beCF4;O=SMdxj)!k|9zCV+Xa|Wx9+jCWOajK6aK67#&`}HGn&Nuk#S*xClH!!7~{b^M@ zq6!^mSQ7b;xuqpgt2V_oQ6j;1@TcQvbsqe1;NK5!#RF?X^J3vQzx?Cpm)@|aAH(jJ;JZ53$n9~1S*g@A*|bhd{TikgZ4 zK9K)CwLKTvqy=&<5x<<(d2Mhof*Gi@zd?AgsO{vtFBf2y^nC2n&(9llI(WKrVD&?C zbF*vCh2mqeu*2kUi0SK1*LmEPGz@2mF`U4CZ@IEvWAgFC_L!%zTf%o-MU?H>W@Ilx z=}L0_N6qw$lBHX)3Yy=Zkw!j_k)e?11($!-c`g3)CUZ|eay0Mqn+ezAgMGpmHkoxK zD`Jk^wBF)=``bsgWJUp|IOMV6i5(+UqkGrGforWP>VJW9@6y_5mpowHnL(uL#J z{eijt)}6jyem{xbhMD9zQLij@$-U=w$d@;`>4N;M*a=4%H*7Clu%c7mU#hP4Q`zK0 zDkz)7b*}qZ@MQZz?j3A@cU)LKt(Cq%teTHAkd(39gwr%>xENW?FF=>s=#wTp`nR=} z(jM=bTp=VFGeJj%G=5FCc555i@ew#h++N(hl^N3K0fpiOQO_9L#GD$@{(ysrIQfp_ zH5ehCatq^f3wG4Y2wtk_ACLU+2Ts2L@0u~&rU865ic6C}9}y9>Nzs1Ya;yJH+lKk8 zC&EEa;IiEo#j%Ue8ya!h;XGKzwr!<*?|B{v_sCH7ke!#f=)L^xh*CXYpp@DnPG1P7 zfz>MgIQn=`SP2}mxwz{z5llcqJP(4*CNYUZ(AjmhkE1?Vx)z4Hmw|2zr*;cM2q2xG80ObE7L(Cd-+n3XzJS0o!_=@5F(2mVPM)D+MkEJa2Pq(yBLq_ZNH z*Tea$nKY(VNN=;)){A8gRt#P{w!&Du))-cp>fA2w^6?Q*R|L`VU z38q-xUm9_x!T7_8v+j zTm93SCA}f%c}ubL(IJc~%Z+^U4vn~S5M-jZ)mgLo*574fm*;ulFvF6Et*Ag^$=mRZyW;o!?%}k>tuDG7B&tU(*>Jc%VJcE+RKQ- z3xW2ou_|=5q1RCw0po}(5EDEZueGn^0H09JZ$4H%Zl4p&_8oPV$_EViE1{-w@TsP^w9~c<`e&oG_dRMvur~ z_sfs7c1u$oatPZ>1(9o`fzH5FpPzt=LXaJ}%BEjpS|lWqd_L&iAoNDN*ZMNcAwEqV zf2u>O;+|B)os?AP=o6sp%xwZ?9XmYnbl4$GVFJ29TpaLdvAU@KIWWh2MYqVJq`e+b zMPk=2G=MG+&S>niYt9rsaXDbIr)IXVXa*=KZ_Q3B%~goNYx*=PH5Q-& zA+>Dwo1~QA)*8Z6Dj_!&x(1*y7&d~rn-a3Ro-ZFoo36lPTFKZ zZV}}z7%6Jk4=@CnFfRu?|1NWvmydWmslnq=pYU~E%KmOH%F;d%7O<)UbFgzw;?C*# zC8jwiUh^~(tL5A=UMUfhY|XEgu*DSOYB?+%o=C!ux(PHFkJ9oJA9D&OBPU9H;tV08 z^9!26L<V|#~y9isYyczTGZt| z$xr$~y0>O(wa-te~xsg*D}w4q2@Zlq5^TCnaKQc~p~C z{i+)$4Pn?$47XcPR@iSJ<`>u8Zv9a%?)=Jnix<+3gy)na zv2nz0!=AX2SjwawNA$*q;izW+EI}I&*p1zqz8zDWpjvL1V1Dj_MswxKCOYh%srMWxmYw}m6VID~JkKY=oiNS0vj4DJov8i%Iz6z*OBD=x-{n=n^uNtq5AUzW zE^hoN9IF|<|6V@ByHC2bcKfl$`w(C!m|=lT21St8lmReEq?7ZF+vQCl2dY zxOI6}o(7DO9jxmZ)P77!mHo7A?PmMit{7`_cRe}w)Fyg9-S91o!f=V#vFz?hXFR!@76NBUI zgGb+VtMqSaIl@nZ5P=a9-e8H8d|Y;j1U!BXMU>~%aH3523B!-Z!bu^9w`E)nW^T+K zQ?|)o2POkH1;CGtsy6Xj{6O#y5PJa#7wI^PZT-5z#?OOk!E+4r}{XDGSzidtqr z(2FbZlFSe%q-L;qY5pYnnHYkH5wR!EsT#u4IPPedc`$9l`n3W((=;6xSL>Y3;1YjW z5ln>Io_Wz_6tha#KrJmx$~^POGqGybxzgdXHM8kfLAyzwcJ*_l;T9N?(!S!2-Xf1g zti;Bwh&yFItVppB_bz)?8LaBozzl3(X~zTS#bprw^#*kJB1pQ-Si`03oqSzX>tge56FjJD3% zofkI-vM`jc0&DCvGN4$B8)!*p!gWc*F*Jp<-$Npn zK8}_lsy82CNSn_-b4}#$2qke{faQ0$S+L`)8?Vj{Zv4B8^t;!0OP8&y$i4XS*mXAX z*RZEY$JxR9|iFEkh=z?FToER>GE}VS$SF@h`&D_Z`+iUv8 zPYsWmWyHu}-qz$}I{k3jrU%{38iNZi)DO5PcTYELmV0>)_>e-WX|bw8w08JCAfau6@*Va??y}$dp)E6cFp7K5$fY7#gC<{X{4z;6$puZ{+TI zMq<88y!wT{(ND2yJdWWn_Z!+Rt7S%A*Qa3%>0aCW>qRAFReX9hGELt`+TPJ1a;CCS zB{#ONM0n0t+%b$8yGzeo;dQ*P8wDE}_Hh}|?3uy5CB!O^%I9@jB<1OV43@_GfzoeO zjaFV7f#q-35IGtEKLRG#^;@j3_M2QDAs(QUEhtr}t%ElWj}cHM0ym}Yix|7iFiO)z zy^mwPnk>nWF73yt5@Ef6JFtieqdfQT)=(6N7nE*7Kh}bph{3TtInPXqf7`n$`P9&3 z1H9$ulINFJO@h;Zx9e!(tQ zfwRH*YGmc0uedaJUp{v=1P1gxRrlLDf#ZR_Gxzlnm^L*y(0`3{S6|4=P|^&P>G$}M zrRMeu%?uMuNwT!F0)sLhw$)S0;P1TfTC}SZYZkWNJcogLON_MFn9@#e3XAvfnUIi( zHNcQGT{*mV(#*&jt}~ASOU}fN@_gd84>9i4q8IOKihtRP@dUaiNIp}Tn*KJippzA_`~-6w*4{#~kJu|Z4E36;^x>@ipdnI0}MTX`&S z?T*k*2RNh3%PuQu%p+#wR6_j7MBV$;gK72TeUtTpsv&!AJhFOaFDVKhi0B9*?~1FqT0^4 z0&Ne6)j@gR0V(ceKS-(=R0f?4Zz6#}Pm)b>OZl>{xE1O{4jDmj?~ejb<@C($2N6Deb896J?9b zD_W#eyLAK2ytcWB&Fw-eLL??#+L>YmedeRrp*A$gTl zTsf0e!Y`YfHJXOn%7s*uRO8gPXH!8FyDoK0>MeIhcXLmwA^f^^%f|RuWcmaI z5L7x^14iv?U2Aa+A*W57R%0PNbisg-pseLHy@i1*`wW@d`%S_pPQ|v!Qwd1yy^lm$ zprBb}0*FPg7g<$z0min{bl6;kUY;0za^K%>p``Lc5Py%JfKS$8H?xRzFgHWHTvcOQ zSga*C&7@BB#5eICoj?G`uvkDF_1tD9B8IIE%#6%g?R|Y)a=ZKU8JOm@oETY@dr&F3 zI@HJZ-V}R9(mPw;VTX{Zr1OqhH?Gt|7t)H*5_r7k@EKiVd4~)FsV6PL?Cdlj$^%^e zL5y8ue^9N*mN!hC{fB-&)6mT_G3VA7=YV3AM4}H#b9!C?S$aZ4hW}pL5(}+72-|PV zpGy%9i2!&$x8DGIBS&_%cYJHPfR)eV&kmF|Srs^P0Vir<29Ade(eIqCjiq)Bv;N<%vRY zaOaORvJIP8BM8nhvZpzutQ0OGWQrTek8{0ex`tVnvmFWo;5#&_k&Ts;=dq^4gPs8i zsG~BFg-n@EX^w6Tbz4A}pt-H~x-~`K&`mOG0RjJL>Q}6t4PXFP!Lf6!ed}{5;#*sw z%Vs6F?_N#}B51;;m@b$h&=NS|mhLe>Etg_{KVm!>FDU2R_*A+Pq}Gxk;#aa)tu;!l0H2Cco6ycN@ar0pnUCLSC(-^!g0I1s;u z(;%d2P(f~rq+TdVGni-hwrj)=vtH``sF)AXgBIEJi5gT&tpKOI1RbHR*|OTdcvMJ- z3n=7DKU^Ukfs&zmagdQOFR##84SV7bth0D)n&%mO>duaioyHiTcirRJlA z$WiZ*Laa1kf01wuVWv$N_gu~ji1WH8jtEO<3(2u%jO3e89@o9EW-eswmp(vNUwL#V zxjVt=3X#X!7lTQ(sE+eWmsB?l0s?tSZ|wSGujvwH$BqsF&Y-yyV+3$=3R=`;lq`lp zK0I9s?x0n&)g<->;g%NqVwl|ZjJ_Ja>K7pIcM)+V z^Jv&+_*qUZ_w4=ENl+FP6O!aTI*Luo3=P1B6+fmqA?Yp|Yb>qyu=!55XSoBeZMie8 zE*0<$SR96Zz+Vlx{ zaO9lzzMgA9esl`gXVV?>oUWm3pSGQ;!gWhhbg*8z9jd3 zx%+wg(L$CCw?19<&3wtsQH7RJfqiL~>grRM8Pc#LH;6%<-QSJBM>(&eK3354?e)zq zKG``MotgYh{e9)wePZBHyKp*NW$;8GiSO8CTYlEFdNMhSU068gW0ZbY?pPT(X3|7! z7n}%7I;^Q*eSvaOogW_~4Bv0N7`9WhdWLBFMF9fZ2O6Bt({dqklv?`GNMMSfb6Rfw zZ@8rjY1@iMu)#6NaHeBsBUVeCOT|T8FobW^VnihW%ddQ}T+dkiE z8;{-p#l+24H@~ub%&X;;*>k&f+snl-ZjR;EB-WLdhl0^d$-1{nPT3h|*SivWlTj;1 zgw=?>8w`+C%AP^CeexN<$G%5;Cca@4sxkRs=l&D~R)IVi^0T)av zfTGqlsGYWU*oAI_Nc+P9;1#+ND_s=xIH&db3R*CzXQFIMO>)6My<18qcYaj3Bf#2o z7TOnem`mJ#<2%~MT=cApt?S7ltIyITrELIXhyk{&0w=~BM7BvH>q^}#n&(AO$Bei+ zWG=zW?8yy8N<0Nq1UKwCckOYLbhTUL3+;ZuoiT4W-o$5k@0p-}32|@0!>A>}(_6}V z2mSka(78z!b43xBjj zKw_2;hX%-Q9CJmHJciG|4%>WrxVaXT&4X;%GesvtI5HnT))z#z}Ws_8pm(Mva%&tc_O~OKyl)G-Y4;l87azcQ}6zw0y?F4AfgKqbm7LV2w=%U6KGV z#>VZ+2wsb!lHD)DMU)i^n~mJroQXfrK4qd3bngLlEl`=SXx;thx8Il~5kN+&{&F|; z%X=PDaVP@V`uW`yd)l-7j_!RanR{tm+IuQNdvu5OUVRaZ3>nPG+m{cMa|h}Ii*^Wl z0`twMd^MI570#E86(dT496|_-!9`te=CS`(JGe3^A}X0_P!Xy)4_^HnD6TNV@`&vciqmP~TV`*zn2?-&N|#;fPKl zdn_uHD8XiX#g^@uKwq}$0hT~nu6JF{Jb%%Uhr%1lK8xYpO>(_(V)?O%QY`c71A9;3 zp-~YO!br(bw(7Si+B--lfbSKmFtS~4kFQ*nC^aUK=i&5H#XZy?ALYKv$LhIYvLJ4vn*S;g9T+!@a;6$Z6b)a^W}3q z6#{n*U!PN%d@bTaC{d1IQa9!W5`SUi*(KBH>ah6zC-#{6xIsbTiTq<3f&vk_#tdS+xV%u#S%Y& zRam|=uUc9iAh5zLdogc1fyTdr9#!rJ`e*#?z_oKv6;%2wOkanA`?ce=$ykP5NR>eC!1g@Z7!s7WdMOoAcAEz1=(0>d+$ z`@5>++`9CcC0+0LBq{21Kv-t!5NrrQ8n=7t9e66xYmkY3Ykdt?VGNpCop&e3@EY46?D;s$z%daKvJVL*|&CRx1cOhFb&wkKjxNhru$3_f*eVnOx zvo*~BA=rR7Gfc0za>Ek}Tq&V>EqLp>nTbZ83Pq`_ztH*vEWUy3sjW9!%g2&#c}=N+ zSkp;3pgUh;n*0zCGytb<-dc^t?NQ6zR3YmW&X#F-l<|PxW>Xu#7 zGWX`%ljaS{(wD=KnvZpU`+oXEHCabIl9q-DtC_=;T3q)i6d7nq(4?<&`1PFApMx;d z5I(hgo{|f@n=4~0-qD7#0%ccy0Tes7L&ittLyCp3L%`Ii9DdxNo0i{6us$0`VsLdu zjVj6{a`&}Q4?Dm`khNzy)TAxF==0fd<^>cXV)%MdaEICb8Tk6rLH zFjJJx_WFJ%fLxM!EbX8WsIuaQ_(;SQI|x@Pm{)L{bc>af{sg$B!uAOD0XlmoPE-DC zS}9h`Z0dtZoOE}bw7tfc2QcS)NcBZ-ukfrrIEecSJ>VR>ZGWnO0bS5Hgy%Q7DmD{i z$fX_PGr;LR6iguqZx?n*eYj2jTf3$<-c5;n?3d!|rSiJHBqVs9Ya$mC=UblYpu|DS51|8_y)y`{bDAr-`Pn0YZMjWK?KBT}r^? ziYvN>%uM><^!~(?4$9M8vBiBy!e&mhrbX#n2JqXFmF4R!V@(+u%%bCNVb9o6@gGnd z?UF510Oq&g29iteb}S*vB;}_%Z)m)(y}@&-ST;B5Rf=P11fmfPgRB&J4c=e1NJ4oI z`qHb)2g?^2E7`X(&Av-%0>xP42u|0vMsOXb=PE~2tg;<92PnJBYk zUffBk5UaPTp35E^gEg_IQ;iNx3Y0d;581ms+P^v2S7Df~9nP{Z3k`e>R$Oa3+LJpi5m*;8GHI#ddy?-P0Liw$!QxfznRzLQL!{>e&J-7m9fTm0JNqtAft7i1#v z-Ejzc4pg_w%+Z-mnWfcHtb{*^TyGqG#Y zB3_e@k~g+J6Mw^ilG;5Zc-h@IfIKd)=4#Q^fl3!l(0WA!+$6!Zv8pZ$S>tRULk&^d zptk~$LfyYP8KKR{EGg||^G2vIz=ph)%i7x%yWlqY+Mkd1>tBo95X%l#;#A*H4Yyk2 z`T;c(KGVx72jvphk|N1ND`Q#UTP2bp+$KY!mRMn;eIjhN93t0bA50QUwvWgSr!OyL z!6fQPK*NqXf6otV+v>PpSCAI3a@);Y2P8pa7xTNnNx8UW07P21H)=)_*_S!GmF8$A zo56+$#_fX%%Gy+w*ec6-^_*)ZYbjy_>Hr_%Vw>N}!dq&0bcc+pPoi?L_5G!<8TFi* zqX@mx?&fvgMQZZ%0G7SZQzPUFHoN|;>4(OnNI_GZl?GU^33;#;J0$LaX935;-X%Xm*~UHBOzhm3g$&40V>$9I<)I-0B5Z6dA|vFSGv)j zAK!t<8|Qj7=o`VyDqHVDDnS6N?>|L4DGPL7n!#>vh5$!Ij>@|KbuP^4CWVqi)c&iQI zgCuFFx9I(T<{N{5pp$UocqT;NY)SWG<8{fypp(lW6$qn@i{S|0YQR zK~P(T3;0jRfB7^p8KMeF4uAVL>GAJZi!|Ulo>?+GDyQ_P<4=DM$UGsprO_V=0mYnlDa!uxBP z{fmD1OPl?Re*6EU&1^7?yV(Xp*?(>~bza{9Tx`OxdA)|e8;{@h{=bM5pxH0|PY~O8 z*dzSk&i{u>eIEpPtwpdyvDtsBM+=Vwb|BhA9`G){dB4A3x6mF?-D9Ahoo|N+|1b{k zj{v5pFjX|_`&4t_*i$||e;BdIzuw9}{LR1A#Xs%AU+Us7 zb@2^r{+GJ=r}y)JtuEZHxpRsYTQM+fEWw-Qqp>?{w!V~~jg!SP`3+?UFVqECpXaf@ z_tFYhW&YN+qcFV6#;5T5A8P3v2RddazM@2foASeUVX!m7`!{mVY_!{3MjOg#Y3HT6 zrQb&Rmz6dqS=yhBI&`dEwz#gnz3j^;jzP$~$KR0ZKdnI-&-=nj@R9bs$<@?%#tPkh z%ES=+PGu6>rOz%yn|&Suf4Re;k*Iyvpe!MRcLle=pE`4*4|E1IRS8AIQGsj~>T5MH zJO9BsAg@dIYo6l;*$T*7zX)e^Dd*VVwY{ADr?L729TAQ@&F!Pw%pH+rJI~!6<`dx~ zaVyAri6J|et+$!-9#7^);?+dG>vo6UGMDm&zNSzbE~dz9--Br~I{ka|@xyZ9k)B13 z{+ng1_d9;G@v~LWjSvo*e8cxDRwUQla*5yUrkpOY#nr<4K2^5KM4NSn+O2K^Fv`k% zOYQ6VtKq#jvCNvT8g__3?Us6u$2Q>QK9gU0NFtm@ zq^+-3;F~RBdrkKejFM>ztbJX3u%BI2%S7YZ$9xv*fg<2;m5qgRPlTq98pE)&a z&^Iz+-L-yXDDTjFN$x(+aWiABa~#)E7tM89OomI=uHGR|;qXbO%6e16%;>_A*+uahGb9Jz@O;0kG!E zD!duG5WkpHGllO=17-3MAoYQ3%jo^dC@x&Y;WKttiOM!!U5eA6IG9O?)65tx8Q>G* zI)qz$8`OBugO_kaU!I9&MFY&+f<M=~i@ z=)F~N{hUcf<4$vmokhL1oi9_hY&0)ppa4rPt)F?9z(ndjzz(=~tIj{Iz^iE{+XtnY znkU99vwyB9`RfPJ32uQ>^`tNm@OVkVqk;I4*2tJYY0X zi2~4-^NRc+0gryZTZ6|Ojw8z*bHMHPy2Hema;OjmswYMxj2@t)tcE04OZ1#xE#IYv$ zft}6_&7u6ms?tPC!uOTrYc+OH@|?{ZN>6<-#ra;06#CXp&8<7SwV0b@WEFPRe!Rpe zPg8CH4iVgZ8kA)wp_g)jC*HqXOGF0q1sz^A-S^0=wBejg!)m)}SvTlNXWn397^Ny~ zwdQk>VrhPbH>EZ|EVj<{9Q%r?jo+iWnfD@GF`F`TOU2+M2(*q)4x7maW!m3?Gz{{* zw8)%*EkItP&dB8E#H(sKE?G;!Q#CX0e{(d!%)l0m@i-IOdIjpFhUANK%xw&@IhSFfXQI4T zsYtHd?0e~-!d8S6gq!+lmb}uWj926=FlbFb084hY|tA}6i_h; zTDA3QD5+6KNQW8n1Z0M9v{CDhDOt((4b}Q!wt^g(G^|f&6tel4Yuc&su$iiq^Cf*o z9#5on>W9V@qq1DPyzZH(t=Eh|h7r^{28|%LJ?@3Ap)iG@s)zytB|qCay&%84Lzx(E z=toiWLZ%&lWyrmhIRK>Kb&n+HZBhh$B-nasv_*5zWVlvOQCL}(clEJhJU(eHg7g$L z5jd>*5_QKRe7$)CwL~=4QOFI5^B$HuYn>&UIK@9|jpB8^vi_Bih^EVR)0X{w{Pci+ zK%sAR>rTx?EFeyR_Vc=deQVFKRF=Q&hfe|w!}G=}Q>mZML$n!vhREOIvqaE+wWwpc zmGY|WHD+V33kc_lUEYG;&5sVW=GBV$9q(>!654NZN}qeU|8%v#D~OPHxzyh#K=eBt zn6LirttvM2vim_juRpT;0?mq}_ebva4Poa%O+v8E6S_`HTm6ORMJn^D8xO`(psy=2 zAaKQ2GH~AB5vYU`DQT6;MPioC+J|<>-xD4yF4qMLoE|XZHHcgsn;|+=yQZs25k>12 zy?O$tV4AxF3cAcBO9$}{@%Jh~3XXR!QI$LbZvxmcuUOy=grz!=dgUJ$kQfl^-{H$s zh{7pe%CIPvd4-_b7?r*`16vvXq+E(-aIYInYs zzxju9d~fh|6%q>ikFJx$D07XD_ll0=E;O({K2h|}z^>lx>wC02kEl-U(k6vcOVlLw z`yVA)*u2rJzhmWDAoCK1G4fdK(cZw1Vf$3y3#uDC=7df?^7Mvitm1V%JUC`eXNcP) z^@$}kg_0ma72jKx-b4w95Wm?YJL$cj?k<8-9Vy#OVj!J@{pBF zmD*Z6siJbD8hv|@89us5WOVF*F)BoW~|yeRiXj`tVqgz1F6OZ z8WT{0)!NtjfXz()Bo%gPoxKoXl)9kU{lpunhFKy6yzv z4h7u~Q}kN%H!uSljovg1y~!K}Dv}l3bFX&r1ZLZ-B~%UMVem>2o8bcQ@k9dGANp&pFM8J!>`2^U=vJKrDd?wg>p-w znPW!i4@nSvq?vEPRdxn*xDw_8PCbNH$?=WUq@@lqwxXnGd8Y}YMgK)nyB z;KuQLl?r6DYIPxF5lRS%nqyFeCv>kon4(r><#pI)p{UBHe4p9UjaQ(ID+>9|ai=t$ zf@j6s&Rn%VhsY+>1+H9=TnLDO7?3vCY=@lp%Lm<3C$^)&%>hs+C4?e+DNg_=-yxNh z{Ud$H#iXSSm#q?U$t8qV)4jwOggpI+pZy;PI*&N+==uf$#v1u?2M^EUmMp2c+6nL- z6qn7WfXZ7Lwu%DuU~)!&d}`p3^?3xh&Dh3v?Lt=kg?g!%j*^Vfspb@e(R~HP1@(fy z)ru|)7j%En;_(id`kS#+Kr0LtQhUwzXo+NLP58J!1qLMuX@)kFg2&#pz)Uo^0_=d= zRH!|DJ3;rz{!of1@~0A|&zr_v+8gfco*qo$u+2!Ird>R`j>Yr^z4Te_-0Adii8o^X zGerImsl>|mpx1@vm?qaHuX1V5Honb4Vs}L?90I!*N2!rJy9M25KFriQ=Wi``O$^1BsOz9!-YN}Sm)2{ zJ10%%w5#wqh~;*-Y%;<=L+!oN=gaf5OuH+H4FqWU)KdK&18v5p|9HrZbgpv_JPx0! zv^S~oA1>2By{Xr|?1j#AVABye7B>A-Unu4)lS==Fq*E}#g`(kzIj@A=p$?~kvUsFz zDlZlS)y>$&(Up&H(e0jI%{E@8CrWIpqJ=cWxVOap2W~$ZzGxEtiAkrN6QeK9P5YSk~ zdCRx1=63Zl!|J(gYL~K4`2S(=J;R#Zwlz={MN|;6(@|{nUZk_62?7cN(p4ao&>{4I z$Wo9hy#^4ZmjI!c03y9aT7b}{6GEg*zmvVsUi<95*1~(A=l(qY0{oJ1mNCa1=Z=(nZ%){Nl>U>RI#- zCIQ1SNSt&3%HQirezcTEZh|s73zO@bvd~wW9HgdvTCs-R!fzrDCCzZ>=Ea;mo$NNr z8`{Q`N43S!zO)HbLfz7}XhS-EEt-n9(k6;4g&#}x(Hpb0{`b=zi~%Nf)#IHlivof( ze*~5`Xtbpt;H0i9t}$Z2R?D0RteyL)yujWl%#3E$Qnis~`Q%R8z3n+o-Jn6z%IC3( z4tOu?5Ks{`r_m2NT7p$R7bRl&sV-mol@Q_C!7I1(>Jpt3<4kv>a01x5@-B0uAo<#3 zg!zhUvc+4}2jlFl^gt-G;x=d1dddr@*fjiuv}?tnD8XvI{BZdN`*2h_I->Oa0VYqV zsYi)Jdv5ji1+J?DdN5bZf&({Levqy=|pK3SWDMp%~Wk!6DV8e(3nYLv4zjyI@=g3Pp8?JA$cO^CaAu2d>z=y_osvU z?`hMhCJ+5!7ckfg8eRhpmDl=1YWH_^0lu!d+iqt8f0|Za;H{$y0rb`db@}vhqoVp~ z0x=V(x(GcgjYqd?x|f=b-9Cyw#5mzDc2{rDPvQ4>w?ZV~=-_$)V5dW2u9uKhY}9D& z=zMl?*`=Ikgsa?D##lRZxWXoW`Q z4=0cPwr^KK{we-@uG{^;_kO`uz^VdLUfzd!q@!^4pqQ(id>57V*Zk4piIp`M^Y{5zo6 zKfX<>5wPTFjzrwNbnN(*pMk|->B@FKmia9C`)L5(uvR4Z``>f_?5F&|6qJ%G+5v_xe$HqwCW6hOV(bS?M{(Jne`XR z7F+f5;!3Qjfj61c;%pOjM%Y(tx5SLXw$T@~%Fa`jZI#J68Zuc0K3Gsd<4VZX!iaEAm~qk0rw_9+`qDPNi8{&py|+$;f?Y z$Ak@{ZZVJ#BOR=Kz2(m!jTbsr5W;_BLM-jzZG4RC-qdeTWyDs(L3OBw8hKh1U;MxW z4YOBIOV`WCF(j+qX?05x>cvzsdEY8{*^d*|aGhjr6vXujPvdoU#pd*jbnDHZ88m_A zwYfEZR@S(iP#kG@zT+1Jem4XsM_i@f&e2!CI{4CyTxrJBV6P|Nv zt<(=eyxRC}4BC`gSuuD2ZAAT{tpE5SndXdQVbf!JyIe3k0hN57W2}&)bbl$(LsnGB zPlAm9EqIDKc`@vm1p@z70#r9N;K486NCngo?MaR3|JFSJxp|o!Kqu?U#2){~ASR%! z$TBOBg*3d8vI3eLcf0NQH=3OWPsvI3-~G>l{P!WY0BAbw^=E%g?eVXVN--ay8Bb+% z9*f9eda4T)cc~xmzdrWYlckXcPfBxa74#-s=~$^H z>pQ|9a-{rCz1P3qC{<&F2q}}5^V&*CYz6~J4 z;i6%4*5?6!vOnpt;Kl``*8;sy5J$WfA3(x^8I<=psNY}lJWdki*uGi1M9B?XTo(Mf zh)-I}z88Osi7W8m;s#0B zws-r#X4YK%Yf0dL<&7Rch^y6~Q&CqgDl4`xW!QN{`7l||s@7Ao(KHFp5F)WDV{iz# zB%2P-($U;V@NxnX*3a?PG(HJ3?*MmW&Qfc`6kt*e29_mfZcpR#)<&T7xVvPRBr#Wk z?c;q%8e!X)9+BdFX`qC~Awz`RHa!8h&B)PPVEC=+`!cZB=iy zM0KiJo=eEzUuphmhRt;?wi(Yy53f}orOxnE_@BVTNL9uQ@-zg}8@;C%5ghcK|Mn?V z^F?|ei0gRdnm6OQ(DR7A-w9XvFk)*j5cI=n`0k)ZPUmf_lQkd&KesQjGTpoKqIAcl zq+heOePQ6+r-q`ri!JTIH;3AaPSpGOe*JjM2U_jS%OK`r`&r7Cg@T6vfhQPX^CX{{1B0R0^!LZlOLA5?R0N6nUd9H>c}UvodAg28H=c6E8@d&RG;)YNX) zsd)h&0IPMvu+X733=rEL9GKG?g|&^>KJqm$+K$hwCr+1p*7gYRY$_Y=2_8C+f+(>^ zVCs&I9Q@Gg@u5@L3MgBN+Sg6o;;M?=jp@h{{F^iS^2uqMV6~vuQLlQzBN{(IY?rXz zHgvFmRtC4~f-@JrdO68+M;qi#-W{I6Rh>_5>(=ntGw0r@=6kgxo zdyPk&NtHXzu0$vu_r(9)RT(y6Q^kBZVi`qx?qvBcp7u~@Jlw`0?532$_&UdfXSMRJeyO~J0 zYT7NBXf@}RjTxjaYzU29UAUh%6Rj&4AJF^#C{uPss)bYv-d(D3Pec+2mfe@4F; zoVii$I^-lOSpAKC&4y4`Z)YXmO0Q4fwNbVZ)I?pKu|p)Oopm1V7q{-3O)Cy^$U-|@ zrxTz4xNo#Q6V0I!RH$m#aMSo8sb=>gGG+dhu*aL<$I_TJSbE&4LQ@G+Cgp7rbdN!zM^W*1{xYs)SU{yPMK-V&xojYLyL?~@aet^_^8T7W_KB@&H~Z=h zLrdyex8@t1dJ&JqGum>s9TI%wHhz0|Ucq;htKvYAdCha-C18a6*qWru=aZdyKU+5= z3LJVJ{s&9ij{3UzT8g+r%wgF2>Pf>!Xr__Uk|Eq;KZ=%O9mYo#$-Zo)K7>!qfs za*{*?nOKdHDXj9MqovtXNZ)*+)6@P!CC^=}BuCd0-@VE?Aybt0fTdJU?u$YlIWNJn zxtp3vejY;BBX!H@Zn7o|sbSWxH61H78nM4rITZ(|H!6u_QE$s`D@tRNA^D7MlRVsm zo`oc_Y6*6L&L}p9zR3FJV%NL$@JSL0UZ1c;Z*B3&(wgp6B-LI5jlIC+`niWp zOE^$-o8}O`YykdO(d$Wp6Tywy52smbGrl135prkCbImHrTbtnVjcmu_1iT-?$RK>y zmWDyx=}9FT`$!D5Yc=$`)cx60FvP}y z=m1ielFy2fJ=O11WG}?4W32bgQ5{LOEh7UZx~kjuxap^Sba@?3I86V?w{mjh%yLl( zl>nNdFz#2sW$DaNYnOVYJ^Tt#4ngegDWUXT68YMwxirPdwpBcG*Lc2w3Q}d@P~%q8 z=?0o{blM#~6=T&YmgXxBrrie4!W_7)7ulv}QJ1_OS3&R!zmj(-!-jh?H4>7ed_h5J|FACLw zH!^&A^V&Yu7d&#Shy)*(wgbw)?l|W+Pir--H8T#x5;I861>RJ744rb%HbGRn)x8NZ z0Ue4v_{^d#Hx@P0KpVuSjijifZeZ1}7dqiI$@B=`v`}fCuXFt`_GtvNZH(oj`Iq_f z7MAy8NkL$Mjo!fvS9~(L)D??$_@+ z8PCd0@Ap_bvt7_{?x}s(lcuCl>A27_K@3Z4S7w7Bj=Rp0Y|p1|{f1D{KBP?^`Ub;G z+}~cCiL9&p875?7O&|64j}8-mw1Hsy*H2qapfmkjm$=DvZBHHk6LGg?e~3g&?iaUq z$w7y{#E1;UNDQ)8-peF?JWQ>Ps`Q+i<8tjGt|)iKl(XhNUb`v@}CZ?i7KeOuJv^keZgvM^vNV zqS!P^&$jSCm?6)14K}gD>oj01)b6Oh5{S1-#D|RG*S71)JauMLLr4d`dG$>NOuLpK zOv)t1G)#JB)~OF`tYtiM3m@$=2wE1?Rj#G}9(Fe%p6Ck;*$!l~OO@OBY*@Qxyg>== zxD~~rYofYRWjnc5)b;}UB7ihXa(7AnaV+mwrHr;t1m14j*!D*Vt=opD5?YtPS&wT_ ztYs>R6JZ!S+nH3R3yWLX+g_v5MsdYitO}_BFRg380o?LBasQUSx-r9~VJC97nL4Iq$AT$mB;2G^nIf59 z%zPvvODW9grA#z9)H? zZ{9T1AP^V(b6Wgo0y?&kp8FFWuiWRvH8~B@mS=AW*zOw~dOAT09Oi|_<}HlFuixm* z7I#~ZsevvOU31bOe`Wd-i+hF~b69;c<3F2z0Jj{i?8MFNV3R-baYG3muZ>d|6dH-1LM1-1 zWd7Ib`;*$gbmo+CmmAY!al@5+o|6{)#11b=X|4mJy(di(SASD$?x`UEZkKkx0Y&TP zNSUPYgUnr}Xiz3Sn+;lIk~Z`IoYF28eybhVIG1C_R8bK6DWf;eVsr8Flz~814=Uop zvb&--#xr!Z^b{^sT!OdRJj#CG4JMPZ-*39~u%s|Q+9GmM&Q>tHy+$JG?U~hhXyqbo zAucCwf4fiJM3%&Qt7>Wd&=>B{o2Il)o^NrMq7K?r3c7n`2p|g4Roj6q_K(UTMEhE7- zuU=%*{yLwEP<{C2-31+ez45ra!$?EhSVVI$=g znC$J0*c?V(<`#i64L}QJT*sQ4DZk1)xqBJ(k-f|8u2kXwz)oU+Lf?Doe-2&`^<1a>F=7F0ZF9{ zJ5fJmE1|5<#wQ<4mvT~K|Bk|?ahUPbryuu-UgIr;c31QXlS6*)rWVr^=&}Ye8O&6U zFo{AJQz#OxIsD;DM(!f~aE#b;F*vI(g!GUxCuwf|5H-RF zA>Tcq_mwYSOlTU?60CNpBd6{ej=#aR<5Vj8^l$r&g4SXWu7Qq0^;yz`u4@pt;xV|x zY{$d=y4-xmEbaFpVyk|k-O+;`i@nJ>=W(tL8g|vh5vO5BFS_*#gIuR__-^T5k$c(b zfc9gfgt>1s4UpcC^^EUnUiMAolV+}8>1J1$+rF(<>$Z_y1Ic2z5xeH5a)CZ{O>`HV zuis7%5dorvx@W97#j3$7S|zV7&YBoPYUaM>reBH1Jp*i&mQQX}>k3-_Yz0WO3*tWq z#(O4bv`kh%^K9b2JhLNd4flP5$n{?GyE@nR1q2)TJ068REUHycS73mQ&yU28*l`es zO9Xi%9NxL@&Od_g~pr|l?cgiT~C_UZv0lnP9Rx+?&v?C`5=-t zDq2;78gkJ@*{a&3QPDwnfVsxd`q{R}<-3XxuCYc4NdgcH|9~Sx*v{W_7~N1Ea#v2X z0753O(am`CMPuwqtCDvch%Z!wBY;x*h5pP$eJx=>#a`!bL9bEt+~Ck0#I5ffSP>1XI5e_9PA$o?{zoT{_d1JqBE(TM^|E!u%{&AC!)V!T^T!kU*1C7AcHyCFWj? z5AC13tuH}s+%i zcHf4uxDq$E=iv+T;{q79a$9L5ktw02+0m-4K^UfO)I)3+@3cHp5eR#HCANzHgva_k zkKyPvxX@QYq)aiI(`FDOW>D<{Y+*Z8?LooI_`>TbWQsOWmgU$njj!eRy;$B|xKY40 z144VH_{2#3fX$$nu2#ODfHRb7v$e=%DIY+Az#;Z0wK{u|?lo>>zFYOTc(h)~%7*7P z7QGe*>y1SL$fZGR+vlF6Yw_Y74hMUxexy4r$E^A#_^H#TsdXaKZ%?Q6-hx)V%$>}v zm%*&gMDs0mXky?ePoCuc(Qx3j_Jb;^6+jTVE?oEE%F*0sVwMXG-K4Ml9pw4WYG$t& z!>b|hmwD5xH`r-n;6pK+rLR(FXXiR%55=lvhDu3KW~l5d0uQp60p(U=nwAjy5YIkT zWKtpo9wEX)Xo};2)noj^Vyjx4wpnM^t%Wq1arDQhZ-iswAz=mg~-fy_0xK z!U#5`W@Dfbd#h%D_fcG!1Jx$*v@Q;WGt+qH6|05203AK`ZBbJok^(CVR2xd8P2$e}xt zlGp3f#KSs3til|C*0sc?DTH?DT^JggvnFaCoZ4Q3j#OGzJ&9dSTeC&wL!WIe?MICo zOm*><&}RPOef)X1>fkrX%88~f3Mx;Rv+kQLkDP&M>dbMD%91c{ug+Z4H&xGIH84M| z-N1S+Xu(Mow!~!Aq{3ZgPMYVLkY*X%GrLnl!?b#|-l1r?JI%?W`q}(t@iBf9i$?$J zmk~M}7)i>uKJ!BqYL;KAPv=IjL+%f2sI9~5be5Adb1>r+tWLKr*oB} z9gf@M%P`id3PR*H zHq9Zg!yWWM&Q=1R&hj`>*}nmL2g)`DCD}0HgP3wj*#%tE7)`q^>r7d-_}>bzC3NPy zwMQx6`4H;;5Vq*(KnKkrtunCeS4;FlCsN&^u@-QLOKRm*CJ1}>wD2QdlbZ2g(U43` zb16*esi|^K?n4>6lnRhJmi2rk6ND}HN%XxL7PYBm$s4YIZGa-x8h3Ml1681KnrR6g z?aFl|@C!Op=u(jCNJA;g7v+710HNyolC^<6LIl$qNPP=BshP7Gs8#F7KfiLgYmx5i z2YKLmAY0J>`%3E4iIp0$B+Wb>zkKZ-Bu`BVT9@SPnX{AP$d$Bc9mQKAEZ)qEQxDUv zp__#Jj9yIif#lXTq!fD#&8T_zgB5ua8B}Xt3jX}o;zlJ8Va2QH)s*UNl{kEd99o8V zpa1CntkNJK`on#&B@)j=&9isKHBXnz;p%?jJ0zpt{5~b^W}%s2HOg^e)jvVlPEGT$ zpo#qBV%40-VJ;dzwsgyNb-GB9K>Sf{7$TXdPU^My$Qnxxb~}^@xw7erVov)3wbAXCSV_N8KDm&jK>`g=a5taI4jN zS}~J2zh~FuRzm;uNa)~OY>(pnc*DTVg0zL74P=5UVM+`AYcL0bF2<8)dTBT#gG!8M zI&M*Ow^5*oB=0h=M0=OGnWycUrW6@*1 z2Jw!T17&NXKdn%(ei^H{nJr~If;G(^r$+YgHT1D<084kzNMg4yl4lW` z&?3PIuLVhsJIe9=MHxs~FcRNo@uT3;E;dCwA`z(K#AbXcDFZN=Sz-9TRb1XKKdr-J z#5pH!+|Xl`>RECZU7a$|dV^YQMeU33+q`?dA!(LFJzWsgay6srC@OWW28Km63*#rn z#}+fF2bkr_uh(c|QixCEv3b)uhwxX`m{@V=c+51R%w4Ifl*@IrmH{-^Vybl_&=@pZ zJaQRFrZk>!H*FdZ3!c+n7X!c%fg=2Fyt;<_GG%)cifj1K%J+{r(WQsp!cB3BO~%Cs zx(DJk)lrZg$JV{A+v534*gU3(9zP8$T-VYoHq%LEzp&yC{X&B>We2vNBuOAJ%R8Bi z12z^A28k6JhFHtfK9AUNT71Hogoj3sAB^g9-EEsr|)C)bl;Cs^>RAQ1{z3D zSLtVtZ2_Y|7A4TH@ADSjmaeS(c^F^QsSjAyL%W)aYo2L1iesSz`LQP}zI7a#CnCko z!Ss9{m#KTNo02(SH+F$9Lq2U~#wJ&y?JFJ4JL?Fe!G)W6J_-0vV1lUgShcmdgm%$q z?DC71JYvk)Az@fLOaxdz;jAMAR-?5C@I^R&r+NqdzU=q8{hq>g`tGcHq+#u=gL3H% z9!di7R`pyuWQ?IvrV3CqB4--H)F0u;1@Wf{C!^4|<&6MEC( z98*oIyp(<9)gVkmM*X`^`I$c5jAy0kGy6_h$AQY+Nd~{*W3~oZk%e+~jBioP@2HF@ zMtxwP;yO3KTW1iZWZtX2HZnYl*H!*x_rY*7%|NP5+ zTVSp6Jp#=oqH*5Zh!i1p;f&udj%&~VqO5xnPtKjPedOKR5A@qzp*-Qm77mh78B6!7)}RNzl4guIQKgOy&sOg3w>94WUW zT5$)<{nZ%%_?w>w2+uTSH(%Soks~d$|1?ET%4g*2G0xA?9A7KGS+9=?o2x#4SIL-u zJUw?Q0iMYqBy`k(`IwvU#3`P;AZ(jH{gCSy&yk5e2SzVrc5`Rv?SK0pfBBQt6Y%yR z7T2y{zML`=1O$8+?Ho|Y50Z@Ok~(<1kz(T7uU=mF2ux`6liSD$`>$s7H3Gc-|M%sb z*s32Ib~b+dHdp7#GdqJ{Z0RMxpi@q{JSqt{YdmTxyP5)Sczh7D8S{VkKqdHBTUV%F z=P%F{Aa5(!aX*HMJF()hDJU5noh!#4lOqxQarb2-&D7b`%?$9355a=9n1mok$vVe! zX&~O!lnKY5vlHHDRltkyDO{p+56q%n-<`1hA}XbY9F5Q|d*LjYZgBNi8!u&f_1n$V zCYq8Lh0QUQlwjVZr@vkcdWm1c93rad)KwC0{AvoXKfP(XDS(Z6@GALhzzx)7cZ|5Z zFrz`+^amLSh|MT@*o7O&cWVzSf7Lg-u7TZl@;i*LDYLLCg5`3fuxu__m&K;#V#EjK z-1cZ>`}T!_=}oJ2;oy}r-wXd#G=Ci8|Nga(@(h2J%krK^g~vnT6?LN^yD5tU%Z@1F zrgx2T4>Cwixb&(m{2O_G@TUrT?z!-=wG2`H_jml)m)F^xwjL=rVUKo`wLW{sS33Nz z@`Kj!yFUW(0UGt%*Q)F{X6ZYau5epd3x_dzCV!<2G$pmzzxADPLp3Vk7vDW`>ry$4 zO~HDEEDSIAbQ8Bhd)bjq_yO&G>mN(i=dS!zEi%o$(6zXmT4x%>Kb@mxBX$~jrOfYF zVo61%5X1c~=AF=|uK{z0In_;V6S-%+2$gcRHf^vehhDNlQtGT$O}C{CIFeHgHh$hDeMY+uO74ggM^|?1;=vqw~$GPS6t8tT!P%#O& z=lrEg`;X7c_yE0OCN+EYS4!*6iF)m^UrF*MDJB}wkX(+0H{%!k1w@0aYxUx>>ii!= z>OM-v(R_S(=2sdJJQwBsUlR8hzxt6LH7$SB!E#K_=YKx-7FA91%Vm+`Cj%D*sj-Up zf2`|YP3%&_4E?W{B?a_Kx8!GXIR7hol6o`2PW?9n6DvO@d071z z9mA^(lEJruuNZ03pDk7{)PDRenxuJqa79u3@J4EQr9tzjlb#tXdLAksBcS6|!V z`Ov{Q8U*I3r87;_?9=?igza7@HTU|}`Ec4UkGQsKCHvt8z4U7I7`*m)v}kFM*Ph+X zm)Q7BYY*Jgt9QrF+As9n3880IgR z^q*ss36aWeOQ^A%dcVG~Tk0V`6>p2b^EgbVDTv+#(*1syNkmRZiUg&R({E2NY4_!3 zmUe1oP7sBScZarpCCzZL=QGmk!~C319GU7k$Sf*MrljdfzJ5{W6gl0JI7;*Wc&otM z?5ZDa&|Kx5It3#S>u&&&^$9Y7{+1ook;u1|h{2p7`+Cn?=ELRIFWaazc$Hw!;=Aj- zHp}d%P=yO8?emUV-XC@6zQ&mcft)*ggM8qo+X-_9R~cNH4fB}`S3d%eGDe*yghoJ4 z1tCFL9L^w$s^wW+dmP7~m4l!-&0y>;=4!8W=sfQB(I(XW(O=x6e_Ug)gQRlLbp_Li zH(e-k%nIZ695D?Ow4!l0Ty<$jQWntE$$hy<&ulxn z-p_MugO?iv9s{!TJJurw;fX>vL#*vl974-;1qouVJ=}^=219^1>RusgI-Xz9$npFL z!wa?49v-mW;4%mUXqCsIU*3I|^4?n=G+JhH31JYuH`T1liyU&W)Ms|-P3M3(WCU|5 zfdGqmmBRCF=lO4%-_Me^tqtrRexA4^ST; z#w6|0n(z=+u?elIgxz`cejR-gHJoo)%Lx(<5ka(GQ4PL_0=#8hG|k2l)vgXo2pr~d z6nh8`USf~Oa!`v+tFMXZiv|V(yqA)fk(CKYiG^nL>qh_gRW_|*cfSto4wc(6w{FQ8 zICLOHom)p-FLYEMgo7Jiop_Z(jMT7rj%3~0TGU?Npmqsv7Ch#dF->rtDtz5J zbQD=w2{Wnba3Tz{hun-sq5Vl+vY+QI;52Ft=&8jm%5#)S6!V6QqbcOLIf}zLpx0v` zPI(!4ml%2uar8s6cJ!sMMk#qGe7qqqzm-gNHTg|GN_*C@ldo@ubNZOpt~qGc87~kD zY07XykUGVqQtH2lGQY2Q+k^G2Nz&vhjZ6x9GWAWd;(mKvv+s4YJ}JA@xp-F-M$u;X zPbLly;(b!gm$FR=I9N}yE1T(!q>aY$&S(HN#qFlxyq1?@d$QJ`DfO>&0%=8cEF|YV zZ{)(UTcN4)Y0gA+k;O)cW;lizj4X~u!`*htgNfsZRbu1it})gGTxpbq%_c9ZdgC+= z8C=ZSGilCV&|)*^pn$0w4r4VkB+lIkzprov^LeBixA(4k*y{~EE|8k{rZj<=rkPi{ zT1FMK$-d*vJ&Oue`zmkig)b%abhsSsFq2_cWyY#Ou(Vz+PtIx}A9RaQHE>%wQ^moW z=q-Np+Mf)NKThu@Dd6UPQK?-IzhF?aa~8?A05Q&de?6wZD~>+%9YzdGkU&n6 z@^EwmdB@@lnoNtH;&-t%*~70QReeLqLEN~x21}smuCsdq0{+Y(0=@gRDwpTfC!5;d zacC_}^3@s022WvQ_27-SL4!pUVe}Nr?IWqoa4G&Jq{EHk zasx$NKQ2pM3#5u`_~91`IA?y6wk{=rKCSJ`8vbVbQge47Vm$7|-$aok)5u2#_1HYt z+d5#n#P$~D8)Oa>SBf-ETCrTkVFO!jAP1NO5B>)({x1k-q$wiK0wj@%XJXh!NQY?%X{E;`4D6u#u%jKDH_>d`_r)0}k6=iR$4WphTVUDYeAah-Ti zM`Z&F6?_?LKCXIne15@_H^TwTR6OTaldlp?QKLd3XwjV&FOGQyQx3cHp+a@*>_}^I zjp2a^!a*iLf)DfLSq+3@Su6i}J+%BoxWo;L*PxSFJ=VFQSD8;aiCtI6k=^uJ*|{r{ zLh;|felQvq-hBZR=v4(j-@Ogbn_^zg8$fy=7WhN%c=60AX+bn^V3R$T*JRbw|Jx?OU+Sx$!`D|hh;!-+*+i5;HQN|>w-ic5 zduw$_@HD02fpsIJim3FU8DEX|z^soMwD=B*xqkhOt{MOZ(W*j8lh}vf59UM8Aj)?A zRUYECod|o4);dLwv06>mzMEDiy%>Dw#5$IPb|z>UIkaDrGVn=#MaN`16I1;*g68!2 ze!JlI?u6&I#m;ji{zbWMsB3vXePwS9#BHdDm^-;-gXq!RT4>fGu6yo4pE^$aeJV1W z)QgoMTwpQF4W-rW-p~+lx1W;WFF#DP+snSDB<9?{$oN~jw@PuH!7=C+rpRho zu*w{RtZlt$M9{(TI<_>g&Jku9UJBWSJ?=0`LNjzn;<4rp(JSV;v1Uh`#)1D z?*a%ySUcIKgvRpYp+ch!t#4~TSFUVURC9hcn;)(6eU3EfAK9??bqc!$cU$Odq}SVD zt2?>-?V-c$5G?O1n~uzwXHEzl0e}IkZe{sJII*B`cW02&OLqfqJYJn{ z{Q{%Mu`n^YjOxvuJfxF2%2*4;gTGsmx*_#z?zINmfuIqqdCzIn+q?Gok%ennx@D!} zdTkLb)4i{f6uf_HBnWn@jTXBGglg+HS+Du}=eOtL`z=~S#j7INwe=LEJlkOAyPNM$ zuSatkF5og~#m8Lq;{;vDEC(hWFbtzJA(9tcQi$lSMX10?J6}Q51nqHd?hj}07gPxw z*UYNGU3o|8`oW2WIiJCTmHS%Zql_Mj8AZVH< z?c)Y{i5=2J8t7B=*cYQ7I|eDUU0TA~nWi=&>T*kvuVsk~FtD{yLKHAYaIm~g%nN4G zUexI`XDZ?@j-30k$X^r9sc%nkpL{p#bOh$C^%Q?>Tz)gFRx^BsE)2KvLvuOWD_)RG z_5pX!fbOR+>b&m3qA$ijn=A2!SN`@cBkg7Vo?7|STP!-C3kC?=_UgTurogquoL*Yd zAc0JRP5qDv?6XQv4s**`QRl3 zt8p3rnJe{6S`Skd(H6VJh1jE-lDpo5+-{bF4qmckihHNTAIb7qfIAh{3wpSPJu#f zj6(tAckT8_jcJHhylI1zk;tpgZzDf@F{{0*@k=LqBiXdXtK#Y(BIQ!0GlVwTfh2BP z7L}2}pM*k*5G$uW4WiaB_C55GkjNcYbp9=N zFNBIn%3b9+{-RmmYjW423*40bb>*bhh8|gY3F7WuOZaw<4rw~khDu8LGP69=(=r{z zMUAa-H8TtkH@9cZmK_&{sl$8d!*L$c&rqq{mIMy<%7`07KPFRy$h&Y(q^YL9pgvJG zF-L#AU$02UE>_4n3S({~aAiR2p%c3>s;>g0W79WuJsf7(D*-Mj=|uQuY?XoLVqaFL zgn7`3G}8*hSOhv>D1BdGcnyz4M+C`ndqoy<5<&LZq`6B!@y_ffrDT32HD7J0mVvcR zemj0BOMe&}#%FpF13?lzwiAC?1Xxj+_f}?XVP9^5HLX6i+Z?!1N7TH%OTH|~xqECl z+KbBXTKy0(?EF7N}R`T?ssm_Vvui{?6v*zQ*9Ux;>I-jPKgwGtID@0asIQS%!AsFbCs6f_@c z$=R2-Y>8;ytOMA~@-tp4HwOEn8&~Yw-M$=N z-|$&|F2Bg@kZ8X)tL$)CUwaUikF2=`RMOVs_|NT+Z?q92C3?F8Q#K<%ALk2F)VV@b zHF=7j!Iew!BHW~c*;>d&5xfuz(hlk%^{w1ON)mJKzYBjq`^m(sr3~t^I2_W;4 zuVn+ucaYjuDpAN63l_8z9uXA=$Y2vV@Xf8ay6bXGhsub~n0qTXyby^m=o9nQ)DUt9*Dbd@F0ae_kN}fVH@6iF2VNitCAu?^+e*C3)9X7MxNIZ)bq}Qi=x@fZWqP1 zrtWc6TO#&L(9T2yO#0I@<{qIw>Dz^m2K+bJ89lfaoQM}=ojewLW_Uf{?%K4wcGO6a z%)RJ4UL>yjU5iDX9|S)3>i$+hkbtq5lWUh@fx>#K>_AoDn@>nkRG<=ew>@<;|2+l1 z{RdSl!77iOdMArc#8JWj8k>d3A+u3aurpyG2w+xRO12+8@*#!Q(zVDd|vR11j zV_4kxSnDivD%kE@=$$nwGwbd{dmw_#)T0NMtn#Y+Dr>606;&8_#7JM~+%xc8BfE)3 zYRO-|L#D0DUqdy$!EV&7{Bf!|LLzWrFVgW~t=9C5Aj@UbFiJg!(HNBsV1C5(p;y0x^eaqmeCd(?KfsQRAg z>Wb9v&AjQZjq)YXva?Egd_zmbiK_GM@{WaR_lZi4+dTs!vz{K&Eb6!f+)$;ExGy%R zKa*pq2*OhoV&ey^{e+NYJ(AAe7Ap!n-)!3o*t2ur0dabk*qtoYg1OL)1A<kW+MVT&ko6e^fMq+u?ObToYOW1B?0$RH3Qp2? zV%NY*vtilLNms+cO3Ukqjm2rLN4iym=t0qIHAJoqIA>$fl10wENY+#{{2o9E6~}$q z%h%k{rv5p30x23WEf_~XK})(4c*OhO z*ibRY+W|X$^5WQ;({A^f&w~8f8qFz^(UWR({PkTVQ;lm3!xe_8n*vqNixH323g2$& zB;&M5Oo$s^x>20k#-vqEmAeAsI_hAxR zp3yrFyh@b>;a5*$-SoaU2C*&lWP}$t(I6(zJ#bC@Ia0A^zdrx$A$&IQvqIvCo~cI0 zLQtM8aW1A1ot1wwdn=qpUG6bL1opf2+}97`vu=gJvWx;TqQ}|Kvu-=?4WZ@&O&y+} z3al$iG~`o##CGuA3xJK+5@Cpu)8{TLa2jz8e*JL8*J(&%xLC9r@ z^I2kd$D-PP#@~!-cPEH8tllM~!Ofa#0gu;vHk9sk?#jI%G^@@=9Hah`Ih8nHFA5R+L9g27nSbO1wj*mB@i>Ey z3xMAegm`^HZ17$!VHA%;_CjrTTx&232z~mY{}o>OvnR*E1oDrR-x{VhFZrE2+3DBc zG3XZoI=DX2$oXk7E_8e9+p%~7Kjl+)pri0n?03TJ6qmEvefaMB`GI#cf>@${jXjI^ zkga+5xno=w27UloVl2Mjw$F6w(J5cbLpJpcI18w4e7s3G98FjhejIiujQF8iEm_JF znCWHw7B37z#lY1^S}o?ssW0ysPy|AYI!K`RKC3y=6hwRZ(j_Ll?_XVC5<_W^4I$sY z4Klp9b=GD7yjcI0jJ(ZK7l#V{eTw@y6Z{|F!gL!XJ(*Kv4S)S)*wK^cnqM6gO#kN@ zl#)40ZOa6pfBobgAUtxHgB$*9{D1z{+wUlQ>~|f0+|vGIH@y|kgD3CM`5qg%`p3|y zK<=NGieu+j@S+o^La%}+9}8bRc7Ogc>i;jB1hzBGmhSy=PQ^d+&N4C}(=Agx|4V2U znT#5E^3J3%`7wh1&&Bog19%2Mv+iRL(LWBT-)Hco!WX-n$Azu`vGbRxz>%fuPWdIQ zj0sewzx_V}J@(2v+IcD}GCu{=o!b*v%R%+c9w54bsJ}gZ?hY{4x<);=F)>;Ht6>7rsFsV3cE_K_t;bAQQd3h*EZf=~ zSCO__hRWRrN&45ITqqc%a6m2Nnx$YF$*J#;(H^P_p|{_q*?#&>!p8}i*+-cd-rXDQ zF@|oN^UDtGIo)d>#G0+rqr4uDup{BLRKC7AI$-U-)|q&uFlRSIfWHc``-NK%*;b~` zDuNpQAk~XmdRZyPEg#1!hI4CiB~<`%+m$P1gOxdQs`~F2QIMR4-!^;_3t=#*eEv9= z&mCgy>mM~G7sS8}@^*rljZx?QLhc9yBwW%89M~iwnTL18=ZJ7`8DS2G#YlB#4!%=Ca|}k7i~&pt9{wsRm^>%IaM|6fPAc}G7MVJOBfYrSBB9zz)1OvO^)qOp z=;h>X>h2jYKQXcxsbtdcf0x%COYWLu$jE1AN-yR(XuI9t617oQ zWVzrx3q!s*sOk7=5$CwP?vKB`yAIb?Nfev02v`i--}Q>7p!F*CwHiu^)!&*^d}f4O zJPORC$DKZ?tn4L6sx|fX(0G(8I-Xg~TU!Y_R&`%0mCB9Bz8JtI@Gu+aJ*AMN7k2qp zt%N{32k_`yfiS=qG}H*m5H0G=S!Ec@n+C`@E~{l&KdMr0F2Z`2&>EG8HJ8u6c_SLq z`68;+V>@HIu-RU5OUP|VtJGnD({(epZPV$w7CLby2&w?PkhixzchVty6x8!6g3$Jz z_S6uX0lltkWM#qqbLFNOn_1BJs?I{*FDIx592jCzb0PTq#Ap>!rYY6_Nei^)f#;d3raOXn8l5LQMbt@ z<9lPk+|Z~1B>f3>C;4kcj~mFi6*a`{JcRG8H;FWz(I>{uF#*b!j})|?VYQU>VZ9j` zz(Qd@V>gv>S1HO?`5D1A0coYL?$R;1GMmqp;dK{qLPUWI`0Yi-V@ivGq)PE$_*yxU zn-9yz7wF9RoZL^tLq`cPjk!+4oB0#DuhTJ5503Aeb5q-AUZXmT|3GMQ8eyO2Cb*+J&Oif0FCg@@_7MiY{SQghow5dg~ zG0O!D;#Fy-=ho)Bl!iB#J6?`v;TJc(wm48p2Pl`7%SiLg4Qg}`kIU$Us{@*c1ktq; zaFuiVT0;NCj{vSxl+XU=xj@Axa%$t%&vt5q!d==4MuM4!81np5>)x@U#@yPGPl$Cw zFWa30&y41TinZyQEs5fB!#VFAlDD^f&dScikJ1G63H^nj>&7jd+%Xl$zzpzn^?o6g zxAOK(fTaM%s`$1swfVQ?#8E-_F0l$HLS+qow_=g;W5Of;03N}sotutP@j^BtLaD`` zvmMl0KZ?}S&KpcY@6ER(9ajLIPuG#=5OP~D<v~?7Zzc)P zh{j$1lOxlS;LB|9^#(W=>(e*}tDcq`i+2@is-(?+R#_^1LF_g;`^y2Ml`eBr-hb00 z%A)Gg{YBkC3KDQPvT_`Kb^d}kzII$^);KSNJvsiiUV|G3JUOk38F3iM^>DF3`VU=v zP`+oXai~BbXHP2z{4qhEE(tV}u z&~8ftg+8SQX3>&zhq(32(pEsIf9ZE~l9U-<#P zzs$wS3sY<+lg$1jqVcpjO+R`M5WA?xi{zQ20?l?BusZtyK?W?ND6K6c_HL+bF3ozp zixhVR)bzKQDEU&LdmqDBeJ%FJTWIgLoLm!~a<)eS8=k7bUdmQ#z)4}ws zw}6){Aja;mcmeTRFm&mCJ+2a>@F`bS>FX`nnFbxdMbduEZM{=oizAh+<^xzqHro&9 zmjzzRx4!>CN+^9p7nGfDBC0OF1wwTI{Jp7CzQ!U8dVdFRj@gIrYjvi~rnhYR=87DsS3PT{~=!=)02? zIJx)gMGF{KWZ74YLoeJ(8fQU=CbSoQn*wYb>REFv^;l5P|FZ3Mft>?7-0oD9Di^-OsiPgk|b z?oz8EfJjO^`ixU1@nMRK!_VuA2QO2QvRccgYlAv7OC*}!2TsWh zCwru?-C5dUWu*<|tJz`FFV^@b0P>y)BCdvGPW{u>Mrf*0kE1or_%U5FM>SAZD~B!= zl2Q9I);z$Huq^8c?ibUmW&8nRXlZBjQ2X%_uubYkZ~8KOM{~;5h#mjqtk-lv|5C$U zAM-itNuOm|8Sf%fk#uyXoJZOPVe>BMQzx0;uNA(I<@Y)P@+rcdy7(lTH-v)#b9AxKpptxCeV<%b@Zm2$I7x#~>vrE0tybK`xxyn(FjVuvWFkJxx#&==R zp*?2i8F&{UohlYjuyDr#wFHN8B1ui3oNzROIUALlZG!9vR%M|2KIvF6bJqeRK-<~d zRyghfK-A8Rp0|r(aok>b5_bR?~#7wQvor%I=^HBDNE3&?Cisik&s+W;^CCvTm zkWMlaKnEQM)VjCB@=tNG`A?QPTBU2Mmv5OCWH}vda><(E>nmS0DH zWZUs0X@Uw%4C^|Uvvp+3&1-abHs^2lDCih@TKBk)2DQZzd|Tc10Y|Kt)b)TfB(6V} zhokg4W>@v;?SM+Y{Dxi1{dFXdByLgEr{hK+)1%@pKp|12OoM9zsX#u0w1yy_9Tnro zUgOPWf*qVo1Siul+HUGJ=veX$Sp--Uu)H>=$)R*Oj7r?RgSuUZy}FX5JI5M%;?tzP zYD49h+xiE&>c{H>ovF*nuEMa=5WtIsXe=vL@_;ByZWIQr3M*LR3kSX;hOLFB&z)pB zd9s=YDEj)CW^v3fbkmO7q~G4&JIYhKvR`9EMhE)j<;J&dNFE;#cLr?5#kxp}8|n9B7Hw);J6c5nvimn0+oi%V?llD}}Xh^}w17kQhP_6~)eD~@jx#fogGko*i z_17U7Fg(00Tm8>H=E|9)z&e?{=X!x)7ADt&H*;XZI1Lb2!i#39fJOx5qC!*-WtzA7 zw(FJ$tSgrdIBE}z-b)o#VcFhC_^oYCMc3_&x$r*AdDIVgb3>$llzlNt+=SWvl!2F% zv$F6R1SHJo)JtYM_rHk8Ey|h< z-?3$@X5iQ`1SD;;`))fI{MP%r%B&oRN`B#noiV_Wmmm)g^r->6{)pl<2xZxRk~Z+t z#HbD3RHD$jI;9Z1wK@f6IrobMj0qnYrho_H7q{{Q#JCB$qtB}KQU3Brbt8l;a`9dd zsHZ0Ok5Y#t!S)wdXcJ3MTRFbmo??GZ8SF1~P1oTRHmqoas^!Ay=y(&Y(*RSRZQI#{ zT)XJy=av8Xl{0CYd2Q5`nOT2(gH=w*mmRr0cG|_>`m~cf=C)E8bD|d!othdPd`)N1 zn5INyxmRW0tivJhYzZ2;`Zb>2S&}0js2v?wt#%xktNasg_bBjEX3;UN+@14von!iv z;sVrMSv9?U$UY$c%ES(EjO_akW6ZHA^pRr7vFLD_d0i}*g-7|6lg|LtjKhFJA~2tu zXnfv*4P!I_7QAcUH*{N5>O?9-6q~o-Tju))N-)T{WQ7dSTmc{H=Z@*BxL@1ax!Xrti^~W%qKGXfOr0hh&3% zU>|!n(tbrUwzAO?*iH`E+_PS}cc=@h)57@dxjtL*9tPNkIHiLt39X*9arBJe6KjeV zVHpxtt~z;71vpMdJ*jh57dkYZkq+8#xS^3ScyiM&4v>03vVMPZV~>nFn11ikc%eNO zY(uAFebp>e(yj6P<~5}gLBO`Y1njT4M9G8c{)bkZDOMX;pHqYi5oN39ZilQYul&Tv zA%(`FOkA#-HfdrG&&xY8w4wR*4OVQ<)GYY=QjNQOt0q8E&+&^q&KE)_2sv4^L=E0g zxml747GmXxyf~As!v|nV=CPPD)jt>gtIG7dfyPsppZ&@OU3^ui1O|7!G}H0zpB4bg zhq6$$CIBH@&VZ4L%|sKG?03r6>CT@SSNa^~*In2GkAOMlz9p0YcU@ z>A{MGm9O0keWq-%KU)`fO^xFLP>f`8N zm*lqUfHgkFpa-Vhe}o5t-dOH3z>Dxi65GuFbKCJ>o08X=r_ZKsP)_`q`5QIS6mkvN zXa4{37d=|JE#W%eC}dDJ768=^;fi?5gB=#@<1xJoiH6Day zw#VG~WUb2jWVCkwqDG|8H*7J+wLKY{NMgbQ6+?Bm=?EiJB>&N)9(ycXjYvJF$Uh>4 zz--mBR1XJ`+N*UQQwgRh4;`TSu_>}wb}72>p-bI3=ta2RH!S5+q%$_cKm$>`I{CC? znz1{p1ZC;T^D#dsgBx@DE1m_w3b7c}-fFYxO%J!z8)#zr=%<6o zNF$*S=YL8bnWB+Q`@U80{*`08e=SQ8VP5;ntjx5|HA6wK<426tGfQ>T@WnI_Gn2r2 zkM1Y(`{dD!lm)SSsd7fgjzI%=N^0-?u_FUq4ven?jgPJRGph(=Z|op&Ra@3=RDrc@ z^LlTMAMafkbz3-+^8WUQ9XSSK?Zv(lZ@Jt$_iEeIoei+?sLQ17DM%Hc-ZHQAZx-tn zxBZjJ*S|9|4_?uWg-E=soGoFCl6G9W&lfR%!mhN**>d+4U?wWeS1Kj>w^QMVNbr_& z+Wo8dr0zKW#^Id7^QFplFLZ;{c=g-{nMDY2Fmr?pl z_rJQL$stgW<+dMDPD3xl!~bf*0Ic@||MEVU$DuWVb3m=B=-)2U)d_(I?!!870n48) zMKG1i{PC)|`|hWwj7Wor+7JEDofXWv@bEZi!N|9NpszRZs*JipV64DoRni{_?m`52Ne(|w`fv~Xg!cUT|5NOK^QV)Cr1GurGJm~L|MNBf@4A{!k2cBU!UVAC zWI#)#pM3B84R!jMm;hfZz=Peo^H(#EyR#dYJGgC+-Nh8OuSl%}vgQ-n#R2=@cbcz3 zs0qb>tGzM7EfAXPx6ijV-`RL9I;V;ZWNcJ9VO)v6)FrHruB)ucvKMx|(+rU!?nu8; z7))jt4f29z;u>9g_q!x+@aNY;$auIg^y`vRmNw(c@};HLGQh+*L3rb)r;A z$XEhCbiKwD=KM}>YvK!9-onquZGLF+O@Pki!0h`hmSJBt-h{xH(f^qC-Kl5hl#~Y5+Gzze zA_f3|%sLFe=dE!wo=b6i$9A}Jpy%USPd87kAQO=p>%Y@-T;MzUeEQVDK-Uad+Wo50 zEIO5(wh<>$3Lri&9~#_qYZQKElCN2swdZ_zf}ct~G7f%6`rxVfn-c$Elkt;u>Ia*r zPs4#+gbs(ktcQ>fQBjPJrOg+}q6%}%YN{INWK|p=J<5%{^=uT&qbW<8?#)(; zNlKbqzr@KY`0Uwyw19%b!{OAW(cIh{g@6V7V8Ju_rEB(6Q&Tn@3pM9iS$P3u_w)0- zr*#-`N&HNwL2XzlN0lM5dl#74HB%)33ofRy1vCi{YEzCiN^u+oQrm<8)}X7R6#V^l zIGVkoeZ3OXrD2l&&+*uwCQ5+wD0lDEv={jJt*Sih$6#ovah?A(86JG=a8$rHAu0nHU%A-g02P{hC_aT^dNR7>S<0ESN zZNOS^q~{^s#?Ef|#fVQaH`SyF^FDwllaYkm*wU7Rtq;Jik_tu47UX&X6f*u`AAdC^ z9y03Tb3;Z(X25Dm6PWKYp25a$@ch5V_rdWmkS z{?FZRy;X_T;zcBmS_CW{e}v2m%P)RBPRSryDd?`@7=&i7tgKv5odMksGgtzB zqRPWt7r^!rjVEBG``z{^RaF|`5-WxxI^e;HJ8A2*Cu-i_k=uccWOfHIl1+T9(kg5_ zRmiO|@uL@N(fi_2Y~mPU9;h0P@11&=N4B{k9KC? z&c=k}M{vbOk9!f(JLD%(vJBEcv0>YlN(Z&a&`#`Kpf;8&j7aVQ`<@3Z;;L{JX z;Ig*eDMFxeN|u>V0^n2mnIdB`=b9=`;b(-Wb64AT%hc_p1fo~rWBnHOzVZg<5T7*l zjI|JazP@9M<&Ug~lAT6&>A&Cv#7kmAwNere;=hy*VoA`^aY)uxg;g_U+W1-Hy6R+y_V8NP}-EJ!H zFV^_GETsb0lAgGYYfS$X`27fDgY@$VVt=Sz~>s?D}G~ zqI!qeidFRLT?@Yr=Ixbct%lU;^i{Gn58;&~&3CO!ly`TNhqU+V%vilos@%q)eewq0 znQWUswzqp%#JcT>fSC;12=l@Pkv=Y1V1{v(C%BYHLsU5=U8l?J^!xmrf_D6h2CQ4k z72A3gwPK0NsA>9SWUE>4msF<9?y-Kb{fGDP%0Z8^$Uh_j169d7HOM75QEFCDSavwW zsc{IEmtFCfJnLDlGna9`5ZdPF#WLj6jDR(E)FKm;u@esuMC{oZgdCFPgrS_d(rW=6 zV-5(PL<`79shqrHHFSSLu%{Dv`e)=t^NSgr7M`7BTB~3|#q{=Z^^K$*T8JF0KZQWW&=L|rw`Gz@U z?vjY?3gzR0sk|WOpeAYas1u{OagyMdr~iC6XQ#HvuC?>ChNR3vhfrAU7T9VeJ9Iiq zvbA$LM(=c{$c&>P?6&u!xpue#zpRzv>-L+0{kWMSK$9s`oPpo)dfs%glHn0Lc2MXl~+L^y}4Ur^Gkz@~~hCDo~ zgWu{bZ}ezH(S=az$H!8K$HmAU`I(S&>t%D}?agNtf0>3cR4E;Q4Meo1jDpF$e1Zy( z5vOh^L&(R)ZRvhf^It#s3^)TyOng3gc`VjgCKIEIR-iG7UT_eyGwe^a;9j(jao`&T zqN44pXv)$g;8nWj7Rfn9|8!lEQe!_$L{gc&79>Q4M}5%`GlHCFXH@yqubRnZ3Z`V& z4_l`>GR!ft7W8_OA!j=AZc#p=Yc*kx6N9!m{X)}r`mf90Rab#KEO46bPRz3&IkFgp zQo8Ed_n44Zq|l9;N2AYj+Ry3-|lE;Y#SZ`CjV@?Q$! z1N#)S`x>api>5hX%F^>}I&G^Q25kGfYI)ROFUA{KfT9^o=I)hnJc1{GuuJ!=_cOP9 z3RvOK2(!x3b}8j)#Ju3R6f38;Qh2W2^+j!D3RnKa%gow<;jXc!RCb^xmG6jDCt^EV5`64rhm(2LC#ML1GMKr zpLWdd{cxVz(4-U5>=_w&u)ErmhJU@=Kn|?|n~RzcOo2Qda3A}y{-R9RV&#SIq@n&| z%sW2WtqZIpcLjpb>B1I)((QicGFp}U^33d>#THbn*2Woy9$y!&`{W;f=<)ueqRymf zMUD6~iaUVma=~`rH;_)FXPCusl+M@PIcpspi*V!Cbq5TrCKe(ew0}L>S>y(3w+*H- z;kh==^N6m&*!$Lun((~CSo>@awgJ_>-&_|+ko>V*VEKJZG8d3f)^q5J&E-GN^wEiB zH11=<7B??DwtobT&(B>x@SFS)mVPY)wKeI)uU$r9LQ*88x2M;c{A9f;b;Jzb@@Oz# zI>PoL@b3RC1RwOhc!NscMM71fuS7emFv=YFxbIIoP^IVY16xEM`^y_)jGJV0yaH`B z;`zare}9#pmzhtvZ58g086m3?;F3Sz)+>_wHYhOL%C^(Y!knYH-a94YIej2<<&9w` z)OOxH&`4PHiYGHsRtaidGxwg+caXmO2Wezg{ex(8Q;+0$s&F*>A`EDTRNI)wBO9q{ zblWF>GkZSBY6HMX=G9a7mUac~YjB_sMVqJFRRF;Ro~t(vq>kQWUYj$0_xbZVv}p=Q z+=^{wypWE>E$wWtgwTPzKW3!9b>0___NB|^PtCR!H(Z*)cetkgKqYDdypLf#_9Vum47ZcSC@q+KGrM8*n;BE@E}47K zg>yI~$&H9nVjcuYzccboXHU@!fwS@jTqXK0%rU$WA8`!p9=g+|{S6C1`+d>?dEtU@ z0WVZ6a;ywTg93YiV3-p~PTULqWtA{d7}nn|%_GI4S0}90wJ)cxUAbX^(RjYM8BUPs z^#i%w(-=1}@lHicrwpz2hEQdiJ@A3+t&GH^s~B<2*tB#1gJK2V)MurXDPRw=35)4q z3N8&6PZu0wgAm0jtGukH!ysQk=DF;prmFf`g$LX(5l^{BwVd@`gjm>w5}(Tyyhq#@sVY&Non^aTgV9?v@2~Y#HLf9 z;kcbBZH$tU`CGW-LElA7!>O}9haWZiAd^s<9D2#Tmr$0H9fd(`q?Osbi|f8#FGDQ5 z&!!JioW3T4Zt0{;ViM-&>`iBJ&u`mC%pqv@R6#!PEpX57M)xBl;Q6&`}*Kbi!JPa=eHvJb@~`l>V$aI_eqF znGF^#9N;8FP18}gb+_zWLIhzBh|Y~G-?`6s2(KiSl-O+qdb?Vh*XC6YtNlp8#5qy&(yoHwfUDB6#d=KnNhuzR8=uUcJwQM$ZBD zlo`6Sd?NkM2}y7A*bqs6@a)vswWuC>_!qpymyT(Hc_Uc;!G~5JHaE**?l0qycdSk` z_qOuikWzfp2LXf^p3ovKMUw9P0P#HdJz{V>ZUfPuKn{9x5d6-JdY48;pqaaHq+rGG zwQJ#>q`M&OnDrZcm18{l#BE;_+i@_AS?zbQZg7qe0E10zJ3Y83A;D+qwBrcmoR5-H zN|QJri#CWw2PdO73v>MG?HOL}`WdI-M;Vaqq~P~})bRty)Bm)w-e`?)vZGiw(G3H}J* z#))Las{7*um}rXZmX;Pqw0`3y_qH*Kv3eF_iBYZbI=j8TYe7zP)3{rpZuU|CZu4Q3o=^na zc3^McH+nl#0YflkZu||)RN3Q$GGIohOO;xT;t*%TaoYrrWGM+b_3=RB1c{xu;89LV zB-q;&F9|4F9(?6b_v&n#twFVXmt5GlU}d!&C06`o_wyRO=S#nTLKu>Lizyz+I*fqLoKheQ5Hu1h_hHsiK z<=zk{rFd{AJf-pWG|ZxcA0=~oX>f; z&;ddX7(OtDN1IS>Cx(j+Fo@3b3~p1GS#`3a4V7v@OW|6(id= zba1;?1kZ?_W|fVZf6r+zK-6vNb2vuhU|IB3neAXS)h*YY z5IHU^zkh@Bg-JGG1D%fOrs<0m;I)Gd+`gQjwuocTZv%0HbNCNm zt7M)GTM0|2vC;*(_sQ`^dV&Z9G8rmkU4Wk1X-S=$=@jO#b2;q!MX3eo=Av({U@}+2 zi_Idi_5+(z#uNv44K+2^H0C=pJY=3Aw2uTxss?GXGMwsS_(i#3Q`GZ z2x6#^T$yqqmX<5ZsaFzwM?GrtJf@Uwld!0n6RZLCt1V7xX2k~OK4D@kcHA0x3;hJF zhawVeaUDp`Nu(-njkI4LTN!o7tew~ zDNk!08_8Wr@E%IAfmDUaz*5b9Gb8qYi;|ow15lEH{Ur(Kk)-*HuDI#Wtzx}S$)zgp z+@m-|cR+~}!?s+5yk4sQXoB1PB8<06`d-;Yk|{Hkz;F+ z3CR7Kn|H{dZO={hJR)8Pq(Ud6XV*T~mo~<-Gyg38_6(^YH1?|^G3DxZ?+a=ju|Lv+ z%iNI81+ZI-seSH&rio0p=MyAgp8cx)xT1M*sRdg#qFLA5ei{fDc_mr5@${l#2kOIt z^x~I{!0XLjn#e%rdyD*o4b`q;*KT81m&4{HroS$6^cxc+hNZK`ElZU+o!s@q#P)3# zyon7miY2!H@D$p!l?feiHwO@G~n%2Wgv_@ zV~r5)DfSI}{4`rVA@lOftuY|aw4RoFoZihx!GgKN;k9dCoh0*h8?hhrfTUqGupxeJ zrV~+|Vid4YNE+SvQkXWd%H+3DXqT?^RV#Cb9^WX+W-KOk`LMkW7fX2s z<$-rmyDvpAxV#B)3Y7}{_0u4Ykn$MZ$`z7!#{{o{NL*C!Rs1rslpus39S~pZVw3}; zGnY3x-D+E`MJyJ}@Ev22Z0J=jnZjU~>!P+@=ehc2b^D~XknCw=5`dY9Z_pj>d`&LU zD|ffll40l+fodMYLQQ*yZQPry@)uoD3A+Q>)fG3;mcy2NTT)zHxe&e@J-OX;uMkLQ zqw(ER0NFd&EmA{i$4Mj$38s{|o2;wc6fzNq7eDMoB?@`L{SIKGQPR5YOJLzJO;z}B zAn7B=j%#1dIb!bBh_WW{zE3uDmLiG0cMxT!qxCo8*DdS-%mmymYg&LlQ+NpS(sT25 zr%H-9v!C&S3mZ*#zV(r`)$Z$hm>%>T$fL-AqO0p3U;&kIVHBqp9o~*sJkY|Zx%p;* z5W`5w{%WgfU!9!j?bL45oRs#u)-E#+L+|}AO=23!dDzbusl)+HWzrRXu#!bl#ydtx z9^}C~F@1s_f!uSNwaipV47ZiSRRLh539~WZjkheX8N|D+o3#`*y4}kqMYn&jLMUsv z7Zn>#=E%EDe!EvhFS!&v$1wG{boQXsV}TSCdjrBuOH``$h*@KoDX10b*WcsTh@;yu zj_OeaD3hWvFPrBj%;VC&fG8&x>mXoW#(T8(IlsM)MBxX1xlZa&R+!nZ6qTZ7og!FV zb~}YpGQ}y+@HvlL9zF+0-W5MvtdxcaVhr413-G}#())8?x>oQ?HX{|ZpDap*96wQb zI!j>*>7R?;O~ZFAgk+rS_V3+UGs-P`U^U~y76Bj`mWVsAQ@vwj0t<5;%= zusiiWCVf|T`7`NHnE9agA6WiijUM@$Lq^k`k-L2ewC?Uwbp7_X@An^keYgx>lvvl5 z@s%4e8*pBDY%O0*A8ZFIfcgo>ACJ+TB^a zgK9)8jwjmCP%4>m8;g=#BuqSY{J@Y8B8qKa5H^8TkB~cCG&B=##|ui60DYj_7=`g+ ztE2X28G^?h4q8kRRjhE=nkalrK@uG_Fa8!9IC+{rU!LtnWXY)i&Xu_N<_$+hr7(h1 z)kQ>#^Kg+T&LO|vEDVp9Z_<@WDnS7m^fHtW3oFeB$H@WV$b-8dMBSh9jkXjjs9D(k%g@Z!rdxaw4F`h!vi zpV=g7Pfl*`=92UKLv(nhQ-H{{K zJqrOpf$a{j*{6Zzz35RZB|Wr62AwNXwWUF17+cC-y|c>3RU~t_EO#9Ig31Fjb*Tfe z5cOf(oirGT1<}eBJ!)iJ>quf>xCAu$9Z9OaB74S3oBdokD0VvYou&Y64ZQ17@v+?B1Ga z3Yt`K8kOT^g3tc$bCUES6G`skEQvx(6P@Q>Lgg@&`Ek4uoaOUfGqfn#Q4RYduxpLT zLrH6DgbjIa&m`s=bfHrGWE}@%(f9qAINd&i0vq}oAtr@}l?}jO#R6FXnJC<>{i-ciKE(_Nxct31FO4IwqwVQzPsd~*gzIV&uLer zU<;3a(4N6Q1roK zg!su49%eQLO4muEu2CHiQZhY%sF6oTu^{kR1j7qA6vT4Emi6kQ^_%kfZ(7|7gA*AE zmF37ehGZF7RXt<*Bo+$dVfbcQmm%isrSODUF_38~GUr)&O+D`aQ2=S8=b&kKid6{#Ss( zS0W$XR%h01sYy+oEcwcXYWXx~;2A2`$s9}U2;+e)qyYxP)W?crlLRusbx|e~YMW!6 z4?wiW>!R*W8lFRXNEcC1Ve-!&IocaU+0mC|_kQ0n7V47F0x%N#^=6q^FAlq)qt(`> zgSLM0qg%m|!(^mgQfjFa)q#OLa6o;_bR{4k>VR8k&&h1c=~1C0Ni0gZ2WggsQILtO z#5}Fv_K0uzCpaVE6J}tTnMdVIh0wNw$f==c&pt0p^YTJ`5UX#v3DdvAmc3@ZYw-UF zHM``uw*36rUR>UIHPIX=SRlyd=v~dIE#WkF!#Q_3C8*KUq5 z$AmnWX7wh|-X@brw4MU%nLyWuRb#*HJb(g_prc{D7HE{O_lJ%cSOS}#jgfxab)S+y z!CY*~Z(XbsQ!1qv=J~ru3mPL$5#?H$ooP)C3QfVJL;l1YJKvS^xis) zZ>*nP$oL5YAaXpuwoT;ez*s;g8ec08QC!nStIm`1&-E z#}Lz4yUcZ3YVZDaIgD3smZfh4ErfyKd<<=H+$WX+9q=Pj zI(aHNd9Lx)#SU6Gd-0cJZ*LPbz%Wi-`DW{?6Z=B*UO_A05P1Mec|6@<{3x^BV)U`Q zwOJ+w%Xv1%vujm#t}d4h*S7%IwWKAYiaN~Kdty0@T$ja=!OV`d$lwdydk1jg@)>`? z9xvRoo$Zi~%XEV@e_gK=Db^QA&lDD&!yO*b;^N)(_pJV5xKBEojVm>-Q7)^4p$4WC zQfckt7}H;aIyyS(*P>!$V$#%&n3LX`csF(dy=`jNbH>7FUvTH39sT|NT^sp3W(f2- zETTsoEg)X&+01NkBE1nDt(MlM!o1%o!Z&s2F*%sy-hiJ-jc&32Piw`5wPlv#z=@`# zv7g}tYdOBBfOYI6y7b_qO%*a7zm#`~37;x3$vlQC?;}M1!wVopmHl{dm8YT%Ip2Tz zPzf?r=Bt}=g5^d;h6(9drcwduyXX9sa^K6pl0^f(iHc(`vl3&qFTTWy0GYH*Pxrtl z^XD3%tE-I93!neYvUHhP^+$1Pgu>aFJC56a#&0@~7aQ>Ko9G5ft+Ysu_m07$%p6U+ zfrwGBe5`I4dxl(ZGpxHq1VEz2^@aBow1s7<-nE##9=&oUvXN-5sLZ}{?0lKh2d8ZS zB~4biv?qJVs9!SCqrj<;vOH2b;4w^DK&155DRGsLJK$k1qRD##z#J=rzBj=$KTlLSrEVDEj&}fay@9(D zWHx)h7(2o;Y@dXhh_#)&Jh#F^z~(%5hn1n<6(1E6%CBZbJ9o~Fa^#j+pv;vK&A2k7 zh8iafQ?ZM=ME^uAi&sEyOgycx$q`tw{pcP3i8c_Vepco+$3pr^><2rmI!~L&iYg{z zO)1YliPx4ZiHtD$IEBp(IeVrzOH`;Qtz_e8t6B0HmN!i>#N2P_FWX1oTAX-MX5ESi zDrwm~zftGtE(R5G!IisOZstVzTXQ501%BT)AD}Em-&*&&^B6U-9*dbVL{Zmv>ZKKb z%Y%*q&NbWFvk#tpGmm0bidR z)6jGseFC_aJ5~vT+TsKh+eZB;gl0|IQlv@#dE*D7IsmzO?U39ATA>+<1RHa^3hMfa+&kqyX>>AoIbdy%HLIF<HQK$EtT6L9^ zKAcPBCg)CjemKFWkTkgkX4m@7I%mK~_ar^!0V<1sK_irCQ zsGjHHA$O^m6zPujkWx<2r~Oucn)Qj%8JjXO`mB4whO&fiOY0W(*92~vv_MvJgI{uY zYAiK@6XLWf%f3=~ty}uHuUUA^gGbNmjh25qNBnQ8aho8}migW6@%x+1HtPuxA}91b zIyLog9#_E)=dVho8m#?2G%Wlu@a_6WZJp6?uJ`}VUvnDRJIij4o|<@QBKW)~?C+QL z&Z*kUmX|-PMs$W*dVo;7wzhROKm^x`OZOD}-3jv_TL%|Zk8(OiM&6K0oj-k+lWTrS zOI13_LDu*0_FCEW&L#KxZp&|8F4Ayy?xZF|@85s+QR!4Nv~E?wo#ih#?o|5gDDjq- zudUpa1qKSl9k%r%YwyJKn?g~3c9ez3f0f!_cyu)CKCsXl5hXu61OYCYv##!2dwLU< zps^bM`{ij;fAzDv@ZjJ6hssB*_8%g<@GJIX8S-6W24(7ueQDV0!H}2=>VqVezQ1lL zg;zcJK4#5-m`mqrqc$!5IQZXk>E3zX353z5NG_J~*3|gX&Rxhtp^gls=J5~L! zPk7LH?un|Z=s+G{dv?hDi{5^ZpLy!@BLN_r= z3C8W7T}A&lLg}(jp3KeTii?X2iE(~Ybs|P*+S1rx8)o=uXRhI=6$Qwo3;y>^I)nzt z+Wwxv;|ZThw!a-F6ZZ7sm!c)Utgt1vwe5;`It4SKjkoC9IrcQ;ttqPFNAV$i;@GeJ zc!@iI`>(QAPR)52$ke;WG5%zX-`*iwno8(^@AZH2$$fchC*9FK;zX3|2>Ax_;@P8h`-<`g|qx#>;F#MlK z@b_ixzZawVuYUy3#-AomTsW?7=@n4bplBDNd+VZ5BE0bWO{@36E>)G;hs`Z7P84@;vSP4keUghzf2m{n=-uU2H=(MSyu zhh>TUkWg{8_BORe9Yh*?a5tgC~c-BeUNOwqiBfXLapowT7nFIos*6>*vzMmDup$VNUW; zQMiS>zGy5BR4zEhcffn!R%+@6A-a>nq5hA)zref^e4Q(8W;Kj$E=bvD9^~(1XIELm ze=AIZ(c~|M`qs;1$7Q6zbD!GsDX^zciwcwakw!NKOs+rIch!i=OeDn+J_z&|_zTPr z7QBfQG0K8D<6`filJ+RWd?Om3D_LzcFPPM#P_&>>R8hP))!}F4rrichCK z&nrwOt`F|mDRD*zvxA0cnNCt23m#0^? zFiCS|#@!z3Y>^@TQ^VYl@1ChMAsuZ?0H5(6O`aWdOa@oq93^gJzCJSAa@zst1TT!` z>oTX1Um3hCQa5jC_7%!cvJ3bp{`|7cAG3^rc}X|x!3jI+O`f;|ntcuJhWMwgrq*J> zU1V=rqIB0{^@-o|PN=4(E=K&*_L7}b^@70?ECO9}_snL&;gr}>`~15fl(I= zuCjPR9$qrD<83{83Jj-A(a?5l8p(@!SvHUmZ5=XL^6Yt;A|iBLeB`ywgnYc{x8Vaw z#q)la6IlkS56YR*`;~VeE~iwOZt~Ih)a_XRxLsH8<-#7IDMTFPP=~BF>urjR&Je@G ze9CN>(DkD7QnV4f;_e1$yJo7UOELX%JH=GE#(s~K(*xNG-J%PEtPEoD9UgtlWli8y zROvddD>gPcb&cmTzyR#`*0djYsaGL|D2-u)?0qLX5d;e?>fX}0u~7@F3kHizMGXoC zA58N9^76dCxRMu(6FUCNk4h7K0|a!*p4iN9cX8Vl;!f85nHj#>4TW zVF~-L3fncaAjGN8wkTA-KXWOmh9>E(9+%I*b1cvoT#zSuZ;?L7^W~6& z*md~(c>xqq{g@T>`N219n&T%)T_Db+U^__SA=o2IC;(Wy&GQG#4T zWCHHd%P;+{b_zHm7W&u*Ujt36?oGVr1X9mH5%lw{3vW3X@k zK?}oa218zr*KXQ9{%akt`OwcXH8)aTd@T2OsMLWUm>%FPTw%qo#TM}D(ZJPJPmM(5 z^Dd!=!>>K0e%f{o7nnc4EA=HM&Bt>Gvey&aUAVWttgB<*m{-ZvP*662B7t{%IMW=R zb>DiqL1gpo`f+=E;44JupaLLfMxc4-WvoX48Q(d&=g)H~)68rcl@na;xr8r4#VLMkYEzmZ8c<21WNv^7 zd&E?At3Uf!966Rve`>v=C0H`|=x|{)EH);Lm^if5zc0M~=543MvKLF=wjDyOY@!QQ zKLL;`lJ(stvnALmdUF!&5-oFy#Q_}72!l!A)hq)m$lpTPfvURp_`k6qGbCOm)J?sX zSLYZO=4Ewtydz^*m=Iy2_c=ogt!5$p9mR1Z@ZjTYPV>CK8ayH1I-YT4A1b7JSNxl` z?4So?s`JV2zHaggAxP7UYfVZ)KtrspfNB6WjclMnb`)H)f)`r8X1aIed%?HG!R@a` zq;0`9C3oP-T{Fq2`$g5nWeuUaNJ;}Pq#2?KgGi~#8z{#9au)U9xZ=j-?6{1P>{+T* z=;@3ke<_|!@6_(8k=+FL9LmcRcoKH(`Zrxuxko_0YiIs4S#cj_{eD|64+0H$wbUm+ z4NDYyCen}m79|Tgsspm(i&yLl_yU_-sbwyX_dJ%)u{5Zae(GlKKaVX|++d8ejz%lx z!m-aW!uPRp68DN1IVuLF&6@>~vcpWkc94f;rjb%cV?%I&^RZ9BkCU@g2s@O?^guH= z)fFC3tQ+xJ$sNN*N^gl3XHt!soQEo%iBE#LBKhM|pymg@%VQYpyI|rbq-?z1)AK<#-IN0B2(28U4ZhOJ3c*lF|HyJnwKgRy- z90>X9aN-QM`-Kp(Z1Xs;xYb%(SWwS;tq}Nm+8zbNzf~i<_-K5k-B%?nbjEse_7NiG zSJlId2a!f@O6kPSZgx(au@rhEx2iX!vw;2-t7lNJk+JBa&wsaIv3BGn|K*IhBn4{< z&ul#qU0-2M_3FeBm#%6;Y!Y`G!S>Bp z;1<@;JXOZ)f&4t9Rz&Q0-?+8UTfIqEq<%l=WivUbQH8c%n6byMcW6}}#u~N?n#oJyA7R2tQH9(voExTM*gI$W8h95Wl92JrH?PKMf8si8JSeflp z{EN7n?!3|vy1x4Kza8WM_O+J+b2rqF4A~Nf#glXP&}E6NHFk(rF)^G;>h1mI5i zH`q=pr`CnLgf7RSd^@i9tPHiLZifjboMQQo_kuq9-!SL@XZHn6!hGZh#r`&<6VCm? zV)MA%m)cIz)KND_9zA6T57Mir69YpilJ$0^ym zj$neYb4YcRe=ae@r&YbDp+1mVsieA$d>XdU+vtWKord*q2ZS|H;E1w#32sFc7q;QN zU6sFJQpu1Cm|NJUb30UT-)GEs+qY6!8&c9UVD6d;({t8KC>i1Pbv5fYUG6K1K}7$( zbcB1)E`8A34Jp8UG`|(Ek>#~@+-K&FsJeSeVSsKGX(!hhBmAitZ;`nk9dO?+!rQ?})m0G=gF9&NrRWs56GbJ}CL49_ z#*>6G?X&^Or=;6AtqU2~aMz-J?4k#XRk7zkKZHzAhhC0-NLyo$$|XZj69(kg#!fl- zSU45x^UWq@=95ZPyQMw=jR}~wpU4Kon~2>JzS;e$^}=6(F%i~V{pa#vt%;vw@&Z;J zm~$LMm#Qx!xS&s1ZMcGTtP1BDL(8`9$^)b!v3JbsTGJ_doa1;zaGW3zvjVt?=7RE5 zu94E!)mR(khWi_Q9SZfJao}3pUxDib41Jb`fYaRTq-TB7hN+Twh;WnW?HAd?&4X_F zc8`g=kf0}`cFTGQKWdq^-JG49B}^$Ie68)>hV%c!-g`zh)o$&=3W5a@9}7rF5fEuA zy@N`TUIa`+lMW&DA~gaEHagOqR0R@B2%#5Iq$4eX(4`3hLN5vBTkiAj{eAo0ukxKS z&KT#fAXk^1dHpc!jor z8W`;S!>SVzo@><69#k`f6!e@y2Wh5qz|z3Esm~XEmJ3={ywP#}+N*R?)U2s()Loqc zC^JrbTv4zYUtPU2ZF_4agozBJt0gj!(r@M`ohZOKj>ONHbd{JE`WL+uKZ(DrX)ayz zbF{dwyFf6zSmLe=P8V_7l&H(<$h0G$U7f1aBTgiShQ9^^PwM=XA{p)F%pKlC_l`x` zk$3jfq9JGd|4)9*XW{7b`5Ue~l#V`>w#>fqn#ud~z)Fgr+niZ1U;j-1vLk=j*T7 zra$$IWF2`NpD*NWZUp)>0>BaV;kh%*`1zD8;jGC@g-uV?_PUd z1}FM_omtOVrSF{0hsaKLNHd`F(IgE|(_ykaWZHWTmpD~;9JSF4P9XWolAGU36)#iyV512Ln=^2411#?jDT zdCK~`YRiAw<<^rYCvrYYewQ>kM!bIQPY%$%Iji|Un(}{r;jgQI1B}0yqsNLos_N1= zfyC8KNiG9DeY$o4MLS0la6LH2W97J*r||IM-PaLs;t~^8dD)l+qNBflmbtf+a#h+& zZ6!mDU^@!uFz_NiYWG#yJVu;PP`p&jG#&XmiR8~dgfa572(fLYHGe zIXQETlYVIFRM^!Tj{e!^0Gr41h=Xf3b16bQro22vtN+}ry4t%(+nsc|ji+oqorYo3 z+fp`M>R(hBDzEVxzT+R>U%li?d&~yT@SIE=7Jcemc9WY+I>DgI!ni*1t=J9u>((9u zZ{}$`<9S)t&BZwRD~`!Y>U^ORY16lSlf3y!$uj)3X6M~vbs%NBqOReZ>T%0bDd)HF z{J$=!T>9P%5XODvT65`KQ~fqGa|j@tV>QI*mYMFIdVf|8zo1GNfGV!SabfdXcDQ7y zyRjC!4ak}g3~avkwY12(DV3oykfKi)5_k-7slee!Wnpn+Od>m6)`rOVnJ54-&RyQg zr?Y2aeNPk;_4foHrxX;BXTPv$QE1{blA-hGJ+u7T*G8Q~P*z=`zJZR%&8-UJJTvr{ zZ|pV?`v>dpm2O}Oz)S*33bEug6wBrxr&Rvh$d{UpEljYbyTvO)z+($&0A~YYeGGsN zNY)F1C^L(2DsBnp3Vzz-Ht0l<|1H3HvCCZ%{4;?+p!CjV0C}#@I~rA-$2f}@Tf=~q z-Nw{|shH#5bmr=>(iH!mIO$_3^!|R(f9xplQo=w*fJ!gjpV7h-L0LByTqg0Y{--ef??0w3(0Q%Bt5fYk znDqzR4AKvHGF6Uya0#2BkCt*VlpAS{<8^-4IOJHjXKqg3Tn%A5_&=ZN-#m(2?SNOr z7Dxi>_oD#1ngxHklwE^*Kc3CxrL6_@v5G9y9AFgl+x6jEo)BUdb8^FOFTL*Z*48a< zGtDsNJLVk%CocX(5{io8nZu0N|bCO@LaE>+{JqJz97pW*I zsXIEptLcF}($Kg!T*PesEy6@EPs9EbD7zXU=4u(a*-wfWfB^jcDlf|s|h3Yi+;;N)CJathM1NN{`#o6in^{W|*R&q?=CKeMn4tTA7{ zcwjz$yfu9#WomCL)z|5`KwHTmv-PyC8Jn=y_|c?g!~D^)9Tdk_B~13?6SH%q_Ga|2fDYaj_RMf z0nM~y%i^2Nw+amrt~j*Y{CB^xt?MDq(e*}KUO3@Gfbk#fRP9sZH*TvO9wn?LKPWq6 zM}(5MS^ExxJ5r~$r4~*lt#&`b6gRdf8jVMJPmu4p2osKZ1y>k@Zpasv+Q8W~do@P< zRswDUz!`aOVgA!SyVW~qMV*%cam}633`w)3q(u2H1;2bdQ#OukeV2st9OSkCWM9GL z#<;RoY&^@Jc+e0XNusieoUOlYguDs#1-Kxgd+YDZ0uMr?aL-mJ75C;wc)RNXPO2A< z&C17!|G654=$_QN#exo?2UTkwXVx*ZpqrgGA23BV-|>~f?B{^`x35*i=hXLA4kzsP z+*f35Q*7Qkj3|d|#h{@_(Zu?rM}bEN+QI{C+*Q!skoCT|+54fl(|7l7_HyLK1FLFn z1O`OKx0RTnywWsM#QMAVS!GGql86V=yoN=I?^yQaAF1JmF7pI(nFSmm+?Pz6of3cv zol;v4289wGork@hBZu6#94SBd$Zh1L27>)|qKZb1BH6~QR%)rV%=+_s&Ln*$EVFr{AtR+zY?eei7l0pjUggzWGsW6F*hUio%hY#(LL)*>5E zaqWKUm#^>Ll11%DRjWN^jhq@bOnDRvK_zB^Tj9oD_S%>fUj2IS#bjC1s4(Z~o@t6W z^aiPS55g08_F#TyAbpue=VsD12>BUX_w>;-HKb*oUKKmt(Q z0p~BmEovJxzpcH@#-emiz8!;t$Gnma5Zie@QNG=VBQcUm#W<$BxG*>G>>cRElwIkCt8@C=>gut>?uRbm1R*mmfUl5oz4e~8TFo#LAjI$*dHC?5D%mSvf*|#U*r@mb z;EIsUa<7|v2(k?Y)z4x_(i)3w7VGy~uGtS~fxdq#^EJbNpzU@DSS&a5oQltd3wei$ z)c?#{>DK95(K-(KzHtC@CwqD=}=lkajM> z{9E6RIfiLCjTO8c_-HCHBU5hWRY~&Jzjc~STr%$+9gis8hRajJqD%cyH%?o zck~0A|8@#!IweN1^Pn9DR|)rORtljwt#v?wO9ephR1yv9tQUauIyjmi&n8-F<{w~2hb8Zb>`CYa46EwWo$8b;D!1oR3|;vSK7G}BW> zGm{!&%c73!zWeKRG2WJxlmyl9ZA;s(4F95;!%X-ZsKwn{*-kOp@$|2&{?&2+%BCCt zAsoJT-rj#3lwUQUbG&r_BG1td=t1m3|r*S){IAVivzPc#j8gW1RyI|N>E^B>% zY=lLURoMLYd3&cqftKcg;Xn_c-j`!(2DIM+!ty58zTJJNwA{y^^v3fBj`6u}xdF}@ zo&5TxuK~k3DBB~pb)}!!Wf^bs_YXTSQ<=SH3kLg^_utNDnFd%jK9?TdPCn~rI{!Ac zht+$WFX$u~_LKG;l)eBH#}E2!k_IK6!(0*H*&1m5_J!?eTDzh3g}3~=v<%8kMSw7-fDjRhuYVtjR1O^L@-WN9<8g6rOx5Jsm+QG3t%umZ)EiEjqnnN|$fARPg7S~O& zktYwDm4qE&!`8?JfLzqgFkv74*lTHs%NK^va~!_cy)A#3%0ojh=(QL?GQRC42Qm?} zcPkUFEnV3^h^*=>x4-OtI9xQE;9k~z^wXsc7*rbVd9=@Ww2vAeE_k3YA?o<*;ltg) z)2pOP@6><;vWfSuD*Z8T!%UHa(^ppEnzt4^z+}}Mo7Z)-Fl$UDRYb)g!3moi%VG+i|axiaz%#JbTg;X_W_NhL94z&S(~^l)+YOYu8K0V7japYNsB zW^cRMq3St2`h!k{e)6RS?3RqJ=-s=ILII-Hv01B0HbOvETA~_xJAc>2ETKECw&wT5 zm;Y-mI#yJz0F~QM(WEC~0)l`ebJ=c_TDGpsb9@M3=6!V`q^PMMFcoS=jCm5HS>J#* zD}8`z?$%X4!!tW~Z0o_a$VJb^sIR_h!=N%ZvtPQw$8*cqV|?^1@f~fo$UWN-)uBIw zSW(Rsd)M8?Zif*|6}*a@y6;&>$h<3~h5>%<5C4c+Wzk!O8QB89rqUTpy==@{|tCd2^KLSdY)D4i}MBJhP30PLgy6KjW?6B?j4f1bc$D8*GW*J z_Jw?OPZR39=rMMcN*l1N!8@JnV^`((zsts?#@v|gcpnR}F#CH47$0Yq_kPtV2R=JT zwa;{zQCIUkHd}^W;_%BD@COX=e(?Q<5_ojXp7-T?ez{J$z!e<*8-3&8%dakq-}o~7 zW2H@LSH5Sou7=pXoW8O=HXBIfNk~g$J?NH3p*CuP8PCfy%T2rN4PE`48oz7W`mgiS z7{sA~YB~K`*NXj^NK_$n2mq%Aw!>c09+PxF5kv_rZz;&-%JAu9VuOpfwtvO+2iGkq zkFhTblL|oDv>ykH()P(eI~ylYy{Q9$A`AGdA%)|9UgF{}j`K4r(EnpIe}Ird#~e5DY?KB;g_x>79Z<@r@k z0-)-yGJm_XG{#UfTYDUA2;>*8Pg;b}b}+!6mD}OcX+El5?KrK!JdBcO&=)>?%*i;z zagh)B^i@8qFKm|bnqxIT*i#X4C(FHs00h;V2K(Z-(EUFyGzM`3pMEcF8L5P}{q^M6 zQ4VX!F+ZybIZ~QH!Mo4C$4JVp*A(=YVqDx8q~+Xg;-ml0mL5A=%9(41e#V3Bsa^$R#BK;a3{Ib=;RIa6~8!OH5xo zcEZpZjwmZYBRrzEc0F$Ao-4=zcdk9Y7WU^u0$jZb0!&DZB8cVq<^G-6o|Uqw`KsoK9DG zeZCtxUaM}(j?!r92JxvIImOEQZ9l?nd*&LQf4Y|NPcDEIsXnu#P%nF(qKJW(Wxttr zTb|aXJ!XpvLJ5-Ax_e!~ZK^ptWG$dtEb7Qu_>K+J_>9RUF{Asv{aZ1cq*BMEdws}9 zo(uie5t|MMkYpSp#yXi2_VC8rbF&?4+4%RlpO{z%5z!t_;Aw>s&+YsdG_~T_HR zymwg~$wRVyq5}Ov1H?THy2OwgU_WzX?;AuI^+Y=fZMa07Ahq2MN$Ci%-HKDY`bMR& z3m)KX6W{1apclWc*%Kf?S3?2qm@Jnl;Ot+@VROXiAl!&Z9*pAZz^M6>>L*b`-}2gO%LUf6u=f$gC%_eL zcKpm~bm5Fc01THGE|4~WNz!;yqDT+D_~VVG^us($4oM1HrpND@4ERpbjFdu)i@84G9rJK0nS0~x712Aj()#0jzPhV>o#mRRY&rGL|JGW@-3+>PIrTs><<2%G>huom zMgr@gp)a~fU{<88;)o$yJ0BV6XO?k&1e4$K!x}R4l1SeUr z;QqF0cg0b=>o()&;O+OZD&5N_IU~`w5b-4&cD z(SJA()5R39Vh?Y*;gfXI2$Vyg6x&1t1L%0#h4Iv5w;c%jg!|J}parWxsj|SCdb4{8T-R$N`icg;}Reak=+-W+8NW<6p2r!P8rav}_?a42`B#b&> z%9{S%7O}BQMVPe}#RR^o5i8_9*pk3~ir3x1WylqOYtO*ZLQr_D$Wl|XF~};SJ$<*tzxo^niv_^SCK|4+@^%0_pax6B}AXK_6W0BG!q} zdG$`)eY>MuW-0!3iaH5p@z!yuLPhH5UjKugZ%95vX=&ZEeRJFgE`ryodG~&)_aT99&J2?ui{nbMN)qgdfy<`kj8qtJWOE7gXER%mIN(YS$Xlcj z0e9&ZuBBl5J&q8MEE|sIh&G7mEl7U|_jKfP62|5wPmd`NWw}c`4c=G5wC|{HBer&D z*+P<#Sm8!^op!c+jw;grx6bmLG=Ahzk-H2)(HI^t4o>E zft&6Nwt)yFy1F&w9o}3YdgZgeufnK_Xz|ZIpyVuPRVO!(4zjqd%JnOt5_sW?lKq%P7*XaSj3 zO-(NCpm6OlAmooeOT(AcfmsP=$Mwnjb!~*5bh^Z2ewbOzPPzugT1! zC0h%F@${*B24ZXov8*tEvweCMlPHN7w z&u>Mq&suQScpv(y-Km>xwq$3aAHU)guz88`t}p1$VYvK-@GD|I_A?fHffmY9HS-yf zQE%A}beDW*@+%MyZ4H784E7a6$h1g%n2~(l-t2uJVfQbk+NnR`anq|8>bSk^*$`jT zr_W0@)e(E%oU$QGf(;*d5{pg>3B{2`;;68C#_AmeKa^3 zc>qEv$=8Xv>3(i3(%jiSvT0+sOdz4YoR`l$V5>e6dlV#^>p$IpIhZL@tlrUUaCUP8 zY`{lCePgX)iW8TYzN>DI<*tD37E))P;|q}C7T~@^D7MA-b-C41XYXgmY#k6{w(gQz zdDcQEoS2Tb(p)=c1Zfq>K_Ivf{gTX4Zz&jcCp*IwKE8h;VaLI2WthPPNp-cS>L@I+ zv8X}7E44VlKeZFg#{7J&0-9l*HQgKp8j<6B;xec|ec5Tzh8AqHIy96xncmRNE~@G^ zEIj?yA-hF=n6>a(|2JkF2xSm`#=e_kC-)QD zd77iE@*kZpclR|Owe1A*U?&PPxS`=o%o!}~?icnlB2!E5JNX49KM5bT$}ilMx_Y4# zFGcUrH8)XrPqeK2+=s@J23C3&!6mC85Dhg%@h=M0OGMZDZ*__um(C4`Zse-NGmtPw zGS_#I@6Ex>ew;ia8eV%9an=T{7P*q%D>DDeo{#e&YJ6v6L21fA650!I7Rut=69 z?H|r`_mwDHGfF$Bjpm5n5YVxQ({Gl7eXv)SJrE!p&1p6_!YlK;vQmSwM#YhcyNssw ze$I+{>Y_iVDKbynU(UmwCvwPo9x*svB*Z6he>-(?%)iYS&5=XZedwYrUYZw;;2k7Y zH(*&--!r}NScpeepGKcWNd8P>Dydy~`A9KpO+KT$KhFd@^Q7N3EP3pxMcc{MZR#v5 zfSW*Gi&jbdeKo9_+I!u!&fjRSiE1e8?EV=_ls|kSgYYf##a^>wfx+vbo7v(Ln+Ir9>zaA?SHeu@n<1-@LK6d@g^Df5j zZ*ehIdWtqj%ID-77osB&uL+)bo+b8j`JuIbqmIY0OWVc7t{6XbC{%(=%5ZAI&38g` z1N*a$FQhHr`5nR_slRrrr>kYXVQ{~~yn;)*LY#f#u1#NTSb0=}T(_Mm-oe4t)1#(! zo<5N!dI83%eQxl1q{dI$+SReFSGltjDuOG_GZSeG^wscNcMH1w|DS}6Y6ye~> zg#^p~nO@()nU-m(%13~2zqh&AU)|~)R({T54m|ZLOt?pphFiP0v2<{+Tg!ead7p zFF<}yyiWYOz&(Pdtyiotb;X(BkMyeOKvhJQeuCV08?R|DsKrjSyPtYL-XOTK#z#?wMMo17Pi$zk-DhZ$S8IoSR>MONc^YYpuw8|o7_fr(gO2YA(&8boI=JZ& z&zVmAGvUg`#BH%_HyhZsXiBQNEti|Wq0dfp)`*^`ct#5~j1TKx;G$2AOyK`6=RMUj z$qBU})ua5VgFwtr1N!A$T^m%F`y%VjVoJ6hYb~!j2MmX!ESLHmXqEGC>~)=j(@V|g zK{xtVSV|i60V3=^Pza>;fzf6HDhwTKTg-ax6ytJgDR;7vY!+-LwG^CXIN6x%{Y|Bq z7PIZ=0vxxJa`n%4qcp5H6vksq3Suvn(R8@|;`gkO>P2W%6vwr&l6Ax>D z{_7Vhj3bXp@ZT5(D)3QrhW9gQOeN*v*dlp*1xxZ@1X1LHAG1(K2GNO4VI9M+O zH~kAH_bhjNAsM&XNOsTB3P0E6C|wSk`O38EC29=I*&35>EtDL|Qxq+gmj}^mLF2Iw zE7j#UP;^#)MDcIZ%?%iDfJZfxPoO_bN3^;(&L;zW%hbf^!|^*10c_{<_7 zf%OmK=Av^5g`k7IHir^zGp4SZ?W8TuksL4OMw|&Vkj%QtvlYIajn6yiNRpiioxbOA zfGvuN&d3vLJ5w++Z{)CyUG;3*UhW`A#LHe+FHBnO>*De93W>%Af}dn&Q19^AU&ICX z8;0O1w%XL1(aO&x((Ys??dwDLz~K7pqCtDBVncqoxKb*cqkY248uy>TCN6O1!&A1* zR@6Egz7f=f&rP33Sx(X*tH96F%HtDTPN8nnAS)H3Ma>*fveE>T+Nj+3U14?ReAqL~yjAu*M4vcmQB#J$f)w^mBFE<+G{Rh1cgoJMw& zTe7gvUVXvg_p~YdSDx(k&)7z6Y`B4oBI@`fmXcbT0VDxj%UDRN@ z>#{rSJ9llfqG8H62Xu92DJ0Y^w#L2R?lNx0-4C6NnVMnPx5M43;CP-=q5d{m(FHrM zjgzqxEscH8-?@cBF+vxaefaap z)2H9?U!*T?vC&GY_qQw;d-4DVj3zJZDZ=J+6@CJt)EspX8mXC1S=Lvr_Q8m|^Ll9# z2lIGa1HQcNRZwTkR`_CtKt2vuvpsVyHNbL7uQV`l`WH#Cay*5LA~j|s@v)DOq*mHCZT zL!G_Y8GfQ(g86{!ib^}6GBfRghT?T6Xd?1qtq`_0 zd**gk$Mhb1(qn(80}@z%aG1&l0V3t2i4Z6@@%I3u!lSFIFb|;&wGin6I)}%@OR;mX zGs(4@R|ZP#54ZMYe3l7HVz+P^eUd-5D;{LqMS1oXAewB~4k1ec*b2pRF;J~Njk~cp zY|(pvbFk^Qp?yZpGP-Kg1zdV}-X?J8*?~j#-Ujm|s?h_A=(X+Y0cR4vri4{0ar+~T zWXVj4SdC)#MD(0-*p?H&ESfr7l&0nh*-DmNPrNKBpHG+G;1uPdrUMm~DW>X1?&2y{ zPxO!&bq{mlmHnf!2L9jLS+w9j>=S0yi>ImIiqPr<9Up1RtIA~D;?%pW3A2R?(T)wg| z9R22oSM0jcEJ?dRAuX>&fui4+aaDDfEZ3*BFPzs#Ng2$%ndfeg94~|U99E%k3v;CQ z`z~#C`wCWCV!)Bb6SmG-d&?|t=nV{12OhTl6nan}+JC8QM{sYiBV2v6+WK4iL-wnL zwSy5X&B zaY$Da1g`~6CwQ{CPj^f>nG#`Il_~<&ll|#D;LrkoUZy-dG=>3tBhQXpz;C*~Tvsw` zF0y@#k3K*#S%!HOu=^0H<$A%PYccFgdx6{F(t3>pk*7_*N3irzvR!6hFv^Rc35pm9 z6-9}SBqva5J-N92Z7V8JbEfSr`DHo3)iqq*hKTHY z_6f29j_zeYO5_%In8=y>OqrqaTCA5j>B(tQc>$-hRYXanNskV^?6CZ$sH5USm>fy6 zY!}J8xL6v_hWp&9?Ub8O=fDO`Lpqpek~y&Q2d_p`Jqh#ZOx_vupTeCL7N!^zJIrN1 ztv;{QKM^=ZBVKHB8o(0iQ^~^RW|Lh^ljm_SOe$?^-lb%?j-MZpdo$wT{-q9#jmHTy ztcQpN$!40EU|L%VWZ#ID0r#(@cDY=*a#R&YYu;fV!ruKrs)hRV@-vM!Qtisz?Cab3 z&gwM3cx~I_A*TL@(uz6$%XJ5ljt|dXD{0)LdH_jyE?|B6x53cGTZsz8!CmReRfvV* z4(-J&prkGJ-M&^OMOu8TDr*UoH-qe&<;_Mhz~&}SK6R$$ulB%TOK9@t>qI&46?oT3 zMNeg2``LRB%)HT2YL7p?*xqXMWOeSf(7XzTOf=oS)B8;RmU%_zj7LT6!NRM#LiCjw zpTK2=DAp%GJe^1_2nF z_=I3PpiO-Dwm|?ZsTx(k5h?*ZCDI6@4 zS#zG~(DjCM;_5{}SXj82_p)}v#M8oFzo2yC48Lwn8WUvo1ION{B3#u*xf1hbr#W4) zJ62TwVDpncXpb(8?DDM(hB4>EM6#CrpbC$}Go$T+_`K@A< z*(~+uFAR8fK0;BOw!3;0pFs1aTR=YGt|fYOt1r$x9rNuWl#4w7eau-S!NhNyjB0~g z#-F0%aLl=SYb|6Nv010??BG7>CE&8)3cJf;it1X~*sqTlVvwaPI)YsKL;h^WjH6=F z?l3|Br#o0a&I}q}J)9)kez=C!048XKoZhm##acd$R|2D!Yu0*`bLdm6=7uiZ9r0}Y z3pU%~+7WUhluD*}FtfEJJ>0rMSwdOEgqOax+zP!V$b#p#8GqbR%Jj*|F1EABidx}l zcmJkOy@7yzRu^9I`=P{Tsw78gX^~HipX?opVFzn`lEx{aXpSGa%SOr+Pqsm({dZ-P zTh#^VshhHkzvZ?mfm1fKIPtHx-b!nRmbj`oiW-=uo07A9sEQhkoZ$~b89)to3qkOxk7Epr*Q1y>?{tfWH? zPfR-^L`_Y|WHb{#vQ}1j$_*)%SLZM7s^qe?yo(r%5#+HmtHj!_hh2_W3C=alu7;1i zyU*seq$Qh$1|ZWP=JmoWM~Xp5XAUVmSIvS-n1b!Z=|mdBeGj+0YN$J?+lM z%9($`;lqYOyskU|v&`q!i4NRXkVl}U1GJQB$GsasH|6b4?Eb9RoZ&$PLD7LUoLj37 zEA^?Ml4ghM^dil`*nb8R|AXG=aHinmmVgE&Fd&(3i67d!

$lG`>qN*HeB}Zun`r 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∾QgqU^?q#r!UJ(fh& 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 literal 136276 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 Y$f8?<-`%Hv0{>mPsQ*j8=B)?+3#hf~y8r+H literal 188743 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� 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 z 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 IWb)?!0R7Gw=>Px# diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts index f4907a1df0969..90fe6e7749840 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts @@ -171,5 +171,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await commonScreenshots.takeScreenshot('webhook-params-test', screenshotDirectories); await testSubjects.click('euiFlyoutCloseButton'); }); + + it('pagerduty connector screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('pagerduty'); + await testSubjects.setValue('nameInput', 'PagerDuty test connector'); + await testSubjects.setValue('pagerdutyApiUrlInput', 'https://dev-test.pagerduty.com/'); + await testSubjects.setValue('pagerdutyRoutingKeyInput', 'testkey'); + await commonScreenshots.takeScreenshot('pagerduty-connector', screenshotDirectories); + await testSubjects.click('create-connector-flyout-save-test-btn'); + await testSubjects.click('toastCloseButton'); + await testSubjects.setValue('eventActionSelect', 'trigger'); + await commonScreenshots.takeScreenshot('pagerduty-params-test', screenshotDirectories); + await testSubjects.click('euiFlyoutCloseButton'); + }); }); } From 772bc0c598ad7ae217e668e012b57bd7942e08db Mon Sep 17 00:00:00 2001 From: Coen Warmer Date: Tue, 5 Sep 2023 21:48:03 +0200 Subject: [PATCH 39/52] Enable "Event Generating Elements Should Be Instrumented" ESLint rule for more O11y Apps (#165647) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .eslintrc.js | 10 +++++++--- ...heck_node_for_existing_data_test_subj_prop.ts | 2 +- ...ating_elements_should_be_instrumented.test.ts | 3 ++- ...generating_elements_should_be_instrumented.ts | 3 ++- .../components/app/help_popover/help_popover.tsx | 1 + .../app/onboarding/agent_config_table.tsx | 1 + .../app/onboarding/instructions/otel_agent.tsx | 1 + .../settings/agent_configurations/list/index.tsx | 2 ++ .../create_agent_key/agent_key_callout.tsx | 1 + .../runtime_attachment/discovery_rule.tsx | 2 ++ .../components/shared/popover_tooltip/index.tsx | 1 + .../shared/span_links/span_links_table.tsx | 1 + .../config_agent/opentelemetry_instructions.tsx | 1 + .../url_search/selectable_url_list.tsx | 1 + .../series_editor/columns/series_actions.tsx | 1 + .../series_editor/columns/series_name.tsx | 1 + .../alerting/inventory/components/expression.tsx | 3 +++ .../alerting/inventory/components/metric.tsx | 1 + .../alerting/inventory/components/node_type.tsx | 1 + .../components/expression_editor/criterion.tsx | 1 + .../metric_anomaly/components/node_type.tsx | 1 + .../components/severity_threshold.tsx | 1 + .../custom_equation/metric_row_controls.tsx | 1 + .../components/expression_row.tsx | 2 ++ .../basic_table/row_expansion_button.tsx | 1 + .../components/logging/log_highlights_menu.tsx | 3 +++ .../public/containers/react_query_provider.tsx | 1 + .../log_entry_rate/sections/anomalies/table.tsx | 2 ++ .../anomalies_table/anomalies_table.tsx | 1 + .../anomalies_table/pagination.tsx | 2 ++ .../components/node_details/overlay.tsx | 7 ++++++- .../node_details/tabs/properties/table.tsx | 1 + .../waffle/metric_control/metrics_edit_mode.tsx | 2 ++ .../components/metadata_details.tsx | 1 + .../components/closable_popover_title.tsx | 1 + .../custom_equation/metric_row_controls.tsx | 1 + .../threshold/components/expression_row.tsx | 1 + .../pages/alerts/components/alert_actions.tsx | 1 + .../ux/core_web_vitals/web_core_vitals_title.tsx | 2 ++ .../custom_metric/metric_indicator.tsx | 1 + .../pages/slos/components/slo_list_item.tsx | 1 + .../public/functions/lens.tsx | 2 ++ .../app/custom_logs/wizard/api_key_banner.tsx | 1 + .../app/custom_logs/wizard/back_button.tsx | 1 + .../app/custom_logs/wizard/configure_logs.tsx | 16 +++++++++++++++- .../custom_logs/wizard/install_elastic_agent.tsx | 6 +++++- .../app/custom_logs/wizard/select_logs.tsx | 7 ++++++- .../public/components/app/home/index.tsx | 1 + .../app/system_logs/install_elastic_agent.tsx | 6 +++++- .../shared/install_elastic_agent_steps.tsx | 1 + .../components/shared/troubleshooting_link.tsx | 1 + .../profiling/public/components/check_setup.tsx | 2 ++ .../components/flamegraph/flamegraph_tooltip.tsx | 7 ++++++- .../missing_symbols_callout.tsx | 9 ++++++++- .../public/components/license_prompt/index.tsx | 6 +++++- .../components/normalization_menu/index.tsx | 4 ++++ .../primary_and_comparison_search_bar.tsx | 1 + .../profiling_app_page_template/index.tsx | 2 ++ .../components/stack_frame_summary/index.tsx | 2 +- .../profiling/public/components/subchart.tsx | 6 +++--- .../public/components/topn_functions/index.tsx | 1 + .../public/views/add_data_view/index.tsx | 7 +++++++ .../public/views/delete_data_view/index.tsx | 1 + .../public/views/stack_traces_view/index.tsx | 1 + .../distinct_probabilistic_values_warning.tsx | 1 + .../public/views/storage_explorer/summary.tsx | 2 ++ .../components/certificates/fingerprint_col.tsx | 1 + .../common/links/step_details_link.tsx | 1 + .../components/common/links/view_alerts.tsx | 7 ++++++- .../components/common/links/view_errors.tsx | 1 + .../monitor_test_result/browser_steps_list.tsx | 1 + .../monitor_add_edit/fields/key_value_field.tsx | 1 + .../monitor_selector/monitor_selector.tsx | 1 + .../management/monitor_list_table/columns.tsx | 1 + .../overview/overview/actions_popover.tsx | 1 + .../overview/grid_by_group/grid_group_item.tsx | 1 + .../overview/overview/metric_item_icon.tsx | 7 ++++++- .../settings/global_params/params_text.tsx | 1 + .../waterfall_marker/waterfall_marker_icon.tsx | 1 + .../reset_percentile_zoom.tsx | 1 + 80 files changed, 172 insertions(+), 20 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 5b5ef73ed3806..6657ba3cb1f01 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -909,11 +909,15 @@ module.exports = { { files: [ 'x-pack/plugins/apm/**/*.{js,mjs,ts,tsx}', - 'x-pack/plugins/observability/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/exploratory_view/**/*.{js,mjs,ts,tsx}', - 'x-pack/plugins/ux/**/*.{js,mjs,ts,tsx}', - 'x-pack/plugins/synthetics/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/infra/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability_ai_assistant/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability_onboarding/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability_shared/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/profiling/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/synthetics/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/ux/**/*.{js,mjs,ts,tsx}', ], rules: { '@kbn/telemetry/event_generating_elements_should_be_instrumented': 'error', diff --git a/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts b/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts index b739dc5116c1c..ef0e32c1d2755 100644 --- a/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts +++ b/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts @@ -37,7 +37,7 @@ export function checkNodeForExistingDataTestSubjProp( const variable = getScope().variables.find((v) => v.name === name); // the variable definition of the spreaded variable return variable && variable.defs.length > 0 - ? variable.defs[0].node.init.properties.find((property: TSESTree.Property) => { + ? variable.defs[0].node.init?.properties.find((property: TSESTree.Property) => { if ('value' in property.key) { return property.key.value === 'data-test-subj'; } diff --git a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts index c8829f05efd21..f08cfa26cbc90 100644 --- a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts +++ b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts @@ -63,7 +63,8 @@ for (const [name, tester] of [tsTester, babelTester]) { ], output: `<${element} data-test-subj="Value${element .replace('Eui', '') - .replace('Empty', '')}">Value`, + .replace('Empty', '') + .replace('Icon', '')}">Value`, })), } ); diff --git a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts index d2069d2845e59..7242ff1645f5e 100644 --- a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts +++ b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts @@ -17,6 +17,7 @@ import { getFunctionName } from '../helpers/get_function_name'; export const EVENT_GENERATING_ELEMENTS = [ 'EuiButton', 'EuiButtonEmpty', + 'EuiButtonIcon', 'EuiLink', 'EuiFieldText', 'EuiFieldSearch', @@ -74,7 +75,7 @@ export const EventGeneratingElementsShouldBeInstrumented: Rule.RuleModule = { const intent = getIntentFromNode(parent); // 4. The element name that generates the events - const element = name.replace('Eui', '').replace('Empty', ''); + const element = name.replace('Eui', '').replace('Empty', '').replace('Icon', ''); const suggestion = `${appName}${componentName}${intent}${element}`; // 'o11yHeaderActionsSubmitButton' diff --git a/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx b/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx index 3a972b44f9a41..c883376cac4e1 100644 --- a/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx +++ b/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx @@ -51,6 +51,7 @@ export function HelpPopoverButton({ return ( {value && ( {value && ( ( ( setConfigToBeDeleted(config)} diff --git a/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx b/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx index 7f5d83f5beb1a..535bd2ed6b4f0 100644 --- a/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx +++ b/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx @@ -58,6 +58,7 @@ export function AgentKeyCallOut({ name, token }: Props) { {(copy) => ( { @@ -108,6 +109,7 @@ export function DiscoveryRule({ { diff --git a/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx b/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx index 4e119c52c8046..df3330a12c590 100644 --- a/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx @@ -28,6 +28,7 @@ export function PopoverTooltip({ closePopover={() => setIsPopoverOpen(false)} button={ ) => { setIsPopoverOpen(!isPopoverOpen); diff --git a/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx b/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx index f223cf0036114..167ce52572dc8 100644 --- a/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx +++ b/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx @@ -142,6 +142,7 @@ export function SpanLinksTable({ items }: Props) { { diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx index 2ea2a993816b7..0b105d0550143 100644 --- a/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx +++ b/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx @@ -83,6 +83,7 @@ export function OpenTelemetryInstructions({ {value && ( closePopover()} aria-label={i18n.translate('xpack.exploratoryView.search.url.close', { diff --git a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx index a2e78fb36c41f..fec7360b253f2 100644 --- a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx +++ b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx @@ -72,6 +72,7 @@ export function SeriesActions({ seriesId, series, seriesConfig, onEditClick }: P const popoverButton = ( setIsEditingEnabled(!isEditingEnabled)} iconType="pencil" aria-label={i18n.translate('xpack.exploratoryView.expView.seriesEditor.editName', { diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx index f06335145877d..340c00b9f48cc 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx @@ -578,6 +578,7 @@ export const ExpressionRow: React.FC = (props) => { = (props) => { /> = (props) => { {canDelete && ( {children} {children} = ({ {canDelete && ( {children} {children} = (props) => { /> = (props) => { {canDelete && ( ({ return ( = ({ = ({ = ({ {page} {page} - + diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx index 197e0ae1cb2a1..01b047f2e3664 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx @@ -65,6 +65,7 @@ export const Table = (props: Props) => { )} > onEdit(metric)} aria-label={i18n.translate( @@ -55,6 +56,7 @@ export const MetricsEditMode = withTheme( onDelete(metric)} diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx index edd760bc17f64..e1596f52aa3c3 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx @@ -142,6 +142,7 @@ export const MetadataDetails = (props: Props) => { {filteredFields.length > NUMBER_OF_COLUMNS ? ( {children} = (props) => { {canDelete && ( setIsPopoverOpen(true)} color={'text'} @@ -110,6 +111,7 @@ export function WebCoreVitalsTitle({ isOpen={isBrowserPopoverOpen} button={ setIsBrowserPopoverOpen(true)} color={'text'} diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx index f451d5d98007c..a333a353f97d9 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx @@ -213,6 +213,7 @@ export function MetricIndicator({ type, indexFields, isLoadingIndex }: MetricInd { lens.navigateToPrefilledEditor(lensEmbeddableInput); @@ -101,6 +102,7 @@ function Lens({ { setIsSaveModalOpen(() => true); diff --git a/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx index c55f554fc4845..b0d6b5f9e6c26 100644 --- a/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx @@ -93,6 +93,7 @@ export function ApiKeyBanner({ {(copy) => ( void }) { return ( , 0 && ( removeLogFilePath(index)} @@ -265,7 +268,11 @@ export function ConfigureLogs() { gutterSize="xs" > - + {i18n.translate( 'xpack.observability_onboarding.configureLogs.logFile.addRow', { @@ -313,6 +320,7 @@ export function ConfigureLogs() { } > setCustomConfigurations(event.target.value) @@ -514,6 +526,7 @@ export function ConfigureLogs() { error={integrationNameError} > , - + {i18n.translate( 'xpack.observability_onboarding.steps.inspect', { defaultMessage: 'Inspect' } @@ -242,6 +245,7 @@ export function InstallElasticAgent() { + {i18n.translate('xpack.observability_onboarding.steps.back', { defaultMessage: 'Back', })} @@ -183,6 +187,7 @@ export function SelectLogs() { { diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx b/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx index 6dcb343b222cb..13aec2ff31c06 100644 --- a/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx @@ -334,6 +334,7 @@ export function Home() { + {i18n.translate( 'xpack.observability_onboarding.systemLogs.back', { defaultMessage: 'Back' } diff --git a/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx b/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx index 282591e0a1487..2d5a42f7c287e 100644 --- a/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx @@ -221,6 +221,7 @@ export function InstallElasticAgentSteps({ values={{ hostRequirementsLink: ( diff --git a/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx b/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx index 5b6a1588d643c..71ab94a9bade8 100644 --- a/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx @@ -13,6 +13,7 @@ export function TroubleshootingLink() { return ( @@ -152,6 +153,7 @@ export function CheckSetup({ children }: { children: React.ReactElement }) { }, button: ( { event.preventDefault(); diff --git a/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx b/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx index ae37ebf65c9f0..7a3b661cdac6d 100644 --- a/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx +++ b/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx @@ -160,7 +160,12 @@ export function FlameGraphTooltip({ style={{ background: theme.euiTheme.border.color }} /> - + {i18n.translate('xpack.profiling.flameGraphTooltip.showMoreButton', { defaultMessage: `Show more information`, diff --git a/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx b/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx index 1f9d40d23a648..ac2c2e7a2407b 100644 --- a/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx +++ b/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx @@ -41,6 +41,7 @@ export function MissingSymbolsCallout({ frameType }: Props) { values={{ readMore: ( @@ -54,6 +55,7 @@ export function MissingSymbolsCallout({ frameType }: Props) { />

- + {i18n.translate( 'xpack.profiling.frameInformationWindow.missingSymbols.interpreted.reportProblem', { defaultMessage: 'Report a problem' } diff --git a/x-pack/plugins/profiling/public/components/license_prompt/index.tsx b/x-pack/plugins/profiling/public/components/license_prompt/index.tsx index 5ec11800d176e..43af8257efea3 100644 --- a/x-pack/plugins/profiling/public/components/license_prompt/index.tsx +++ b/x-pack/plugins/profiling/public/components/license_prompt/index.tsx @@ -38,7 +38,11 @@ export function LicensePrompt() {

} actions={[ - + {i18n.translate('xpack.profiling.invalidLicense.subscriptionManagementLink', { defaultMessage: 'Upgrade subscription', })} diff --git a/x-pack/plugins/profiling/public/components/normalization_menu/index.tsx b/x-pack/plugins/profiling/public/components/normalization_menu/index.tsx index 3d80d43bbe89c..da17c339814e4 100644 --- a/x-pack/plugins/profiling/public/components/normalization_menu/index.tsx +++ b/x-pack/plugins/profiling/public/components/normalization_menu/index.tsx @@ -95,6 +95,7 @@ export function NormalizationMenu(props: Props) { prepend={NORMALIZE_BY_LABEL} append={ {SCALE_LABEL}} > {SCALE_LABEL}} > { props.onChange(mode, options); setIsPopoverOpen(false); diff --git a/x-pack/plugins/profiling/public/components/primary_and_comparison_search_bar.tsx b/x-pack/plugins/profiling/public/components/primary_and_comparison_search_bar.tsx index 12375925bb606..e5a60a7d95149 100644 --- a/x-pack/plugins/profiling/public/components/primary_and_comparison_search_bar.tsx +++ b/x-pack/plugins/profiling/public/components/primary_and_comparison_search_bar.tsx @@ -91,6 +91,7 @@ export function PrimaryAndComparisonSearchBar() { { diff --git a/x-pack/plugins/profiling/public/components/profiling_app_page_template/index.tsx b/x-pack/plugins/profiling/public/components/profiling_app_page_template/index.tsx index a62d342b3919e..e094038e2f190 100644 --- a/x-pack/plugins/profiling/public/components/profiling_app_page_template/index.tsx +++ b/x-pack/plugins/profiling/public/components/profiling_app_page_template/index.tsx @@ -70,6 +70,7 @@ export function ProfilingAppPageTemplate({ 'data-test-subj': 'profilingPageTemplate', rightSideItems: [ { setPrivilegesWarningDismissed(true); }} diff --git a/x-pack/plugins/profiling/public/components/stack_frame_summary/index.tsx b/x-pack/plugins/profiling/public/components/stack_frame_summary/index.tsx index 5533df8479d4e..d73c382962a59 100644 --- a/x-pack/plugins/profiling/public/components/stack_frame_summary/index.tsx +++ b/x-pack/plugins/profiling/public/components/stack_frame_summary/index.tsx @@ -39,7 +39,7 @@ export function StackFrameSummary({ frame, onFrameClick }: Props) {
{onFrameClick ? ( - + ) : ( diff --git a/x-pack/plugins/profiling/public/components/subchart.tsx b/x-pack/plugins/profiling/public/components/subchart.tsx index ee388b851d0ed..4100425cb05d6 100644 --- a/x-pack/plugins/profiling/public/components/subchart.tsx +++ b/x-pack/plugins/profiling/public/components/subchart.tsx @@ -135,7 +135,7 @@ export function SubChart({ {hasMoreFrames && !!onShowMoreClick && ( - + {i18n.translate('xpack.profiling.stackTracesView.showMoreTracesButton', { defaultMessage: 'Show more', })} @@ -185,13 +185,13 @@ export function SubChart({ {showFrames ? ( - onShowMoreClick?.()}> + onShowMoreClick?.()}> {label} ) : category === OTHER_BUCKET_LABEL ? ( {label} ) : ( - + {label} )} diff --git a/x-pack/plugins/profiling/public/components/topn_functions/index.tsx b/x-pack/plugins/profiling/public/components/topn_functions/index.tsx index ec99236cb135f..4ec9bb8631327 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions/index.tsx +++ b/x-pack/plugins/profiling/public/components/topn_functions/index.tsx @@ -227,6 +227,7 @@ export const TopNFunctionsGrid = forwardRef( } return ( @@ -430,6 +432,7 @@ EOF`} values={{ link: ( @@ -493,6 +496,7 @@ EOF`} versionTo: 6.4, linuxLink: ( @@ -503,6 +507,7 @@ EOF`} ), debianLink: ( @@ -513,6 +518,7 @@ EOF`} ), fedoraLink: ( @@ -523,6 +529,7 @@ EOF`} ), advancedLink: ( diff --git a/x-pack/plugins/profiling/public/views/delete_data_view/index.tsx b/x-pack/plugins/profiling/public/views/delete_data_view/index.tsx index 7e07ba4a1ec86..c4f1399edafe7 100644 --- a/x-pack/plugins/profiling/public/views/delete_data_view/index.tsx +++ b/x-pack/plugins/profiling/public/views/delete_data_view/index.tsx @@ -28,6 +28,7 @@ export function DeleteDataView() { footer={
diff --git a/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx b/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx index 0df1f9ae855f9..f024b8a21dcce 100644 --- a/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx +++ b/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx @@ -170,6 +170,7 @@ export function StackTracesView() { {(data?.charts.length ?? 0) > limit && ( { profilingRouter.push(routePath, { path, diff --git a/x-pack/plugins/profiling/public/views/storage_explorer/distinct_probabilistic_values_warning.tsx b/x-pack/plugins/profiling/public/views/storage_explorer/distinct_probabilistic_values_warning.tsx index 1427eed54de41..4c963c79a2e7a 100644 --- a/x-pack/plugins/profiling/public/views/storage_explorer/distinct_probabilistic_values_warning.tsx +++ b/x-pack/plugins/profiling/public/views/storage_explorer/distinct_probabilistic_values_warning.tsx @@ -43,6 +43,7 @@ export function DistinctProbabilisticValuesWarning({ = ({ cert }) => { {(copy) => ( { return ( - + ); }; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx index 0ca0b19a4f58e..e41b2be1a7c11 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx @@ -16,6 +16,7 @@ export const ErrorsLink = ({ disabled }: { disabled?: boolean }) => { return ( ( toggleDetails(item)} aria-label={expandedMap[item._id] ? 'Collapse' : 'Expand'} iconType={expandedMap[item._id] ? 'arrowDown' : 'arrowRight'} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/fields/key_value_field.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/fields/key_value_field.tsx index 7d062fbde7548..58470a204ab51 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/fields/key_value_field.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/fields/key_value_field.tsx @@ -156,6 +156,7 @@ export const KeyValuePairsField = ({ append={ { const button = ( ( {testTime} - + diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/params_text.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/params_text.tsx index 71024bf9899a7..42bb72f541648 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/params_text.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/params_text.tsx @@ -16,6 +16,7 @@ export const ParamsText = ({ text }: { text: string }) => { Date: Tue, 5 Sep 2023 16:02:05 -0400 Subject: [PATCH 40/52] feat(slo): delete slo instances (#165270) --- .../kbn-slo-schema/src/rest_specs/slo.ts | 10 ++ .../docs/openapi/slo/bundled.json | 105 ++++++++++- .../docs/openapi/slo/bundled.yaml | 69 +++++++- .../schemas/delete_slo_instances_request.yaml | 26 +++ .../schemas/historical_summary_request.yaml | 4 +- .../docs/openapi/slo/entrypoint.yaml | 2 + ...@{spaceid}@api@slos@_delete_instances.yaml | 40 +++++ .../observability/server/routes/slo/route.ts | 19 ++ .../services/slo/delete_slo_instances.test.ts | 165 ++++++++++++++++++ .../services/slo/delete_slo_instances.ts | 71 ++++++++ .../server/services/slo/index.ts | 1 + 11 files changed, 506 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/observability/docs/openapi/slo/components/schemas/delete_slo_instances_request.yaml create mode 100644 x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@_delete_instances.yaml create mode 100644 x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts create mode 100644 x-pack/plugins/observability/server/services/slo/delete_slo_instances.ts diff --git a/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts b/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts index 17b8e86d9fc5a..706213003250b 100644 --- a/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts +++ b/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts @@ -158,6 +158,10 @@ const findSLOResponseSchema = t.type({ results: t.array(sloWithSummaryResponseSchema), }); +const deleteSLOInstancesParamsSchema = t.type({ + body: t.type({ list: t.array(t.type({ sloId: sloIdSchema, instanceId: t.string })) }), +}); + const fetchHistoricalSummaryParamsSchema = t.type({ body: t.type({ list: t.array(t.type({ sloId: sloIdSchema, instanceId: allOrAnyString })) }), }); @@ -239,6 +243,9 @@ type UpdateSLOResponse = t.OutputOf; type FindSLOParams = t.TypeOf; type FindSLOResponse = t.OutputOf; +type DeleteSLOInstancesInput = t.OutputOf; +type DeleteSLOInstancesParams = t.TypeOf; + type FetchHistoricalSummaryParams = t.TypeOf; type FetchHistoricalSummaryResponse = t.OutputOf; type HistoricalSummaryResponse = t.OutputOf; @@ -269,6 +276,7 @@ type KQLCustomIndicator = t.OutputOf; export { createSLOParamsSchema, deleteSLOParamsSchema, + deleteSLOInstancesParamsSchema, findSLOParamsSchema, findSLOResponseSchema, getPreviewDataParamsSchema, @@ -294,6 +302,8 @@ export type { CreateSLOInput, CreateSLOParams, CreateSLOResponse, + DeleteSLOInstancesInput, + DeleteSLOInstancesParams, FindSLOParams, FindSLOResponse, GetPreviewDataParams, diff --git a/x-pack/plugins/observability/docs/openapi/slo/bundled.json b/x-pack/plugins/observability/docs/openapi/slo/bundled.json index 374d35c9dd212..559f5713e2c35 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/bundled.json +++ b/x-pack/plugins/observability/docs/openapi/slo/bundled.json @@ -677,6 +677,74 @@ } } } + }, + "/s/{spaceId}/api/observability/slos/_delete_instances": { + "post": { + "summary": "Batch delete rollup and summary data for the matching list of sloId and instanceId", + "operationId": "deleteSloInstancesOp", + "description": "You must have `all` privileges for the **SLOs** feature in the **Observability** section of the Kibana feature privileges.\n", + "tags": [ + "slo" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + }, + { + "$ref": "#/components/parameters/space_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/delete_slo_instances_request" + } + } + } + }, + "responses": { + "204": { + "description": "Successful request" + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/400_response" + } + } + } + }, + "401": { + "description": "Unauthorized response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/401_response" + } + } + } + }, + "403": { + "description": "Unauthorized response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/403_response" + } + } + } + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + } } }, "components": { @@ -1718,10 +1786,10 @@ "title": "Historical summary request", "type": "object", "required": [ - "sloIds" + "list" ], "properties": { - "sloIds": { + "list": { "description": "The list of SLO identifiers to get the historical summary for", "type": "array", "items": { @@ -1756,6 +1824,39 @@ } } } + }, + "delete_slo_instances_request": { + "title": "Delete SLO instances request", + "description": "The delete SLO instances request takes a list of SLO id and instance id, then delete the rollup and summary data. This API can be used to remove the staled data of an instance SLO that no longer get updated.\n", + "type": "object", + "required": [ + "list" + ], + "properties": { + "list": { + "description": "An array of slo id and instance id", + "type": "array", + "items": { + "type": "object", + "required": [ + "sloId", + "instanceId" + ], + "properties": { + "sloId": { + "description": "The SLO unique identifier", + "type": "string", + "example": "8853df00-ae2e-11ed-90af-09bb6422b258" + }, + "instanceId": { + "description": "The SLO instance identifier", + "type": "string", + "example": "8853df00-ae2e-11ed-90af-09bb6422b258" + } + } + } + } + } } } } diff --git a/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml b/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml index a6cdf5c376485..efeeb090f0156 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml @@ -408,6 +408,46 @@ paths: application/json: schema: $ref: '#/components/schemas/403_response' + /s/{spaceId}/api/observability/slos/_delete_instances: + post: + summary: Batch delete rollup and summary data for the matching list of sloId and instanceId + operationId: deleteSloInstancesOp + description: | + You must have `all` privileges for the **SLOs** feature in the **Observability** section of the Kibana feature privileges. + tags: + - slo + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + - $ref: '#/components/parameters/space_id' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/delete_slo_instances_request' + responses: + '204': + description: Successful request + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/400_response' + '401': + description: Unauthorized response + content: + application/json: + schema: + $ref: '#/components/schemas/401_response' + '403': + description: Unauthorized response + content: + application/json: + schema: + $ref: '#/components/schemas/403_response' + servers: + - url: https://localhost:5601 components: securitySchemes: basicAuth: @@ -1190,9 +1230,9 @@ components: title: Historical summary request type: object required: - - sloIds + - list properties: - sloIds: + list: description: The list of SLO identifiers to get the historical summary for type: array items: @@ -1216,3 +1256,28 @@ components: example: 0.9836 errorBudget: $ref: '#/components/schemas/error_budget' + delete_slo_instances_request: + title: Delete SLO instances request + description: | + The delete SLO instances request takes a list of SLO id and instance id, then delete the rollup and summary data. This API can be used to remove the staled data of an instance SLO that no longer get updated. + type: object + required: + - list + properties: + list: + description: An array of slo id and instance id + type: array + items: + type: object + required: + - sloId + - instanceId + properties: + sloId: + description: The SLO unique identifier + type: string + example: 8853df00-ae2e-11ed-90af-09bb6422b258 + instanceId: + description: The SLO instance identifier + type: string + example: 8853df00-ae2e-11ed-90af-09bb6422b258 diff --git a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/delete_slo_instances_request.yaml b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/delete_slo_instances_request.yaml new file mode 100644 index 0000000000000..819050a915df5 --- /dev/null +++ b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/delete_slo_instances_request.yaml @@ -0,0 +1,26 @@ +title: Delete SLO instances request +description: > + The delete SLO instances request takes a list of SLO id and instance id, then delete the rollup and summary data. + This API can be used to remove the staled data of an instance SLO that no longer get updated. +type: object +required: + - list +properties: + list: + description: An array of slo id and instance id + type: array + items: + type: object + required: + - sloId + - instanceId + properties: + sloId: + description: The SLO unique identifier + type: string + example: 8853df00-ae2e-11ed-90af-09bb6422b258 + instanceId: + description: The SLO instance identifier + type: string + example: 8853df00-ae2e-11ed-90af-09bb6422b258 + \ No newline at end of file diff --git a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/historical_summary_request.yaml b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/historical_summary_request.yaml index 737a5b83f03f9..a2be13fc9842d 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/historical_summary_request.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/historical_summary_request.yaml @@ -1,9 +1,9 @@ title: Historical summary request type: object required: - - sloIds + - list properties: - sloIds: + list: description: The list of SLO identifiers to get the historical summary for type: array items: diff --git a/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml b/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml index 44f16ed4585e0..ee722573efa91 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml @@ -31,6 +31,8 @@ paths: $ref: "paths/s@{spaceid}@api@slos@{sloid}@{disable}.yaml" "/s/{spaceId}/internal/observability/slos/_historical_summary": $ref: "paths/s@{spaceid}@api@slos@_historical_summary.yaml" + "/s/{spaceId}/api/observability/slos/_delete_instances": + $ref: "paths/s@{spaceid}@api@slos@_delete_instances.yaml" components: securitySchemes: basicAuth: diff --git a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@_delete_instances.yaml b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@_delete_instances.yaml new file mode 100644 index 0000000000000..e9775576695a2 --- /dev/null +++ b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@_delete_instances.yaml @@ -0,0 +1,40 @@ +post: + summary: Batch delete rollup and summary data for the matching list of sloId and instanceId + operationId: deleteSloInstancesOp + description: > + You must have `all` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + tags: + - slo + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml + - $ref: ../components/parameters/space_id.yaml + requestBody: + required: true + content: + application/json: + schema: + $ref: '../components/schemas/delete_slo_instances_request.yaml' + responses: + '204': + description: Successful request + '400': + description: Bad request + content: + application/json: + schema: + $ref: '../components/schemas/400_response.yaml' + '401': + description: Unauthorized response + content: + application/json: + schema: + $ref: '../components/schemas/401_response.yaml' + '403': + description: Unauthorized response + content: + application/json: + schema: + $ref: '../components/schemas/403_response.yaml' + servers: + - url: https://localhost:5601 diff --git a/x-pack/plugins/observability/server/routes/slo/route.ts b/x-pack/plugins/observability/server/routes/slo/route.ts index f77f173675c68..99eec0b54ee5a 100644 --- a/x-pack/plugins/observability/server/routes/slo/route.ts +++ b/x-pack/plugins/observability/server/routes/slo/route.ts @@ -9,6 +9,7 @@ import { errors } from '@elastic/elasticsearch'; import { failedDependency, forbidden } from '@hapi/boom'; import { createSLOParamsSchema, + deleteSLOInstancesParamsSchema, deleteSLOParamsSchema, fetchHistoricalSummaryParamsSchema, findSloDefinitionsParamsSchema, @@ -26,6 +27,7 @@ import { DefaultSummaryClient, DefaultTransformManager, DeleteSLO, + DeleteSLOInstances, FindSLO, GetSLO, KibanaSavedObjectsSLORepository, @@ -225,6 +227,22 @@ const findSLORoute = createObservabilityServerRoute({ }, }); +const deleteSloInstancesRoute = createObservabilityServerRoute({ + endpoint: 'POST /api/observability/slos/_delete_instances 2023-10-31', + options: { + tags: ['access:slo_write'], + }, + params: deleteSLOInstancesParamsSchema, + handler: async ({ context, params }) => { + await assertPlatinumLicense(context); + + const esClient = (await context.core).elasticsearch.client.asCurrentUser; + const deleteSloInstances = new DeleteSLOInstances(esClient); + + await deleteSloInstances.execute(params.body); + }, +}); + const findSloDefinitionsRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/_definitions', options: { @@ -351,6 +369,7 @@ const getPreviewData = createObservabilityServerRoute({ export const sloRouteRepository = { ...createSLORoute, ...deleteSLORoute, + ...deleteSloInstancesRoute, ...disableSLORoute, ...enableSLORoute, ...fetchHistoricalSummary, diff --git a/x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts b/x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts new file mode 100644 index 0000000000000..bd3826e31fa92 --- /dev/null +++ b/x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts @@ -0,0 +1,165 @@ +/* + * Copyright 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 { ElasticsearchClient } from '@kbn/core/server'; +import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { DeleteSLOInstances } from './delete_slo_instances'; + +describe('DeleteSLOInstances', () => { + let mockEsClient: jest.Mocked; + let deleteSLOInstances: DeleteSLOInstances; + + beforeEach(() => { + mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); + deleteSLOInstances = new DeleteSLOInstances(mockEsClient); + }); + + describe('validation', () => { + it("forbids deleting an SLO with an '*' (all) instance id", async () => { + await expect( + deleteSLOInstances.execute({ + list: [ + { sloId: 'first', instanceId: 'irrelevant' }, + { sloId: 'second', instanceId: '*' }, + ], + }) + ).rejects.toThrowError("Cannot delete an SLO instance '*'"); + }); + }); + + it('deletes the roll up and the summary data for each tuple', async () => { + await deleteSLOInstances.execute({ + list: [ + { sloId: 'first', instanceId: 'host-foo' }, + { sloId: 'second', instanceId: 'host-foo' }, + { sloId: 'third', instanceId: 'cluster-eu' }, + ], + }); + + expect(mockEsClient.deleteByQuery).toHaveBeenCalledTimes(2); + expect(mockEsClient.deleteByQuery.mock.calls[0][0]).toMatchInlineSnapshot(` + Object { + "index": ".slo-observability.sli-v2*", + "query": Object { + "bool": Object { + "should": Array [ + Object { + "bool": Object { + "must": Array [ + Object { + "term": Object { + "slo.id": "first", + }, + }, + Object { + "term": Object { + "slo.instanceId": "host-foo", + }, + }, + ], + }, + }, + Object { + "bool": Object { + "must": Array [ + Object { + "term": Object { + "slo.id": "second", + }, + }, + Object { + "term": Object { + "slo.instanceId": "host-foo", + }, + }, + ], + }, + }, + Object { + "bool": Object { + "must": Array [ + Object { + "term": Object { + "slo.id": "third", + }, + }, + Object { + "term": Object { + "slo.instanceId": "cluster-eu", + }, + }, + ], + }, + }, + ], + }, + }, + "wait_for_completion": false, + } + `); + expect(mockEsClient.deleteByQuery.mock.calls[1][0]).toMatchInlineSnapshot(` + Object { + "index": ".slo-observability.summary-v2*", + "query": Object { + "bool": Object { + "should": Array [ + Object { + "bool": Object { + "must": Array [ + Object { + "term": Object { + "slo.id": "first", + }, + }, + Object { + "term": Object { + "slo.instanceId": "host-foo", + }, + }, + ], + }, + }, + Object { + "bool": Object { + "must": Array [ + Object { + "term": Object { + "slo.id": "second", + }, + }, + Object { + "term": Object { + "slo.instanceId": "host-foo", + }, + }, + ], + }, + }, + Object { + "bool": Object { + "must": Array [ + Object { + "term": Object { + "slo.id": "third", + }, + }, + Object { + "term": Object { + "slo.instanceId": "cluster-eu", + }, + }, + ], + }, + }, + ], + }, + }, + "wait_for_completion": false, + } + `); + }); +}); diff --git a/x-pack/plugins/observability/server/services/slo/delete_slo_instances.ts b/x-pack/plugins/observability/server/services/slo/delete_slo_instances.ts new file mode 100644 index 0000000000000..f1892122622d6 --- /dev/null +++ b/x-pack/plugins/observability/server/services/slo/delete_slo_instances.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; +import { ALL_VALUE, DeleteSLOInstancesParams } from '@kbn/slo-schema'; +import { + SLO_DESTINATION_INDEX_PATTERN, + SLO_SUMMARY_DESTINATION_INDEX_PATTERN, +} from '../../assets/constants'; +import { IllegalArgumentError } from '../../errors'; + +interface SloInstanceTuple { + sloId: string; + instanceId: string; +} + +export class DeleteSLOInstances { + constructor(private esClient: ElasticsearchClient) {} + + public async execute(params: DeleteSLOInstancesParams): Promise { + const containsAllValueInstanceId = params.list.some((item) => item.instanceId === ALL_VALUE); + if (containsAllValueInstanceId) { + throw new IllegalArgumentError("Cannot delete an SLO instance '*'"); + } + + await this.deleteRollupData(params.list); + await this.deleteSummaryData(params.list); + } + + private async deleteRollupData(list: SloInstanceTuple[]): Promise { + await this.esClient.deleteByQuery({ + index: SLO_DESTINATION_INDEX_PATTERN, + wait_for_completion: false, + query: { + bool: { + should: list.map((item) => ({ + bool: { + must: [ + { term: { 'slo.id': item.sloId } }, + { term: { 'slo.instanceId': item.instanceId } }, + ], + }, + })), + }, + }, + }); + } + + private async deleteSummaryData(list: SloInstanceTuple[]): Promise { + await this.esClient.deleteByQuery({ + index: SLO_SUMMARY_DESTINATION_INDEX_PATTERN, + wait_for_completion: false, + query: { + bool: { + should: list.map((item) => ({ + bool: { + must: [ + { term: { 'slo.id': item.sloId } }, + { term: { 'slo.instanceId': item.instanceId } }, + ], + }, + })), + }, + }, + }); + } +} diff --git a/x-pack/plugins/observability/server/services/slo/index.ts b/x-pack/plugins/observability/server/services/slo/index.ts index 396b443be7eeb..7c99c289ae90b 100644 --- a/x-pack/plugins/observability/server/services/slo/index.ts +++ b/x-pack/plugins/observability/server/services/slo/index.ts @@ -7,6 +7,7 @@ export * from './create_slo'; export * from './delete_slo'; +export * from './delete_slo_instances'; export * from './fetch_historical_summary'; export * from './find_slo'; export * from './get_slo'; From 3cb13fb9c17706cb53cd551b7114e9d25fbd1080 Mon Sep 17 00:00:00 2001 From: Trevor Pierce <1Copenut@users.noreply.github.com> Date: Tue, 5 Sep 2023 15:16:55 -0500 Subject: [PATCH 41/52] Upgrade EUI to v88.1.0 (#165047) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## PR change summary `v87.2.0`⏩`v88.1.0` ⚠️ The biggest thing to QA in this PR is several **breaking changes** to `EuiDescriptionList`. ### Description list `columnWidths` prop This PR introduces a new `columnWidths` prop and removes several Kibana instances of custom CSS overrides to title/description column widths. The primary motivation behind this is not just to reduce custom CSS, but also because v88.0.0 introduced an underlying CSS change of `column` description lists to using [`display: grid` CSS](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout). The new prop allows us to support existing description list custom widths while not requiring Kibana developers to understand or write grid CSS (except for 1 or two scenarios around `max-width`). ⚠️ **No user-facing UI around column widths should have regressed as a result of these changes. If they have, please let us know in this PR.** ### Description list gutter size changes The prop `gutterSize` has been renamed to `rowGutterSize` and the default size is now `s` instead of `m`. The change to `s` from `m` means there is an **expected** smaller gap between list items (see below screenshots): **Current `EuiDescriptionList` with default `rowGutterSize="s"`** **Prior `EuiDescriptionList` with default `gutterSize="m"`** If Kibana teams prefer to keep the previous `m` gutter for their instances of `EuiDescriptionList`, you have a couple of options: 1. Let EUI team know in the PR and we can set usage back to what it was before 2. Set `rowGutterSize="m"` yourselves manually --- ## [`88.1.0`](https://github.com/elastic/eui/tree/v88.1.0) - Added `font.defaultUnits` theme token. EUI component font sizes default to `rem` units - this token allows consumers to configure this to `px` or `em` ([#7133](https://github.com/elastic/eui/pull/7133)) - Updated `EuiDescriptionList` with new `columnWidths` prop ([#7146](https://github.com/elastic/eui/pull/7146)) **Bug fixes** - Fixed `EuiDataGrid`'s keyboard shortcuts popover display ([#7146](https://github.com/elastic/eui/pull/7146)) **CSS-in-JS conversions** - Renamed `useEuiFontSize()`'s `measurement` option to `unit` for clarity ([#7133](https://github.com/elastic/eui/pull/7133)) ## [`88.0.0`](https://github.com/elastic/eui/tree/v88.0.0) - Updated `EuiDescriptionList` with a new `columnGutterSize` prop ([#7062](https://github.com/elastic/eui/pull/7062)) **Deprecations** - Deprecated `EuiSuggest`. We recommend using `EuiSelectable` or `EuiComboBox` instead ([#7122](https://github.com/elastic/eui/pull/7122)) - Deprecated `EuiControlBar`. We recommend using `EuiBottomBar` instead ([#7122](https://github.com/elastic/eui/pull/7122)) - Deprecated `EuiColorStops`. We recommend copying the component to your application if necessary ([#7122](https://github.com/elastic/eui/pull/7122)) - Deprecated `EuiNotificationEvent`. We recommend copying the component to your application if necessary ([#7122](https://github.com/elastic/eui/pull/7122)) **Breaking changes** - Renamed `EuiDescriptionList`'s `gutterSize` prop to `rowGutterSize` ([#7062](https://github.com/elastic/eui/pull/7062)) - `EuiDescriptionList`'s `rowGutterSize` prop now defaults to a size of `s` (was previously `m`) ([#7062](https://github.com/elastic/eui/pull/7062)) **Accessibility** - Fixed the dark mode colors of inline `EuiDescriptionListTitle`s to meet WCAG color contrast requirements ([#7062](https://github.com/elastic/eui/pull/7062)) **CSS-in-JS conversions** - Converted `EuiKeyPadMenuItem` to Emotion; Removed `$euiKeyPadMenuSize` and `$euiKeyPadMenuMarginSize` ([#7118](https://github.com/elastic/eui/pull/7118)) --------- Co-authored-by: Cee Chen Co-authored-by: Cee Chen <549407+cee-chen@users.noreply.github.com> Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Nikita Indik --- package.json | 2 +- src/dev/license_checker/config.ts | 2 +- .../shard_failure_description.test.tsx.snap | 14 +- .../_shard_failure_modal.scss | 18 -- .../shard_failure_description.tsx | 2 +- .../workpad_filters/filter.component.tsx | 13 +- .../severity_map.tsx | 4 +- .../components/_index.scss | 1 - .../analysis_summary/_analysis_summary.scss | 11 - .../components/analysis_summary/_index.scss | 1 - .../analysis_summary/analysis_summary.tsx | 7 +- .../import_summary/_import_summary.scss | 12 - .../import_summary/import_summary.tsx | 7 +- .../extend_index_management.test.tsx.snap | 52 ++--- .../__snapshots__/index.test.tsx.snap | 6 + .../annotation_description_list/_index.scss | 15 +- .../annotation_description_list/index.tsx | 1 + .../components/rule_editor/_rule_editor.scss | 12 +- .../detector_description_list.test.js.snap | 12 + .../_detector_description_list.scss | 15 +- .../detector_description_list.js | 1 + .../rule_action_panel.test.js.snap | 18 ++ .../select_rule_action/rule_action_panel.js | 6 +- .../__snapshots__/checker_errors.test.js.snap | 4 +- .../user_profile/user_profile.test.tsx | 15 +- .../common/components/inspect/modal.tsx | 20 +- .../create_descriptions_list.test.tsx.snap | 2 +- .../components/rule_details/constants.ts | 8 + .../rule_details/rule_about_section.tsx | 8 +- .../rule_details/rule_definition_section.tsx | 8 +- .../rule_details/rule_schedule_section.tsx | 8 +- .../rules/description_step/index.tsx | 10 +- .../console/components/command_usage.tsx | 8 +- .../management/components/console/console.tsx | 14 -- .../status_action.tsx | 2 +- .../components/action_log_expanded_tray.tsx | 1 - .../resolver/view/panels/event_detail.tsx | 9 +- .../public/resolver/view/panels/styles.tsx | 8 +- .../__snapshots__/index.test.tsx.snap | 44 ++-- .../detail_panel_description_list/index.tsx | 1 + .../detail_panel_description_list/styles.ts | 5 +- .../nav_control_popover.test.tsx.snap | 215 ++++-------------- .../nav_control/nav_control_popover.test.tsx | 7 +- .../components/monitor_details_panel.tsx | 158 ++++++------- .../monitor_test_result/result_details.tsx | 2 - .../monitor_details_panel_container.tsx | 8 - .../toolbar/components/inspect/modal.tsx | 23 +- .../__snapshots__/expanded_row.test.tsx.snap | 2 +- .../monitor_status.bar.test.tsx.snap | 18 +- .../ssl_certificate.test.tsx.snap | 4 +- .../most_recent_error.test.tsx.snap | 2 +- .../__snapshots__/map_tooltip.test.tsx.snap | 6 +- yarn.lock | 78 ++++--- 53 files changed, 380 insertions(+), 550 deletions(-) delete mode 100644 x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_analysis_summary.scss delete mode 100644 x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_index.scss create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts diff --git a/package.json b/package.json index a26b2479e9816..80d1b5b6faf59 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.9.1-canary.1", "@elastic/ems-client": "8.4.0", - "@elastic/eui": "87.2.0", + "@elastic/eui": "88.1.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index c239333d00590..448c7f900ffd1 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -85,7 +85,7 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.4.0': ['Elastic License 2.0'], - '@elastic/eui@87.2.0': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@88.1.0': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary }; diff --git a/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap b/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap index 56581d0f3f019..fbad1c1f3dc80 100644 --- a/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap +++ b/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap @@ -11,13 +11,18 @@ exports[`ShardFailureDescription renders matching snapshot given valid propertie > & { value: string }; -const titleStyle = { - width: '30%', -}; - -const descriptionStyle = { - width: '70%', -}; - const renderElement = ( Component: FC< Omit & { onChange?: CustomComponentProps['updateFilter'] } @@ -53,11 +45,12 @@ export const Filter: FC = ({ filter, ...restProps }) => { ); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_by_resource/severity_map.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_by_resource/severity_map.tsx index 5c6888eca7494..94ebaf30572b3 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_by_resource/severity_map.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_by_resource/severity_map.tsx @@ -14,7 +14,7 @@ import { EuiFlexItem, EuiText, } from '@elastic/eui'; -import { ColorStop } from '@elastic/eui/src/components/color_picker/color_stops'; +import { PaletteColorStop } from '@elastic/eui/src/components/color_picker/color_palette_picker'; import { i18n } from '@kbn/i18n'; import { getSeverityStatusColor } from '../../../common/utils/get_vulnerability_colors'; import { VulnSeverity } from '../../../../common/types'; @@ -53,7 +53,7 @@ const formatPercentage = (percentage: number) => { export const SeverityMap = ({ severityMap, total }: Props) => { const { euiTheme } = useEuiTheme(); - const severityMapPallet: ColorStop[] = []; + const severityMapPallet: PaletteColorStop[] = []; const severityMapTooltip: SeverityMapTooltip[] = []; if (total > 0) { diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/_index.scss b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/_index.scss index 1973f51e0a59e..0477913cd0beb 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/_index.scss +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/_index.scss @@ -1,4 +1,3 @@ -@import 'analysis_summary/index'; @import 'edit_flyout/index'; @import 'file_contents/index'; @import 'import_summary/index'; diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_analysis_summary.scss b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_analysis_summary.scss deleted file mode 100644 index 50496ef9b23e0..0000000000000 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_analysis_summary.scss +++ /dev/null @@ -1,11 +0,0 @@ -.analysis-summary-list.euiDescriptionList { - // adding overrides for title and desciption - // these have to be overridden here as they are not - // accessable as overrides in the EuiDescriptionList component - .euiDescriptionList__title { - flex-basis: 15%; - } - .euiDescriptionList__description { - flex-basis: 85%; - } -} diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_index.scss b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_index.scss deleted file mode 100644 index 61cd703f53067..0000000000000 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'analysis_summary'; diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/analysis_summary.tsx b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/analysis_summary.tsx index 91baf60ed065a..1ce06cc07dc9e 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/analysis_summary.tsx +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/analysis_summary/analysis_summary.tsx @@ -28,7 +28,12 @@ export const AnalysisSummary: FC<{ results: FindFileStructureResponse }> = ({ re - + ); }; diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/_import_summary.scss b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/_import_summary.scss index b21c35e430456..a2b4e36fcbe5e 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/_import_summary.scss +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/_import_summary.scss @@ -1,15 +1,3 @@ -.import-summary-list.euiDescriptionList { - // adding overrides for title and desciption - // these have to be overridden here as they are not - // accessable as overrides in the EuiDescriptionList component - .euiDescriptionList__title { - flex-basis: 15%; - } - .euiDescriptionList__description { - flex-basis: 85%; - } -} - .failure-list { max-height: 200px; overflow-y: auto; diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/import_summary.tsx b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/import_summary.tsx index 202110ccbd358..04b8330eae234 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/import_summary.tsx +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_summary/import_summary.tsx @@ -53,7 +53,12 @@ export const ImportSummary: FC = ({ iconType="check" data-test-subj="dataVisualizerFileImportSuccessCallout" > - + {importFailures && importFailures.length > 0 && ( diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap b/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap index 7d7a293d7ae87..72c481a2ee613 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap +++ b/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap @@ -134,18 +134,18 @@ Array [ class="euiFlexItem emotion-euiFlexItem-grow-1" >
Lifecycle policy
Current action
rollover
Failed step
check-rollover-ready
@@ -185,42 +185,42 @@ Array [ class="euiFlexItem emotion-euiFlexItem-grow-1" >
Current phase
hot
Current action time
2018-12-07 13:02:55
Phase definition
Lifecycle policy
Current action
complete
Failed step
-
@@ -312,30 +312,30 @@ Array [ class="euiFlexItem emotion-euiFlexItem-grow-1" >
Current phase
new
Current action time
2018-12-07 13:02:55
diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/__snapshots__/index.test.tsx.snap b/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/__snapshots__/index.test.tsx.snap index 275b46d154ed6..98026a92071b9 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/__snapshots__/index.test.tsx.snap @@ -3,6 +3,12 @@ exports[`AnnotationDescriptionList Initialization with annotation. 1`] = ` * { - margin-top: $euiSizeXS; +.ml-annotation-description-list { + row-gap: $euiSizeXS; } diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx b/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx index a32e18bb8940b..8ff86208435cf 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx +++ b/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx @@ -116,6 +116,7 @@ export const AnnotationDescriptionList = ({ annotation, detectorDescription }: P data-test-subj={'mlAnnotationDescriptionList'} className="ml-annotation-description-list" type="column" + columnWidths={[3, 7]} listItems={listItems} /> ); diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss b/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss index 26767dd1e24db..03eca2842c300 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss +++ b/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss @@ -11,15 +11,12 @@ // SASSTODO: Dangerous EUI overwrite .euiDescriptionList { + row-gap: $euiSizeXS; + .euiDescriptionList__title { - flex-basis: 15%; padding: 0 $euiSize; } - .euiDescriptionList__description { - flex-basis: 85%; - } - .euiDescriptionList__title:nth-child(1), .euiDescriptionList__description:nth-child(2) { color: $euiTitleColor; @@ -33,11 +30,6 @@ padding-top: $euiSizeS; } } - - // SASSTODO: Dangerous EUI overwrite - .euiDescriptionList.euiDescriptionList--column > * { - margin-top: $euiSizeXS; - } } // SASSTODO: Dangerous EUI overwrite diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/__snapshots__/detector_description_list.test.js.snap b/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/__snapshots__/detector_description_list.test.js.snap index 2126624420d7c..6c92a5d5a30e5 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/__snapshots__/detector_description_list.test.js.snap +++ b/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/__snapshots__/detector_description_list.test.js.snap @@ -3,6 +3,12 @@ exports[`DetectorDescriptionList render for detector with anomaly values 1`] = ` * { - margin-top: $euiSizeXS; +.rule-detector-description-list { + row-gap: $euiSizeXS; } diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/detector_description_list.js b/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/detector_description_list.js index 6e5cd75124c18..f19c915a2d0da 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/detector_description_list.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/components/detector_description_list/detector_description_list.js @@ -69,6 +69,7 @@ export function DetectorDescriptionList({ job, detector, anomaly }) { ); diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/__snapshots__/rule_action_panel.test.js.snap b/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/__snapshots__/rule_action_panel.test.js.snap index d54f3c710b584..de98d9efc1cdf 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/__snapshots__/rule_action_panel.test.js.snap +++ b/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/__snapshots__/rule_action_panel.test.js.snap @@ -6,6 +6,12 @@ exports[`RuleActionPanel renders panel for rule with a condition 1`] = ` paddingSize="m" > - + ); } diff --git a/x-pack/plugins/monitoring/public/components/no_data/__snapshots__/checker_errors.test.js.snap b/x-pack/plugins/monitoring/public/components/no_data/__snapshots__/checker_errors.test.js.snap index d995e36569959..429c292e423cc 100644 --- a/x-pack/plugins/monitoring/public/components/no_data/__snapshots__/checker_errors.test.js.snap +++ b/x-pack/plugins/monitoring/public/components/no_data/__snapshots__/checker_errors.test.js.snap @@ -26,7 +26,7 @@ Array [ data-type="row" >
403 Forbidden
@@ -36,7 +36,7 @@ Array [ no access for you
500 Internal Server Error
diff --git a/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx b/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx index bae93d048af88..aa8371ac46e32 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx +++ b/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx @@ -266,9 +266,8 @@ describe('useUserProfileForm', () => { const themeOptions = themeMenu.find('EuiKeyPadMenuItem'); expect(themeOptions).toHaveLength(3); themeOptions.forEach((option) => { - expect(option.getDOMNode().classList.contains('euiKeyPadMenuItem-isDisabled')).toEqual( - false - ); + const menuItemEl = (option.getDOMNode() as unknown as Element[])[1]; + expect(menuItemEl.className).not.toContain('disabled'); }); }); @@ -353,9 +352,8 @@ describe('useUserProfileForm', () => { const themeOptions = themeMenu.find('EuiKeyPadMenuItem'); expect(themeOptions).toHaveLength(3); themeOptions.forEach((option) => { - expect(option.getDOMNode().classList.contains('euiKeyPadMenuItem-isDisabled')).toEqual( - true - ); + const menuItemEl = (option.getDOMNode() as unknown as Element[])[1]; + expect(menuItemEl.className).toContain('disabled'); }); }); @@ -391,9 +389,8 @@ describe('useUserProfileForm', () => { const themeOptions = themeMenu.find('EuiKeyPadMenuItem'); expect(themeOptions).toHaveLength(3); themeOptions.forEach((option) => { - expect(option.getDOMNode().classList.contains('euiKeyPadMenuItem-isDisabled')).toEqual( - true - ); + const menuItemEl = (option.getDOMNode() as unknown as Element[])[1]; + expect(menuItemEl.className).toContain('disabled'); }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx b/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx index b9e27c921704a..9cb27d7b6a7ad 100644 --- a/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx +++ b/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx @@ -30,20 +30,6 @@ import * as i18n from './translations'; import { getScopeFromPath, useSourcererDataView } from '../../containers/sourcerer'; import { SourcererScopeName } from '../../store/sourcerer/model'; -const DescriptionListStyled = styled(EuiDescriptionList)` - @media only screen and (min-width: ${(props) => props.theme.eui.euiBreakpoints.s}) { - .euiDescriptionList__title { - width: 30% !important; - } - - .euiDescriptionList__description { - width: 70% !important; - } - } -`; - -DescriptionListStyled.displayName = 'DescriptionListStyled'; - export interface ModalInspectProps { adHocDataViews?: string[] | null; additionalRequests?: string[] | null; @@ -209,7 +195,11 @@ export const ModalInspectQuery = ({ content: ( <> - + ), }, diff --git a/x-pack/plugins/security_solution/public/common/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap index ddf64d1c066c3..d472238b65359 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap @@ -6,7 +6,7 @@ exports[`create_description_list renders correctly against snapshot 1`] = ` Object { "align": "left", "compressed": false, - "gutterSize": "m", + "rowGutterSize": "s", "textStyle": "normal", "type": "row", } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts new file mode 100644 index 0000000000000..1561be4f4d8a4 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/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 DESCRIPTION_LIST_COLUMN_WIDTHS: [string, string] = ['50%', '50%']; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx index 5c3002946baf6..aef4eccaa4299 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx @@ -32,6 +32,7 @@ import { filterEmptyThreats } from '../../../rule_creation_ui/pages/rule_creatio import { ThreatEuiFlexGroup } from '../../../../detections/components/rules/description_step/threat_description'; import { BadgeList } from './badge_list'; +import { DESCRIPTION_LIST_COLUMN_WIDTHS } from './constants'; import * as i18n from './translations'; const OverrideColumn = styled(EuiFlexItem)` @@ -357,7 +358,12 @@ export const RuleAboutSection = ({ rule }: RuleAboutSectionProps) => { /> )} - +
); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx index de9e257c798bc..72057da4d963a 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx @@ -44,6 +44,7 @@ import { MlJobLink } from '../../../../detections/components/rules/ml_job_link/m import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs'; import { useKibana } from '../../../../common/lib/kibana/kibana_react'; import { BadgeList } from './badge_list'; +import { DESCRIPTION_LIST_COLUMN_WIDTHS } from './constants'; import * as i18n from './translations'; interface SavedQueryNameProps { @@ -497,7 +498,12 @@ export const RuleDefinitionSection = ({ rule }: RuleDefinitionSectionProps) => { return (
- +
); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_schedule_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_schedule_section.tsx index e7d2bbaeb831d..1d4f4290c4b03 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_schedule_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_schedule_section.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { EuiDescriptionList, EuiText } from '@elastic/eui'; import type { RuleResponse } from '../../../../../common/api/detection_engine/model/rule_schema/rule_schemas'; import { getHumanizedDuration } from '../../../../detections/pages/detection_engine/rules/helpers'; +import { DESCRIPTION_LIST_COLUMN_WIDTHS } from './constants'; import * as i18n from './translations'; interface IntervalProps { @@ -46,7 +47,12 @@ export const RuleScheduleSection = ({ rule }: RuleScheduleSectionProps) => { return (
- +
); }; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx index 8d7c21e386e40..a55d229bb1b97 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx @@ -60,11 +60,7 @@ import type { LicenseService } from '../../../../../common/license'; const DescriptionListContainer = styled(EuiDescriptionList)` max-width: 600px; - &.euiDescriptionList--column .euiDescriptionList__title { - width: 30%; - } - &.euiDescriptionList--column .euiDescriptionList__description { - width: 70%; + .euiDescriptionList__description { overflow-wrap: anywhere; } `; @@ -76,6 +72,8 @@ const panelViewStyle = css` text-overflow: ellipsis; `; +const DESCRIPTION_LIST_COLUMN_WIDTHS: [string, string] = ['50%', '50%']; + interface StepRuleDescriptionProps { columns?: 'multi' | 'single' | 'singleSplit'; data: unknown; @@ -155,6 +153,8 @@ export const StepRuleDescriptionComponent = ({ )} diff --git a/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx b/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx index 66d97b0da5451..7d1895ba7d1b7 100644 --- a/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx +++ b/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx @@ -38,7 +38,7 @@ export const CommandInputUsage = memo>(({ >(({ (({ commandDef, errorMessage {title}, description }]} descriptionProps={additionalProps} titleProps={additionalProps} @@ -191,7 +191,7 @@ export const CommandUsage = memo(({ commandDef, errorMessage .euiDescriptionList__title { - width: 20%; - margin-top: ${({ theme: { eui } }) => eui.euiSizeS}; - } - - > .euiDescriptionList__description { - width: 80%; - margin-top: ${({ theme: { eui } }) => eui.euiSizeS}; - } - } - } `; export const Console = memo( diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/status_action.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/status_action.tsx index 357d0e566e328..2de29f621c7ec 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/status_action.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/status_action.tsx @@ -252,7 +252,7 @@ export const EndpointStatusActionResult = memo< diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx index 849e9e484b008..7920bae8b22d7 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx @@ -36,7 +36,6 @@ const customDescriptionListCss = css` > .euiDescriptionList__title, > .euiDescriptionList__description { font-weight: ${(props) => props.theme.eui.euiFontWeightRegular}; - margin-top: ${(props) => props.theme.eui.euiSizeS}; } } `; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/event_detail.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/event_detail.tsx index f085c0a906e39..e5e1f88a36169 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/event_detail.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/event_detail.tsx @@ -216,6 +216,7 @@ function EventDetailFields({ event }: { event: SafeResolverEvent }) {
Host ID
@@ -378,7 +378,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
First seen
@@ -393,7 +393,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r />
Last seen
@@ -417,7 +417,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r data-type="row" >
IP addresses
@@ -431,7 +431,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
MAC addresses
@@ -445,7 +445,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
Platform
@@ -468,7 +468,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r data-type="row" >
Operating system
@@ -482,7 +482,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
Family
@@ -496,7 +496,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
Version
@@ -510,7 +510,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
Architecture
@@ -533,7 +533,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r data-type="row" >
Cloud provider
@@ -547,7 +547,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
Region
@@ -561,7 +561,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
Instance ID
@@ -575,7 +575,7 @@ exports[`Details Panel Component DetailsPanel:HostDetails: rendering it should r
Machine type
@@ -707,7 +707,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul data-type="row" >
Location
@@ -721,7 +721,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul
Autonomous system
@@ -744,7 +744,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul data-type="row" >
First seen
@@ -759,7 +759,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul />
Last seen
@@ -783,7 +783,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul data-type="row" >
Host ID
@@ -797,7 +797,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul
Host name
@@ -820,7 +820,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul data-type="row" >
WhoIs
@@ -853,7 +853,7 @@ exports[`Details Panel Component DetailsPanel:NetworkDetails: rendering it shoul
Reputation
diff --git a/x-pack/plugins/session_view/public/components/detail_panel_description_list/index.tsx b/x-pack/plugins/session_view/public/components/detail_panel_description_list/index.tsx index 3d942fc42326e..99dc0d546233f 100644 --- a/x-pack/plugins/session_view/public/components/detail_panel_description_list/index.tsx +++ b/x-pack/plugins/session_view/public/components/detail_panel_description_list/index.tsx @@ -23,6 +23,7 @@ export const DetailPanelDescriptionList = ({ listItems }: DetailPanelDescription return ( { const descriptionList: CSSObject = { padding: `${euiTheme.size.base} ${euiTheme.size.s} `, alignItems: 'flex-start', + rowGap: 0, }; const tabListTitle = { - width: '40%', display: 'flex', - marginTop: '0px', }; const tabListDescription = { - width: '60%', display: 'flex', - marginTop: '0px', }; return { diff --git a/x-pack/plugins/spaces/public/nav_control/__snapshots__/nav_control_popover.test.tsx.snap b/x-pack/plugins/spaces/public/nav_control/__snapshots__/nav_control_popover.test.tsx.snap index 2c46a577810f1..77801c3f8dadd 100644 --- a/x-pack/plugins/spaces/public/nav_control/__snapshots__/nav_control_popover.test.tsx.snap +++ b/x-pack/plugins/spaces/public/nav_control/__snapshots__/nav_control_popover.test.tsx.snap @@ -1,171 +1,52 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`NavControlPopover renders without crashing 1`] = ` - + +
+
+
+ +
+
+
+ `; diff --git a/x-pack/plugins/spaces/public/nav_control/nav_control_popover.test.tsx b/x-pack/plugins/spaces/public/nav_control/nav_control_popover.test.tsx index 54411b7ac85d5..420730ea696ac 100644 --- a/x-pack/plugins/spaces/public/nav_control/nav_control_popover.test.tsx +++ b/x-pack/plugins/spaces/public/nav_control/nav_control_popover.test.tsx @@ -12,8 +12,7 @@ import { EuiSelectable, EuiSelectableListItem, } from '@elastic/eui'; -import { act, waitFor } from '@testing-library/react'; -import { shallow } from 'enzyme'; +import { act, render, waitFor } from '@testing-library/react'; import React from 'react'; import * as Rx from 'rxjs'; @@ -70,7 +69,7 @@ describe('NavControlPopover', () => { it('renders without crashing', () => { const spacesManager = spacesManagerMock.create(); - const wrapper = shallow( + const { baseElement } = render( { navigateToUrl={jest.fn()} /> ); - expect(wrapper).toMatchSnapshot(); + expect(baseElement).toMatchSnapshot(); }); it('renders a SpaceAvatar with the active space', async () => { diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/monitor_details_panel.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/monitor_details_panel.tsx index 7b60d3c382f67..5a7bc3d722d2b 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/monitor_details_panel.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/monitor_details_panel.tsx @@ -17,7 +17,6 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; -import { euiStyled } from '@kbn/kibana-react-plugin/common'; import { TagsBadges } from './tag_badges'; import { PanelWithTitle } from './panel_with_title'; import { MonitorEnabled } from '../../monitors_page/management/monitor_list_table/monitor_enabled'; @@ -32,14 +31,6 @@ import { import { MonitorTypeBadge } from './monitor_type_badge'; import { useDateFormat } from '../../../../../hooks/use_date_format'; -const TitleLabel = euiStyled(EuiDescriptionListTitle)` - width: 40%; -`; - -const DescriptionLabel = euiStyled(EuiDescriptionListDescription)` - width: 60%; -`; - export interface MonitorDetailsPanelProps { latestPing?: Ping; loading: boolean; @@ -75,80 +66,82 @@ export const MonitorDetailsPanel = ({ titleLeftAlign hasBorder={hasBorder} > - - - - {!hideEnabled && ( - <> - {ENABLED_LABEL} - - {monitor && ( - { - dispatch(getMonitorAction.get({ monitorId: configId })); - }} - /> - )} - - + + + {!hideEnabled && ( + <> + {ENABLED_LABEL} + + {monitor && ( + { + dispatch(getMonitorAction.get({ monitorId: configId })); + }} + /> + )} + + + )} + {URL_LABEL} + + {url ? ( + + {url} + + ) : ( + + {UN_AVAILABLE_LABEL} + )} - {URL_LABEL} - - {url ? ( - - {url} - - ) : ( - - {UN_AVAILABLE_LABEL} - - )} - - {LAST_RUN_LABEL} - - {latestPing?.timestamp ? ( - - {LAST_MODIFIED_LABEL} - - - {monitor[ConfigKey.PROJECT_ID] && ( - <> - {PROJECT_ID_LABEL} - {monitor[ConfigKey.PROJECT_ID]} - + + {LAST_RUN_LABEL} + + {latestPing?.timestamp ? ( + + {LAST_MODIFIED_LABEL} + + + {monitor[ConfigKey.PROJECT_ID] && ( + <> + {PROJECT_ID_LABEL} + + {monitor[ConfigKey.PROJECT_ID]} + + + )} + {MONITOR_ID_ITEM_TEXT} + {monitor.id} + {MONITOR_TYPE_LABEL} + + + + {FREQUENCY_LABEL} + + {frequencyStr(monitor[ConfigKey.SCHEDULE])} + - {!hideLocations && ( - <> - {LOCATIONS_LABEL} - - - - - )} + {!hideLocations && ( + <> + {LOCATIONS_LABEL} + + + + + )} - {TAGS_LABEL} - - - - - + {TAGS_LABEL} + + + +
); }; @@ -213,13 +206,6 @@ const Time = ({ timestamp }: { timestamp?: string }) => { return timestamp ? : null; }; -export const WrapperStyle = euiStyled.div` - .euiDescriptionList.euiDescriptionList--column > *, - .euiDescriptionList.euiDescriptionList--responsiveColumn > * { - margin-top: ${({ theme }) => theme.eui.euiSizeS}; - } -`; - const FREQUENCY_LABEL = i18n.translate('xpack.synthetics.management.monitorList.frequency', { defaultMessage: 'Frequency', }); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details.tsx index 3b863847968e9..558e42401d6ee 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details.tsx @@ -96,7 +96,6 @@ export const TimingDetails = ({ step }: { step: JourneyStep }) => { return ( { return ( ); }; - -export const WrapperStyle = euiStyled.div` - .euiDescriptionList.euiDescriptionList--column > *, - .euiDescriptionList.euiDescriptionList--responsiveColumn > * { - margin-top: ${({ theme }) => theme.eui.euiSizeS}; - } -`; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/inspect/modal.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/inspect/modal.tsx index f64c531519d5e..e13284f1048b2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/inspect/modal.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/inspect/modal.tsx @@ -22,26 +22,11 @@ import numeral from '@elastic/numeral'; import { ReactNode } from 'react'; import React from 'react'; -import { euiStyled, EuiTheme } from '@kbn/kibana-react-plugin/common'; +import { euiStyled } from '@kbn/kibana-react-plugin/common'; import { isEmpty } from 'lodash'; import { GetInspectQuery } from '../../../../../../types'; import * as i18n from './translations'; -const DescriptionListStyled = euiStyled(EuiDescriptionList)` - @media only screen and (min-width: ${({ theme }: { theme: EuiTheme }) => - theme.eui.euiBreakpoints.s}) { - .euiDescriptionList__title { - width: 30% !important; - } - - .euiDescriptionList__description { - width: 70% !important; - } - } -`; - -DescriptionListStyled.displayName = 'DescriptionListStyled'; - export interface ModalInspectProps { closeModal: () => void; getInspectQuery: GetInspectQuery; @@ -154,7 +139,11 @@ const ModalInspectQueryComponent = ({ closeModal, getInspectQuery, title }: Moda content: ( <> - + ), }, diff --git a/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap b/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap index 254b265e63ecd..4a4a5a5255cb3 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap +++ b/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap @@ -150,7 +150,7 @@ exports[`PingListExpandedRow renders link to docs if body is not recorded but it data-type="row" >
Response Body
diff --git a/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap b/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap index cae8a771e1696..5ebde1d72dd0d 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap +++ b/x-pack/plugins/uptime/public/legacy_uptime/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap @@ -23,47 +23,47 @@ Array [ }
Overall availability
0.00 %
Url
--
Monitor ID
Tags
TLS Certificate , @@ -63,7 +63,7 @@ Array [ }
TLS Certificate
, diff --git a/x-pack/plugins/uptime/public/legacy_uptime/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap b/x-pack/plugins/uptime/public/legacy_uptime/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap index 619096189b084..5ec1d2011e72e 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap +++ b/x-pack/plugins/uptime/public/legacy_uptime/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap @@ -6,7 +6,7 @@ exports[`MostRecentError component renders properly with mock data 1`] = ` data-type="row" >
Most recent error (5 days ago)
diff --git a/x-pack/plugins/ux/public/components/app/rum_dashboard/visitor_breakdown_map/__snapshots__/map_tooltip.test.tsx.snap b/x-pack/plugins/ux/public/components/app/rum_dashboard/visitor_breakdown_map/__snapshots__/map_tooltip.test.tsx.snap index c109a89f6480b..439bc91ac5b97 100644 --- a/x-pack/plugins/ux/public/components/app/rum_dashboard/visitor_breakdown_map/__snapshots__/map_tooltip.test.tsx.snap +++ b/x-pack/plugins/ux/public/components/app/rum_dashboard/visitor_breakdown_map/__snapshots__/map_tooltip.test.tsx.snap @@ -14,17 +14,17 @@ Array [ }
Average page load duration
, ] diff --git a/yarn.lock b/yarn.lock index 006b36f36eb02..3ff002d5dfe50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1596,18 +1596,18 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@87.2.0": - version "87.2.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-87.2.0.tgz#6feabaea7daa03c1d9a906ed2f97312eec12bfe0" - integrity sha512-U4pDkDHTgYf39/D4o9inOcKMedDf+Y4sv42fRydg/blBYNbDCTlU/3z4fhpO2rA03kDyMFohMmRMt4aBrirBTA== +"@elastic/eui@88.1.0": + version "88.1.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-88.1.0.tgz#0c10173fecd5812b035c349cc8a836fa198d1f59" + integrity sha512-0irae9LLl9j2fc11FZePhioPAyus7YGpm0yoiKOnD5JqSskqRlmlmwPCYSIEYfxbwyibA4qrbt7kenJ7PTOt5g== dependencies: "@hello-pangea/dnd" "^16.2.0" "@types/lodash" "^4.14.194" - "@types/numeral" "^0.0.28" + "@types/numeral" "^2.0.2" "@types/react-input-autosize" "^2.2.1" "@types/react-window" "^1.8.5" - "@types/refractor" "^3.0.0" - "@types/resize-observer-browser" "^0.1.5" + "@types/refractor" "^3.0.2" + "@types/resize-observer-browser" "^0.1.7" "@types/vfile-message" "^2.0.0" chroma-js "^2.4.2" classnames "^2.3.2" @@ -1625,7 +1625,7 @@ react-window "^1.8.9" refractor "^3.5.0" rehype-raw "^5.0.0" - rehype-react "^6.0.0" + rehype-react "^6.2.1" rehype-stringify "^8.0.0" remark-breaks "^2.0.2" remark-emoji "^2.1.0" @@ -1633,7 +1633,7 @@ remark-rehype "^8.0.0" tabbable "^5.3.3" text-diff "^1.0.1" - unified "^9.2.0" + unified "^9.2.2" unist-util-visit "^2.0.3" url-parse "^1.5.10" uuid "^8.3.0" @@ -6272,12 +6272,12 @@ get-stream "^6.0.1" minimist "^1.2.6" -"@mapbox/hast-util-table-cell-style@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz#5b7166ae01297d72216932b245e4b2f0b642dca6" - integrity sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA== +"@mapbox/hast-util-table-cell-style@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" + integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== dependencies: - unist-util-visit "^1.3.0" + unist-util-visit "^1.4.1" "@mapbox/jsonlint-lines-primitives@^2.0.2", "@mapbox/jsonlint-lines-primitives@~2.0.2": version "2.0.2" @@ -9371,10 +9371,10 @@ resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4" integrity sha512-4QQmOF5KlwfxJ5IGXFIudkeLCdMABz03RcUXu+LCb24zmln8QW6aDjuGl4d4XPVLf2j+FnjelHTP7dvceAFbhA== -"@types/numeral@^0.0.28": - version "0.0.28" - resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz#e43928f0bda10b169b6f7ecf99e3ddf836b8ebe4" - integrity sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw== +"@types/numeral@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-2.0.2.tgz#8ea2c4f4e64c0cc948ad7da375f6f827778a7912" + integrity sha512-A8F30k2gYJ/6e07spSCPpkuZu79LCnkPTvqmIWQzNGcrzwFKpVOydG41lNt5wZXjSI149qjyzC2L1+F2PD/NUA== "@types/object-hash@^1.3.0": version "1.3.0" @@ -9654,17 +9654,17 @@ dependencies: redux "^4.0.0" -"@types/refractor@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.0.tgz#c535cfad1c54cf377ae2984f6cf6e9627a36ea66" - integrity sha512-jkCqkTpxMXXfN03Xpzj+mBMxo9IxG616SV2U42iwHkBGq/f8RrX3DCzLayIqUV+MAIBCUvl5xPnjqpUtZRnMqA== +"@types/refractor@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz#2d42128d59f78f84d2c799ffc5ab5cadbcba2d82" + integrity sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg== dependencies: "@types/prismjs" "*" -"@types/resize-observer-browser@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz#36d897708172ac2380cd486da7a3daf1161c1e23" - integrity sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ== +"@types/resize-observer-browser@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" + integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== "@types/resolve@^1.20.1": version "1.20.1" @@ -26052,12 +26052,12 @@ rehype-raw@^5.0.0: dependencies: hast-util-raw "^6.0.0" -rehype-react@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.1.0.tgz#95f8c936eea2159f92adfbf58e5e90be86a97cbf" - integrity sha512-hQ4DSGOJKA1a87Ei4fJtSHzopbfgoHkwjWMCFpLrcVR5+AIyCOtHy4oQcpGF11kTZOU6oKmJ9UKzO/JpI/XZWA== +rehype-react@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" + integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== dependencies: - "@mapbox/hast-util-table-cell-style" "^0.1.3" + "@mapbox/hast-util-table-cell-style" "^0.2.0" hast-to-hyperscript "^9.0.0" rehype-stringify@^8.0.0: @@ -29320,7 +29320,7 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -unified@^9.0.0, unified@^9.2.0, unified@^9.2.1: +unified@^9.0.0, unified@^9.2.1: version "9.2.1" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== @@ -29332,6 +29332,18 @@ unified@^9.0.0, unified@^9.2.0, unified@^9.2.1: trough "^1.0.0" vfile "^4.0.0" +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + union-value@^1.0.0, union-value@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -29468,7 +29480,7 @@ unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.2, unist- unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" -unist-util-visit@^1.3.0: +unist-util-visit@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== From 49153fc8ffc39f9ee568c926971340ae9e558247 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 21:32:32 +0100 Subject: [PATCH 42/52] fix(NA): eslint check --- .../synthetics/components/common/components/view_document.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx index a37a5d8afd17e..591c91a902146 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/view_document.tsx @@ -53,6 +53,7 @@ export const ViewDocument = ({ ping }: { ping: Ping }) => { return ( <> { From 68f2adf1b19b77ba9e00c7abfd572a09d12792da Mon Sep 17 00:00:00 2001 From: Brad White Date: Tue, 5 Sep 2023 15:36:35 -0600 Subject: [PATCH 43/52] Add waitForReady to base config for FTR serverless (#165522) ## Summary `waitForReady` was added in #165467. This PR utilizes it so that FTR doesn't continue with starting Kibana until ES has reported its ready. We get quite a few of [these errors](https://buildkite.com/elastic/kibana-pull-request/builds/155832#018a5223-a3f7-4a43-990d-004ca465ab84/2350-2452) every time, and it could be misleading. It adds 20-30s to startup time. --------- Co-authored-by: Tiago Costa --- packages/kbn-es/src/utils/docker.ts | 51 +++++++++++++++++---- packages/kbn-test/src/es/test_es_cluster.ts | 1 + 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index 01db89a14c6ab..7a014d9fc19b9 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -10,11 +10,16 @@ import execa from 'execa'; import fs from 'fs'; import Fsp from 'fs/promises'; import { resolve, basename, join } from 'path'; -import { Client, HttpConnection } from '@elastic/elasticsearch'; +import { Client, ClientOptions, HttpConnection } from '@elastic/elasticsearch'; import { ToolingLog } from '@kbn/tooling-log'; import { kibanaPackageJson as pkg, REPO_ROOT } from '@kbn/repo-info'; -import { ES_P12_PASSWORD, ES_P12_PATH } from '@kbn/dev-utils'; +import { + CA_CERT_PATH, + ES_P12_PASSWORD, + ES_P12_PATH, + kibanaDevServiceAccount, +} from '@kbn/dev-utils'; import { createCliError } from '../errors'; import { EsClusterExecOptions } from '../cluster_exec_options'; @@ -547,19 +552,21 @@ export async function runServerlessEsNode( ); } -function getESClient( - { node }: { node: string } = { node: `http://localhost:${DEFAULT_PORT}` } -): Client { +function getESClient(clientOptions: ClientOptions): Client { return new Client({ - node, Connection: HttpConnection, + ...clientOptions, }); } const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); -async function waitUntilClusterReady(timeoutMs = 60 * 1000): Promise { +async function waitUntilClusterReady( + clientOptions: ClientOptions, + timeoutMs = 60 * 1000 +): Promise { const started = Date.now(); - const client = getESClient(); + const client = getESClient(clientOptions); + while (started + timeoutMs > Date.now()) { try { await client.info(); @@ -579,6 +586,7 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO await setupDocker({ log, image, options }); const volumeCmd = await setupServerlessVolumes(log, options); + const portCmd = resolvePort(options); const nodeNames = await Promise.all( SERVERLESS_NODES.map(async (node, i) => { @@ -593,7 +601,7 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO ), options ), - i === 0 ? resolvePort(options) : [], + i === 0 ? portCmd : [], volumeCmd ), }); @@ -621,7 +629,30 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO if (options.waitForReady) { log.info('Waiting until ES is ready to serve requests...'); - await waitUntilClusterReady(); + + const esNodeUrl = `${options.ssl ? 'https' : 'http'}://${portCmd[1].substring( + 0, + portCmd[1].lastIndexOf(':') + )}`; + + await waitUntilClusterReady({ + node: esNodeUrl, + ...(options.ssl + ? { + auth: { bearer: kibanaDevServiceAccount.token }, + tls: { + ca: [fs.readFileSync(CA_CERT_PATH)], + // NOTE: Even though we've added ca into the tls options, we are using 127.0.0.1 instead of localhost + // for the ip which is not validated. As such we are getting the error + // Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list: + // To work around that we are overriding the function checkServerIdentity too + checkServerIdentity: () => { + return undefined; + }, + }, + } + : {}), + }); log.success('ES is ready'); } diff --git a/packages/kbn-test/src/es/test_es_cluster.ts b/packages/kbn-test/src/es/test_es_cluster.ts index 580840b6b35a8..31efd5ef709e8 100644 --- a/packages/kbn-test/src/es/test_es_cluster.ts +++ b/packages/kbn-test/src/es/test_es_cluster.ts @@ -238,6 +238,7 @@ export function createTestEsCluster< background: true, files, kill: true, // likely don't need this but avoids any issues where the ESS cluster wasn't cleaned up + waitForReady: true, }); } else if (Path.isAbsolute(esFrom)) { installPath = esFrom; From 4d47b49f104ad91aacfa8c937a18952342f4da16 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 5 Sep 2023 15:31:57 -0700 Subject: [PATCH 44/52] [DOCS] Automate Opsgenie connector screenshots (#165265) --- .../connectors/action-types/opsgenie.asciidoc | 2 ++ .../connectors/images/opsgenie-connector.png | Bin 55074 -> 181577 bytes .../images/opsgenie-params-test.png | Bin 56953 -> 145875 bytes .../stack_connectors/connector_types.ts | 13 +++++++++++++ 4 files changed, 15 insertions(+) diff --git a/docs/management/connectors/action-types/opsgenie.asciidoc b/docs/management/connectors/action-types/opsgenie.asciidoc index 817acdfb135d4..e7cb784ca31fc 100644 --- a/docs/management/connectors/action-types/opsgenie.asciidoc +++ b/docs/management/connectors/action-types/opsgenie.asciidoc @@ -15,6 +15,7 @@ or as needed when you're creating a rule. For example: [role="screenshot"] image::management/connectors/images/opsgenie-connector.png[Opsgenie connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[opsgenie-connector-configuration]] @@ -37,6 +38,7 @@ as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/opsgenie-params-test.png[Opsgenie params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. The Opsgenie connector supports two types of actions: Create alert and Close alert. The properties supported for each action are different because Opsgenie defines different properties for each operation. diff --git a/docs/management/connectors/images/opsgenie-connector.png b/docs/management/connectors/images/opsgenie-connector.png index ccb08b27d69344ec1f0f4bc833969bb7cf253e1b..29b9db891a5d59c9aff07b667bf692349c6dfc43 100644 GIT binary patch literal 181577 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%0AsSv)Jk&tz1s_*}d=+ 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

i&5?V5OjI-&;z< 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 z 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 z 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 Se>WW9@8JVw+2Z?8{r(SATjNpy diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts index 90fe6e7749840..0f0a2e40fba00 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts @@ -186,5 +186,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await commonScreenshots.takeScreenshot('pagerduty-params-test', screenshotDirectories); await testSubjects.click('euiFlyoutCloseButton'); }); + + it('opsgenie connector screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('opsgenie'); + await testSubjects.setValue('nameInput', 'Opsgenie test connector'); + await testSubjects.setValue('secrets.apiKey-input', 'testkey'); + await commonScreenshots.takeScreenshot('opsgenie-connector', screenshotDirectories); + await testSubjects.click('create-connector-flyout-save-test-btn'); + await testSubjects.click('toastCloseButton'); + await commonScreenshots.takeScreenshot('opsgenie-params-test', screenshotDirectories); + await testSubjects.click('euiFlyoutCloseButton'); + }); }); } From 2d8c8c16c43e918788e8ce4b1dfad745d48a80a9 Mon Sep 17 00:00:00 2001 From: Youhei Sakurai Date: Wed, 6 Sep 2023 10:32:07 +0900 Subject: [PATCH 45/52] Add autocomplete for knn in search query (#165531) ## Summary This PR adds autocomplete for knn in search query. ![autocomplete-for-knn](https://github.com/elastic/kibana/assets/721858/3e185db5-f132-4865-9ca0-245af71ea9bd) Closes #165529 ### 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 ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ## Release note Improves autocomplete to suggest knn in search query --- .../server/lib/spec_definitions/js/search.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/plugins/console/server/lib/spec_definitions/js/search.ts b/src/plugins/console/server/lib/spec_definitions/js/search.ts index 25e1a782fa0a6..6dc30ba7f8906 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/search.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/search.ts @@ -222,6 +222,37 @@ export const search = (specService: SpecDefinitionsService) => { timeout: '1s', version: { __one_of: [true, false] }, track_total_hits: { __one_of: [true, false] }, + knn: { + __template: { + field: '', + k: 10, + num_candidates: 100, + }, + __one_of: [ + { + field: '{field}', + filter: { __scope_link: 'GLOBAL.filter' }, + k: 10, + num_candidates: 100, + query_vector: [], + query_vector_builder: {}, + similarity: { __one_of: ['l2_norm', 'cosine', 'dot_product'] }, + boost: 1.0, + }, + [ + { + field: '{field}', + filter: { __scope_link: 'GLOBAL.filter' }, + k: 10, + num_candidates: 100, + query_vector: [], + query_vector_builder: {}, + similarity: { __one_of: ['l2_norm', 'cosine', 'dot_product'] }, + boost: 1.0, + }, + ], + ], + }, }, }); From 434be0c759c77ad0988ef5e122b14bef8328d530 Mon Sep 17 00:00:00 2001 From: Youhei Sakurai Date: Wed, 6 Sep 2023 10:32:27 +0900 Subject: [PATCH 46/52] Change to not prompt autocomplete in the end triple quotes (#165535) ## Summary This PR stops prompting autocomplete in the middle of the end triple quotes. ![not-prompt-autocomplete-in-triple-quotes](https://github.com/elastic/kibana/assets/721858/14a74b6e-985c-4739-99a9-4f3232c305b5) Closes #124084 ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) `backport:skip` because the bug is trivial. ## Release note Fixes autocomplete not to be prompt between the triple quotes --- src/plugins/console/public/lib/autocomplete/autocomplete.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index 04634e635ac12..167a0e0ab1bd3 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -1056,6 +1056,12 @@ export default function ({ return context; } + const t = editor.getTokenAt(pos); + if (t && t.type === 'punctuation.end_triple_quote' && pos.column !== t.position.column + 3) { + // skip to populate context as the current position is not on the edge of end_triple_quote + return context; + } + // needed for scope linking + global term resolving context.endpointComponentResolver = getEndpointBodyCompleteComponents; context.globalComponentResolver = getGlobalAutocompleteComponents; From 9b963bfe337737555d302db78aa3daa81ea9af41 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 5 Sep 2023 18:32:50 -0700 Subject: [PATCH 47/52] [DOCS] Move preconfigured index connector details (#165277) --- .../connector-apis-passthru.asciidoc | 2 +- .../connectors/action-types/index.asciidoc | 74 ++---------------- ...pre-configured-alert-history-connector.png | Bin 163742 -> 152201 bytes .../pre-configured-connectors.asciidoc | 62 ++++++++++++--- docs/settings/alert-action-settings.asciidoc | 9 +++ packages/kbn-doc-links/src/get_doc_links.ts | 2 +- .../plugins/actions/docs/openapi/bundled.json | 2 +- .../plugins/actions/docs/openapi/bundled.yaml | 2 +- .../schemas/config_properties_index.yaml | 2 +- 9 files changed, 75 insertions(+), 80 deletions(-) diff --git a/docs/api-generated/connectors/connector-apis-passthru.asciidoc b/docs/api-generated/connectors/connector-apis-passthru.asciidoc index f5128f88f1b1e..aefb065281d3a 100644 --- a/docs/api-generated/connectors/connector-apis-passthru.asciidoc +++ b/docs/api-generated/connectors/connector-apis-passthru.asciidoc @@ -1389,7 +1389,7 @@ Any modifications made to this file will be overwritten.

config_properties_index - Connector request properties for an index connector Up

Defines properties for connectors when type is .index.
-
executionTimeField (optional)
String Specifies a field that will contain the time the alert condition was detected.
+
executionTimeField (optional)
String A field that indicates when the document was indexed.
index
String The Elasticsearch index to be written to.
refresh (optional)
Boolean The refresh policy for the write request, which affects when changes are made visible to search. Refer to the refresh setting for Elasticsearch document APIs.
diff --git a/docs/management/connectors/action-types/index.asciidoc b/docs/management/connectors/action-types/index.asciidoc index 87c7494df23ea..5a09ab2d23c5f 100644 --- a/docs/management/connectors/action-types/index.asciidoc +++ b/docs/management/connectors/action-types/index.asciidoc @@ -3,13 +3,13 @@ ++++ Index ++++ +:frontmatter-description: Add a connector that can add documents to {es} indices. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] -An index connector indexes a document into {es}. -You can create index connectors in {kib} or by using the -<>. Alternatively, you can use the <>. -If you are running {kib} on-prem, you can also create more preconfigured index -connectors. +An index connector indexes a document into {es}. [float] [[define-index-ui]] @@ -26,72 +26,14 @@ image::management/connectors/images/index-connector.png[Index connector] [[index-connector-configuration]] ==== Connector configuration -Index connectors must have a name and an {es} index. You can optionally set the time field, which contains the -details about when each alert condition was detected. - -[float] -[[preconfigured-index-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-index: - name: preconfigured-index-connector-type - actionTypeId: .index - config: - index: .kibana - executionTimeField: my-field --- - -For more information, go to <>. - -[float] -[[preconfigured-connector-alert-history]] -==== Preconfigured alert history {es} index connector - -preview::[] - -{kib} offers a preconfigured index connector to facilitate indexing active alert -data into {es}. - -To use this connector, set -<> to `true`. - -When you subsequently create rules, you can use the -`Alert history Elasticsearch index (preconfigured)` connector. - -[role="screenshot"] -image::images/pre-configured-alert-history-connector.png[Select pre-configured alert history connectors] - -Documents are indexed using a preconfigured schema that captures the -<> available for the rule. -By default, these documents are indexed into the `kibana-alert-history-default` -index, but you can specify a different index. Index names must start with -`kibana-alert-history-` to take advantage of the preconfigured alert history -index template. - -[IMPORTANT] -==== -* To write documents to the preconfigured index, you must have `all` or `write` -privileges to the `kibana-alert-history-*` indices. Refer to -<> for more information. -* The `kibana-alert-history-*` indices are not configured to use ILM so they must -be maintained manually. If the index size grows large, consider using the -{ref}/docs-delete-by-query.html[delete by query] API to clean up older documents -in the index. -==== +Index connectors must have a name and an {es} index. +You can optionally choose a field that indicates when the document was indexed. [float] [[index-action-configuration]] === Test connectors -You can test connectors with the <> or -as you're creating or editing the connector in {kib}. For example: +You can test connectors as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/index-params-test.png[Index params test] diff --git a/docs/management/connectors/images/pre-configured-alert-history-connector.png b/docs/management/connectors/images/pre-configured-alert-history-connector.png index 98cfbd0f39f7b2ce3060564ac344f7ab4864008b..dd72a96a761c9d5f98914cf2d69a771d24cf7ec0 100644 GIT binary patch literal 152201 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 Qy#xG_mQ;{{iyM9TKe2p;f&c&j literal 163742 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�yg&^PN`S)CH+tK}wCdGGzWw2#{V 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 T5;*HgfJ;~N_6>}>E$aUObD(5r diff --git a/docs/management/connectors/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc index ceaf771a58f9e..443fda6cba218 100644 --- a/docs/management/connectors/pre-configured-connectors.asciidoc +++ b/docs/management/connectors/pre-configured-connectors.asciidoc @@ -57,36 +57,80 @@ Sensitive properties, such as passwords, can also be stored in the <>. ============================================== +[float] +[[managing-pre-configured-connectors]] +=== View preconfigured connectors + +When you open the main menu, click *{stack-manage-app} > {connectors-ui}*. +Preconfigured connectors appear regardless of which space you are in. +They are tagged as “preconfigured”, and you cannot delete them. + +[role="screenshot"] +image::images/preconfigured-connectors-managing.png[Connectors managing tab with pre-configured] + +Clicking a preconfigured connector shows the description, but not the configuration. + [float] [[build-in-preconfigured-connectors]] === Built-in preconfigured connectors {kib} provides the following built-in preconfigured connectors: -* <> +* <> * <> [float] -[[managing-pre-configured-connectors]] -=== View preconfigured connectors +[[preconfigured-connector-alert-history]] +==== Preconfigured alert history {es} index connector -When you open the main menu, click *{stack-manage-app} > {connectors-ui}*. -Preconfigured connectors appear regardless of which space you are -in. They are tagged as “preconfigured”, and you cannot delete them. +preview::[] + +{kib} offers a preconfigured index connector to facilitate indexing active alert data into {es}. +To use this connector, set <> to `true`. + +When you subsequently create rules, you can use the `Alert history Elasticsearch index (preconfigured)` connector. [role="screenshot"] -image::images/preconfigured-connectors-managing.png[Connectors managing tab with pre-configured] +image::images/pre-configured-alert-history-connector.png[Creating a rule action that uses the pre-configured alert history connector] -Clicking a preconfigured connector shows the description, but not the -configuration. +Documents are indexed using a preconfigured schema that captures the <> available for the rule. +By default, these documents are indexed into the `kibana-alert-history-default` index, but you can specify a different index. +Index names must start with `kibana-alert-history-` to take advantage of the preconfigured alert history index template. + +[IMPORTANT] +==== +* To write documents to the preconfigured index, you must have `all` or `write` privileges to the `kibana-alert-history-*` indices. +* The `kibana-alert-history-*` indices are not configured to use ILM so they must be maintained manually. If the index size grows large, consider using the {ref}/docs-delete-by-query.html[delete by query] API to clean up older documents in the index. +==== [float] === Examples +* <> * <> * <> * <> + +[float] +[[preconfigured-index-configuration]] +==== Index connectors + +The following example creates a <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-index: + name: preconfigured-index-connector-type + actionTypeId: .index + config: + index: .kibana <1> + executionTimeField: my-field <2> +-- +<1> The {es} index to be written to. +<2> A field that indicates when the document was indexed. + [float] [[preconfigured-opsgenie-configuration]] ==== {opsgenie} connectors diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 9ab4058d35e30..c7a43932fa1f8 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -252,6 +252,9 @@ Specifies configuration details that are specific to the type of preconfigured c The type of preconfigured connector. For example: `.email`, `.index`, `.opsgenie`, `.server-log`, `.resilient`, `.slack`, and `.webhook`. +`xpack.actions.preconfigured..config`:: +The configuration details, which are specific to the type of preconfigured connector. + `xpack.actions.preconfigured..config.apiUrl`:: A configuration URL that varies by connector: + @@ -261,6 +264,12 @@ A configuration URL that varies by connector: NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. -- +`xpack.actions.preconfigured..config.executionTimeField`:: +For an <>, a field that indicates when the document was indexed. + +`xpack.actions.preconfigured..config.index`:: +For an <>, specifies the {es} index. + `xpack.actions.preconfigured..name`:: The name of the preconfigured connector. diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index a8d63137fa0a9..147b26fc6e03a 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -552,7 +552,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { maintenanceWindows: `${KIBANA_DOCS}maintenance-windows.html`, pagerDutyAction: `${KIBANA_DOCS}pagerduty-action-type.html`, preconfiguredConnectors: `${KIBANA_DOCS}pre-configured-connectors.html`, - preconfiguredAlertHistoryConnector: `${KIBANA_DOCS}index-action-type.html#preconfigured-connector-alert-history`, + preconfiguredAlertHistoryConnector: `${KIBANA_DOCS}pre-configured-connectors.html#preconfigured-connector-alert-history`, serviceNowAction: `${KIBANA_DOCS}servicenow-action-type.html#configuring-servicenow`, serviceNowSIRAction: `${KIBANA_DOCS}servicenow-sir-action-type.html`, setupPrerequisites: `${KIBANA_DOCS}alerting-setup.html#alerting-prerequisites`, diff --git a/x-pack/plugins/actions/docs/openapi/bundled.json b/x-pack/plugins/actions/docs/openapi/bundled.json index 67191da3842d6..ebd18fad973a3 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.json +++ b/x-pack/plugins/actions/docs/openapi/bundled.json @@ -1659,7 +1659,7 @@ "type": "object", "properties": { "executionTimeField": { - "description": "Specifies a field that will contain the time the alert condition was detected.", + "description": "A field that indicates when the document was indexed.", "default": null, "type": "string", "nullable": true diff --git a/x-pack/plugins/actions/docs/openapi/bundled.yaml b/x-pack/plugins/actions/docs/openapi/bundled.yaml index 5da86f4563a6c..39a6bea27385f 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.yaml +++ b/x-pack/plugins/actions/docs/openapi/bundled.yaml @@ -1028,7 +1028,7 @@ components: type: object properties: executionTimeField: - description: Specifies a field that will contain the time the alert condition was detected. + description: A field that indicates when the document was indexed. default: null type: string nullable: true diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml index c82f775fe15dc..6c335b166d20a 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml @@ -5,7 +5,7 @@ description: Defines properties for connectors when type is `.index`. type: object properties: executionTimeField: - description: Specifies a field that will contain the time the alert condition was detected. + description: A field that indicates when the document was indexed. default: null type: string nullable: true From 24cbba299787c9d3a5108fe2e2c6cc9f4a73b362 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 04:24:59 +0100 Subject: [PATCH 48/52] skip flaky serverless test --- .../functional/test_suites/common/index_management/indices.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 02b6acdfbfa56..b4473f0ba16a5 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 @@ -15,7 +15,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); const retry = getService('retry'); - describe('Indices', function () { + // Flaky on serverless + describe.skip('Indices', function () { before(async () => { await security.testUser.setRoles(['index_management_user']); await pageObjects.common.navigateToApp('indexManagement'); From c9958485facc282294916508b2c5b766555c3205 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 6 Sep 2023 01:04:20 -0400 Subject: [PATCH 49/52] [api-docs] 2023-09-06 Daily api_docs build (#165794) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/452 --- api_docs/actions.devdocs.json | 32 + api_docs/actions.mdx | 4 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- 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.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.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 4 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.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 | 556 +----------------- 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.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.devdocs.json | 28 + api_docs/kbn_search_api_panels.mdx | 4 +- 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.devdocs.json | 56 ++ api_docs/kbn_slo_schema.mdx | 4 +- 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.devdocs.json | 144 +++++ api_docs/kbn_text_based_editor.mdx | 4 +- 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.devdocs.json | 8 - 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.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/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 | 64 +- api_docs/observability.mdx | 4 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 20 +- 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.devdocs.json | 194 +++++- api_docs/stack_alerts.mdx | 7 +- 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.devdocs.json | 14 + api_docs/text_based_languages.mdx | 4 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 61 ++ api_docs/triggers_actions_ui.mdx | 4 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 581 files changed, 1202 insertions(+), 1136 deletions(-) diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index ab2fd467cd958..68e7723fc7fa1 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -3509,6 +3509,38 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.setEnabledConnectorTypes", + "type": "Function", + "tags": [], + "label": "setEnabledConnectorTypes", + "description": [], + "signature": [ + "(connectorTypes: string[]) => void" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.setEnabledConnectorTypes.$1", + "type": "Array", + "tags": [], + "label": "connectorTypes", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "lifecycle": "setup", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 1675e5db1912c..0985f86300e69 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.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 | |-------------------|-----------|------------------------|-----------------| -| 267 | 0 | 261 | 30 | +| 269 | 0 | 263 | 30 | ## Client diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 17d00954ff5e6..4db3eb7532c53 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-05 +date: 2023-09-06 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 e69040bbcb687..85d9b71699e77 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 74220f3e48d63..319891bcf513d 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 1f3e0da71d41a..a895f490187fb 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-05 +date: 2023-09-06 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 7e0cb19b76349..2373d1d20cfac 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-05 +date: 2023-09-06 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 7c9e072b32a5a..5a2e02e21714f 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-05 +date: 2023-09-06 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 b095e025ebb25..71690f87c1a92 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-05 +date: 2023-09-06 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 b35d2c259da58..cc1fe5f9fa748 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-05 +date: 2023-09-06 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 391741661db72..f8d7b2a27d369 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-05 +date: 2023-09-06 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 34f1b185e06bc..1af3539ef5ac9 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-05 +date: 2023-09-06 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 80664fabad87d..d3d61657ed676 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-05 +date: 2023-09-06 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 73b5ef4c2517e..01f2089596b6a 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-05 +date: 2023-09-06 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 8b0f6a65ddd8e..be0fb6438525b 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-05 +date: 2023-09-06 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 89e27b560261f..88d1e38aa0e5a 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-05 +date: 2023-09-06 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 5410157a3a4e8..b6124e08cd350 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-05 +date: 2023-09-06 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 765d3226f9c3a..4e21c123a96e8 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-05 +date: 2023-09-06 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 e0b54f328ba2c..8efe7de4747d1 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-05 +date: 2023-09-06 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 113f43f209db5..4c8df64fa2cfc 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-05 +date: 2023-09-06 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 6318a4faa542c..4940ef352585c 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-05 +date: 2023-09-06 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 9886b7a3ea00b..3237478bf66c9 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-05 +date: 2023-09-06 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 a5dd74b6330d1..2cb7a44d97fd0 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-05 +date: 2023-09-06 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 66ba3a87e78bb..d13956de9f217 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-05 +date: 2023-09-06 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 91b1eb51f287b..12a480db48c7d 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-05 +date: 2023-09-06 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 a45b5025b2fe9..74994c4829bec 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 70949b17f4987..46531c9a02904 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-05 +date: 2023-09-06 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 62d0861bbbf19..310e48213af7a 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-05 +date: 2023-09-06 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 fde4b2f40f862..08230c72660ac 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-05 +date: 2023-09-06 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 d2fa815d40409..a29d62bd9c5ae 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-05 +date: 2023-09-06 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 c10490b5d7a9a..187c9712e4b69 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-05 +date: 2023-09-06 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 6e41bcc12d78a..07264a9d936a1 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 0d85b10f37cbd..9e13e90657c1c 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index dec5ec2987ed8..4fa0316ec8e5a 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-05 +date: 2023-09-06 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 a01b818334271..10632b2d4896b 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index b09904070bf9a..195314fc734f8 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -921,7 +921,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | | | [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=title) | - | | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | -| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [workspace_top_nav_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx#:~:text=toMountPoint), [workspace_top_nav_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint) | - | +| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint) | - | | | [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [source_picker.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/source_picker.tsx#:~:text=includeFields) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index bbdf4234fb74b..a325fd6f43f55 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 6b0064c8f0858..de965350e87ad 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index a63ae77760646..c74856cd3ff5e 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 675890ffa1ac8..9f6ff44667e3a 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-05 +date: 2023-09-06 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 90e742bda6198..97310dfc057fe 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-05 +date: 2023-09-06 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 ace6dbb2a4c7d..ec0bdf9631439 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-05 +date: 2023-09-06 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 be41e8d5bc699..06a56b891b64e 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-05 +date: 2023-09-06 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 8fd457f066ffe..ec718fa5655d2 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-05 +date: 2023-09-06 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 cf6cd38a5251c..4f83486d558e2 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 07418305cdc71..5499ef93aa543 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index f5aaa1ac5bd5c..0f19677a6dad2 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-05 +date: 2023-09-06 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 d72d41002cf5d..2d036d98c176a 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-05 +date: 2023-09-06 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 edabbf7f2b416..28d0b86a754bf 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-05 +date: 2023-09-06 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 d977e9d3c6444..872e71e7d9514 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-05 +date: 2023-09-06 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 cf353aeb1663c..2ebc1a0477ab0 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-05 +date: 2023-09-06 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 4dc1d165e75fb..dbcfa79c17407 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-05 +date: 2023-09-06 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 bd676f00bd162..92cc5b1de1d4f 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-05 +date: 2023-09-06 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 e07f5ea5cd63f..3088aaeb30bfe 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-05 +date: 2023-09-06 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 38013982ab985..6069e11e72648 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-05 +date: 2023-09-06 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 0e8902fbf0a0f..a99de7d753807 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-05 +date: 2023-09-06 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 fcae81f5883cf..db6de17efd135 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-05 +date: 2023-09-06 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 039b050b32bc6..8e515e738c6df 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-05 +date: 2023-09-06 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 9f2f3434acb56..773380b5de18f 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-05 +date: 2023-09-06 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 8f9d323b53023..0d0470eb67888 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-05 +date: 2023-09-06 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 f3e7d5eeaee3c..105172011496c 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-05 +date: 2023-09-06 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 214d3d21153e2..1101379011fb9 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-05 +date: 2023-09-06 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 7f245d3889e1f..054d4560a99b0 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-05 +date: 2023-09-06 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 ce5cf4cc0939f..74a4cd4d131bf 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-05 +date: 2023-09-06 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 db13ee18b015e..fbfd9a1d0855f 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-05 +date: 2023-09-06 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 bc8dff8530b8e..176f7897ba0aa 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 7cb2ca900ab10..d9b7d3b411174 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 54c4bb33663b7..3eb1600270481 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-05 +date: 2023-09-06 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 fe86c6e0074a2..dd194c513358c 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 58bf0969ecb00..02687c281e11c 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 53425f7e23d24..eb73dfcd24143 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-05 +date: 2023-09-06 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 a1230a39ce3f2..ea77ddbecac91 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-05 +date: 2023-09-06 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 9915ed0e2802a..689e76b0b9cad 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-05 +date: 2023-09-06 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 586539ca0d0aa..99620afbd13a1 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-05 +date: 2023-09-06 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 c394ca0f93615..942abb35cb86f 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 25a6849dd773c..d9904dab581e3 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 0cccce355c006..90c41da824f8e 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-05 +date: 2023-09-06 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 5b47285b9edcd..b889647d6b02a 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-05 +date: 2023-09-06 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 c3c4259afdfb1..33964bc6de443 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-05 +date: 2023-09-06 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 9d13f55b01c3d..874707881804d 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-05 +date: 2023-09-06 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 6e51456817f54..05a81b1a8feef 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-05 +date: 2023-09-06 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 9bb30d89b5db3..677382c6e0405 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-05 +date: 2023-09-06 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 c60de50828f02..8a6ccbef94e04 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-05 +date: 2023-09-06 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 45459e55d57d2..c29ef9f2d3687 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-05 +date: 2023-09-06 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 64b3d4ae9600c..20c1b38ed8419 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-05 +date: 2023-09-06 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 0387bc14aa30c..2e4bcf1093c08 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-05 +date: 2023-09-06 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 a2dfb1d49ac93..5f117aad37f87 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-05 +date: 2023-09-06 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 c36b7b83b967c..7bbdd9182c6a8 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-05 +date: 2023-09-06 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 053d4313a1174..91b41b353c85e 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-05 +date: 2023-09-06 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 5b8013b126b1a..b5f1c3fde5c2e 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-05 +date: 2023-09-06 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 c2055ef8d02bc..df1585a9557ba 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-05 +date: 2023-09-06 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 df61103a09941..fdd2bd041f9fc 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-05 +date: 2023-09-06 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 fb844e6b7c754..9025efdcccbee 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-05 +date: 2023-09-06 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 30c1a22a8ec4a..22ba77889cc08 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-05 +date: 2023-09-06 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 09007f8b0e82e..2145de70fd218 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-05 +date: 2023-09-06 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 a04a564cde49c..19469c8e8373b 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-05 +date: 2023-09-06 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 ce523adf57985..e064ff507b39b 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-05 +date: 2023-09-06 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 9f4d642a9f4ef..c817f89501300 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-05 +date: 2023-09-06 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 82da938a2e3b9..cc6c2e7c69890 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-05 +date: 2023-09-06 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 b14c9ededd480..71e1f390d6646 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-05 +date: 2023-09-06 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 e49db93b653a5..6dcb11df62f92 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-05 +date: 2023-09-06 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 6b8ed504dc92d..6cd8345f78503 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-05 +date: 2023-09-06 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 a5c29e677ec23..723bb8a4741b9 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-05 +date: 2023-09-06 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 50523b6543892..c24fd85553e1a 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-05 +date: 2023-09-06 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 30878509c9908..f92216a33e2c4 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-05 +date: 2023-09-06 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 001c90e047fae..aa3b7bac022d5 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-05 +date: 2023-09-06 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 909659dcf4b32..83331cb9c1a73 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-05 +date: 2023-09-06 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 4d1b33ff13923..5f1dc03899307 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-05 +date: 2023-09-06 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 2d3190c184aa0..27a106cc7a8e8 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-05 +date: 2023-09-06 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 a044b568a4c6d..bc12eabd449a3 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-05 +date: 2023-09-06 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 7dff56ea557ef..8b9f1735d0551 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-05 +date: 2023-09-06 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 d98cbfcac9f03..f0e644b3f6a72 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-05 +date: 2023-09-06 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 571943ac43efc..ca6e85734b249 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-05 +date: 2023-09-06 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 f840d96fb96a8..a2e394b5ea713 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-05 +date: 2023-09-06 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 80dc326e0b499..c0f56347084ff 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-05 +date: 2023-09-06 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 59ee0aee26e27..2ddb0a46a82c6 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-05 +date: 2023-09-06 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 da3749b332c70..71e1743ff2a9f 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-05 +date: 2023-09-06 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 abf01e9b87809..b8a5f7f52d98c 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-05 +date: 2023-09-06 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 eeafd6d571c92..97a38610e99ef 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-05 +date: 2023-09-06 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 56a4f9835d002..55f676eea5f44 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-05 +date: 2023-09-06 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 d62cfc6e67a36..09a7677e1b56a 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-05 +date: 2023-09-06 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 c734b69e04e11..54e73f3583b24 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-05 +date: 2023-09-06 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 af02ffe0dc431..f852dd94d67a4 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-05 +date: 2023-09-06 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 0c91163570254..fda9e4147f3d7 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-05 +date: 2023-09-06 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 2b4ca8a154b87..7b7bd2ff59c42 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-05 +date: 2023-09-06 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 839b32626a245..253bd423024a6 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-05 +date: 2023-09-06 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 498d5d98e4a90..dc7cb08859ada 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-05 +date: 2023-09-06 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 53cde53b4ed52..b43365fa7cf9d 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-05 +date: 2023-09-06 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 211b46e09eabd..2989abbfb45b1 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-05 +date: 2023-09-06 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 14b282a273f22..4bbc9f2727889 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-05 +date: 2023-09-06 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 315c7acf87a17..3057b026516fb 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-05 +date: 2023-09-06 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 9b9547190aa86..a41a066e3116d 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-05 +date: 2023-09-06 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 99e3e0ed02fa2..b1c4d5c02c3fe 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-05 +date: 2023-09-06 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 4e1e2c7844df3..2cec1dd239207 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-05 +date: 2023-09-06 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 647817f602e86..c0047306b8f83 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-05 +date: 2023-09-06 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 5a469f8fb6cc0..5cfa7b3df9daf 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-05 +date: 2023-09-06 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 fc98432fd11db..ddc641e1eee49 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-05 +date: 2023-09-06 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 707a34374771c..199ea676a211b 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-05 +date: 2023-09-06 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 ebfd9644f1ffa..87cc2be55db43 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-05 +date: 2023-09-06 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 86c1b2a59a51c..faed4a14018dc 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-05 +date: 2023-09-06 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 941f7eeab85a6..60d510d551c91 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-05 +date: 2023-09-06 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 ec369f63898dd..b878d1a7ab151 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-05 +date: 2023-09-06 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 e392692c7a0ce..5e2fc1372babd 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-05 +date: 2023-09-06 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 8871af521c930..8947bc93d11a1 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-05 +date: 2023-09-06 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 6b56be8c38b51..b9b47c43d59eb 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-05 +date: 2023-09-06 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 e667a125a4268..fbd85c0ed6b47 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-05 +date: 2023-09-06 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 9127767aba5b2..f02e9dcb86806 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-05 +date: 2023-09-06 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 8cf713c6da2f1..d42cc7ed4822e 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-05 +date: 2023-09-06 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 f1ef685c162ad..e72aa5b4728de 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-05 +date: 2023-09-06 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 324b3291c428b..89bc353e5baf8 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-05 +date: 2023-09-06 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 bd3bb18d01281..00d1054a0a915 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-05 +date: 2023-09-06 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 f72e86ef83440..0a266520ad02f 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-05 +date: 2023-09-06 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 4d968a10b1371..5befa6f5952ca 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-05 +date: 2023-09-06 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 aadb7ee12c9f5..f0b40dbdb50ad 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-05 +date: 2023-09-06 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 5891024b67a45..8fd99fbc6eee7 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-05 +date: 2023-09-06 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 f5369679076f2..0c10b629b805f 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-05 +date: 2023-09-06 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 a4628267a3b23..d9111ff5f70fe 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-05 +date: 2023-09-06 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 af7d968100a5a..84ffe2a552c1e 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-05 +date: 2023-09-06 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 6dffcd5bf011d..2c3f8173e7951 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-05 +date: 2023-09-06 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 9f3b157a0e7ad..d00a1502a7330 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-05 +date: 2023-09-06 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 7196d5b59d0b4..ac9c6838058a5 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-05 +date: 2023-09-06 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 dbc1eaec1fb49..cd0f5dfbc331c 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-05 +date: 2023-09-06 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 c353870e9bd1c..5c9ba89d1d3cc 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-05 +date: 2023-09-06 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 1a5426df061ed..8ddec293e6234 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-05 +date: 2023-09-06 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 ea6fd0531228d..e41cd33e69f2e 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-05 +date: 2023-09-06 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 bca77c3503b45..d2b49ab6107b0 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-05 +date: 2023-09-06 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 376f67dce7275..f91003ff0eb4e 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-05 +date: 2023-09-06 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 ea1da3f4749f4..a6e016cf61aeb 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-05 +date: 2023-09-06 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 bf0e09898be90..b37e85685210c 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-05 +date: 2023-09-06 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 5775b5d5f9b73..6c2ff683c7bae 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-05 +date: 2023-09-06 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 9a5c8dc842acb..b64ba2f04dd64 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-05 +date: 2023-09-06 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 24b454a40a72b..a8828523b867c 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-05 +date: 2023-09-06 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 2323310976cdf..8493514402cb1 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-05 +date: 2023-09-06 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 efa9880e343cd..5c69f0bf3be8c 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-05 +date: 2023-09-06 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 688cb85dc67d1..797af39591fed 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-05 +date: 2023-09-06 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 ed462f0b7103e..676aa7b03ec77 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-05 +date: 2023-09-06 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 9c9a2f63eab66..afc3e7d2c0f20 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-05 +date: 2023-09-06 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 f740c651d8dcf..1dc638f47b08e 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-05 +date: 2023-09-06 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 2307f7280d904..e1fc914d02688 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-05 +date: 2023-09-06 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 897affe7c09b8..af32e68b59eb9 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-05 +date: 2023-09-06 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 d4fdd95134136..b2d9f76b852a1 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-05 +date: 2023-09-06 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 87346e93af629..d36a9beb010a9 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-05 +date: 2023-09-06 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 c8dcdc45a54a4..623ad50e66332 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-05 +date: 2023-09-06 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 ef1491370a696..22c60891dfd63 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-05 +date: 2023-09-06 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 f85ebe7a68529..8cd5969d03905 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-05 +date: 2023-09-06 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 018b03c72899f..1972bc47648ab 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-05 +date: 2023-09-06 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 646cf9fd1bb02..cdf7045703aef 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3643,10 +3643,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/internal/find_tags.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/guide_state_routes.ts" @@ -4111,6 +4107,10 @@ "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts" }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/mapping.ts" @@ -4767,206 +4767,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/data_streams/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -5527,18 +5327,6 @@ "plugin": "cloudChat", "path": "x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, { "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/routes/api/get_route.test.ts" @@ -5727,14 +5515,6 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/test/helpers/router_mock.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/anonymous_access/get_capabilities.test.ts" @@ -6429,10 +6209,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/internal/bulk_delete.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts" @@ -7361,186 +7137,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/preconfiguration/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/preconfiguration/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/health_check/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/message_signing_service/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -8431,10 +8027,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/update_rule.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/plugin_state_routes.ts" @@ -8763,58 +8355,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -8939,10 +8479,6 @@ "plugin": "cases", "path": "x-pack/plugins/cases/server/routes/api/register_routes.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/update.test.ts" @@ -9153,10 +8689,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/bulk_disable_rules.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts" @@ -9201,14 +8733,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -9527,10 +9051,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/tags/delete_tag.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts" @@ -9775,54 +9295,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -13649,6 +13121,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/json_schema.ts" @@ -14425,6 +13901,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts" @@ -14761,6 +14241,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_usage_stats.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/annotations.ts" @@ -15401,6 +14885,10 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/patch_list_route.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts" @@ -15545,6 +15033,10 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/delete_list_route.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/annotations.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index d75b9c88f0d8c..9c3496ef068f3 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-05 +date: 2023-09-06 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 17ec295e2b28a..9ea6c1275a4b1 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-05 +date: 2023-09-06 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 af7530ebe2780..064a29285937d 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-05 +date: 2023-09-06 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 8c8bf1891f9f1..528a58fcd9afa 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-05 +date: 2023-09-06 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 b28afa660b41c..fdb0954f4e478 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-05 +date: 2023-09-06 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 e26626cf1aa43..4528e9b4a1544 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-05 +date: 2023-09-06 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 1dde8083861cc..776c8c619f977 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-05 +date: 2023-09-06 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 4c96d38b98734..6a06e4503c60c 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-05 +date: 2023-09-06 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 c95da94e81dd9..ce6c84a1bd946 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-05 +date: 2023-09-06 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 313d1a1cbc7ce..adca2cad222a8 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-05 +date: 2023-09-06 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 b270138d4cde2..e1023f069e005 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-05 +date: 2023-09-06 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 bfad413d0dbae..58676fb7f6427 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-05 +date: 2023-09-06 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 a3d274221d1f7..b1d24176b8cb8 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-05 +date: 2023-09-06 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 b96e16ddd9e4e..559e1fa99ab74 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-05 +date: 2023-09-06 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 4ea507f43b8d8..58cfd92adec97 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-05 +date: 2023-09-06 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 e663c9a363275..a534b7d888b56 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-05 +date: 2023-09-06 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 c1e5800d3fc35..026bf2a562778 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-05 +date: 2023-09-06 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 377505265a597..c1d0e4b35eb36 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-05 +date: 2023-09-06 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 08e6c40d3b799..e837d8eb13ab7 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-05 +date: 2023-09-06 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 374fd7a4c3600..4e6036af67658 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-05 +date: 2023-09-06 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 789f56c123186..c5886d6d47910 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-05 +date: 2023-09-06 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 9ce1103581bb2..95a75ad4c18ce 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-05 +date: 2023-09-06 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 f65dc13cd22a7..380282b4554c9 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-05 +date: 2023-09-06 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 d9393f985758f..f78d7428e9be1 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-05 +date: 2023-09-06 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 2a7dcbd5d1af9..30ff706492b45 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-05 +date: 2023-09-06 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 8701f13ca30dc..d974a7a67c19f 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-05 +date: 2023-09-06 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 8d37a662156d1..9e2e896b4df6c 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-05 +date: 2023-09-06 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 4cc7d28317be7..c665b4838b3fe 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-05 +date: 2023-09-06 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 48905d30f9cfe..61ccc1bb4249c 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-05 +date: 2023-09-06 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 afca185707beb..c26140dc1a4f2 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-05 +date: 2023-09-06 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 f6a66c5963efc..4abe76f9aa06d 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-05 +date: 2023-09-06 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 147187be6169d..8ee27b4b6d659 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-05 +date: 2023-09-06 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 831b0fa16040c..d39dbc30f0e99 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-05 +date: 2023-09-06 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 13f3e351a4e1b..79796c21f1a30 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-05 +date: 2023-09-06 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 cee4243d41ec9..287e9f8b1253a 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-05 +date: 2023-09-06 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 d0e79df85e348..d2084acdedc68 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-05 +date: 2023-09-06 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 0efde46e225c8..a04f2da24f043 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-05 +date: 2023-09-06 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 b9b84c8887fc5..7a0c4e4360ba8 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-05 +date: 2023-09-06 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 7a04d07f67c12..f6950ead9c384 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-05 +date: 2023-09-06 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 8b8849d1e1a78..63c27b4dd965f 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-05 +date: 2023-09-06 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 bde0ba3320d89..a4b85da878aa8 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-05 +date: 2023-09-06 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 c5f0137d455e2..cabbdecb8810e 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-05 +date: 2023-09-06 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 b09d5759718c2..fede8551955b7 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-05 +date: 2023-09-06 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 71ec48a5a4eb3..d5a3a3a0cadd7 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-05 +date: 2023-09-06 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 985a16b0261ea..f8899741c8460 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-05 +date: 2023-09-06 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 c3e93e7242086..1a90b731a4887 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-05 +date: 2023-09-06 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 5389c790c3889..64389307dc138 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-05 +date: 2023-09-06 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 24d6094fecad2..0f8a33bebb2e9 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-05 +date: 2023-09-06 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 3348a66f9503c..dd9f7170f150b 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-05 +date: 2023-09-06 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 00ec9085ed5b0..90e9ac5bd716d 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-05 +date: 2023-09-06 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 46cca04b8c670..a1817a6a07a17 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-05 +date: 2023-09-06 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 15a10088397da..39c4cf7af65a6 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-05 +date: 2023-09-06 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 f11d1ea3fd27b..e54de71bfcbc2 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-05 +date: 2023-09-06 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 b38bf406d436f..3ff296d3868fc 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-05 +date: 2023-09-06 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 dcc9f8b8c8e94..f6960165a3be9 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-05 +date: 2023-09-06 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 d87aa7fa00c18..f19151f739d6f 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-05 +date: 2023-09-06 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 0243585e35df1..25f1f95e6a02e 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-05 +date: 2023-09-06 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 089cd4f11e138..c937a174fb823 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-05 +date: 2023-09-06 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 0d93a2c9924c8..6e626b240d86f 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-05 +date: 2023-09-06 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 038594c4e6f50..4fd533bb4bd96 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-05 +date: 2023-09-06 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 8de8c4fc312c4..9f52c18dfbf58 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-05 +date: 2023-09-06 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 14872988849f1..9d8cb3332c731 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-05 +date: 2023-09-06 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 0707f752b2a6c..94fd11c66372d 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-05 +date: 2023-09-06 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 35c63747efecb..dda2c0825eaa3 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-05 +date: 2023-09-06 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 b13279c38b32f..a19249d60f01d 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-05 +date: 2023-09-06 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 5740bf4cbada0..c966bb6c9d67a 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-05 +date: 2023-09-06 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 3126e14f0581c..b587cc553b72a 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-05 +date: 2023-09-06 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 d2910acd94f73..1e629acc9f8dc 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-05 +date: 2023-09-06 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 caca10c2fd48f..3bb3db62ea820 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-05 +date: 2023-09-06 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 96d43fb283968..4555f0c0cd81e 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-05 +date: 2023-09-06 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 52d1fb852d224..c165846077470 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-05 +date: 2023-09-06 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 e256f3ba6d69e..a91080213c357 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-05 +date: 2023-09-06 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 c883b482a9c69..9867d7595e2d6 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-05 +date: 2023-09-06 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 513db41d2f316..49a95f55c685f 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-05 +date: 2023-09-06 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 38cfbeb018997..4f4a82e3edb6b 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-05 +date: 2023-09-06 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 cfe6994c0bbf7..9cc0c2c5ccd1b 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-05 +date: 2023-09-06 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 0bacde75c8ed3..c8480d7b9aebd 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-05 +date: 2023-09-06 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 f1671013301da..c3b16d9766a8d 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-05 +date: 2023-09-06 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 3f0b161976b96..6c6d03f53fba5 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-05 +date: 2023-09-06 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 696ae1d316070..75dc24f2e5847 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-05 +date: 2023-09-06 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 6461a930f9926..86303d6f9925b 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-05 +date: 2023-09-06 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 11e95f64326de..7585ebcdc8491 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-05 +date: 2023-09-06 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 2fff03abb2438..0ea42f83373ff 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-05 +date: 2023-09-06 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 3d8450614de08..fe1bd0e1c356e 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-05 +date: 2023-09-06 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 8a4e30bc7f65e..c29d4fa88fcb8 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-05 +date: 2023-09-06 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 bbc16de105137..c0f46d66768c2 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-05 +date: 2023-09-06 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 f2235fdee4dee..69d4bc3d102b6 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-05 +date: 2023-09-06 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 c14fe4df54dc4..50e5bd19b4768 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-05 +date: 2023-09-06 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 cd44c94dbb706..3c831c1d0ee89 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-05 +date: 2023-09-06 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 1244ed0c0da4c..78a73de5d1867 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-05 +date: 2023-09-06 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 76ecfb8d270ca..a6105789f0523 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-05 +date: 2023-09-06 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 8a115eeed4cf6..766b8051ca37a 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-05 +date: 2023-09-06 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 bda8d0b6b8ab1..cb1ffb4254106 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-05 +date: 2023-09-06 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 023e5b73ca23d..b047cb06b1511 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-05 +date: 2023-09-06 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 247745c07f508..9219e6753b699 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-05 +date: 2023-09-06 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 bb3308665a207..44e124a7514ad 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-05 +date: 2023-09-06 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 315988ced942c..f75e59835c071 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-05 +date: 2023-09-06 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 8777eb2ca54ef..0180e463d2d72 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-05 +date: 2023-09-06 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 387d6797cd5a5..840bef3ce72ef 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-05 +date: 2023-09-06 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 efaffaf33ca7c..176cd083cf18e 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-05 +date: 2023-09-06 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 ef7beaef0f6a9..0ac9edfdd54fc 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-05 +date: 2023-09-06 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 763e602b18868..b20c3bdd080da 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-05 +date: 2023-09-06 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 918307a7aea1f..113cd6a82a2b5 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-05 +date: 2023-09-06 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 8889c66a849e1..d6bc349a21507 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-05 +date: 2023-09-06 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 787be9b13f6ff..56d8fec5c0828 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-05 +date: 2023-09-06 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 d0134b6dd43c5..b9d6443d12d88 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-05 +date: 2023-09-06 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 1ee3655894d70..53a748f72b7e0 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 32a41d70a9325..e10d05ddd78de 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-05 +date: 2023-09-06 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 a276ef5f584e8..a670edb9d3018 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-05 +date: 2023-09-06 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 bd3a9ef6ceb82..23edb0ca7fe72 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-05 +date: 2023-09-06 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 ae8ce838528bd..c95007904924d 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-05 +date: 2023-09-06 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 31679eb5a4ee6..58903a3c81abd 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-05 +date: 2023-09-06 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 6af12ec235d93..10bad964f02e3 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-05 +date: 2023-09-06 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 057d553c9c272..bebee29d1038a 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-05 +date: 2023-09-06 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 2626b9b5e3793..5d064f79a07bd 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-05 +date: 2023-09-06 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 9ce008af48794..a9952ec8ee4af 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-05 +date: 2023-09-06 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 a8ab926401b82..0e57d7bc1d6bd 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-05 +date: 2023-09-06 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 34abd1a51f0fd..eec6a2e640015 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-05 +date: 2023-09-06 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 ca7517756e605..7196f80f9f763 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-05 +date: 2023-09-06 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 7899f9650cd30..46a0a1ea92a11 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-05 +date: 2023-09-06 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 fdd6e0c7f3fc3..4269e7ed98e83 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-05 +date: 2023-09-06 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 fc83a934bf7e1..e0b8669cdc1dd 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-05 +date: 2023-09-06 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 0788687a910fe..9bc0c96297a67 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-05 +date: 2023-09-06 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 8af6fb11bde12..e9b8161b5dc7d 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-05 +date: 2023-09-06 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 c99be713b8d90..bbd8695bcee88 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-05 +date: 2023-09-06 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 b911c6e1e1952..568548ff4aa6f 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-05 +date: 2023-09-06 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 b5bda95c806cb..fa5768753b039 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-05 +date: 2023-09-06 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 e3d7321f12ea1..419f938af074e 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-05 +date: 2023-09-06 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 65b0ac1dd0ecd..c1bfcd5bb2818 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-05 +date: 2023-09-06 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 a68e429f6013e..6c563f87fe9c4 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-05 +date: 2023-09-06 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 df6dcbf68a99c..9d8254b6d4c5f 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-05 +date: 2023-09-06 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 7fe9a26ba9dd7..ccc8ed8e145b8 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-05 +date: 2023-09-06 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 f64d1c6af5206..cd799193dec7a 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-05 +date: 2023-09-06 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 8676c7107d4dd..80c18b02ac5d9 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-05 +date: 2023-09-06 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 a0f2a90b37a14..fccf61bb0964f 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-05 +date: 2023-09-06 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 8024bad81452e..b7f726363dba7 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-05 +date: 2023-09-06 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 79f69a5cc71a0..4eee0d1ff683e 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-05 +date: 2023-09-06 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 cc4337a22a137..4884deac439ee 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-05 +date: 2023-09-06 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 81ae937e1aabc..d77d54b054703 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-05 +date: 2023-09-06 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 903ff74457bd2..89ce0ace7f38c 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-05 +date: 2023-09-06 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 2d1f2dd1b4f3e..94444ebdea104 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-05 +date: 2023-09-06 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 d3f8fb3e152da..bdd68dda0749d 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-05 +date: 2023-09-06 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 3b5fe7bcd0bb7..b1b983d226fc9 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-05 +date: 2023-09-06 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 eea14a63ba6ba..4f0bc0218e945 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-05 +date: 2023-09-06 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 5c11668ffa71e..5dd173d676d19 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-05 +date: 2023-09-06 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 f4b3cbee7bc65..b37f26feca8fb 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-05 +date: 2023-09-06 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 277d89eeb2666..f5ee3dc45859c 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-05 +date: 2023-09-06 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 3121954ab3512..80ec92818f67d 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-05 +date: 2023-09-06 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 6d1e806fffcf2..4d9107defc8a9 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-05 +date: 2023-09-06 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 ffb235143b227..dabeeff20ae91 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-05 +date: 2023-09-06 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 6dac7d9151945..cb57687c88b52 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-05 +date: 2023-09-06 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 c13b36d6a01b5..e26a3332382d8 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-05 +date: 2023-09-06 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 0643d300555bb..10cb7f1612594 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-05 +date: 2023-09-06 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 8bcf6ef9da913..4d78f021e9b8e 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-05 +date: 2023-09-06 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 268c13ee40c21..25b8eddaed820 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-05 +date: 2023-09-06 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 cda3b46c2c802..a486f91c6ce80 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-05 +date: 2023-09-06 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 d4c39692829a9..1f573f178aa48 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-05 +date: 2023-09-06 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 edb82b7d856a9..9aae44e563071 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-05 +date: 2023-09-06 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 9ee3a48b1ed90..b61bae7f686c0 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-05 +date: 2023-09-06 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 d4fcdeafed66b..d028bcdd292c2 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-05 +date: 2023-09-06 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 8e0369f66c66b..46160457cfb40 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-05 +date: 2023-09-06 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 0a44b471adea8..b49d37521dfc5 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-05 +date: 2023-09-06 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 1a8bff8e80c51..f36efa6260bed 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-05 +date: 2023-09-06 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 f376e5de94cbd..e67965622abf2 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-05 +date: 2023-09-06 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 5a614d4f7e906..2293abb378091 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-05 +date: 2023-09-06 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 cc1cd6b7c29c3..76d18ea443e22 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-05 +date: 2023-09-06 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 88af0e128fe6d..b63ebb802ae4b 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-05 +date: 2023-09-06 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 5004023259bfa..0e95c8df6db6c 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-05 +date: 2023-09-06 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 8ab31c0810681..09f3f34afa52f 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-05 +date: 2023-09-06 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 de7246615f050..c2686005a1b47 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-05 +date: 2023-09-06 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 300345dc19e9f..e364f70c184f4 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-05 +date: 2023-09-06 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 65e39c56c54cf..e7fe7ad9957c3 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-05 +date: 2023-09-06 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 5989125209f3c..096a5f9b29ae8 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-05 +date: 2023-09-06 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 8c2fe6d0f842b..7208fd4f27840 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-05 +date: 2023-09-06 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 b87966a18bcc8..cb41d872a670c 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-05 +date: 2023-09-06 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 54cb3c3ed4458..93bb955960964 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-05 +date: 2023-09-06 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 032e218c58780..4c283c282c8db 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-05 +date: 2023-09-06 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 7aed7a647acd3..a9c038be9f5c2 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-05 +date: 2023-09-06 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 e1d4a47d80bc5..463ab406fd55f 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-05 +date: 2023-09-06 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 7e85861952f55..bda7e1b72a441 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-05 +date: 2023-09-06 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 3fb6a56259ba7..b8f82ea078ebd 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-05 +date: 2023-09-06 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 ab04f163b40df..bb6ff9ee4a617 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-05 +date: 2023-09-06 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 b3d04d8b790ae..c84308de8a868 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-05 +date: 2023-09-06 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 5680da729406a..066a71a3ae5cc 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-05 +date: 2023-09-06 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 6e12225151607..5f2f2e6c06ab9 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-05 +date: 2023-09-06 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 0c622fb705406..26eda92de104d 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-05 +date: 2023-09-06 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 149efa170d300..d4bc0aa7aeb60 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-05 +date: 2023-09-06 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 70d41bb5964de..d960522fa72fd 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-05 +date: 2023-09-06 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 037d30c889f87..da88dd664e8ff 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-05 +date: 2023-09-06 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 58fbeeee2d187..eecec8d83ceec 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-05 +date: 2023-09-06 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 959e2a057f24c..c82f905d9cae0 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-05 +date: 2023-09-06 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 7613d4be794d4..987e08f19e998 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-05 +date: 2023-09-06 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 0323e7ebc62b4..56a9cf9e42403 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-05 +date: 2023-09-06 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 cf70a70947460..6c1db92f4085f 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-05 +date: 2023-09-06 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 d04209a9f3568..a16b44419d80c 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-05 +date: 2023-09-06 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 c2e009a4b77fb..3fb309c33bca7 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-05 +date: 2023-09-06 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 31eb94cd3909e..9b7f9cae664f2 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-05 +date: 2023-09-06 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 0ea939bbde996..425b657af6cfc 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-05 +date: 2023-09-06 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 bd5a2b4bf7477..8215af139a97c 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-05 +date: 2023-09-06 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 ece34b24df02d..d56d17b99edbb 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-05 +date: 2023-09-06 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 dcec40e3a89da..ba5d06f60e55a 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-05 +date: 2023-09-06 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 ef9900034a6d5..0ce562174ec43 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-05 +date: 2023-09-06 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 0393965e2ebb2..a3b3283db157c 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-05 +date: 2023-09-06 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 3605f1aba2368..65c3223d3705c 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-05 +date: 2023-09-06 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.devdocs.json b/api_docs/kbn_search_api_panels.devdocs.json index 8c1ce9f259ef6..e493e1db46fd8 100644 --- a/api_docs/kbn_search_api_panels.devdocs.json +++ b/api_docs/kbn_search_api_panels.devdocs.json @@ -926,6 +926,34 @@ "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-api-panels", + "id": "def-common.LanguageDefinitionSnippetArguments.ingestPipeline", + "type": "string", + "tags": [], + "label": "ingestPipeline", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-api-panels/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-api-panels", + "id": "def-common.LanguageDefinitionSnippetArguments.extraIngestDocumentValues", + "type": "Object", + "tags": [], + "label": "extraIngestDocumentValues", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "packages/kbn-search-api-panels/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 23d87424f2b07..f928c35ff17e3 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.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 | |-------------------|-----------|------------------------|-----------------| -| 65 | 0 | 65 | 0 | +| 67 | 0 | 67 | 0 | ## Common diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index a7f3a7c301a2f..b61b3acebc30b 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-05 +date: 2023-09-06 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 feff9a8532c37..52f9bf0331d66 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-05 +date: 2023-09-06 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 43b8698ec5add..21a9a0d4229eb 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-05 +date: 2023-09-06 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 0edc300b7fbb8..8535e3c2ceb45 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-05 +date: 2023-09-06 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 303b370aed662..0989d2c61bc6c 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-05 +date: 2023-09-06 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 0e8e3606673c7..618fce3049404 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-05 +date: 2023-09-06 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 39fd4b1f96d01..b59feab2155c5 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-05 +date: 2023-09-06 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 e1881be0c8187..9b6e5f38500a4 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-05 +date: 2023-09-06 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 1c4796084d273..de06ac2178b85 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-05 +date: 2023-09-06 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 057fd8ddd0154..8dc2abd94a379 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-05 +date: 2023-09-06 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 bcab35e3734e8..b0b4e63b53415 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-05 +date: 2023-09-06 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 6188b4f538622..98e145e6c291a 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-05 +date: 2023-09-06 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 ee9589bd9fdab..be1b7c054f509 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-05 +date: 2023-09-06 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 55ab104bac818..f8c8e1d9bce9e 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-05 +date: 2023-09-06 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 16df8b1d3143c..9fd2114f82497 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-05 +date: 2023-09-06 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 9d02dbe8bf408..4674d7f39cc79 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-05 +date: 2023-09-06 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 47fd8f9a4d494..812a2357c9c1c 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-05 +date: 2023-09-06 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 5c0ca05384879..f23fad4563b05 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-05 +date: 2023-09-06 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 806945c74d6ef..2684bdf0d61e2 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-05 +date: 2023-09-06 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 67c024298e1af..4aa83b1b2a28a 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-05 +date: 2023-09-06 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 ae9982c0af157..fb5c6248a7aa4 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-05 +date: 2023-09-06 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 f9802c7fe0576..272b283e3809f 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-05 +date: 2023-09-06 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 6dc1d8f5b2b13..6cfe959f3b6a8 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-05 +date: 2023-09-06 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 1b4eefb68fc5f..fc08e81a4f1d4 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-05 +date: 2023-09-06 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 e106cb033c5c2..e75c15121e929 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-05 +date: 2023-09-06 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 f9ad4f267548f..a15223e4a5b18 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-05 +date: 2023-09-06 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 8f8629d869e68..45f677c9b03a8 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-05 +date: 2023-09-06 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 82f04c8c1f8f3..d7e66c2dfcafb 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-05 +date: 2023-09-06 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 e4ec0a2a0470d..2a7a12643f66c 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-05 +date: 2023-09-06 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 332ee7b559786..6d03355f6bb90 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-05 +date: 2023-09-06 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 b342b28412dd3..5000f6af0f8f1 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-05 +date: 2023-09-06 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 ea0dee0f20096..78930ef11a46c 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-05 +date: 2023-09-06 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 bed943cf01244..2fb5ef4f4d1ab 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-05 +date: 2023-09-06 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 298b26586d47f..c401fc4ae57cc 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-05 +date: 2023-09-06 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 f8e4d0340abe9..2f49e7214e438 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-05 +date: 2023-09-06 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 a9cfd49bd9006..932e071d8c4e3 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-05 +date: 2023-09-06 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 571aa579476e0..1e6a87987a4f2 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-05 +date: 2023-09-06 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 d320a6fe79159..195ca50f84803 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-05 +date: 2023-09-06 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 7a01e2db59806..56aae935b33b6 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-05 +date: 2023-09-06 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 05b8167d72a32..be3191df40254 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-05 +date: 2023-09-06 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 7fe50b1e6efa5..cbafafdf15054 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-05 +date: 2023-09-06 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 341baae0eddc6..ca5b614f31f5e 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-05 +date: 2023-09-06 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 b5bdafbe3406e..e93ae95420c38 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-05 +date: 2023-09-06 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 bd9f0e5e054b5..e700985ce82b4 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-05 +date: 2023-09-06 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 bdb21965fe310..f04034c8db728 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-05 +date: 2023-09-06 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 f8166ef3df380..221bc0e89d69b 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-05 +date: 2023-09-06 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 034c8d773754d..9304bde1efab8 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-05 +date: 2023-09-06 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 47ecb7343d741..76c8f65bf9a38 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-05 +date: 2023-09-06 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 c5369259e7b4d..c51b4524362ff 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-05 +date: 2023-09-06 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 b9d0e9b498902..ead37eb00cd9d 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-05 +date: 2023-09-06 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 2bd6c3050ac8f..5138e162e33f4 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-05 +date: 2023-09-06 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 35e91bb002744..7239a015c29f4 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-05 +date: 2023-09-06 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 c1cf40e7bc764..fa8bd59e552a6 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-05 +date: 2023-09-06 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 86fa9e7c1891f..ff4e2959c6d3e 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-05 +date: 2023-09-06 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 3c8e084113bee..4f737aa135efc 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-05 +date: 2023-09-06 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 28f32b9dc5257..96f74da39a60e 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-05 +date: 2023-09-06 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 997a796e86d22..88245cb24a015 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-05 +date: 2023-09-06 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 f470445bd947b..39f5d7cd276e7 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-05 +date: 2023-09-06 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 33873f09e4810..96fc64390daf1 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-05 +date: 2023-09-06 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 274db8e8bfa85..beb8813a7170f 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-05 +date: 2023-09-06 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 9a775023878d6..6df2460db09a5 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-05 +date: 2023-09-06 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 aed9adc9f36ba..7d9bdd1d9570d 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-05 +date: 2023-09-06 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 07c8ac15e2ccb..0f5fb94765341 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-05 +date: 2023-09-06 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 129749e6731df..6912120abed7c 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-05 +date: 2023-09-06 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 d36240ef6c53e..68926ed3daf26 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-05 +date: 2023-09-06 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 cf78e32a622ed..7e9cb4fc44597 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-05 +date: 2023-09-06 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 d3a1875b6ce61..e3919b804ff70 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-05 +date: 2023-09-06 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.devdocs.json b/api_docs/kbn_slo_schema.devdocs.json index 02eec6e3a39cb..0666cd886ffa9 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -628,6 +628,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.DeleteSLOInstancesInput", + "type": "Type", + "tags": [], + "label": "DeleteSLOInstancesInput", + "description": [], + "signature": [ + "{ list: { sloId: string; instanceId: string; }[]; }" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.DeleteSLOInstancesParams", + "type": "Type", + "tags": [], + "label": "DeleteSLOInstancesParams", + "description": [], + "signature": [ + "{ list: { sloId: string; instanceId: string; }[]; }" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.FetchHistoricalSummaryParams", @@ -2079,6 +2109,32 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.deleteSLOInstancesParamsSchema", + "type": "Object", + "tags": [], + "label": "deleteSLOInstancesParamsSchema", + "description": [], + "signature": [ + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }>" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.deleteSLOParamsSchema", diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 0839df57edc00..a3231fcbe7b8c 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 132 | 0 | 129 | 0 | +| 135 | 0 | 132 | 0 | ## Common diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 407b4ab1645d0..625a1baf66680 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-05 +date: 2023-09-06 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 8a7b3d8d10eba..67f61e7309c88 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-05 +date: 2023-09-06 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 8af618fd3428f..9488d28e11bbe 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-05 +date: 2023-09-06 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 dbffcc85a47b8..837b297215919 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-05 +date: 2023-09-06 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 6b1ecb4fc1a93..163e9fad938f4 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-05 +date: 2023-09-06 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 f25b8eca3b096..9d077f5729f64 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-05 +date: 2023-09-06 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 5077de40d935f..f7448b3c6e089 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-05 +date: 2023-09-06 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 43372f3125e20..e5765ce453870 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-05 +date: 2023-09-06 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.devdocs.json b/api_docs/kbn_text_based_editor.devdocs.json index e0ba49c3e1b0e..252a6537ae639 100644 --- a/api_docs/kbn_text_based_editor.devdocs.json +++ b/api_docs/kbn_text_based_editor.devdocs.json @@ -3,6 +3,136 @@ "client": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL", + "type": "Function", + "tags": [], + "label": "fetchFieldsFromESQL", + "description": [], + "signature": [ + "(query: ", + { + "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" + }, + ", expressions: ", + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + }, + ", time: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined) => Promise<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + " | undefined>" + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$1", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "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" + } + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$2", + "type": "Object", + "tags": [], + "label": "expressions", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + } + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$3", + "type": "Object", + "tags": [], + "label": "time", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/text-based-editor", "id": "def-public.TextBasedLanguagesEditor", @@ -272,6 +402,20 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 9e04bda94e0e3..64e7ed9a883be 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 17 | 0 | 16 | 0 | +| 22 | 0 | 21 | 0 | ## Client diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 871c6c2b8e718..2e4e64028de10 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-05 +date: 2023-09-06 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 be3c8e29d5516..e8f536396cd3c 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-05 +date: 2023-09-06 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 46f8c19cf89ec..b32fffce5ce5f 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-05 +date: 2023-09-06 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 d8b53fc2d669f..6af725a802219 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-05 +date: 2023-09-06 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 a08cefa0974a5..175f75d1c9c72 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-05 +date: 2023-09-06 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 68e956c6a9fd7..cf4823a41b994 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-05 +date: 2023-09-06 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 91091dbb7a330..30d39fbab123b 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-05 +date: 2023-09-06 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 40c628ad3325c..86f54f4a13e60 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-05 +date: 2023-09-06 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 f22127f77ae44..861b929e842e1 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-05 +date: 2023-09-06 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 1e294e99efaba..931a77d995dd5 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-05 +date: 2023-09-06 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 b8c701132cb88..5fa41d11ace3c 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-05 +date: 2023-09-06 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 ed3eb341e30b8..bd6a2a9fea7ae 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-05 +date: 2023-09-06 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 fabeb02cc299a..2266479569fb7 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-05 +date: 2023-09-06 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 9e9cb5759dee2..85666acc83ea4 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-05 +date: 2023-09-06 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 7b5a3ae2edbf2..d6cf87ff8567d 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-05 +date: 2023-09-06 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 0dc5954a37433..5cc15cfbba8a8 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-05 +date: 2023-09-06 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 aa2fb5154468f..8958468bc9f2d 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-05 +date: 2023-09-06 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 9fa0c25531795..148fbff039e18 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 3133e29cbacf4..242e917a38c35 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -3726,14 +3726,6 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx" }, - { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx" - }, - { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/application.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 72e61b9db565c..6bfcbb46328e6 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-05 +date: 2023-09-06 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 91d17d9fcde72..5163dcb316e50 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-05 +date: 2023-09-06 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 eeb74883b2962..bb869216c84f1 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-05 +date: 2023-09-06 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 7640d66033c05..b11450706ba43 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-05 +date: 2023-09-06 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 51aee902356a6..0b7294a36838d 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-05 +date: 2023-09-06 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 6d5783871cdc4..c84037bdb1fdc 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-05 +date: 2023-09-06 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 8514ee21fcd37..e210d8a6bfe13 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-05 +date: 2023-09-06 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 7d88a913416d4..3271d5e1f245c 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 88da234919d93..befcc70437a54 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 6a569ad488335..ffa98ecee1830 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-05 +date: 2023-09-06 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 506e3bdaa1684..b98088ff6fca4 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-05 +date: 2023-09-06 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 415d96478e799..7ccc3846ad0d1 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-05 +date: 2023-09-06 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 a76d920efbd05..0f06b54ce9df8 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-05 +date: 2023-09-06 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 87679e97ee10f..9550b03ca8ef3 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-05 +date: 2023-09-06 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 2f9c10a8d601f..9f00d4a1b3112 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-05 +date: 2023-09-06 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 1f3f4c9e84b3c..ff84af9508421 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-05 +date: 2023-09-06 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 58358d769e1c8..f1420e4cfa2f3 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-05 +date: 2023-09-06 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 5c0fda7795ffc..ea0effc9fea3a 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-05 +date: 2023-09-06 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 4b84d2688576b..859779de519dc 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-05 +date: 2023-09-06 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 844c63784a8e7..cdec51c565667 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-05 +date: 2023-09-06 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 24d66a3f94a94..009e122a6a378 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -155,9 +155,7 @@ "label": "AlertSummary", "description": [], "signature": [ - "({ alertSummaryFields }: ", - "AlertSummaryProps", - ") => JSX.Element" + "({ alertSummaryFields }: AlertSummaryProps) => JSX.Element" ], "path": "x-pack/plugins/observability/public/pages/alert_details/components/alert_summary.tsx", "deprecated": false, @@ -418,9 +416,7 @@ "label": "DatePicker", "description": [], "signature": [ - "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: ", - "DatePickerProps", - ") => JSX.Element" + "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: DatePickerProps) => JSX.Element" ], "path": "x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx", "deprecated": false, @@ -9231,6 +9227,34 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, + "; \"POST /api/observability/slos/_delete_instances 2023-10-31\": { endpoint: \"POST /api/observability/slos/_delete_instances 2023-10-31\"; params?: ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }> | undefined; handler: ({}: ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteHandlerResources", + "text": "ObservabilityRouteHandlerResources" + }, + " & { params: { body: { list: { sloId: string; instanceId: string; }[]; }; }; }) => Promise; } & ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteCreateOptions", + "text": "ObservabilityRouteCreateOptions" + }, "; \"DELETE /api/observability/slos/{id} 2023-10-31\": { endpoint: \"DELETE /api/observability/slos/{id} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", @@ -10937,6 +10961,34 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, + "; \"POST /api/observability/slos/_delete_instances 2023-10-31\": { endpoint: \"POST /api/observability/slos/_delete_instances 2023-10-31\"; params?: ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }> | undefined; handler: ({}: ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteHandlerResources", + "text": "ObservabilityRouteHandlerResources" + }, + " & { params: { body: { list: { sloId: string; instanceId: string; }[]; }; }; }) => Promise; } & ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteCreateOptions", + "text": "ObservabilityRouteCreateOptions" + }, "; \"DELETE /api/observability/slos/{id} 2023-10-31\": { endpoint: \"DELETE /api/observability/slos/{id} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 4f5365797c3b2..d10fd512c30be 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 542 | 2 | 533 | 16 | +| 542 | 2 | 533 | 14 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 31e4264930aee..e3520b084ccac 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 939e6d954a9b7..ccc3104347e34 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 040d247a44432..e544473677fd3 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-05 +date: 2023-09-06 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 b9a92bd0e15a9..58b1aeeb72c30 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-05 +date: 2023-09-06 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 8c9256f9f511c..f8a0a349a4ea1 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,13 +21,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 72503 | 223 | 61894 | 1513 | +| 72529 | 223 | 61920 | 1511 | ## Plugin Directory | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 267 | 0 | 261 | 30 | +| | [@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 | @@ -135,7 +135,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 542 | 2 | 533 | 16 | +| | [@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 | @@ -170,7 +170,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 119 | 0 | 60 | 10 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 22 | 1 | 22 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 253 | 0 | 65 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 14 | 0 | 14 | 3 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 24 | 0 | 24 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 4 | 0 | 4 | 1 | | synthetics | [@elastic/uptime](https://github.com/orgs/elastic/teams/uptime) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 96 | 0 | 53 | 6 | @@ -178,12 +178,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 26 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 19 | 0 | 19 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 20 | 0 | 20 | 0 | | | [@elastic/protections-experience](https://github.com/orgs/elastic/teams/protections-experience) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 5 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 257 | 1 | 213 | 22 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 573 | 1 | 547 | 51 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 576 | 1 | 550 | 51 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 145 | 0 | 103 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 206 | 0 | 140 | 9 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 13 | 0 | 10 | 3 | @@ -526,7 +526,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | | | [@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) | - | 65 | 0 | 65 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 67 | 0 | 67 | 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 | @@ -594,7 +594,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 3 | 0 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 132 | 0 | 129 | 0 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 135 | 0 | 132 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 102 | 2 | 65 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 | @@ -603,7 +603,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 289 | 4 | 242 | 12 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 137 | 5 | 105 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 17 | 0 | 16 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 22 | 0 | 21 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 72 | 0 | 55 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 86 | 0 | 86 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 17307c56df40b..8baaad3c6c961 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-05 +date: 2023-09-06 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 c733c69c88c29..bfbb359943027 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-05 +date: 2023-09-06 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 7dfef9cbc7f5d..be115e09b2ccf 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-05 +date: 2023-09-06 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 46f7029e4c437..cfbfdbe19c2d7 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-05 +date: 2023-09-06 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 652db20d467be..6ceb583f5e701 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-05 +date: 2023-09-06 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 f05dfff64c6eb..19e06683b4eac 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-05 +date: 2023-09-06 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 04ca4e478bd01..912d13f8bbe28 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-05 +date: 2023-09-06 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 deb21fb5af459..e015e177cbba5 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-05 +date: 2023-09-06 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 a389e8c341df1..92c55394f4209 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-05 +date: 2023-09-06 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 51f2eac47f7ee..142c9ae875e69 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-05 +date: 2023-09-06 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 cc16ca5a190d2..f61d87c732506 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-05 +date: 2023-09-06 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 6e99575f34bea..b517eca82a928 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-05 +date: 2023-09-06 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 32fbb58ee3493..abc9de3307deb 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-05 +date: 2023-09-06 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 f606643f4009d..61bc012db63a9 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-05 +date: 2023-09-06 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 fffd6ea49de6f..dbb975cc061ed 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-05 +date: 2023-09-06 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 ffd1930565da5..b4bd667da42a4 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-05 +date: 2023-09-06 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 3950548c880fb..bde9ff25f6e97 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-05 +date: 2023-09-06 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 56c700c517970..ed2dae2824bab 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-05 +date: 2023-09-06 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 98f2cb7869788..d07f98a7332b0 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-05 +date: 2023-09-06 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 fe15bc4706c25..d715d1010ba65 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-05 +date: 2023-09-06 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 0528a3c42d91c..d78f273a7755b 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-05 +date: 2023-09-06 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 ca487148446ab..93287788f8645 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-05 +date: 2023-09-06 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 2382a958e93a4..684d74bc88e77 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-05 +date: 2023-09-06 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 0c2b0290e9db7..e1b29a4b77478 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-05 +date: 2023-09-06 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 6385220853e90..0117b9138ccee 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-05 +date: 2023-09-06 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 7d25378cd6f0e..c93a024b3b41b 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-05 +date: 2023-09-06 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 54715a2f5bf55..9f61d5283f5e5 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.devdocs.json b/api_docs/stack_alerts.devdocs.json index 65ec1191d667f..cced9a721c32e 100644 --- a/api_docs/stack_alerts.devdocs.json +++ b/api_docs/stack_alerts.devdocs.json @@ -210,9 +210,201 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument", + "type": "Function", + "tags": [], + "label": "rowToDocument", + "description": [], + "signature": [ + "(columns: EsqlResultColumn[], row: EsqlResultRow) => EsqlDocument" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument.$1", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "EsqlResultColumn[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument.$2", + "type": "Array", + "tags": [], + "label": "row", + "description": [], + "signature": [ + "EsqlResultRow" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.toEsQueryHits", + "type": "Function", + "tags": [], + "label": "toEsQueryHits", + "description": [], + "signature": [ + "(results: ", + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + }, + ") => { hits: EsqlHit[]; total: number; }" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.toEsQueryHits.$1", + "type": "Object", + "tags": [], + "label": "results", + "description": [], + "signature": [ + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.transformDatatableToEsqlTable", + "type": "Function", + "tags": [], + "label": "transformDatatableToEsqlTable", + "description": [], + "signature": [ + "(results: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ") => ", + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.transformDatatableToEsqlTable.$1", + "type": "Object", + "tags": [], + "label": "results", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable", + "type": "Interface", + "tags": [], + "label": "EsqlTable", + "description": [], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "EsqlResultColumn[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable.values", + "type": "Array", + "tags": [], + "label": "values", + "description": [], + "signature": [ + "EsqlResultRow[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], - "interfaces": [], "enums": [], "misc": [ { diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 546ab4089308b..598ea05dd18d8 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.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 | |-------------------|-----------|------------------------|-----------------| -| 14 | 0 | 14 | 3 | +| 24 | 0 | 24 | 3 | ## Client @@ -44,6 +44,9 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o ### Functions +### Interfaces + + ### Consts, variables and types diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index cfe538fc4b18e..cacc8c975df10 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-05 +date: 2023-09-06 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 c110a53377d03..f3a1b5c7e0e57 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-05 +date: 2023-09-06 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 7bfe57d68a2d1..0d92ce6df2bc2 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-05 +date: 2023-09-06 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 40acb98da6933..4e74bf052b9cb 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-05 +date: 2023-09-06 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 0df30daa7aa12..5eff47d932a72 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-05 +date: 2023-09-06 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 7a11b41d310d4..384f4633571aa 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.devdocs.json b/api_docs/text_based_languages.devdocs.json index 85e21f93ca908..c44e1664a3fe1 100644 --- a/api_docs/text_based_languages.devdocs.json +++ b/api_docs/text_based_languages.devdocs.json @@ -279,6 +279,20 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "textBasedLanguages", + "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 0742546f60027..30272f75bfcf6 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 19 | 0 | 19 | 0 | +| 20 | 0 | 20 | 0 | ## Client diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index c7145498c1a5c..1d77c0df3a97c 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-05 +date: 2023-09-06 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 bbc1eb06c8e39..23ceb4fe61e6a 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-05 +date: 2023-09-06 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 e5d3181a1d8d6..bab5d6c094c68 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index 9d84568f429d3..a153daf2744a9 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -803,6 +803,47 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.getTimeOptions", + "type": "Function", + "tags": [], + "label": "getTimeOptions", + "description": [], + "signature": [ + "(unitSize: number) => { text: string; value: ", + { + "pluginId": "triggersActionsUi", + "scope": "public", + "docId": "kibTriggersActionsUiPluginApi", + "section": "def-public.TIME_UNITS", + "text": "TIME_UNITS" + }, + "; }[]" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/get_time_options.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.getTimeOptions.$1", + "type": "number", + "tags": [], + "label": "unitSize", + "description": [], + "signature": [ + "number" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/get_time_options.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "triggersActionsUi", "id": "def-public.getTimeUnitLabel", @@ -5688,6 +5729,26 @@ "path": "x-pack/plugins/triggers_actions_ui/public/application/app.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.TriggersAndActionsUiServices.expressions", + "type": "Object", + "tags": [], + "label": "expressions", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + } + ], + "path": "x-pack/plugins/triggers_actions_ui/public/application/app.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 51693988db001..5f23ec23ba53d 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.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 | |-------------------|-----------|------------------------|-----------------| -| 573 | 1 | 547 | 51 | +| 576 | 1 | 550 | 51 | ## Client diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index a60e9a0225c50..891ed57dca705 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-05 +date: 2023-09-06 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 8acfb4007dac3..fa0e10091834f 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-05 +date: 2023-09-06 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 603f48d60f203..39bdf05d8be5e 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-05 +date: 2023-09-06 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 7b1d9e1b20dad..8ae211ab4a1fe 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index fd7beddabd867..3eea6ef3a5403 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-05 +date: 2023-09-06 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 a72a03bf4fac3..d66fa6a04e945 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-05 +date: 2023-09-06 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 62c01dfb2cc5f..3987d3bcc9316 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-05 +date: 2023-09-06 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 11d978023890f..5f956a0d5b10e 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-05 +date: 2023-09-06 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 960eb658ca681..aaf47c8abd982 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-05 +date: 2023-09-06 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 15e9fd60eafed..993e491bb3987 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-05 +date: 2023-09-06 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 59c3f306ced16..493ba55128160 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-05 +date: 2023-09-06 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 0010c70cfdbde..7ab3f9c575f7b 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-05 +date: 2023-09-06 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 6173477d3c7a5..377532248eac0 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-05 +date: 2023-09-06 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 fc76ac9c6fc64..e0318e12ac9df 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-05 +date: 2023-09-06 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 ce5bbdddd2e36..a2ad41cc88773 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-05 +date: 2023-09-06 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 c44173caff05c..c6cad2abd1b16 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-05 +date: 2023-09-06 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 d61f09f713d1b..2359fb1e3d51d 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-05 +date: 2023-09-06 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 bde589e42f805..a73a33c6af0ce 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-05 +date: 2023-09-06 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 78696e8ff2b7d..f5e16234f7811 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-05 +date: 2023-09-06 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 a98046d0fe69a..91ba1aeb857f8 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-05 +date: 2023-09-06 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 bc11233812a61..cb7ba41730b13 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From e315c9c17598b983edba3cf251679598908f8d9b Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 6 Sep 2023 07:16:29 +0200 Subject: [PATCH 50/52] [Defend Workflows] Artifact Rollout Note field (#164838) This PR is a second part of Artifact Rollout Epic (https://github.com/elastic/security-team/issues/3593) and it introduces **Note** field as described in https://github.com/elastic/security-team/issues/7238 ticket. Changes: 1. Added a new SO, `policy-settings-protection-updates-note` which holds non indexable `note` field of type **text** and reference to package policy 2. Added `getPackagePolicyDeleteCallback` that cleans up SO on package policy deletion 3. Exposed an API to interact with the SO (POST, GET) with POST method accepting both creation and update if SO exists. 4. Integrated UI with API with `react-query` hooks. Flow https://github.com/elastic/kibana/assets/29123534/359d59bd-1bde-417a-9449-467d08e81809 Read only access ![Screenshot 2023-08-29 at 13 11 58](https://github.com/elastic/kibana/assets/29123534/36df0b40-6012-45a8-aa7d-c2fa0527e594) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../current_mappings.json | 16 +- .../group2/check_registered_types.test.ts | 1 + .../group3/type_registrations.test.ts | 1 + .../group5/dot_kibana_split.test.ts | 1 + .../src/security/kibana_sub_features.ts | 5 +- .../protection_updates_note_schema.ts | 23 +++ .../common/endpoint/constants.ts | 1 + .../cypress/e2e/endpoint/policy_details.cy.ts | 68 ++++++- .../cypress/tasks/endpoint_policy.ts | 12 ++ .../hooks/use_get_protection_updates_note.ts | 42 ++++ .../hooks/use_post_protection_updates_note.ts | 47 +++++ .../protection_updates_layout.tsx | 86 +++++++- .../endpoint/endpoint_app_context_services.ts | 11 +- .../saved_object_mappings.ts | 28 +++ .../server/endpoint/mocks.ts | 1 + .../protection_updates_note/handlers.test.ts | 191 ++++++++++++++++++ .../protection_updates_note/handlers.ts | 126 ++++++++++++ .../routes/protection_updates_note/index.ts | 63 ++++++ .../fleet_integration.test.ts | 25 ++- .../fleet_integration/fleet_integration.ts | 10 +- .../remove_protection_updates_note.ts | 33 +++ .../security_solution/server/plugin.ts | 3 + .../security_solution/server/saved_objects.ts | 2 + 23 files changed, 780 insertions(+), 16 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/lib/protection_updates_note/saved_object_mappings.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts create mode 100644 x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index c2e1b05850689..4e0e5a1028fa1 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -616,6 +616,10 @@ } } }, + "apm-indices": { + "dynamic": false, + "properties": {} + }, "tag": { "properties": { "name": { @@ -2987,6 +2991,14 @@ } } }, + "policy-settings-protection-updates-note": { + "properties": { + "note": { + "type": "text", + "index": false + } + } + }, "infrastructure-ui-source": { "dynamic": false, "properties": {} @@ -3031,10 +3043,6 @@ } } }, - "apm-indices": { - "dynamic": false, - "properties": {} - }, "apm-telemetry": { "dynamic": false, "properties": {} diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts index 6bea2a8d7f2e2..43890b88dbdb5 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts @@ -125,6 +125,7 @@ describe('checking migration metadata changes on all registered SO types', () => "osquery-pack": "6ab4358ca4304a12dcfc1777c8135b75cffb4397", "osquery-pack-asset": "b14101d3172c4b60eb5404696881ce5275c84152", "osquery-saved-query": "44f1161e165defe3f9b6ad643c68c542a765fcdb", + "policy-settings-protection-updates-note": "33924bb246f9e5bcb876109cc83e3c7a28308352", "query": "21cbbaa09abb679078145ce90087b1e88b7eae95", "risk-engine-configuration": "b105d4a3c6adce40708d729d12e5ef3c8fbd9508", "rules-settings": "892a2918ebaeba809a612b8d97cec0b07c800b5f", diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts index 3235c6cfa057e..61294c22a160e 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts @@ -96,6 +96,7 @@ const previouslyRegisteredTypes = [ 'osquery-saved-query', 'osquery-usage-metric', 'osquery-manager-usage-metric', + 'policy-settings-protection-updates-note', 'query', 'rules-settings', 'sample-data-telemetry', diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts index 32ac61f0d2711..6581541e70244 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts @@ -245,6 +245,7 @@ describe('split .kibana index into multiple system indices', () => { "osquery-pack", "osquery-pack-asset", "osquery-saved-query", + "policy-settings-protection-updates-note", "query", "risk-engine-configuration", "rules-settings", diff --git a/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts b/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts index 86cbf89f26a6f..d9a090f1313f0 100644 --- a/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts +++ b/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import type { SubFeatureConfig } from '@kbn/features-plugin/common'; import { EXCEPTION_LIST_NAMESPACE_AGNOSTIC } from '@kbn/securitysolution-list-constants'; import { AppFeaturesPrivilegeId, AppFeaturesPrivileges } from '../app_features_privileges'; + import { SecuritySubFeatureId } from '../app_features_keys'; import { APP_ID } from '../constants'; import type { SecurityFeatureParams } from './types'; @@ -320,7 +321,7 @@ const policyManagementSubFeature: SubFeatureConfig = { includeIn: 'none', name: 'All', savedObject: { - all: [], + all: ['policy-settings-protection-updates-note'], read: [], }, ui: ['writePolicyManagement', 'readPolicyManagement'], @@ -332,7 +333,7 @@ const policyManagementSubFeature: SubFeatureConfig = { name: 'Read', savedObject: { all: [], - read: [], + read: ['policy-settings-protection-updates-note'], }, ui: ['readPolicyManagement'], }, diff --git a/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts new file mode 100644 index 0000000000000..1207d3d2418fa --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +export const GetProtectionUpdatesNoteSchema = { + params: schema.object({ + package_policy_id: schema.string(), + }), +}; + +export const CreateUpdateProtectionUpdatesNoteSchema = { + body: schema.object({ + note: schema.string(), + }), + params: schema.object({ + package_policy_id: schema.string(), + }), +}; diff --git a/x-pack/plugins/security_solution/common/endpoint/constants.ts b/x-pack/plugins/security_solution/common/endpoint/constants.ts index 19c77f230eea5..6f2d4832e5727 100644 --- a/x-pack/plugins/security_solution/common/endpoint/constants.ts +++ b/x-pack/plugins/security_solution/common/endpoint/constants.ts @@ -63,6 +63,7 @@ export const METADATA_TRANSFORMS_STATUS_ROUTE = `${BASE_ENDPOINT_ROUTE}/metadata export const BASE_POLICY_RESPONSE_ROUTE = `${BASE_ENDPOINT_ROUTE}/policy_response`; export const BASE_POLICY_ROUTE = `${BASE_ENDPOINT_ROUTE}/policy`; export const AGENT_POLICY_SUMMARY_ROUTE = `${BASE_POLICY_ROUTE}/summaries`; +export const PROTECTION_UPDATES_NOTE_ROUTE = `${BASE_ENDPOINT_ROUTE}/protection_updates_note/{package_policy_id}`; /** Suggestions routes */ export const SUGGESTIONS_ROUTE = `${BASE_ENDPOINT_ROUTE}/suggestions/{suggestion_type}`; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts index 6e63264f63e2e..577164ff4d893 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts @@ -9,7 +9,10 @@ import moment from 'moment/moment'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import type { PolicyData } from '../../../../../common/endpoint/types'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; -import { setCustomProtectionUpdatesManifestVersion } from '../../tasks/endpoint_policy'; +import { + setCustomProtectionUpdatesManifestVersion, + setCustomProtectionUpdatesNote, +} from '../../tasks/endpoint_policy'; import { login, ROLE } from '../../tasks/login'; import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; @@ -17,6 +20,8 @@ describe('Policy Details', () => { describe('Protection updates', () => { const loadProtectionUpdatesUrl = (policyId: string) => loadPage(`/app/security/administration/policy/${policyId}/protectionUpdates`); + const testNote = 'test note'; + const updatedTestNote = 'updated test note'; describe('Renders and saves protection updates', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; @@ -59,13 +64,18 @@ describe('Policy Details', () => { cy.getByTestSubj('protection-updates-version-to-deploy-picker').within(() => { cy.get('input').should('have.value', formattedToday); }); + cy.getByTestSubj('protection-updates-manifest-name-note-title'); + cy.getByTestSubj('protection-updates-manifest-note'); cy.getByTestSubj('policyDetailsSaveButton'); }); it('should successfully update the manifest version to custom date', () => { loadProtectionUpdatesUrl(policy.id); cy.getByTestSubj('protection-updates-manifest-switch').click(); + cy.getByTestSubj('protection-updates-manifest-note').type(testNote); + cy.intercept('PUT', `/api/fleet/package_policies/${policy.id}`).as('policy'); + cy.intercept('POST', `/api/endpoint/protection_updates_note/*`).as('note'); cy.getByTestSubj('policyDetailsSaveButton').click(); cy.wait('@policy').then(({ request, response }) => { expect(request.body.inputs[0].config.policy.value.global_manifest_version).to.equal( @@ -73,8 +83,15 @@ describe('Policy Details', () => { ); expect(response?.statusCode).to.equal(200); }); + + cy.wait('@note').then(({ request, response }) => { + expect(request.body.note).to.equal(testNote); + expect(response?.statusCode).to.equal(200); + }); + cy.getByTestSubj('protectionUpdatesSuccessfulMessage'); cy.getByTestSubj('protection-updates-deployed-version').contains(formattedToday); + cy.getByTestSubj('protection-updates-manifest-note').contains(testNote); }); }); @@ -122,6 +139,50 @@ describe('Policy Details', () => { }); }); + describe('Renders and saves protection updates with custom note', () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; + + const twoMonthsAgo = moment().subtract(2, 'months').format('YYYY-MM-DD'); + + beforeEach(() => { + login(); + disableExpandableFlyoutAdvancedSettings(); + }); + + before(() => { + getEndpointIntegrationVersion().then((version) => { + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; + setCustomProtectionUpdatesManifestVersion(policy.id, twoMonthsAgo); + setCustomProtectionUpdatesNote(policy.id, testNote); + }); + }); + }); + + after(() => { + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } + }); + + it('should update note on save', () => { + loadProtectionUpdatesUrl(policy.id); + cy.getByTestSubj('protection-updates-manifest-note').contains(testNote); + cy.getByTestSubj('protection-updates-manifest-note').clear().type(updatedTestNote); + + cy.intercept('POST', `/api/endpoint/protection_updates_note/*`).as('note_updated'); + cy.getByTestSubj('policyDetailsSaveButton').click(); + cy.wait('@note_updated').then(({ request, response }) => { + expect(request.body.note).to.equal(updatedTestNote); + expect(response?.statusCode).to.equal(200); + }); + cy.getByTestSubj('protectionUpdatesSuccessfulMessage'); + cy.getByTestSubj('protection-updates-manifest-note').contains(updatedTestNote); + }); + }); + describe('Renders read only protection updates for user without write permissions', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; @@ -138,6 +199,7 @@ describe('Policy Details', () => { indexedPolicy = data; policy = indexedPolicy.integrationPolicies[0]; setCustomProtectionUpdatesManifestVersion(policy.id, twoMonthsAgo.format('YYYY-MM-DD')); + setCustomProtectionUpdatesNote(policy.id, testNote); }); }); }); @@ -162,6 +224,10 @@ describe('Policy Details', () => { cy.getByTestSubj('protection-updates-manifest-name-version-to-deploy-title'); cy.getByTestSubj('protection-updates-version-to-deploy-view-mode'); cy.getByTestSubj('protection-updates-version-to-deploy-picker').should('not.exist'); + + cy.getByTestSubj('protection-updates-manifest-name-note-title'); + cy.getByTestSubj('protection-updates-manifest-note').should('not.exist'); + cy.getByTestSubj('protection-updates-manifest-note-view-mode').contains(testNote); cy.getByTestSubj('policyDetailsSaveButton').should('be.disabled'); }); }); 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 f597e9ae4e225..9353cdf9ed822 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 @@ -94,3 +94,15 @@ export const setCustomProtectionUpdatesManifestVersion = ( }); }); }; + +export const setCustomProtectionUpdatesNote = ( + endpointPolicyId: string, + note: string +): Cypress.Chainable> => { + return request<{ note: string }>({ + method: 'POST', + url: `/api/endpoint/protection_updates_note/${endpointPolicyId}`, + body: { note }, + headers: { 'Elastic-Api-Version': '2023-10-31' }, + }); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts new file mode 100644 index 0000000000000..0ac3db09b35a2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from '@tanstack/react-query'; +import { resolvePathVariables } from '../../../../../../common/utils/resolve_path_variables'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../../../../common/endpoint/constants'; +import { useKibana } from '../../../../../../common/lib/kibana'; + +export const getProtectionUpdatesNoteQueryKey = (packagePolicyId: string) => + `protection-updates-note-${packagePolicyId}`; + +interface UseProtectionUpdatesNote { + packagePolicyId: string; +} + +interface NoteResponse { + note: string; +} + +export const useGetProtectionUpdatesNote = ({ packagePolicyId }: UseProtectionUpdatesNote) => { + const { http } = useKibana().services; + + return useQuery<{ data: NoteResponse }, unknown, NoteResponse>( + [getProtectionUpdatesNoteQueryKey(packagePolicyId)], + () => + http.get( + resolvePathVariables(PROTECTION_UPDATES_NOTE_ROUTE, { package_policy_id: packagePolicyId }), + { + version: '2023-10-31', + } + ), + { + keepPreviousData: true, + enabled: !!packagePolicyId, + retry: false, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts new file mode 100644 index 0000000000000..16b6ee66f07ca --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts @@ -0,0 +1,47 @@ +/* + * Copyright 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 { useMutation, useQueryClient } from '@tanstack/react-query'; +import { getProtectionUpdatesNoteQueryKey } from './use_get_protection_updates_note'; +import { useKibana } from '../../../../../../common/lib/kibana'; +import { resolvePathVariables } from '../../../../../../common/utils/resolve_path_variables'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../../../../common/endpoint/constants'; + +interface ProtectionUpdatesNoteParams { + packagePolicyId: string; +} + +interface NoteResponse { + note: string; +} + +export const useCreateProtectionUpdatesNote = ({ + packagePolicyId, +}: ProtectionUpdatesNoteParams) => { + const { http } = useKibana().services; + const queryClient = useQueryClient(); + + return useMutation< + { data: NoteResponse }, + { body: { error: string; message: string } }, + NoteResponse + >( + (payload) => + http.post( + resolvePathVariables(PROTECTION_UPDATES_NOTE_ROUTE, { policy_id: packagePolicyId }), + { + version: '2023-10-31', + body: JSON.stringify(payload), + } + ), + { + onSuccess: () => { + queryClient.invalidateQueries([getProtectionUpdatesNoteQueryKey(packagePolicyId)]); + }, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx index 09439918dfde0..499be2cf31284 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx @@ -13,14 +13,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, + EuiIconTip, EuiPanel, EuiShowFor, EuiSpacer, EuiSwitch, EuiText, + EuiTextArea, EuiTitle, } from '@elastic/eui'; -import React, { useCallback, useContext, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; import { ThemeContext } from 'styled-components'; import { i18n } from '@kbn/i18n'; @@ -28,6 +30,8 @@ import { FormattedMessage } from '@kbn/i18n-react'; import type { Moment } from 'moment'; import moment from 'moment'; import { cloneDeep } from 'lodash'; +import { useCreateProtectionUpdatesNote } from './hooks/use_post_protection_updates_note'; +import { useGetProtectionUpdatesNote } from './hooks/use_get_protection_updates_note'; import { useUserPrivileges } from '../../../../../common/components/user_privileges'; import { useToasts } from '../../../../../common/lib/kibana'; import { useUpdateEndpointPolicy } from '../../../../hooks/policy/use_update_endpoint_policy'; @@ -67,6 +71,20 @@ export const ProtectionUpdatesLayout = React.memo( const today = moment(); const [selectedDate, setSelectedDate] = useState(today); + const { data: fetchedNote, isLoading: getNoteInProgress } = useGetProtectionUpdatesNote({ + packagePolicyId: _policy.id, + }); + const { isLoading: createNoteInProgress, mutate: createNote } = useCreateProtectionUpdatesNote({ + packagePolicyId: _policy.id, + }); + const [note, setNote] = useState(''); + + useEffect(() => { + if (fetchedNote && !getNoteInProgress) { + setNote(fetchedNote.note); + } + }, [fetchedNote, getNoteInProgress]); + const automaticUpdatesEnabled = manifestVersion === 'latest'; const internalDateFormat = 'YYYY-MM-DD'; const displayDateFormat = 'MMMM DD, YYYY'; @@ -119,8 +137,27 @@ export const ProtectionUpdatesLayout = React.memo( text: err.message, }); }); + if ((!fetchedNote && note !== '') || (fetchedNote && note !== fetchedNote.note)) { + createNote( + { note }, + { + onError: (error) => { + toasts.addDanger({ + 'data-test-subj': 'protectionUpdatesNoteUpdateFailureMessage', + title: i18n.translate( + 'xpack.securitySolution.endpoint.protectionUpdates.noteUpdateErrorTitle', + { + defaultMessage: 'Note update failed!', + } + ), + text: error.body.message, + }); + }, + } + ); + } }, - [dispatch, policy, sendPolicyUpdate, toasts] + [policy, sendPolicyUpdate, fetchedNote, note, toasts, dispatch, createNote] ); const toggleAutomaticUpdates = useCallback( @@ -260,16 +297,57 @@ export const ProtectionUpdatesLayout = React.memo( )} - + {deployedVersion === 'latest' ? 'latest' : formattedDate} + {renderVersionToDeployPicker()} + + +
+ {i18n.translate('xpack.securitySolution.endpoint.protectionUpdates.note.label', { + defaultMessage: 'Note', + })} +
+
+ + + + } + /> +
+ + {canWritePolicyManagement ? ( + setNote(e.target.value)} + fullWidth={true} + rows={3} + placeholder={i18n.translate( + 'xpack.securitySolution.endpoint.protectionUpdates.note.placeholder', + { + defaultMessage: 'Add relevant information about update here', + } + )} + data-test-subj={'protection-updates-manifest-note'} + /> + ) : ( + {note} + )} + ( {canWritePolicyManagement ? ( fleetActionsClientMock), esClient: elasticsearchClientMock.createElasticsearchClient(), appFeaturesService, + savedObjectsClient: savedObjectsClientMock.create(), }; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts new file mode 100644 index 0000000000000..029d652953861 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts @@ -0,0 +1,191 @@ +/* + * Copyright 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 { EndpointAppContextService } from '../../endpoint_app_context_services'; +import type { KibanaResponseFactory, SavedObjectsClientContract } from '@kbn/core/server'; + +import { + createMockEndpointAppContextServiceSetupContract, + createMockEndpointAppContextServiceStartContract, + createRouteHandlerContext, +} from '../../mocks'; +import type { ScopedClusterClientMock } from '@kbn/core/server/mocks'; +import { + elasticsearchServiceMock, + httpServerMock, + savedObjectsClientMock, +} from '@kbn/core/server/mocks'; +import { getProtectionUpdatesNoteHandler, postProtectionUpdatesNoteHandler } from './handlers'; +import { requestContextMock } from '../../../lib/detection_engine/routes/__mocks__'; + +const mockedSOSuccessfulFindResponse = { + total: 1, + saved_objects: [ + { + id: 'id', + type: 'type', + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + attributes: { note: 'note' }, + score: 1, + }, + ], + page: 1, + per_page: 10, +}; + +const mockedSOSuccessfulFindResponseEmpty = { + total: 0, + saved_objects: [], + page: 1, + per_page: 10, +}; + +const createMockedSOSuccessfulCreateResponse = (note: string) => ({ + id: 'id', + type: 'type', + references: [], + attributes: { note }, +}); + +const mockedSOSuccessfulUpdateResponse = [ + 'policy-settings-protection-updates-note', + 'id', + { note: 'note2' }, + { + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + refresh: 'wait_for', + }, +]; + +describe('test protection updates note handler', () => { + let endpointAppContextService: EndpointAppContextService; + let mockSavedObjectClient: jest.Mocked; + let mockResponse: jest.Mocked; + let mockScopedClient: ScopedClusterClientMock; + + describe('test protection updates note handler', () => { + beforeEach(() => { + mockScopedClient = elasticsearchServiceMock.createScopedClusterClient(); + mockSavedObjectClient = savedObjectsClientMock.create(); + mockResponse = httpServerMock.createResponseFactory(); + endpointAppContextService = new EndpointAppContextService(); + endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); + endpointAppContextService.start(createMockEndpointAppContextServiceStartContract()); + }); + + afterEach(() => endpointAppContextService.stop()); + + it('should create a new note if one does not exist', async () => { + const protectionUpdatesNoteHandler = postProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + body: { note: 'note' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponseEmpty); + + mockSavedObjectClient.create.mockResolvedValueOnce( + createMockedSOSuccessfulCreateResponse('note') + ); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + expect(mockSavedObjectClient.create).toBeCalledWith( + 'policy-settings-protection-updates-note', + { note: 'note' }, + { + references: [{ id: undefined, name: 'package_policy', type: 'ingest-package-policies' }], + refresh: 'wait_for', + } + ); + }); + + it('should update an existing note on post if one exists', async () => { + const protectionUpdatesNoteHandler = postProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + body: { note: 'note2' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponse); + + mockSavedObjectClient.update.mockResolvedValueOnce( + createMockedSOSuccessfulCreateResponse('note2') + ); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + expect(mockSavedObjectClient.update).toBeCalledWith(...mockedSOSuccessfulUpdateResponse); + }); + + it('should return the note if one exists', async () => { + const protectionUpdatesNoteHandler = getProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponse); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + const result = mockResponse.ok.mock.calls[0][0]?.body as { note: string }; + expect(result.note).toEqual('note'); + }); + + it('should return notFound if no note exists', async () => { + const protectionUpdatesNoteHandler = getProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponseEmpty); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.notFound).toBeCalled(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts new file mode 100644 index 0000000000000..e1677451ff577 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts @@ -0,0 +1,126 @@ +/* + * Copyright 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 { + RequestHandler, + SavedObjectReference, + SavedObjectsClientContract, +} from '@kbn/core/server'; +import type { TypeOf } from '@kbn/config-schema'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import { protectionUpdatesNoteSavedObjectType } from '../../lib/protection_updates_note/saved_object_mappings'; +import type { + CreateUpdateProtectionUpdatesNoteSchema, + GetProtectionUpdatesNoteSchema, +} from '../../../../common/api/endpoint/protection_updates_note/protection_updates_note_schema'; + +const getProtectionNote = async (SOClient: SavedObjectsClientContract, packagePolicyId: string) => { + return SOClient.find<{ note: string }>({ + type: protectionUpdatesNoteSavedObjectType, + hasReference: { type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, id: packagePolicyId }, + }); +}; + +const updateProtectionNote = async ( + SOClient: SavedObjectsClientContract, + noteId: string, + note: string, + references: SavedObjectReference[] +) => { + return SOClient.update( + protectionUpdatesNoteSavedObjectType, + noteId, + { + note, + }, + { + references, + refresh: 'wait_for', + } + ); +}; + +const createProtectionNote = async ( + SOClient: SavedObjectsClientContract, + note: string, + references: SavedObjectReference[] +) => { + return SOClient.create( + protectionUpdatesNoteSavedObjectType, + { + note, + }, + { + references, + refresh: 'wait_for', + } + ); +}; + +export const postProtectionUpdatesNoteHandler = function (): RequestHandler< + TypeOf, + undefined, + TypeOf +> { + return async (context, request, response) => { + const SOClient = (await context.core).savedObjects.client; + const { package_policy_id: packagePolicyId } = request.params; + const { note } = request.body; + + const soClientResponse = await getProtectionNote(SOClient, packagePolicyId); + + if (soClientResponse.saved_objects[0]) { + const { references } = soClientResponse.saved_objects[0]; + + const updatedNoteSO = await updateProtectionNote( + SOClient, + soClientResponse.saved_objects[0].id, + note, + references + ); + + const { attributes } = updatedNoteSO; + + return response.ok({ body: attributes }); + } + + const references: SavedObjectReference[] = [ + { + id: packagePolicyId, + name: 'package_policy', + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + }, + ]; + + const noteSO = await createProtectionNote(SOClient, note, references); + + const { attributes } = noteSO; + + return response.ok({ body: attributes }); + }; +}; + +export const getProtectionUpdatesNoteHandler = function (): RequestHandler< + TypeOf, + undefined, + undefined +> { + return async (context, request, response) => { + const SOClient = (await context.core).savedObjects.client; + const { package_policy_id: packagePolicyId } = request.params; + + const soClientResponse = await getProtectionNote(SOClient, packagePolicyId); + + if (!soClientResponse.saved_objects[0] || !soClientResponse.saved_objects[0].attributes) { + return response.notFound({ body: { message: 'No note found for this policy' } }); + } + + const { attributes } = soClientResponse.saved_objects[0]; + + return response.ok({ body: attributes }); + }; +}; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts new file mode 100644 index 0000000000000..4d398bbe14e6e --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { IRouter } from '@kbn/core/server'; +import { getProtectionUpdatesNoteHandler, postProtectionUpdatesNoteHandler } from './handlers'; +import { + GetProtectionUpdatesNoteSchema, + CreateUpdateProtectionUpdatesNoteSchema, +} from '../../../../common/api/endpoint/protection_updates_note/protection_updates_note_schema'; +import { withEndpointAuthz } from '../with_endpoint_authz'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../common/endpoint/constants'; +import type { EndpointAppContext } from '../../types'; + +export function registerProtectionUpdatesNoteRoutes( + router: IRouter, + endpointAppContext: EndpointAppContext +) { + const logger = endpointAppContext.logFactory.get('protectionUpdatesNote'); + + router.versioned + .post({ + access: 'public', + path: PROTECTION_UPDATES_NOTE_ROUTE, + options: { authRequired: true, tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: CreateUpdateProtectionUpdatesNoteSchema, + }, + }, + withEndpointAuthz( + { all: ['canWritePolicyManagement'] }, + logger, + postProtectionUpdatesNoteHandler() + ) + ); + + router.versioned + .get({ + access: 'public', + path: PROTECTION_UPDATES_NOTE_ROUTE, + options: { authRequired: true, tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: GetProtectionUpdatesNoteSchema, + }, + }, + withEndpointAuthz( + { all: ['canReadPolicyManagement'] }, + logger, + getProtectionUpdatesNoteHandler() + ) + ); +} diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts index e2ce386337a85..43292c8436fdc 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts @@ -615,7 +615,7 @@ describe('ingest_integration tests ', () => { const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; const invokeDeleteCallback = async (): Promise => { - const callback = getPackagePolicyDeleteCallback(exceptionListClient); + const callback = getPackagePolicyDeleteCallback(exceptionListClient, soClient); await callback(deletePackagePolicyMock(), soClient, esClient); }; @@ -640,6 +640,27 @@ describe('ingest_integration tests ', () => { }); it('removes policy from artifact', async () => { + soClient.find.mockResolvedValueOnce({ + total: 1, + saved_objects: [ + { + id: 'id', + type: 'type', + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + attributes: { note: 'note' }, + score: 1, + }, + ], + page: 1, + per_page: 10, + }); + await invokeDeleteCallback(); expect(exceptionListClient.findExceptionListsItem).toHaveBeenCalledWith({ @@ -660,6 +681,8 @@ describe('ingest_integration tests ', () => { osTypes: fakeArtifact.os_types, tags: [], }); + + expect(soClient.delete).toBeCalledWith('policy-settings-protection-updates-note', 'id'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts index 554417eee480d..c2775f3f4794a 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { Logger, ElasticsearchClient } from '@kbn/core/server'; +import type { Logger, ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; import type { ExceptionListClient } from '@kbn/lists-plugin/server'; import type { PluginStartContract as AlertsStartContract } from '@kbn/alerting-plugin/server'; import type { @@ -44,6 +44,7 @@ import type { AnyPolicyCreateConfig } from './types'; import { ENDPOINT_INTEGRATION_CONFIG_KEY } from './constants'; import { createEventFilters } from './handlers/create_event_filters'; import type { AppFeaturesService } from '../lib/app_features_service/app_features_service'; +import { removeProtectionUpdatesNote } from './handlers/remove_protection_updates_note'; const isEndpointPackagePolicy = ( packagePolicy: T @@ -280,7 +281,8 @@ export const getPackagePolicyPostCreateCallback = ( }; export const getPackagePolicyDeleteCallback = ( - exceptionsClient: ExceptionListClient | undefined + exceptionsClient: ExceptionListClient | undefined, + savedObjectsClient: SavedObjectsClientContract | undefined ): PostPackagePolicyPostDeleteCallback => { return async (deletePackagePolicy): Promise => { if (!exceptionsClient) { @@ -290,8 +292,12 @@ export const getPackagePolicyDeleteCallback = ( for (const policy of deletePackagePolicy) { if (isEndpointPackagePolicy(policy)) { policiesToRemove.push(removePolicyFromArtifacts(exceptionsClient, policy)); + if (savedObjectsClient) { + policiesToRemove.push(removeProtectionUpdatesNote(savedObjectsClient, policy)); + } } } + await Promise.all(policiesToRemove); }; }; diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts new file mode 100644 index 0000000000000..9106eba06e780 --- /dev/null +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PostPackagePolicyPostDeleteCallback } from '@kbn/fleet-plugin/server'; +import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import pMap from 'p-map'; +import { protectionUpdatesNoteSavedObjectType } from '../../endpoint/lib/protection_updates_note/saved_object_mappings'; + +export const removeProtectionUpdatesNote = async ( + soClient: SavedObjectsClientContract, + policy: Parameters[0][0] +) => { + if (policy.id) { + const foundProtectionUpdatesNotes = await soClient.find({ + type: protectionUpdatesNoteSavedObjectType, + hasReference: { + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + id: policy.id, + }, + }); + await pMap( + foundProtectionUpdatesNotes.saved_objects, + (protectionUpdatesNote: { id: string }) => { + soClient.delete(protectionUpdatesNoteSavedObjectType, protectionUpdatesNote.id); + } + ); + } +}; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 65d66e4fde644..8d3bef07d19e1 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -98,6 +98,7 @@ import { import { AppFeaturesService } from './lib/app_features_service/app_features_service'; import { registerRiskScoringTask } from './lib/risk_engine/tasks/risk_scoring_task'; +import { registerProtectionUpdatesNoteRoutes } from './endpoint/routes/protection_updates_note'; export type { SetupPlugins, StartPlugins, PluginSetup, PluginStart } from './plugin_contract'; @@ -317,6 +318,7 @@ export class Plugin implements ISecuritySolutionPlugin { ); registerLimitedConcurrencyRoutes(core); registerPolicyRoutes(router, this.endpointContext); + registerProtectionUpdatesNoteRoutes(router, this.endpointContext); registerActionRoutes( router, this.endpointContext, @@ -533,6 +535,7 @@ export class Plugin implements ISecuritySolutionPlugin { createFleetActionsClient, esClient: core.elasticsearch.client.asInternalUser, appFeaturesService, + savedObjectsClient, }); this.telemetryReceiver.start( diff --git a/x-pack/plugins/security_solution/server/saved_objects.ts b/x-pack/plugins/security_solution/server/saved_objects.ts index 096b46528e76f..3f91bcf149ac6 100644 --- a/x-pack/plugins/security_solution/server/saved_objects.ts +++ b/x-pack/plugins/security_solution/server/saved_objects.ts @@ -7,6 +7,7 @@ import type { CoreSetup } from '@kbn/core/server'; +import { protectionUpdatesNoteType } from './endpoint/lib/protection_updates_note/saved_object_mappings'; import { noteType, pinnedEventType, timelineType } from './lib/timeline/saved_object_mappings'; // eslint-disable-next-line no-restricted-imports import { legacyType as legacyRuleActionsType } from './lib/detection_engine/rule_actions_legacy'; @@ -24,6 +25,7 @@ const types = [ manifestType, signalsMigrationType, riskEngineConfigurationType, + protectionUpdatesNoteType, ]; export const savedObjectTypes = types.map((type) => type.name); From 4fc0369713f8abbe8686e182daee8d36a79e7844 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 6 Sep 2023 09:03:48 +0300 Subject: [PATCH 51/52] [ES|QL] Adds initial telemetry events (#165693) ## Summary Adds initial counters for ES|QL 1. When the Try ES|QL option in dataview picker is clicked 2. When a Lens chart with text based languages is rendered --- .../public/dataview_picker/change_dataview.tsx | 8 ++++++-- .../datasources/text_based/text_based_languages.tsx | 8 +++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx index 7d04fd5fa3621..4c4a81371e052 100644 --- a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx +++ b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx @@ -27,6 +27,7 @@ import { EuiButtonEmpty, EuiToolTip, } from '@elastic/eui'; +import { METRIC_TYPE } from '@kbn/analytics'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { AggregateQuery, getLanguageDisplayName } from '@kbn/es-query'; import type { DataView } from '@kbn/data-views-plugin/public'; @@ -92,7 +93,9 @@ export function ChangeDataView({ const [selectedDataViewId, setSelectedDataViewId] = useState(currentDataViewId); const kibana = useKibana(); - const { application, data, storage, dataViews, dataViewEditor } = kibana.services; + const { application, data, storage, dataViews, dataViewEditor, appName, usageCollection } = + kibana.services; + const reportUiCounter = usageCollection?.reportUiCounter.bind(usageCollection, appName); const styles = changeDataViewStyles({ fullWidth: trigger.fullWidth }); const [isTextLangTransitionModalDismissed, setIsTextLangTransitionModalDismissed] = useState(() => Boolean(storage.get(TEXT_LANG_TRANSITION_MODAL_KEY)) @@ -366,8 +369,9 @@ export function ChangeDataView({ (q: AggregateQuery) => { onTextLangQuerySubmit?.(q); setPopoverIsOpen(false); + reportUiCounter?.(METRIC_TYPE.CLICK, `esql:unified_search_clicked`); }, - [onTextLangQuerySubmit] + [onTextLangQuerySubmit, reportUiCounter] ); const cleanup = useCallback( diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx index e2dc541e77e2d..a76e2edd623b0 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { CoreStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; -import type { AggregateQuery } from '@kbn/es-query'; +import { AggregateQuery, isOfAggregateQueryType, getAggregateQueryMode } from '@kbn/es-query'; import type { SavedObjectReference } from '@kbn/core/public'; import { EuiFormRow } from '@elastic/eui'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; @@ -371,6 +371,12 @@ export function getTextBasedDatasource({ }, getRenderEventCounters(state: TextBasedPrivateState): string[] { + const context = state?.initialContext; + if (context && 'query' in context && context.query && isOfAggregateQueryType(context.query)) { + const language = getAggregateQueryMode(context.query); + // it will eventually log render_lens_esql_chart + return [`${language}_chart`]; + } return []; }, From 0f3209cc50fc624e7d1d35e3b8e13725aaf5fc85 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 6 Sep 2023 09:21:46 +0200 Subject: [PATCH 52/52] [AggConfigs] Consider root level filters buckets correctly when building other terms bucket (#165656) ## Summary Fixes #165487 This PR fixes the `Other` bucket problem when the filter is used at root level with a nested `terms` agg. This is visible when using the `Split metric by` in Lens in a table visualization. Used the `sum` to easily compare the results: Screenshot 2023-09-05 at 11 12 46 Now introducing a basic `*` Filter as `split metric by`: Screenshot 2023-09-05 at 11 12 52 And with a more complex filter (1098 + 564 = 1662): Screenshot 2023-09-05 at 11 12 36 ### 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: Stratoula Kalafateli --- .../_terms_other_bucket_helper.test.ts | 113 ++++++++++++++++++ .../buckets/_terms_other_bucket_helper.ts | 6 +- 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts index 981ff3664fbec..b68893847ed64 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts @@ -545,6 +545,119 @@ describe('Terms Agg Other bucket helper', () => { expect(agg).toEqual(false); }); + + test('returns true when nested filter agg has buckets', () => { + const aggConfigs = getAggConfigs([ + { + id: '0', + type: BUCKET_TYPES.FILTERS, + params: [ + { + input: { + language: 'kuery', + query: '', + }, + label: '', + }, + ], + }, + ...nestedTerm.aggs, + ]); + + const nestedTermResponseWithRootFilter = wrapResponse({ + '0': { + buckets: { + '*': { + '1': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { + '2': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { key: 'ios', doc_count: 2850 }, + { key: 'win xp', doc_count: 2830 }, + { key: '__missing__', doc_count: 1430 }, + ], + }, + key: 'US-with-dash', + doc_count: 2850, + }, + { + '2': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { key: 'ios', doc_count: 1850 }, + { key: 'win xp', doc_count: 1830 }, + { key: '__missing__', doc_count: 130 }, + ], + }, + key: 'IN-with-dash', + doc_count: 2830, + }, + ], + }, + doc_count: 1148, + }, + }, + }, + }); + + const otherAggConfig = buildOtherBucketAgg( + aggConfigs, + aggConfigs.aggs[2] as IBucketAggConfig, + enrichResponseWithSampling(nestedTermResponseWithRootFilter) + ); + + expect(otherAggConfig).toBeDefined(); + if (otherAggConfig) { + const expectedResponse = { + 'other-filter': { + aggs: undefined, + filters: { + filters: { + [`${SEP}*${SEP}IN-with-dash`]: { + bool: { + must: [], + filter: [ + { bool: { filter: [], must: [], must_not: [], should: [] } }, + { match_phrase: { 'geo.src': 'IN-with-dash' } }, + { exists: { field: 'machine.os.raw' } }, + ], + should: [], + must_not: [ + { match_phrase: { 'machine.os.raw': 'ios' } }, + { match_phrase: { 'machine.os.raw': 'win xp' } }, + ], + }, + }, + [`${SEP}*${SEP}US-with-dash`]: { + bool: { + must: [], + filter: [ + { bool: { filter: [], must: [], must_not: [], should: [] } }, + { match_phrase: { 'geo.src': 'US-with-dash' } }, + { exists: { field: 'machine.os.raw' } }, + ], + should: [], + must_not: [ + { match_phrase: { 'machine.os.raw': 'ios' } }, + { match_phrase: { 'machine.os.raw': 'win xp' } }, + ], + }, + }, + }, + }, + }, + }; + const resp = otherAggConfig(); + const topAgg = !isSamplingEnabled(probability) ? resp : resp.sampling!.aggs; + expect(topAgg).toEqual(expectedResponse); + } + }); }); describe(`mergeOtherBucketAggResponse${getTitlePostfix()}`, () => { diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts index 9737883733266..924564744962f 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts @@ -206,7 +206,11 @@ export const buildOtherBucketAgg = ( ) => { // make sure there are actually results for the buckets const agg = aggregations[aggId]; - if (!agg || !agg.buckets.length) { + if ( + !agg || + // buckets can be either an array or an object in case there's also a filter at the same level + (Array.isArray(agg.buckets) ? !agg.buckets.length : !Object.values(agg.buckets).length) + ) { noAggBucketResults = true; return; }