diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index aa7a96bc8b4a8..27b48e0d18d4b 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -271,30 +271,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/functional/defend_workflows.sh - label: 'Defend Workflows Cypress Tests' - agents: - queue: n2-4-virt - depends_on: build - timeout_in_minutes: 60 - parallelism: 10 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/steps/functional/defend_workflows_serverless.sh - label: 'Defend Workflows Cypress Tests on Serverless' - agents: - queue: n2-4-virt - depends_on: build - timeout_in_minutes: 60 - parallelism: 6 - retry: - automatic: - - exit_status: '*' - limit: 1 - - command: .buildkite/scripts/steps/functional/threat_intelligence.sh label: 'Threat Intelligence Cypress Tests' agents: diff --git a/.buildkite/pipelines/on_merge_unsupported_ftrs.yml b/.buildkite/pipelines/on_merge_unsupported_ftrs.yml index 8221e27ea7502..bf606f2e5abd5 100644 --- a/.buildkite/pipelines/on_merge_unsupported_ftrs.yml +++ b/.buildkite/pipelines/on_merge_unsupported_ftrs.yml @@ -61,3 +61,27 @@ steps: limit: 3 - exit_status: '*' limit: 1 + + - command: .buildkite/scripts/steps/functional/defend_workflows.sh + label: 'Defend Workflows Cypress Tests' + agents: + queue: n2-4-virt + depends_on: build + timeout_in_minutes: 60 + parallelism: 10 + retry: + automatic: + - exit_status: '*' + limit: 1 + + - command: .buildkite/scripts/steps/functional/defend_workflows_serverless.sh + label: 'Defend Workflows Cypress Tests on Serverless' + agents: + queue: n2-4-virt + depends_on: build + timeout_in_minutes: 60 + parallelism: 6 + retry: + automatic: + - exit_status: '*' + limit: 1 diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 223acd9220046..6011d1d78a696 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -249,30 +249,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/functional/defend_workflows.sh - label: 'Defend Workflows Cypress Tests' - agents: - queue: n2-4-virt - depends_on: build - timeout_in_minutes: 60 - parallelism: 16 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/steps/functional/defend_workflows_serverless.sh - label: 'Defend Workflows Cypress Tests on Serverless' - agents: - queue: n2-4-virt - depends_on: build - timeout_in_minutes: 60 - parallelism: 6 - retry: - automatic: - - exit_status: '*' - limit: 1 - - command: .buildkite/scripts/steps/functional/threat_intelligence.sh label: 'Threat Intelligence Cypress Tests' agents: diff --git a/.buildkite/pipelines/pull_request/defend_workflows.yml b/.buildkite/pipelines/pull_request/defend_workflows.yml new file mode 100644 index 0000000000000..29d90461b04d5 --- /dev/null +++ b/.buildkite/pipelines/pull_request/defend_workflows.yml @@ -0,0 +1,24 @@ +steps: + - command: .buildkite/scripts/steps/functional/defend_workflows.sh + label: 'Defend Workflows Cypress Tests' + agents: + queue: n2-4-virt + depends_on: build + timeout_in_minutes: 60 + parallelism: 16 + retry: + automatic: + - exit_status: '*' + limit: 1 + + - command: .buildkite/scripts/steps/functional/defend_workflows_serverless.sh + label: 'Defend Workflows Cypress Tests on Serverless' + agents: + queue: n2-4-virt + depends_on: build + timeout_in_minutes: 60 + parallelism: 6 + retry: + automatic: + - exit_status: '*' + limit: 1 diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 9c7b02eb98604..0a305f49a811f 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -179,6 +179,19 @@ const uploadPipeline = (pipelineContent: string | object) => { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/cypress_burn.yml')); } + if ( + (await doAnyChangesMatch([ + /^packages\/kbn-securitysolution-.*/, + /^x-pack\/plugins\/security_solution/, + /^x-pack\/test\/defend_workflows_cypress/, + /^x-pack\/test\/security_solution_cypress/, + /^fleet_packages\.json/, + ])) || + GITHUB_PR_LABELS.includes('ci:all-cypress-suites') + ) { + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/defend_workflows.yml')); + } + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/post_build.yml')); // remove duplicated steps diff --git a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh b/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh index 56b44315bf064..9d353b167ea47 100755 --- a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh +++ b/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh @@ -16,6 +16,9 @@ export JOB=kibana-security-solution-chrome buildkite-agent meta-data set "${BUILDKITE_JOB_ID}_is_test_execution_step" "true" +mkdir .ftr +retry 5 5 vault kv get -format=json -field=data secret/kibana-issues/dev/security-quality-gate/role-users > .ftr/role_users.json + cd x-pack/test/security_solution_cypress set +e diff --git a/.buildkite/scripts/serverless/create_deploy_tag/collect_commit_info.ts b/.buildkite/scripts/serverless/create_deploy_tag/collect_commit_info.ts index ce30a3a71d8ee..5f4957f771d45 100644 --- a/.buildkite/scripts/serverless/create_deploy_tag/collect_commit_info.ts +++ b/.buildkite/scripts/serverless/create_deploy_tag/collect_commit_info.ts @@ -13,6 +13,7 @@ import { getSelectedCommitHash, getCommitByHash, makeCommitInfoHtml, + getRecentCommits, } from './info_sections/commit_info'; import { getArtifactBuild, @@ -45,7 +46,8 @@ async function main() { const buildkiteBuild = await getOnMergePRBuild(selectedSha); const nextBuildContainingCommit = await getQAFBuildContainingCommit( selectedSha, - selectedCommitInfo.date! + selectedCommitInfo.date!, + await getRecentCommits(50) ); const artifactBuild = await getArtifactBuild(selectedSha); addBuildkiteInfoSection( diff --git a/.buildkite/scripts/serverless/create_deploy_tag/create_deploy_tag.sh b/.buildkite/scripts/serverless/create_deploy_tag/create_deploy_tag.sh index b0d7660054bce..87c197142a9bb 100755 --- a/.buildkite/scripts/serverless/create_deploy_tag/create_deploy_tag.sh +++ b/.buildkite/scripts/serverless/create_deploy_tag/create_deploy_tag.sh @@ -11,9 +11,12 @@ fi echo "--- Creating deploy tag $DEPLOY_TAG at $KIBANA_COMMIT_SHA" +echo "Fetching user identity from GitHub..." +IDENTITY_JSON=$(ts-node .buildkite/scripts/serverless/create_deploy_tag/get_github_identity.ts) + # Set git identity to whomever triggered the buildkite job -git config user.email "$BUILDKITE_BUILD_CREATOR_EMAIL" -git config user.name "$BUILDKITE_BUILD_CREATOR" +git config user.email "${BUILDKITE_BUILD_CREATOR_EMAIL:-$(echo ${IDENTITY_JSON} | jq .email)}" +git config user.name "${BUILDKITE_BUILD_CREATOR:-$(echo ${IDENTITY_JSON} | jq .name)}" # Create a tag for the deploy git tag -a "$DEPLOY_TAG" "$KIBANA_COMMIT_SHA" \ diff --git a/.buildkite/scripts/serverless/create_deploy_tag/get_github_identity.ts b/.buildkite/scripts/serverless/create_deploy_tag/get_github_identity.ts new file mode 100644 index 0000000000000..f8179b4f0a37a --- /dev/null +++ b/.buildkite/scripts/serverless/create_deploy_tag/get_github_identity.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// Query the GitHub API for the user's GitHub identity +import { octokit } from './shared'; + +const getGitHubIdentity = async (): Promise<{ + login: string; + name: string | null; + email: string | null; +}> => { + const { data } = await octokit.users.getAuthenticated(); + + return { + login: data.login, + name: data.name, + email: data.email, + }; +}; + +async function main() { + try { + const identity = await getGitHubIdentity(); + + if (!identity.name) { + identity.name = identity.login; + } + + if (!identity.email) { + identity.email = `${identity.login}@elastic.co`; + } + + return identity; + } catch (error) { + console.error(error); + + return { + login: 'unknown-user', + name: 'Unknown User', + email: 'unknown-user@elastic.co', + }; + } +} + +if (require.main === module) { + main().then((identity) => { + console.log(JSON.stringify(identity)); + }); +} else { + module.exports = main; +} diff --git a/.buildkite/scripts/serverless/create_deploy_tag/info_sections/build_info.ts b/.buildkite/scripts/serverless/create_deploy_tag/info_sections/build_info.ts index 7330458703546..0315d59ec9ca4 100644 --- a/.buildkite/scripts/serverless/create_deploy_tag/info_sections/build_info.ts +++ b/.buildkite/scripts/serverless/create_deploy_tag/info_sections/build_info.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { components } from '@octokit/openapi-types'; -import { buildkite, buildkiteBuildStateToEmoji, CommitWithStatuses, octokit } from '../shared'; +import { buildkite, buildkiteBuildStateToEmoji, CommitWithStatuses } from '../shared'; +import { GitCommitExtract } from './commit_info'; import { Build } from '#pipeline-utils/buildkite'; const QA_FTR_TEST_SLUG = 'appex-qa-serverless-kibana-ftr-tests'; @@ -70,27 +70,30 @@ export async function getArtifactBuild(commitSha: string): Promise { - // List of commits - const commitShaList = await getCommitListCached(); - // List of QAF builds const qafBuilds = await buildkite.getBuildsAfterDate(QA_FTR_TEST_SLUG, date, 30); + qafBuilds.reverse(); // Find the first build that contains this commit - const build = qafBuilds.find((kbBuild) => { - // Check if build.commit is after commitSha? - const kibanaCommitSha = tryGetKibanaBuildHashFromQAFBuild(kbBuild); - const buildkiteBuildShaIndex = commitShaList.findIndex((c) => c.sha === kibanaCommitSha); - const commitShaIndex = commitShaList.findIndex((c) => c.sha === commitSha); - - return ( - commitShaIndex !== -1 && - buildkiteBuildShaIndex !== -1 && - buildkiteBuildShaIndex < commitShaIndex - ); - }); + const build = qafBuilds + // Only search across scheduled builds, triggered builds might run with different commits + .filter((e) => e.source === 'schedule') + .find((kbBuild) => { + const commitShaIndex = recentGitCommits.findIndex((c) => c.sha === commitSha); + + const kibanaCommitOfFTR = tryGetKibanaBuildHashFromQAFBuild(kbBuild); + const buildkiteBuildShaIndex = recentGitCommits.findIndex((c) => c.sha === kibanaCommitOfFTR); + + // Check if build.commit is after commitSha? + return ( + commitShaIndex !== -1 && + buildkiteBuildShaIndex !== -1 && + buildkiteBuildShaIndex <= commitShaIndex + ); + }); if (!build) { return null; @@ -121,25 +124,6 @@ function tryGetKibanaBuildHashFromQAFBuild(build: Build) { } } -let _commitListCache: Array | null = null; -async function getCommitListCached() { - if (!_commitListCache) { - const resp = await octokit.request<'GET /repos/{owner}/{repo}/commits'>( - 'GET /repos/{owner}/{repo}/commits', - { - owner: 'elastic', - repo: 'kibana', - headers: { - accept: 'application/vnd.github.v3+json', - 'X-GitHub-Api-Version': '2022-11-28', - }, - } - ); - _commitListCache = resp.data; - } - return _commitListCache; -} - function makeBuildInfoSnippetHtml(name: string, build: BuildkiteBuildExtract | null) { if (!build) { return `[❓] ${name} - no build found`; diff --git a/.buildkite/scripts/serverless/create_deploy_tag/list_commit_candidates.ts b/.buildkite/scripts/serverless/create_deploy_tag/list_commit_candidates.ts index 7b20174200096..8245b195789fe 100755 --- a/.buildkite/scripts/serverless/create_deploy_tag/list_commit_candidates.ts +++ b/.buildkite/scripts/serverless/create_deploy_tag/list_commit_candidates.ts @@ -83,7 +83,7 @@ async function enrichWithStatuses(commits: GitCommitExtract[]): Promise { })(); const makeMockExec = (id: string) => { - console.warn("--- Using mock exec, don't use this on CI. ---"); + if (process.env?.CI?.match(/(1|true)/i)) { + throw new Error(`Mock exec is not supported in CI - your commands won't be executed.`); + } + const callStorage = getCallStorage(); const calls = callStorage[id]; diff --git a/.github/paths-labeller.yml b/.github/paths-labeller.yml index 4f4057935265a..5f1ac0401ab31 100644 --- a/.github/paths-labeller.yml +++ b/.github/paths-labeller.yml @@ -8,18 +8,17 @@ - "Feature:ExpressionLanguage": - "src/plugins/expressions/**/*.*" - "src/plugins/bfetch/**/*.*" - - "Team:apm": + - "Team:obs-ux-infra_services": - "x-pack/plugins/apm/**/*.*" - "x-pack/test/apm_api_integration/**/*.*" - "packages/kbn-apm-synthtrace/**/*.*" - "packages/kbn-apm-synthtrace-client/**/*.*" - "packages/kbn-apm-utils/**/*.*" - - "Team:Fleet": - - "x-pack/plugins/fleet/**/*.*" - - "x-pack/test/fleet_api_integration/**/*.*" - - "Team:uptime": - "x-pack/plugins/synthetics/**/*.*" - "x-pack/plugins/ux/**/*.*" - "x-pack/plugins/observability/public/components/shared/exploratory_view/**/*.*" + - "Team:Fleet": + - "x-pack/plugins/fleet/**/*.*" + - "x-pack/test/fleet_api_integration/**/*.*" - "Team:obs-ux-management": - "x-pack/plugins/observability/**/*.*" diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 7709257435bb7..d1449bb4f5442 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index bce5a1fc82590..e063bf6df4262 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index c1f74dfb3274e..2c3f3fe8ad821 100644 --- a/api_docs/ai_assistant_management_observability.mdx +++ b/api_docs/ai_assistant_management_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementObservability title: "aiAssistantManagementObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementObservability plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementObservability'] --- import aiAssistantManagementObservabilityObj from './ai_assistant_management_observability.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 848766d618c0a..cf78bd1b05f4f 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 724759f81e697..fdf70ee454902 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-12-13 +date: 2023-12-18 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 dc4670eb9da35..d40ce5a71c17a 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-12-13 +date: 2023-12-18 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 4332e1296e080..bf2e4195bbde6 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-12-13 +date: 2023-12-18 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 12ce31b5fc992..3492827c5f164 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-12-13 +date: 2023-12-18 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 789670a6bddc1..b99e057c430cf 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-12-13 +date: 2023-12-18 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 3c8659acbb808..45ef7d3af1b42 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-12-13 +date: 2023-12-18 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 bddb939897f7d..34c44f5a72c88 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-12-13 +date: 2023-12-18 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 64297ff727746..54443dab0bb19 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-12-13 +date: 2023-12-18 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 fc8a144d07016..f6ed79fed21c4 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.devdocs.json b/api_docs/charts.devdocs.json index 08ffd55cf4e6c..7a0f646988360 100644 --- a/api_docs/charts.devdocs.json +++ b/api_docs/charts.devdocs.json @@ -2239,19 +2239,9 @@ "label": "theme", "description": [], "signature": [ - "{ readonly chartsDefaultTheme: ", - "RecursivePartial", - "<", - "Theme", - ">; readonly chartsDefaultBaseTheme: ", - "Theme", - "; chartsTheme$: ", - "Observable", - "<", - "RecursivePartial", - "<", + "{ readonly chartsDefaultBaseTheme: ", "Theme", - ">>; chartsBaseTheme$: ", + "; chartsBaseTheme$: ", "Observable", "<", "Theme", @@ -3403,7 +3393,7 @@ "CustomXDomain", " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; } | undefined; }" + " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; } | undefined; }" ], "path": "src/plugins/charts/common/static/overrides/settings.ts", "deprecated": false, diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index b3eeff9a0316a..5922ea4676fff 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-12-13 +date: 2023-12-18 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 08bd6905c5636..56e061837c347 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index b0ef9f3444300..dfab273f2a8a1 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-12-13 +date: 2023-12-18 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 9cae5b79d0479..6c2e123b2daad 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-12-13 +date: 2023-12-18 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 e8ea589290d82..02a383a8bd04c 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-12-13 +date: 2023-12-18 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 2522a1727be7d..fd3451cd8b25c 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-12-13 +date: 2023-12-18 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 1fcc3d5026448..0a88f9c0d6bbf 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-12-13 +date: 2023-12-18 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 3c314e3f55237..20b386f71265a 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-12-13 +date: 2023-12-18 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 c27e47ec3d9b2..51d15d378ee8e 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-12-13 +date: 2023-12-18 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 30d14130df133..bcf15e3402ff7 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-12-13 +date: 2023-12-18 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 9447da6a6c499..9f59b08b3f38f 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-12-13 +date: 2023-12-18 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 f3d8c5220c9d4..b7a5d18a76ff4 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-12-13 +date: 2023-12-18 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 f88394fa5f92c..02c66c81bc712 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-12-13 +date: 2023-12-18 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 2bd9a94fb8748..86f96ae960121 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-12-13 +date: 2023-12-18 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 8d6b70f36a85d..dcd50dc9f7f3e 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-12-13 +date: 2023-12-18 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 8477e652f6cc5..22d26ca448f35 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-12-13 +date: 2023-12-18 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 9e2675a5d3422..958f49dd1b01d 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-12-13 +date: 2023-12-18 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 6fc94ee14799a..3fcd74bf2db2b 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-12-13 +date: 2023-12-18 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 9937b3ce9caba..39ed6985bfed2 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-12-13 +date: 2023-12-18 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 3aa5ab77d0037..2390728196970 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.devdocs.json b/api_docs/dataset_quality.devdocs.json index 5aa8c615ce8b0..70ddd3bed1130 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -130,7 +130,7 @@ "StringC", "; }>]>; }> | undefined; handler: ({}: ", "DatasetQualityRouteHandlerResources", - " & { params: { query: { start: number; end: number; } & { type?: \"metrics\" | \"synthetics\" | \"profiling\" | \"traces\" | \"logs\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ degradedDocs: { dataset: string; percentage: number; }[]; }>; } & ", + " & { params: { query: { start: number; end: number; } & { type?: \"metrics\" | \"synthetics\" | \"traces\" | \"logs\" | \"profiling\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ degradedDocs: { dataset: string; percentage: number; }[]; }>; } & ", "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/stats\": { endpoint: \"GET /internal/dataset_quality/data_streams/stats\"; params?: ", "TypeC", @@ -156,7 +156,7 @@ "StringC", "; }>]>; }> | undefined; handler: ({}: ", "DatasetQualityRouteHandlerResources", - " & { params: { query: { type?: \"metrics\" | \"synthetics\" | \"profiling\" | \"traces\" | \"logs\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ dataStreamsStats: ", + " & { params: { query: { type?: \"metrics\" | \"synthetics\" | \"traces\" | \"logs\" | \"profiling\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ dataStreamsStats: ", "DataStreamStat", "[]; integrations: ", "Integration", @@ -217,7 +217,7 @@ "StringC", "; }>]>; }> | undefined; handler: ({}: ", "DatasetQualityRouteHandlerResources", - " & { params: { query: { start: number; end: number; } & { type?: \"metrics\" | \"synthetics\" | \"profiling\" | \"traces\" | \"logs\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ degradedDocs: { dataset: string; percentage: number; }[]; }>; } & ", + " & { params: { query: { start: number; end: number; } & { type?: \"metrics\" | \"synthetics\" | \"traces\" | \"logs\" | \"profiling\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ degradedDocs: { dataset: string; percentage: number; }[]; }>; } & ", "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/stats\": { endpoint: \"GET /internal/dataset_quality/data_streams/stats\"; params?: ", "TypeC", @@ -243,7 +243,7 @@ "StringC", "; }>]>; }> | undefined; handler: ({}: ", "DatasetQualityRouteHandlerResources", - " & { params: { query: { type?: \"metrics\" | \"synthetics\" | \"profiling\" | \"traces\" | \"logs\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ dataStreamsStats: ", + " & { params: { query: { type?: \"metrics\" | \"synthetics\" | \"traces\" | \"logs\" | \"profiling\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ dataStreamsStats: ", "DataStreamStat", "[]; integrations: ", "Integration", diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index ca2c2db5182bd..81cc0ab9b84f1 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index c69ec0abd8a01..f4bea6a1ef33e 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -18,7 +18,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | ml, stackAlerts | - | | | ruleRegistry, observability, ml, infra, monitoring, securitySolution, stackAlerts, synthetics, transform, uptime | - | -| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, visualizations, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, security, alerting, triggersActionsUi, cases, aiops, advancedSettings, exploratoryView, fleet, metricsDataAccess, licenseManagement, maps, dataVisualizer, ml, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, enterpriseSearch, globalSearchBar, graph, grokdebugger, indexLifecycleManagement, infra, ingestPipelines, logstash, monitoring, observabilityOnboarding, osquery, devTools, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, console, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | +| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, visualizations, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, security, alerting, triggersActionsUi, cases, aiops, advancedSettings, exploratoryView, fleet, metricsDataAccess, licenseManagement, maps, dataVisualizer, ml, osquery, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, globalSearchBar, graph, grokdebugger, indexLifecycleManagement, infra, ingestPipelines, logstash, monitoring, observabilityOnboarding, devTools, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, console, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | | | encryptedSavedObjects, actions, data, ml, logstash, securitySolution, cloudChat | - | | | actions, ml, savedObjectsTagging, enterpriseSearch | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, aiops, ml, dataVisualizer, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | @@ -28,7 +28,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | dashboard, dataVisualizer, stackAlerts, expressionPartitionVis | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | | | triggersActionsUi | - | -| | inspector, data, savedObjects, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, advancedSettings, exploratoryView, fleet, telemetry, maps, banners, reporting, timelines, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, monitoring, securitySolution, synthetics, uptime, cloudLinks, console, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | +| | inspector, data, savedObjects, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, advancedSettings, exploratoryView, fleet, telemetry, maps, timelines, banners, reporting, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, monitoring, securitySolution, synthetics, uptime, cloudLinks, console, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | | | @kbn/core, visualizations, triggersActionsUi, advancedSettings | - | | | observability, @kbn/securitysolution-data-table, securitySolution | - | | | monitoring | - | @@ -57,7 +57,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | securitySolution | - | | | securitySolution | - | -| | exploratoryView, fleet, dataVisualizer, cloudSecurityPosture, discoverEnhanced, osquery, synthetics | - | +| | exploratoryView, fleet, dataVisualizer, osquery, cloudSecurityPosture, discoverEnhanced, synthetics | - | | | @kbn/core-plugins-browser-internal, @kbn/core-root-browser-internal, home, savedObjects, unifiedSearch, visualizations, fileUpload, dashboardEnhanced, transform, discover, dataVisualizer | - | | | @kbn/core-lifecycle-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, visualizations, exploratoryView, transform, @kbn/core-saved-objects-browser-mocks | - | | | actions, alerting | - | @@ -128,8 +128,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/reporting-export-types-pdf, reporting | - | | | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, observabilityOnboarding, console | - | | | @kbn/content-management-table-list-view, filesManagement | - | -| | enterpriseSearch | - | | | @kbn/react-kibana-context-styled, kibanaReact | - | +| | enterpriseSearch | - | | | encryptedSavedObjects | - | | | @kbn/core | - | | | @kbn/core | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 20c0c1e4060f5..a11224493d683 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -145,9 +145,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | [internal_utils.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts#:~:text=migrationVersion) | - | | | [internal_utils.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts#:~:text=migrationVersion), [internal_utils.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts#:~:text=migrationVersion), [internal_utils.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts#:~:text=migrationVersion), [internal_utils.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts#:~:text=migrationVersion) | - | -| | [increment_counter_internal.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/increment_counter_internal.ts#:~:text=migrationVersion), [repository.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts#:~:text=migrationVersion) | - | +| | [increment_counter_internal.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/increment_counter_internal.ts#:~:text=migrationVersion), [increment_counter.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/increment_counter.test.ts#:~:text=migrationVersion) | - | | | [bulk_create.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts#:~:text=migrationVersion), [repository.test.common.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/test_helpers/repository.test.common.ts#:~:text=migrationVersion) | - | -| | [create.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts#:~:text=migrationVersion), [repository.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts#:~:text=migrationVersion), [repository.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts#:~:text=migrationVersion), [repository.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts#:~:text=migrationVersion) | - | +| | [create.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts#:~:text=migrationVersion), [create.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts#:~:text=migrationVersion), [create.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts#:~:text=migrationVersion), [create.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts#:~:text=migrationVersion) | - | @@ -651,7 +651,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/index.tsx#:~:text=KibanaThemeProvider) | - | | | [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi) | - | | | [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz) | - | | | [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0197a283cfa49..ab3591dba2573 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 712073756ba39..eeda4c2b542ee 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json index e1cc13f2bb13d..ee434fed57833 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -2458,18 +2458,6 @@ "plugin": "dataVisualizer", "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx" }, - { - "plugin": "cloudSecurityPosture", - "path": "x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx" - }, - { - "plugin": "discoverEnhanced", - "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts" - }, - { - "plugin": "discoverEnhanced", - "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts" - }, { "plugin": "osquery", "path": "x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx" @@ -2482,6 +2470,18 @@ "plugin": "osquery", "path": "x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx" }, + { + "plugin": "cloudSecurityPosture", + "path": "x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx" + }, + { + "plugin": "discoverEnhanced", + "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts" + }, + { + "plugin": "discoverEnhanced", + "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx" diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 1991c9af98d29..50ed757f8e751 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-12-13 +date: 2023-12-18 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 21976ad6e2de3..338829c6ed471 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-12-13 +date: 2023-12-18 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 4e8876ee9be94..8479686b3104a 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.devdocs.json b/api_docs/elastic_assistant.devdocs.json index 9a3dd4987b4a5..0f18338ae23fe 100644 --- a/api_docs/elastic_assistant.devdocs.json +++ b/api_docs/elastic_assistant.devdocs.json @@ -11,7 +11,1677 @@ "server": { "classes": [], "functions": [], - "interfaces": [], + "interfaces": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool", + "type": "Interface", + "tags": [], + "label": "AssistantTool", + "description": [ + "\nInterfaces for registering tools to be used by the elastic assistant" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.sourceRegister", + "type": "string", + "tags": [], + "label": "sourceRegister", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.isSupported", + "type": "Function", + "tags": [], + "label": "isSupported", + "description": [], + "signature": [ + "(params: ", + { + "pluginId": "elasticAssistant", + "scope": "server", + "docId": "kibElasticAssistantPluginApi", + "section": "def-server.AssistantToolParams", + "text": "AssistantToolParams" + }, + ") => boolean" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.isSupported.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + { + "pluginId": "elasticAssistant", + "scope": "server", + "docId": "kibElasticAssistantPluginApi", + "section": "def-server.AssistantToolParams", + "text": "AssistantToolParams" + } + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.getTool", + "type": "Function", + "tags": [], + "label": "getTool", + "description": [], + "signature": [ + "(params: ", + { + "pluginId": "elasticAssistant", + "scope": "server", + "docId": "kibElasticAssistantPluginApi", + "section": "def-server.AssistantToolParams", + "text": "AssistantToolParams" + }, + ") => ", + "Tool", + " | null" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantTool.getTool.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + { + "pluginId": "elasticAssistant", + "scope": "server", + "docId": "kibElasticAssistantPluginApi", + "section": "def-server.AssistantToolParams", + "text": "AssistantToolParams" + } + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams", + "type": "Interface", + "tags": [], + "label": "AssistantToolParams", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.alertsIndexPattern", + "type": "string", + "tags": [], + "label": "alertsIndexPattern", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.allow", + "type": "Array", + "tags": [], + "label": "allow", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.allowReplacement", + "type": "Array", + "tags": [], + "label": "allowReplacement", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.assistantLangChain", + "type": "boolean", + "tags": [], + "label": "assistantLangChain", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.chain", + "type": "Object", + "tags": [], + "label": "chain", + "description": [], + "signature": [ + "RetrievalQAChain" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.esClient", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + "{ create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "WriteResponseBase", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "WriteResponseBase", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "WriteResponseBase", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "WriteResponseBase", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "WriteResponseBase", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "WriteResponseBase", + ">; }; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; helpers: ", + "default", + "; name: string | symbol; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchApplication]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kSynonyms]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; child: (opts: ", + "ClientOptions", + ") => ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TasksTaskListResponseBase", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TasksTaskListResponseBase", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TasksTaskListResponseBase", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "AcknowledgedResponseBase", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "AcknowledgedResponseBase", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "AcknowledgedResponseBase", + ">; }; enrich: ", + "default", + "; eql: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; healthReport: { (this: That, params?: ", + "HealthReportRequest", + " | ", + "HealthReportRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "HealthReportResponse", + ">; (this: That, params?: ", + "HealthReportRequest", + " | ", + "HealthReportRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "HealthReportResponse", + ", unknown>>; (this: That, params?: ", + "HealthReportRequest", + " | ", + "HealthReportRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "HealthReportResponse", + ">; }; ilm: ", + "default", + "; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "WriteResponseBase", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "WriteResponseBase", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "WriteResponseBase", + ">; }; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; monitoring: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "AcknowledgedResponseBase", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "AcknowledgedResponseBase", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "AcknowledgedResponseBase", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params: ", + "ReindexRequest", + " | ", + "ReindexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params: ", + "ReindexRequest", + " | ", + "ReindexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params: ", + "ReindexRequest", + " | ", + "ReindexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchApplication: ", + "default", + "; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; security: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; synonyms: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; transform: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.modelExists", + "type": "boolean", + "tags": [], + "label": "modelExists", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.onNewReplacements", + "type": "Function", + "tags": [], + "label": "onNewReplacements", + "description": [], + "signature": [ + "((newReplacements: Record) => void) | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.onNewReplacements.$1", + "type": "Object", + "tags": [], + "label": "newReplacements", + "description": [], + "signature": [ + "Record" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.replacements", + "type": "Object", + "tags": [], + "label": "replacements", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.request", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginSetupDependencies", + "type": "Interface", + "tags": [], + "label": "ElasticAssistantPluginSetupDependencies", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginSetupDependencies.actions", + "type": "Object", + "tags": [], + "label": "actions", + "description": [], + "signature": [ + { + "pluginId": "actions", + "scope": "server", + "docId": "kibActionsPluginApi", + "section": "def-server.PluginSetupContract", + "text": "PluginSetupContract" + } + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginSetupDependencies.ml", + "type": "CompoundType", + "tags": [], + "label": "ml", + "description": [], + "signature": [ + "JobServiceProvider", + " & ", + "AnomalyDetectorsProvider", + " & ", + "MlSystemProvider", + " & ", + "ModulesProvider", + " & ", + "ResultsServiceProvider", + " & { alertingServiceProvider(savedObjectsClient: ", + { + "pluginId": "@kbn/core-saved-objects-api-server", + "scope": "common", + "docId": "kibKbnCoreSavedObjectsApiServerPluginApi", + "section": "def-common.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "): { preview: (args_0: Readonly<{} & { timeRange: string; alertParams: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>; sampleSize: number; }>) => Promise; execute: (params: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>, spaceId: string) => Promise<{ payload: ", + "AnomalyDetectionAlertPayload", + "; context: ", + "AnomalyDetectionAlertContext", + "; name: string; isHealthy: boolean; } | undefined>; }; } & ", + "TrainedModelsProvider" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStartDependencies", + "type": "Interface", + "tags": [], + "label": "ElasticAssistantPluginStartDependencies", + "description": [], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStartDependencies.actions", + "type": "Object", + "tags": [], + "label": "actions", + "description": [], + "signature": [ + { + "pluginId": "actions", + "scope": "server", + "docId": "kibActionsPluginApi", + "section": "def-server.PluginStartContract", + "text": "PluginStartContract" + } + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], "enums": [], "misc": [], "objects": [], @@ -84,6 +1754,114 @@ "path": "x-pack/plugins/elastic_assistant/server/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStart.registerTools", + "type": "Function", + "tags": [], + "label": "registerTools", + "description": [ + "\nRegister tools to be used by the elastic assistant" + ], + "signature": [ + "(pluginName: string, tools: ", + { + "pluginId": "elasticAssistant", + "scope": "server", + "docId": "kibElasticAssistantPluginApi", + "section": "def-server.AssistantTool", + "text": "AssistantTool" + }, + "[]) => void" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStart.registerTools.$1", + "type": "string", + "tags": [], + "label": "pluginName", + "description": [ + "Name of the plugin the tool should be registered to" + ], + "signature": [ + "string" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStart.registerTools.$2", + "type": "Array", + "tags": [], + "label": "tools", + "description": [ + "AssistantTools to be registered with for the given plugin" + ], + "signature": [ + { + "pluginId": "elasticAssistant", + "scope": "server", + "docId": "kibElasticAssistantPluginApi", + "section": "def-server.AssistantTool", + "text": "AssistantTool" + }, + "[]" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStart.getRegisteredTools", + "type": "Function", + "tags": [], + "label": "getRegisteredTools", + "description": [ + "\nGet the registered tools" + ], + "signature": [ + "(pluginName: string) => ", + { + "pluginId": "elasticAssistant", + "scope": "server", + "docId": "kibElasticAssistantPluginApi", + "section": "def-server.AssistantTool", + "text": "AssistantTool" + }, + "[]" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStart.getRegisteredTools.$1", + "type": "string", + "tags": [], + "label": "pluginName", + "description": [ + "Name of the plugin to get the tools for" + ], + "path": "x-pack/plugins/elastic_assistant/server/services/app_context.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "lifecycle": "start", diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 6e5b753fdaba3..a2c2b504dfbef 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-solution](https://github.com/orgs/elastic/teams/secur | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 4 | 0 | 2 | 0 | +| 36 | 0 | 28 | 0 | ## Server @@ -31,3 +31,6 @@ Contact [@elastic/security-solution](https://github.com/orgs/elastic/teams/secur ### Start +### Interfaces + + diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index b6b9068f6bbb3..8389a899ba227 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-12-13 +date: 2023-12-18 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 2f36742483ff2..ff1e67822fa7b 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-12-13 +date: 2023-12-18 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 4430aa549e6b9..a47111610dcdf 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-12-13 +date: 2023-12-18 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 096c1d056210d..7fd3eaca41e50 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-12-13 +date: 2023-12-18 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 f45f65c2c960a..c2624f82921ba 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-12-13 +date: 2023-12-18 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 f223dc2f51006..f571e4f8740f0 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 8cf2b45bb218e..15e6be951ac7b 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index fccfee4c9df96..e40a78ff75254 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.devdocs.json b/api_docs/exploratory_view.devdocs.json index 0e55c27726762..9c86024cc4f65 100644 --- a/api_docs/exploratory_view.devdocs.json +++ b/api_docs/exploratory_view.devdocs.json @@ -1215,7 +1215,7 @@ "label": "observabilityShared", "description": [], "signature": [ - "{ navigation: { PageTemplate: (pageTemplateProps: ", + "{ locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", ") => JSX.Element; registerSections: (sections$: ", "Observable", diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index b297eb9d277e8..bfe5801abe7b4 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-12-13 +date: 2023-12-18 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 06ffcc7a2baad..e4ef7e053a2e7 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.devdocs.json b/api_docs/expression_gauge.devdocs.json index 77364b73eed1f..b38c5c31347ff 100644 --- a/api_docs/expression_gauge.devdocs.json +++ b/api_docs/expression_gauge.devdocs.json @@ -1257,7 +1257,7 @@ "CustomXDomain", " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined; }" + " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined; }" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_renderers.ts", "deprecated": false, diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 3ed59da560f0f..f0ede837beaf2 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.devdocs.json b/api_docs/expression_heatmap.devdocs.json index d11837f817ccd..90835598df7ca 100644 --- a/api_docs/expression_heatmap.devdocs.json +++ b/api_docs/expression_heatmap.devdocs.json @@ -527,7 +527,7 @@ "CustomXDomain", " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_heatmap/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 5f1009d0668e1..a5d6315c6626d 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-12-13 +date: 2023-12-18 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 61d5408445a43..90059d8cff950 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-12-13 +date: 2023-12-18 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 65ab0588a5eab..168f800a0081d 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-12-13 +date: 2023-12-18 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 eef78d69f9961..c56f4fa9d8e19 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.devdocs.json b/api_docs/expression_metric_vis.devdocs.json index f8dd939d5f389..37d520de6b448 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -904,7 +904,7 @@ "CustomXDomain", " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 7207d496d561c..98177c0300813 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-12-13 +date: 2023-12-18 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 4fe14176ea884..904f4cc1bce66 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-12-13 +date: 2023-12-18 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 2d61395f7b57e..298193a1737ad 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-12-13 +date: 2023-12-18 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 9301fa1c7a55d..1e74209d0d395 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-12-13 +date: 2023-12-18 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 90222ec59c78b..fa44f87fa5b22 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-12-13 +date: 2023-12-18 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 d81547562db5f..5108fc9808341 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.devdocs.json b/api_docs/expression_x_y.devdocs.json index da16d0b24133a..a1289bd45ad5c 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -1978,7 +1978,7 @@ "CustomXDomain", " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_renderers.ts", "deprecated": false, diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 45fff0597cf12..d3c7f84749c5d 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-12-13 +date: 2023-12-18 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 747eec2145c55..b98eb7026244e 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-12-13 +date: 2023-12-18 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 d203a51e12fbe..454c8f03367da 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-12-13 +date: 2023-12-18 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 c92b3a0ba5f98..9dd0b97e64ec8 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-12-13 +date: 2023-12-18 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 f0c74f1d78666..4021ba58c7f20 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-12-13 +date: 2023-12-18 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 29ccee54a8b35..6c07fffc51ffe 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-12-13 +date: 2023-12-18 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 a66b6b7f19f2b..68987d9cd7ac9 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-12-13 +date: 2023-12-18 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 7b7c401508c32..73c4dee2f1277 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-12-13 +date: 2023-12-18 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 10042db9a56d8..f1c3f3cc1a913 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-12-13 +date: 2023-12-18 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 c9ad6f6ca9d74..c042e6144fe77 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-12-13 +date: 2023-12-18 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 ff92fef8f8c9a..a9abb45c37c85 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-12-13 +date: 2023-12-18 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 28da19a2bc552..674b8f7effddf 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-12-13 +date: 2023-12-18 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 895ed1a6b4a87..b778b3382f0b5 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-12-13 +date: 2023-12-18 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 7de1a1dd5348d..c684d47e6b029 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-12-13 +date: 2023-12-18 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 1e086d59f9ae7..a919b307e6821 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-12-13 +date: 2023-12-18 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 c4ed1c2b51662..8fa62f4d2d670 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-12-13 +date: 2023-12-18 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 25a48f415644d..ac5f555034a95 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-12-13 +date: 2023-12-18 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 829b51b4c75ae..74dbf76765b6c 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index d2b7cc6c00e8e..171a14fb69ef5 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index ca49679f9950f..e1f95801b3462 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-12-13 +date: 2023-12-18 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 b49b5dc3a136f..c0c27ef3e91f6 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-12-13 +date: 2023-12-18 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 2577debfb5711..bb2aedd617e18 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-12-13 +date: 2023-12-18 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 3359c10ac882c..056a90759df25 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index a8e17dc06b3ab..42af610a54bff 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 0282d7e5bd496..55e03d25df5e5 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-12-13 +date: 2023-12-18 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 d4d90691beb10..22e5f87e5d944 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-12-13 +date: 2023-12-18 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 61f8cc16086ff..e0fb45d2a34e0 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.devdocs.json b/api_docs/kbn_analytics_client.devdocs.json index ff3773ba777b1..2ae989f1fbf2b 100644 --- a/api_docs/kbn_analytics_client.devdocs.json +++ b/api_docs/kbn_analytics_client.devdocs.json @@ -732,16 +732,12 @@ }, { "plugin": "observabilityAIAssistant", - "path": "x-pack/plugins/observability_ai_assistant/public/components/chat/chat_body.tsx" + "path": "x-pack/plugins/observability_ai_assistant/public/analytics/index.ts" }, { "plugin": "observabilityAIAssistant", "path": "x-pack/plugins/observability_ai_assistant/public/utils/storybook_decorator.tsx" }, - { - "plugin": "observabilityAIAssistant", - "path": "x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx" - }, { "plugin": "apm", "path": "x-pack/plugins/apm/public/services/telemetry/telemetry_client.ts" diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 4126632162903..27fad748961d3 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index a29fa9f20e3d2..b332ba2f15077 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.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 d9376ac2df305..4c05abf6d9069 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-12-13 +date: 2023-12-18 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 d143c7c007faf..b43c90a0540a5 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-12-13 +date: 2023-12-18 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 7d83cc403e715..8ce9b7942e346 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-12-13 +date: 2023-12-18 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 a78078515dc37..2c4f25586b711 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-12-13 +date: 2023-12-18 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 6c324ba477a2e..9c2c36886a075 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-12-13 +date: 2023-12-18 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 8bb955b29fee3..35a46cc2c1e4f 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-12-13 +date: 2023-12-18 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 e81fd3a891a6a..b34e7d0b790f1 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-12-13 +date: 2023-12-18 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 e25c74daea32b..3404635761839 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-12-13 +date: 2023-12-18 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 79152bda711c6..2573d0417601e 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-12-13 +date: 2023-12-18 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 154618c811879..a91a5a8d1dff0 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 362fa5510dc98..5d767b8ca8bc9 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index e7b8ed9443021..fdba00611b817 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 1adf444153408..5fdfc3d8a1f32 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index eb832c193ed52..6089f4a18146a 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-12-13 +date: 2023-12-18 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 67f495cbc029e..d69636b052b3b 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-12-13 +date: 2023-12-18 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 5c6285786a170..0aa94786c7d48 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-12-13 +date: 2023-12-18 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 522606e53db45..a40509d452432 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-12-13 +date: 2023-12-18 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 e59e659acc666..ca41d4b5ed87a 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-12-13 +date: 2023-12-18 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 2e99ab0710e79..a34f052404c56 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-12-13 +date: 2023-12-18 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 0b2263347c2c6..fcd17b60f9a7d 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-12-13 +date: 2023-12-18 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 2abecbc4b17df..5d4387186d935 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-12-13 +date: 2023-12-18 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 df4a54a052401..c98e62ee39b2f 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 32648e0373b5b..b2bc50ba2d721 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-12-13 +date: 2023-12-18 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 4d82b53f8c39f..6e9701c063df1 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-12-13 +date: 2023-12-18 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 8e92f2153bc19..c0b12cb8c73b0 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-12-13 +date: 2023-12-18 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 b6802618e64e2..b23dc53cac326 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-12-13 +date: 2023-12-18 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 5185aa6662488..0057ac674e793 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-12-13 +date: 2023-12-18 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 7a1c77330c5f7..f7fc00555cde1 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-12-13 +date: 2023-12-18 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 f56f760c53ca5..648a85570a45e 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-12-13 +date: 2023-12-18 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_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index fc31b2991ddc7..077c1616ec586 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.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 e7cc31c0b8ba8..9706c5a4ff2aa 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-12-13 +date: 2023-12-18 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 e55293f6be42d..5b682e687b1cc 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-12-13 +date: 2023-12-18 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 aff818916b9fb..0cd7d25af0936 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-12-13 +date: 2023-12-18 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 60f101d120cbe..6bbcf077f9aef 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-12-13 +date: 2023-12-18 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 89e2eb2c94b14..cdc49dcfff3dd 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-12-13 +date: 2023-12-18 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 7ecafaed29f0d..490bb46e56b1b 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-12-13 +date: 2023-12-18 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 b27c2634a0f4f..bc499fc8a7831 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-12-13 +date: 2023-12-18 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 739a57f3dc823..72b74fc3326a0 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-12-13 +date: 2023-12-18 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 929fef3ea886b..af44f2a45a210 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-12-13 +date: 2023-12-18 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 33bb03daa12b3..193c703933d07 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-12-13 +date: 2023-12-18 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 cbf365951ba4b..79eeb48505030 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-12-13 +date: 2023-12-18 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 98ab0dfcd07d6..3a854a2871a01 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-12-13 +date: 2023-12-18 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 60bb5ec83a2b9..eeda2267135af 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-12-13 +date: 2023-12-18 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 4f19ada5e9e52..fa553f51684a2 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-12-13 +date: 2023-12-18 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 3d2df96958550..589c052b12b26 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-12-13 +date: 2023-12-18 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 1cccbb1f775e7..51d1b3d091b1b 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-12-13 +date: 2023-12-18 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 a5f8eba05c452..ba6bf377dee27 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-12-13 +date: 2023-12-18 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 77a957ac8f0c1..be3ddc0ee7399 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-12-13 +date: 2023-12-18 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 d7b02ea20cf95..fbd2ae1268939 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-12-13 +date: 2023-12-18 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 fe06955bebf4a..3c38a19d6ed73 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-12-13 +date: 2023-12-18 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 1feebaae6def1..10e5c64016955 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-12-13 +date: 2023-12-18 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 f8eb2544113d3..f3a196140ad0a 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-12-13 +date: 2023-12-18 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 7a1f0f7483f5e..2e0c62f61d634 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-12-13 +date: 2023-12-18 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 3d2e07f37b288..d6db51de343fb 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-12-13 +date: 2023-12-18 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 e51568187b057..534948735f573 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-12-13 +date: 2023-12-18 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 f9340f07a4cc3..27dcb84c32c5d 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-12-13 +date: 2023-12-18 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 56d7cc03be575..0962de3f43130 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-12-13 +date: 2023-12-18 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 838819c43e59c..adbb81c1fdfc4 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-12-13 +date: 2023-12-18 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 45f73e4359679..50fab91fc6366 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-12-13 +date: 2023-12-18 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 fba87b9c01b72..f1fa152c1c9b2 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-12-13 +date: 2023-12-18 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 570da6460a492..0bae8ebbb61d0 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-12-13 +date: 2023-12-18 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 70ec67032c48d..d80f5a1af49a3 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-12-13 +date: 2023-12-18 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 432e8e00ea41a..fcd2d84585c96 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-12-13 +date: 2023-12-18 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 473f0ea2f5185..8a403979234e3 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-12-13 +date: 2023-12-18 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 cbcd7c940c25b..8caccd3ae2684 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-12-13 +date: 2023-12-18 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 7d8d8502d2207..a756035b02840 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-12-13 +date: 2023-12-18 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 0895b794596ad..23095669443b7 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-12-13 +date: 2023-12-18 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 5f3fb472912f7..646df9276fe7a 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-12-13 +date: 2023-12-18 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 8cbf2cec345c6..94771e15fac55 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-12-13 +date: 2023-12-18 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 f8bc6a54f0a2d..2dba4fea20d06 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-12-13 +date: 2023-12-18 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 18136564bbf12..58e32b924d3c3 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-12-13 +date: 2023-12-18 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 2df9543b8cd54..db09a6a8c8236 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-12-13 +date: 2023-12-18 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 c33717919ba98..c8cce322ea439 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-12-13 +date: 2023-12-18 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 52cfa77bcee24..b9be5fd3e75ec 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-12-13 +date: 2023-12-18 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 aafe2d83d5d1a..199212f8e920d 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-12-13 +date: 2023-12-18 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 87baf71caffe0..635b004bdc967 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-12-13 +date: 2023-12-18 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 59cf301a70043..a6eaea88dff2e 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-12-13 +date: 2023-12-18 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 f602cd7547f8b..ee7dd336667ce 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-12-13 +date: 2023-12-18 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 3d7d18298d438..2c8b091f78567 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-12-13 +date: 2023-12-18 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 a8101222096f7..b7be1fb84e52d 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-12-13 +date: 2023-12-18 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 9823c7ba466fd..ed95ed6f07e61 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-12-13 +date: 2023-12-18 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 0209d605a120f..dc11b4273af32 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-12-13 +date: 2023-12-18 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 14a6607805575..d09ace31b27be 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-12-13 +date: 2023-12-18 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 eef5b2c26706e..06bc8e23c4ad0 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-12-13 +date: 2023-12-18 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 a667d906a1de4..f383ae9420241 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-12-13 +date: 2023-12-18 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 c8a6f9b24bc3c..a3df7b87884c1 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-12-13 +date: 2023-12-18 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 45a54b7bd0b09..fe9c0e0574263 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-12-13 +date: 2023-12-18 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 ff903feea66f2..fb847974f362a 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-12-13 +date: 2023-12-18 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 a97595e1e2c0b..61673518293a3 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-12-13 +date: 2023-12-18 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 024a0f7238779..84e3cfe7e45b3 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-12-13 +date: 2023-12-18 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 1e0c2d8a5d7f1..72f4da59ee099 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-12-13 +date: 2023-12-18 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 7d41bd32d8167..da9605c46a1a0 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-12-13 +date: 2023-12-18 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 f94979b775da2..a8b7284092e91 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-12-13 +date: 2023-12-18 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 630fed53c5148..777c1d21ff366 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-12-13 +date: 2023-12-18 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 751d066b54037..b32d6bbe4f133 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-12-13 +date: 2023-12-18 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 0dca8ac8cf1ab..97c584d234d87 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-12-13 +date: 2023-12-18 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 c87058079b43b..cdd0ce8b821a6 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-12-13 +date: 2023-12-18 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 982c9ec20da8f..c8d46b9066dad 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-12-13 +date: 2023-12-18 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 23d2e610a59a7..abc7ff90c58f0 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-12-13 +date: 2023-12-18 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 3bee0bef372f3..26407c48aa55b 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-12-13 +date: 2023-12-18 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 272e7b8c76e20..00beedd62a1a9 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-12-13 +date: 2023-12-18 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.mdx b/api_docs/kbn_core_http_server.mdx index d75a7b5d9d5d5..3f7cb307cc325 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-12-13 +date: 2023-12-18 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 e9941473dcdef..e04e7d002b67d 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-12-13 +date: 2023-12-18 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 a8f938f65d889..80b40ed18e0bf 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-12-13 +date: 2023-12-18 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 028adb3bd6939..550bd8fda45d8 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-12-13 +date: 2023-12-18 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 263ed9883f026..ad9ca0992b1b6 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-12-13 +date: 2023-12-18 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 640783c63c73a..cb9f63f13b1a8 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-12-13 +date: 2023-12-18 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 77482c147c580..76f8bd811d59a 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-12-13 +date: 2023-12-18 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 6eecab36e6177..6f10cbde93a11 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-12-13 +date: 2023-12-18 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 9cf7949cced73..0727e0bd484c4 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-12-13 +date: 2023-12-18 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 746fbbd74f6be..9e684933823f6 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-12-13 +date: 2023-12-18 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 9f21cd0dc029a..658d527d3064e 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-12-13 +date: 2023-12-18 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 bd19ff90e4ed6..91627cd136552 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-12-13 +date: 2023-12-18 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 1bc06056dcbcb..60b9a17504815 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-12-13 +date: 2023-12-18 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 7de464cb3b69c..e2a82ec070989 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-12-13 +date: 2023-12-18 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 eac4333f59568..8b0f6a3397f91 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-12-13 +date: 2023-12-18 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 330a5902fd11d..76685a5bbbee8 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-12-13 +date: 2023-12-18 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 4dcfc49869ba0..f13047197f085 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-12-13 +date: 2023-12-18 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 e8f195fee88ec..fe1ee0320fd29 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-12-13 +date: 2023-12-18 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 6793265c8aa15..966a116622309 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-12-13 +date: 2023-12-18 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 0d8e18e3d3cc6..2f22f46f55040 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-12-13 +date: 2023-12-18 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 7e38479e3cc27..7da73dd887ea1 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-12-13 +date: 2023-12-18 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 db082887ab8a0..7c56b28aaa11f 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-12-13 +date: 2023-12-18 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 3751b78444017..fea60539d0205 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-12-13 +date: 2023-12-18 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 ca3aff31a4cf1..9636268421d9f 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-12-13 +date: 2023-12-18 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 45b4509e14493..cbbc6f79e0a78 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-12-13 +date: 2023-12-18 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 e5d13df751b85..249a9f243ad26 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-12-13 +date: 2023-12-18 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 3d6bc5235b40c..d3517d28baf76 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-12-13 +date: 2023-12-18 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 9ceef895b28f6..2df4d8f0c36fa 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-12-13 +date: 2023-12-18 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 c5fcac50533a7..6b4d7ab555b1a 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-12-13 +date: 2023-12-18 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 75e4dc81274b0..d426d8d96cf4d 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-12-13 +date: 2023-12-18 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 54ae10ae3cd01..95720f9933108 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-12-13 +date: 2023-12-18 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 1cb5a78991718..fda3e7897a309 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-12-13 +date: 2023-12-18 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 3690cfcf46081..a20f89ef876d5 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-12-13 +date: 2023-12-18 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 76d5a9d233f93..482aac37947f4 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-12-13 +date: 2023-12-18 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 4667604ed9450..667b3de586bb2 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-12-13 +date: 2023-12-18 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 84fb88fae897a..b3c306763223d 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-12-13 +date: 2023-12-18 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 61ef0e7570514..9096726f6f872 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-12-13 +date: 2023-12-18 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_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 8f960a3928655..eca2061e12448 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 0f4b87031d582..b30994cf53e77 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 2d9e09da8a755..69a197d409734 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-12-13 +date: 2023-12-18 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 853a8c94fd2d8..2e51207839685 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-12-13 +date: 2023-12-18 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 4172b3cbd4a43..e6e45078e109d 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-12-13 +date: 2023-12-18 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 4289e8b9d62b6..2b9c468a11b58 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-12-13 +date: 2023-12-18 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 a657b7f9cead1..b469f1091e43c 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-12-13 +date: 2023-12-18 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 5e6ec55efcbfa..cb5397b159ba2 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-12-13 +date: 2023-12-18 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 c964f14f656c9..b121cde27c778 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-12-13 +date: 2023-12-18 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 225025fd28f42..911005fcaf805 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-12-13 +date: 2023-12-18 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 3a67f9680e990..38f164f47aa34 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-12-13 +date: 2023-12-18 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.devdocs.json b/api_docs/kbn_core_saved_objects_api_server.devdocs.json index 51dfc7d588784..3756940fe5518 100644 --- a/api_docs/kbn_core_saved_objects_api_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_server.devdocs.json @@ -6035,15 +6035,15 @@ }, { "plugin": "@kbn/core-saved-objects-api-server-internal", - "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts" + "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts" }, { "plugin": "@kbn/core-saved-objects-api-server-internal", - "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts" + "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts" }, { "plugin": "@kbn/core-saved-objects-api-server-internal", - "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts" + "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts" } ] }, @@ -7207,7 +7207,7 @@ }, { "plugin": "@kbn/core-saved-objects-api-server-internal", - "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts" + "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/increment_counter.test.ts" } ] }, diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 3cbe8db9b56b2..f85b2c9b20a4b 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-12-13 +date: 2023-12-18 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 9f1861343d56a..0526d4a6500e4 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-12-13 +date: 2023-12-18 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 fa03ac492e35f..317849626b5ac 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-12-13 +date: 2023-12-18 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 c442c252f7dc8..e2c07fc6e5fe1 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-12-13 +date: 2023-12-18 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 686e5adfac317..3ceaa17b078a0 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-12-13 +date: 2023-12-18 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 af72bbb47b4e0..c09d453c23e5d 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-12-13 +date: 2023-12-18 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 67eb29f599876..6525aa51019df 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-12-13 +date: 2023-12-18 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 51be848cdf4f3..97a402c613fbd 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-12-13 +date: 2023-12-18 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 0da26fad91241..161858bc9135b 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-12-13 +date: 2023-12-18 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 2af26f92d9cba..a2e247ae7f0e9 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-12-13 +date: 2023-12-18 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 ef9769a2b4de9..bf9bae4fcd9f3 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-12-13 +date: 2023-12-18 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 1c251fc569fdd..d61def8d8ba8f 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-12-13 +date: 2023-12-18 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 217996ebf2ec9..517653f19d05e 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-12-13 +date: 2023-12-18 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 1f7339467049d..e4a0a9b0f9f08 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-12-13 +date: 2023-12-18 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 1b427bab5a16c..fb8e03f629b71 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-12-13 +date: 2023-12-18 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 4d5bb27403790..39e153de04d62 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-12-13 +date: 2023-12-18 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 757930a265a42..a6551b34dd11f 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-12-13 +date: 2023-12-18 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 78a8b715801c1..af785c9dcbae5 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-12-13 +date: 2023-12-18 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 4dbc5433d61e6..cbc30a36bffe8 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-12-13 +date: 2023-12-18 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 0a17e80d44d94..7e47b960a041b 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-12-13 +date: 2023-12-18 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 34846dd69b6cd..0497b2a43ec07 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-12-13 +date: 2023-12-18 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 f7e32a86a57d3..9b3bf41851680 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-12-13 +date: 2023-12-18 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 1e094750d0923..7a440fac8f33a 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-12-13 +date: 2023-12-18 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 c16469d1d7de6..2eb7b79dbbeb2 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 679a39206805e..bae058c2a2c5f 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 6742babd8492b..b7fd7a7a19f55 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-12-13 +date: 2023-12-18 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 326c546649937..1d6dc02915b7f 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-12-13 +date: 2023-12-18 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 a7138087a4029..dcc9095057db1 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-12-13 +date: 2023-12-18 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 a926ef20794de..ccdbc6c90818f 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-12-13 +date: 2023-12-18 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 193b975169f8c..a89ca998f7e15 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-12-13 +date: 2023-12-18 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 249abfb23f3fe..97c2a7d1c4f69 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-12-13 +date: 2023-12-18 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 496ddcdc0a860..796fa4641bfb1 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-12-13 +date: 2023-12-18 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 47cc146a759c5..90261b6029ecf 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-12-13 +date: 2023-12-18 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 02e9bf7b7ccdc..2e78bd4ecb952 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-12-13 +date: 2023-12-18 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 6eb605151af98..b787fb372d072 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-12-13 +date: 2023-12-18 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 7b7aaace79737..f6ad6aeb00c6b 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-12-13 +date: 2023-12-18 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 d532d2918ac42..5dc95c55c2e2f 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-12-13 +date: 2023-12-18 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 fbba0242c64b3..74e8ecc50a858 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-12-13 +date: 2023-12-18 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 e59de6d91bb60..401a6558c3cfe 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-12-13 +date: 2023-12-18 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 8c80068266e24..a870f8df64b59 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-12-13 +date: 2023-12-18 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 72a4618d648e9..12f52963f12d2 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-12-13 +date: 2023-12-18 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 8d04ae66cff3e..76ead1f6cad73 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-12-13 +date: 2023-12-18 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 cbfce21ad9f88..1f49fc788d804 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-12-13 +date: 2023-12-18 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 797a2960f36dc..5de3db0711913 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index e6d4931de6e25..5db137898b87f 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 77c05539afc2f..d722b995af198 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 7d553155e80a7..f92815983f176 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-12-13 +date: 2023-12-18 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 1a1b49d74d506..21da5176decdd 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-12-13 +date: 2023-12-18 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 cff702c8454f7..92377b2c836fe 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-12-13 +date: 2023-12-18 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 bca751a7894e0..4b5d42f73f0fc 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-12-13 +date: 2023-12-18 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 74f3c0b2c6bdc..b2bb609a91644 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-12-13 +date: 2023-12-18 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 cbb06ddc7e649..0a855d60325aa 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-12-13 +date: 2023-12-18 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 d05d87e357de7..edb1f6c1ef122 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-12-13 +date: 2023-12-18 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 91c39d73c54be..5c408500376d8 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-12-13 +date: 2023-12-18 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 e4c690254167f..6be47aad55d28 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-12-13 +date: 2023-12-18 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 f574019bc37a5..ed09ca48b930d 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-12-13 +date: 2023-12-18 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 4d84e974f2ae4..6a63269e63038 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-12-13 +date: 2023-12-18 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 355a46813c9e0..095e294b197eb 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-12-13 +date: 2023-12-18 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 376d689c46a4d..92e47c1e80ee2 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-12-13 +date: 2023-12-18 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 c9e0ad5c06637..b7821b359a6e2 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-12-13 +date: 2023-12-18 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 f5d94a99102ca..eb2197b02a7ea 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-12-13 +date: 2023-12-18 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 4c4d02b8f24ee..e36223ee58a12 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-12-13 +date: 2023-12-18 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 fc0d0f7e9c405..94c9efb39c80f 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-12-13 +date: 2023-12-18 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 9f4c60267c061..ed78fcf431945 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 417cdaff4e836..0120336a220ea 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -840,7 +840,7 @@ "label": "fleet", "description": [], "signature": [ - "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; }" + "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; readonly performancePresets: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 0190e6a3d4c0e..f257a84ee9df5 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-12-13 +date: 2023-12-18 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 07dd422299359..fc140091aa73a 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-12-13 +date: 2023-12-18 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 89fb8f4639420..001bcabce3062 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-12-13 +date: 2023-12-18 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 75e4cf8683ed1..8d0379b73bffb 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-12-13 +date: 2023-12-18 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 50c5250908e1d..448c81776b53c 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-12-13 +date: 2023-12-18 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 286e08990126d..6b514df2f6ad8 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-12-13 +date: 2023-12-18 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_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 05eec93c0206e..d8736fe7fdbcb 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 824ef416a252b..0615538ed8aee 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index e5eb4719162ef..e9628df7b8716 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 5248a83e6398f..b01bcd77a0723 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-12-13 +date: 2023-12-18 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 715e1c162dfff..716f5c753935d 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-12-13 +date: 2023-12-18 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 df73bd0d75190..f592656e15c5a 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-12-13 +date: 2023-12-18 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 45d7c549158c4..033e3da68c8f4 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-12-13 +date: 2023-12-18 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 0952d933464bf..9679981a4ad50 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-12-13 +date: 2023-12-18 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 0c0821d6dda17..80a5bb8c8d592 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-12-13 +date: 2023-12-18 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 131398f26e042..6047999634fa2 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-12-13 +date: 2023-12-18 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 cc3862cec982b..7b0110c1da11b 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-12-13 +date: 2023-12-18 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 d3ac28ade010e..4a53c6bc1be00 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-12-13 +date: 2023-12-18 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 6463cacd9e717..57ee7f9140690 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 06d175b25b7cb..b391dff8f787d 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 32494163a6287..981f39a78518b 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-12-13 +date: 2023-12-18 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 31886b2094864..36ae97691ed46 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-12-13 +date: 2023-12-18 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 686bc471e42e4..bd5b0e7bd90d1 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-12-13 +date: 2023-12-18 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 2eefc2369697f..3cc35fb60e45d 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-12-13 +date: 2023-12-18 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 6b6a1b00f78db..fb10b807484c7 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index a642f257df5fc..f03fe4ef061fd 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-12-13 +date: 2023-12-18 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 03919a18e2f07..3b4f833c4efbd 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-12-13 +date: 2023-12-18 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 5c42bd80242f1..4cd9e8e01d40d 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-12-13 +date: 2023-12-18 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 c82122a723038..949665759bd5c 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-12-13 +date: 2023-12-18 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 beb3488e00a8e..1a7d7f457eef7 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-12-13 +date: 2023-12-18 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 f6a71e5202038..253477e5882eb 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-12-13 +date: 2023-12-18 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 f5835a8a6ac9a..a6338ecff062a 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-12-13 +date: 2023-12-18 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 e7cfa83d170a3..97671be1549ac 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-12-13 +date: 2023-12-18 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 7e17a68b0caf6..48fddec56fc11 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-12-13 +date: 2023-12-18 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 1a76683430fd2..87ebdbf2a77af 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-12-13 +date: 2023-12-18 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 5b3f1c09f834d..168779660e4b7 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-12-13 +date: 2023-12-18 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 cd6f32db4a6c1..641cf8d9596ab 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-12-13 +date: 2023-12-18 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 69b01da920f36..e10faf6fa36f4 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-12-13 +date: 2023-12-18 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 5a56570507bb6..6706a41f7f851 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-12-13 +date: 2023-12-18 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 b994b4ba78ddd..ea53f8abcf641 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-12-13 +date: 2023-12-18 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 12b2b6d927838..71abef9698b94 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-12-13 +date: 2023-12-18 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 a74b229db148e..b241fec416b97 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-12-13 +date: 2023-12-18 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 fa150ec4071e8..3e4e05f01392a 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-12-13 +date: 2023-12-18 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 00527bca17d36..29fa1180055ee 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-12-13 +date: 2023-12-18 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 fc0c2e7eaf5c9..85cc8998c837f 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-12-13 +date: 2023-12-18 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 d57da2600e752..bd9ea8ea80549 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-12-13 +date: 2023-12-18 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 5e8070808bbee..068f2d5f52f07 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index f5df57c02cd0a..92b0090dce580 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index c1f41a4f80de8..2bbd298328721 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index bfcdf11720a45..b92019369c1f6 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 2ce0ffe395efd..cef98e2186271 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 0beddbe227c9e..e094de228e61d 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 897e67cf54e2d..e9cf3555aba3e 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 80fd0019175d1..6188476a963c7 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index e948e440036c1..90340644d4c7b 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 7de2852066b85..c8b6f4b77fa88 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index ecd260135a5b7..6a8e81ee1afde 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 7d1476c67ece6..88d4e50eb4268 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-12-13 +date: 2023-12-18 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 e92912624971a..4abeebd551b28 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-12-13 +date: 2023-12-18 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 ef1d579be39ad..b13324dd0e5fb 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-12-13 +date: 2023-12-18 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 3502123f7e578..e2be7f0976c3a 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-12-13 +date: 2023-12-18 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 a20ae933ab25c..3627f26f72e31 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-12-13 +date: 2023-12-18 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 580cd38214cdd..bb670665d482d 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 0d431a26a6dbe..a0994c8ba1d78 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 283d0c2f8a7ea..4fe327028ec1b 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-12-13 +date: 2023-12-18 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 439ae544d8605..b2b8746710376 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-12-13 +date: 2023-12-18 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 b518dab27f4eb..c75f23a379ef5 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-12-13 +date: 2023-12-18 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 351a555fe4282..2098fdb2090ea 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-12-13 +date: 2023-12-18 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 a1a0df5ed1a95..a4873cc57aeae 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-12-13 +date: 2023-12-18 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 adb90a0916a82..279c4fc6dc828 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-12-13 +date: 2023-12-18 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 7d3165effd6a8..dc298e02da940 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-12-13 +date: 2023-12-18 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 7765019ce7be3..c6cf6204e8759 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-12-13 +date: 2023-12-18 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 49ec4c0312f01..7ee4dfda97a3e 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-12-13 +date: 2023-12-18 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 29b00b4f0ea8c..c6d7b9dce8d49 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-12-13 +date: 2023-12-18 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 b40050b9838b0..57cddb7fd0ece 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-12-13 +date: 2023-12-18 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 57f87953252f1..69c56d1eb05cd 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-12-13 +date: 2023-12-18 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 9288ea13d8355..efd1a6d6f880f 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-12-13 +date: 2023-12-18 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 6133035700ca6..1dc71b8d2ef86 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-12-13 +date: 2023-12-18 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 27a3f24927c83..7939ad7cd1cff 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-12-13 +date: 2023-12-18 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 c6dd5611bca68..f709af3ccb7aa 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-12-13 +date: 2023-12-18 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 3455653ac867e..7e5eaa5d7622b 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-12-13 +date: 2023-12-18 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 a6f445b91d1b2..236d4a4b2f22c 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-12-13 +date: 2023-12-18 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_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 6e33cd480e06f..23e90604f982b 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index d7b9d937de309..8d13454cb9a6e 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-12-13 +date: 2023-12-18 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 4d409c269cc33..e5d7b0aa67eb5 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-12-13 +date: 2023-12-18 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 6ddcb0039c3b1..4d9378269c2aa 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-12-13 +date: 2023-12-18 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 5a47eb045785f..99a52143d6005 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index ad173b74792f5..22fa9c9b32fb2 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index bb504f44e85d7..33c0d3eed4203 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index c74cc52197962..113433523f147 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index e237ff406439a..263e013d08d63 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index f6f16b5a9899a..720494699fe70 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-12-13 +date: 2023-12-18 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 2d75ba3911991..952a3340af2b2 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-12-13 +date: 2023-12-18 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 a06116214ee4d..83dbb0c4a7a7c 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-12-13 +date: 2023-12-18 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_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index af6f4153a775b..e16600d18d7b2 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index c99f839e0cd87..7553359315d68 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-12-13 +date: 2023-12-18 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 1ff790b494f92..36f37f53d14e0 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-12-13 +date: 2023-12-18 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 14cdbb159032d..61c3e5d26adab 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 97ea75e3b7311..249bfc33eca40 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 8a68c2147d2f2..c4b75d0550019 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-12-13 +date: 2023-12-18 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 df9509c23887c..84afd18b92520 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-12-13 +date: 2023-12-18 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 d6b506ea27baa..ba6ba45c02e79 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-12-13 +date: 2023-12-18 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 03c9fd692c898..ac88554558b28 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-12-13 +date: 2023-12-18 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 e9ae72a522762..5b3aca108bdf4 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-12-13 +date: 2023-12-18 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 96a8c16d6e5c0..ceb1bae3f5e4f 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-12-13 +date: 2023-12-18 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 3adad51d474a1..eef506749eff1 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-12-13 +date: 2023-12-18 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 1075cef5e2127..3d8430dacd6a9 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-12-13 +date: 2023-12-18 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 311f1dcf1a038..b1e50a15e7ce2 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-12-13 +date: 2023-12-18 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 2e0a455c85645..5c87c85b8cacb 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-12-13 +date: 2023-12-18 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 b104dc4bc3131..36f750b73a827 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-12-13 +date: 2023-12-18 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 cb34a5bc49c05..d6e8e3d8460e0 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-12-13 +date: 2023-12-18 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 f895dedb40b97..9bc687cb25d08 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 8b6545393f1cf..f9e334f8d409b 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index b53ad1d9b7a7b..442aad29a0c58 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 7006c2ebb02fb..74f62c3d11483 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 3f30bdb419d76..b9c1335e9a667 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 3f0e19f78c12d..7ecfba370b97e 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 646425127b092..eaa2a48ba19c6 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index c4fb7f8b90b17..f8367a9d63640 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 3522fa6bdf41d..24a3960a1c0a8 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 7d7474b00053d..3c93dadb1bf79 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index ef16d0652bb93..513169c265ec9 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 000bd5413ec62..f14474a85f18e 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-12-13 +date: 2023-12-18 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 55e679923887d..3180c43267a15 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-12-13 +date: 2023-12-18 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 0efb1f26615d6..cb60c7dd094c8 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-12-13 +date: 2023-12-18 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 5fddb72479ab1..38f097fe924fd 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index a67b9b6ed0616..d41c0802256a5 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.devdocs.json b/api_docs/kbn_search_connectors.devdocs.json index a6acd12d30d6a..f3377ab693b7f 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -9321,6 +9321,33 @@ ] } ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features.FeatureName.DOCUMENT_LEVEL_SECURITY", + "type": "Object", + "tags": [], + "label": "[FeatureName.DOCUMENT_LEVEL_SECURITY]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features.FeatureName.DOCUMENT_LEVEL_SECURITY.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ] }, @@ -12540,10 +12567,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage", "type": "Object", "tags": [], - "label": "google_drive", + "label": "google_cloud_storage", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12551,7 +12578,19 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration", "type": "Object", "tags": [], "label": "configuration", @@ -12562,7 +12601,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials", "type": "Object", "tags": [], "label": "service_account_credentials", @@ -12573,7 +12612,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -12587,7 +12626,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -12601,7 +12640,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.display", "type": "string", "tags": [], "label": "display", @@ -12622,7 +12661,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.label", "type": "string", "tags": [], "label": "label", @@ -12633,7 +12672,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.options", "type": "Array", "tags": [], "label": "options", @@ -12647,7 +12686,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.order", "type": "number", "tags": [], "label": "order", @@ -12658,7 +12697,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.required", "type": "boolean", "tags": [], "label": "required", @@ -12672,7 +12711,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -12686,18 +12725,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.type", "type": "string", "tags": [], "label": "type", @@ -12718,7 +12760,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -12732,7 +12774,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.validations", "type": "Array", "tags": [], "label": "validations", @@ -12746,7 +12788,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.service_account_credentials.value", "type": "string", "tags": [], "label": "value", @@ -12759,10 +12801,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count", "type": "Object", "tags": [], - "label": "use_domain_wide_delegation_for_sync", + "label": "retry_count", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12770,21 +12812,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -12798,7 +12837,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.display", "type": "string", "tags": [], "label": "display", @@ -12811,7 +12850,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12819,7 +12858,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.label", "type": "string", "tags": [], "label": "label", @@ -12830,7 +12869,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.options", "type": "Array", "tags": [], "label": "options", @@ -12844,7 +12883,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.order", "type": "number", "tags": [], "label": "order", @@ -12855,13 +12894,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12869,7 +12908,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -12883,18 +12922,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.type", "type": "string", "tags": [], "label": "type", @@ -12907,7 +12949,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12915,13 +12957,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12929,7 +12971,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.validations", "type": "Array", "tags": [], "label": "validations", @@ -12943,14 +12985,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.retry_count.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -12959,10 +12998,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service", "type": "Object", "tags": [], - "label": "google_workspace_admin_email_for_data_sync", + "label": "use_text_extraction_service", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12970,7 +13009,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -12984,13 +13023,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -12998,7 +13037,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.display", "type": "string", "tags": [], "label": "display", @@ -13011,7 +13050,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13019,7 +13058,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.label", "type": "string", "tags": [], "label": "label", @@ -13030,7 +13069,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.options", "type": "Array", "tags": [], "label": "options", @@ -13044,7 +13083,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.order", "type": "number", "tags": [], "label": "order", @@ -13055,7 +13094,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.required", "type": "boolean", "tags": [], "label": "required", @@ -13069,7 +13108,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -13083,7 +13122,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -13094,7 +13133,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.type", "type": "string", "tags": [], "label": "type", @@ -13107,7 +13146,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13115,13 +13154,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13129,13 +13168,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.validations", "type": "Array", "tags": [], "label": "validations", "description": [], "signature": [ - "{ type: string; constraint: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13143,23 +13182,74 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.configuration.use_text_extraction_service.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - }, + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_cloud_storage.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive", + "type": "Object", + "tags": [], + "label": "google_drive", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials", "type": "Object", "tags": [], - "label": "google_workspace_email_for_shared_drives_sync", + "label": "service_account_credentials", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13167,7 +13257,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -13181,13 +13271,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13195,7 +13285,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.display", "type": "string", "tags": [], "label": "display", @@ -13208,7 +13298,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TEXTAREA" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13216,7 +13306,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.label", "type": "string", "tags": [], "label": "label", @@ -13227,7 +13317,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.options", "type": "Array", "tags": [], "label": "options", @@ -13241,7 +13331,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.order", "type": "number", "tags": [], "label": "order", @@ -13252,7 +13342,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.required", "type": "boolean", "tags": [], "label": "required", @@ -13266,13 +13356,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13280,7 +13370,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -13291,7 +13381,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.type", "type": "string", "tags": [], "label": "type", @@ -13312,7 +13402,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -13326,13 +13416,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.validations", "type": "Array", "tags": [], "label": "validations", "description": [], "signature": [ - "{ type: string; constraint: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13340,7 +13430,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.service_account_credentials.value", "type": "string", "tags": [], "label": "value", @@ -13353,10 +13443,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync", "type": "Object", "tags": [], - "label": "use_document_level_security", + "label": "use_domain_wide_delegation_for_sync", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13364,7 +13454,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -13378,7 +13468,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -13392,7 +13482,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.display", "type": "string", "tags": [], "label": "display", @@ -13413,7 +13503,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.label", "type": "string", "tags": [], "label": "label", @@ -13424,7 +13514,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.options", "type": "Array", "tags": [], "label": "options", @@ -13438,7 +13528,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.order", "type": "number", "tags": [], "label": "order", @@ -13449,7 +13539,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.required", "type": "boolean", "tags": [], "label": "required", @@ -13463,7 +13553,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -13477,7 +13567,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -13488,7 +13578,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.type", "type": "string", "tags": [], "label": "type", @@ -13509,7 +13599,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -13523,7 +13613,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.validations", "type": "Array", "tags": [], "label": "validations", @@ -13537,7 +13627,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_domain_wide_delegation_for_sync.value", "type": "boolean", "tags": [], "label": "value", @@ -13553,10 +13643,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync", "type": "Object", "tags": [], - "label": "google_workspace_admin_email", + "label": "google_workspace_admin_email_for_data_sync", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13564,7 +13654,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -13578,13 +13668,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "({ field: string; value: true; } | { field: string; value: false; })[]" + "{ field: string; value: true; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13592,7 +13682,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.display", "type": "string", "tags": [], "label": "display", @@ -13613,7 +13703,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.label", "type": "string", "tags": [], "label": "label", @@ -13624,7 +13714,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.options", "type": "Array", "tags": [], "label": "options", @@ -13638,7 +13728,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.order", "type": "number", "tags": [], "label": "order", @@ -13649,7 +13739,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.required", "type": "boolean", "tags": [], "label": "required", @@ -13663,7 +13753,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -13677,7 +13767,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -13688,7 +13778,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.type", "type": "string", "tags": [], "label": "type", @@ -13709,7 +13799,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -13723,7 +13813,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.validations", "type": "Array", "tags": [], "label": "validations", @@ -13737,7 +13827,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email_for_data_sync.value", "type": "string", "tags": [], "label": "value", @@ -13750,10 +13840,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync", "type": "Object", "tags": [], - "label": "max_concurrency", + "label": "google_workspace_email_for_shared_drives_sync", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13761,24 +13851,27 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: true; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13786,7 +13879,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.display", "type": "string", "tags": [], "label": "display", @@ -13799,7 +13892,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13807,7 +13900,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.label", "type": "string", "tags": [], "label": "label", @@ -13818,7 +13911,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.options", "type": "Array", "tags": [], "label": "options", @@ -13832,7 +13925,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.order", "type": "number", "tags": [], "label": "order", @@ -13843,13 +13936,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13857,7 +13950,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -13871,7 +13964,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -13882,7 +13975,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.type", "type": "string", "tags": [], "label": "type", @@ -13895,7 +13988,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13903,13 +13996,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13917,13 +14010,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.validations", "type": "Array", "tags": [], "label": "validations", "description": [], "signature": [ - "{ type: string; constraint: number; }[]" + "{ type: string; constraint: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13931,7 +14024,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_email_for_shared_drives_sync.value", "type": "string", "tags": [], "label": "value", @@ -13944,10 +14037,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security", "type": "Object", "tags": [], - "label": "use_text_extraction_service", + "label": "use_document_level_security", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13955,7 +14048,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -13969,7 +14062,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -13983,7 +14076,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.display", "type": "string", "tags": [], "label": "display", @@ -14004,7 +14097,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.label", "type": "string", "tags": [], "label": "label", @@ -14015,7 +14108,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.options", "type": "Array", "tags": [], "label": "options", @@ -14029,7 +14122,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.order", "type": "number", "tags": [], "label": "order", @@ -14040,7 +14133,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.required", "type": "boolean", "tags": [], "label": "required", @@ -14054,7 +14147,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -14068,7 +14161,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -14079,7 +14172,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.type", "type": "string", "tags": [], "label": "type", @@ -14100,13 +14193,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14114,7 +14207,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.validations", "type": "Array", "tags": [], "label": "validations", @@ -14128,7 +14221,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_document_level_security.value", "type": "boolean", "tags": [], "label": "value", @@ -14141,101 +14234,13 @@ "trackAdoption": false } ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.features", - "type": "Object", - "tags": [], - "label": "features", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.features.FeatureName.DOCUMENT_LEVEL_SECURITY", - "type": "Object", - "tags": [], - "label": "[FeatureName.DOCUMENT_LEVEL_SECURITY]", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.features.FeatureName.DOCUMENT_LEVEL_SECURITY.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.serviceType", - "type": "string", - "tags": [], - "label": "serviceType", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira", - "type": "Object", - "tags": [], - "label": "jira", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration", - "type": "Object", - "tags": [], - "label": "configuration", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email", "type": "Object", "tags": [], - "label": "data_source", + "label": "google_workspace_admin_email", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14243,7 +14248,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -14257,13 +14262,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "({ field: string; value: true; } | { field: string; value: false; })[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14271,7 +14276,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.display", "type": "string", "tags": [], "label": "display", @@ -14284,7 +14289,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".DROPDOWN" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14292,7 +14297,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.label", "type": "string", "tags": [], "label": "label", @@ -14303,13 +14308,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.options", "type": "Array", "tags": [], "label": "options", "description": [], "signature": [ - "{ label: string; value: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14317,7 +14322,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.order", "type": "number", "tags": [], "label": "order", @@ -14328,7 +14333,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.required", "type": "boolean", "tags": [], "label": "required", @@ -14342,7 +14347,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -14356,21 +14361,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.type", "type": "string", "tags": [], "label": "type", @@ -14391,7 +14393,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -14405,13 +14407,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.validations", "type": "Array", "tags": [], "label": "validations", "description": [], "signature": [ - "never[]" + "{ type: string; constraint: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14419,7 +14421,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.google_workspace_admin_email.value", "type": "string", "tags": [], "label": "value", @@ -14432,10 +14434,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency", "type": "Object", "tags": [], - "label": "username", + "label": "max_concurrency", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14443,27 +14445,24 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14471,7 +14470,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.display", "type": "string", "tags": [], "label": "display", @@ -14484,7 +14483,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14492,7 +14491,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.label", "type": "string", "tags": [], "label": "label", @@ -14503,7 +14502,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.options", "type": "Array", "tags": [], "label": "options", @@ -14517,7 +14516,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.order", "type": "number", "tags": [], "label": "order", @@ -14528,13 +14527,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14542,7 +14541,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -14556,21 +14555,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.type", "type": "string", "tags": [], "label": "type", @@ -14583,7 +14579,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14591,13 +14587,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14605,13 +14601,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.validations", "type": "Array", "tags": [], "label": "validations", "description": [], "signature": [ - "never[]" + "{ type: string; constraint: number; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14619,7 +14615,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.max_concurrency.value", "type": "string", "tags": [], "label": "value", @@ -14632,10 +14628,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service", "type": "Object", "tags": [], - "label": "password", + "label": "use_text_extraction_service", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14643,7 +14639,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -14657,13 +14653,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14671,7 +14667,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.display", "type": "string", "tags": [], "label": "display", @@ -14684,7 +14680,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14692,7 +14688,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.label", "type": "string", "tags": [], "label": "label", @@ -14703,7 +14699,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.options", "type": "Array", "tags": [], "label": "options", @@ -14717,7 +14713,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.order", "type": "number", "tags": [], "label": "order", @@ -14728,7 +14724,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.required", "type": "boolean", "tags": [], "label": "required", @@ -14742,13 +14738,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14756,21 +14752,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.type", "type": "string", "tags": [], "label": "type", @@ -14783,7 +14776,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14791,13 +14784,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14805,7 +14798,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.validations", "type": "Array", "tags": [], "label": "validations", @@ -14819,23 +14812,39 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.configuration.use_text_extraction_service.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - }, + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.features.FeatureName.DOCUMENT_LEVEL_SECURITY", "type": "Object", "tags": [], - "label": "account_email", + "label": "[FeatureName.DOCUMENT_LEVEL_SECURITY]", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14843,7 +14852,82 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.features.FeatureName.DOCUMENT_LEVEL_SECURITY.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.google_drive.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira", + "type": "Object", + "tags": [], + "label": "jira", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source", + "type": "Object", + "tags": [], + "label": "data_source", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -14857,13 +14941,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14871,7 +14955,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.display", "type": "string", "tags": [], "label": "display", @@ -14884,7 +14968,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".DROPDOWN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14892,7 +14976,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.label", "type": "string", "tags": [], "label": "label", @@ -14903,13 +14987,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.options", "type": "Array", "tags": [], "label": "options", "description": [], "signature": [ - "never[]" + "{ label: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14917,7 +15001,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.order", "type": "number", "tags": [], "label": "order", @@ -14928,18 +15012,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.placeholder", - "type": "string", - "tags": [], - "label": "placeholder", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.required", "type": "boolean", "tags": [], "label": "required", @@ -14953,7 +15026,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -14967,7 +15040,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.tooltip", "type": "Uncategorized", "tags": [], "label": "tooltip", @@ -14981,7 +15054,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.type", "type": "string", "tags": [], "label": "type", @@ -15002,7 +15075,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -15016,7 +15089,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.validations", "type": "Array", "tags": [], "label": "validations", @@ -15030,7 +15103,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.value", "type": "string", "tags": [], "label": "value", @@ -15043,10 +15116,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username", "type": "Object", "tags": [], - "label": "api_token", + "label": "username", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15054,7 +15127,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -15068,7 +15141,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -15082,7 +15155,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.display", "type": "string", "tags": [], "label": "display", @@ -15103,7 +15176,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.label", "type": "string", "tags": [], "label": "label", @@ -15114,7 +15187,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.options", "type": "Array", "tags": [], "label": "options", @@ -15128,7 +15201,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.order", "type": "number", "tags": [], "label": "order", @@ -15139,7 +15212,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.required", "type": "boolean", "tags": [], "label": "required", @@ -15153,13 +15226,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15167,7 +15240,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.tooltip", "type": "Uncategorized", "tags": [], "label": "tooltip", @@ -15181,7 +15254,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.type", "type": "string", "tags": [], "label": "type", @@ -15202,7 +15275,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -15216,7 +15289,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.validations", "type": "Array", "tags": [], "label": "validations", @@ -15230,7 +15303,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.value", "type": "string", "tags": [], "label": "value", @@ -15243,10 +15316,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password", "type": "Object", "tags": [], - "label": "jira_url", + "label": "password", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15254,7 +15327,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -15268,13 +15341,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15282,7 +15355,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.display", "type": "string", "tags": [], "label": "display", @@ -15303,7 +15376,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.label", "type": "string", "tags": [], "label": "label", @@ -15314,7 +15387,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.options", "type": "Array", "tags": [], "label": "options", @@ -15328,7 +15401,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.order", "type": "number", "tags": [], "label": "order", @@ -15339,18 +15412,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.placeholder", - "type": "string", - "tags": [], - "label": "placeholder", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.required", "type": "boolean", "tags": [], "label": "required", @@ -15364,13 +15426,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15378,7 +15440,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.tooltip", "type": "Uncategorized", "tags": [], "label": "tooltip", @@ -15392,7 +15454,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.type", "type": "string", "tags": [], "label": "type", @@ -15413,7 +15475,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -15427,7 +15489,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.validations", "type": "Array", "tags": [], "label": "validations", @@ -15441,7 +15503,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.value", "type": "string", "tags": [], "label": "value", @@ -15454,10 +15516,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email", "type": "Object", "tags": [], - "label": "projects", + "label": "account_email", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15465,7 +15527,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -15479,13 +15541,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15493,7 +15555,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.display", "type": "string", "tags": [], "label": "display", @@ -15506,7 +15568,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTAREA" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15514,7 +15576,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.label", "type": "string", "tags": [], "label": "label", @@ -15525,7 +15587,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.options", "type": "Array", "tags": [], "label": "options", @@ -15539,7 +15601,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.order", "type": "number", "tags": [], "label": "order", @@ -15550,7 +15612,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.required", "type": "boolean", "tags": [], "label": "required", @@ -15564,7 +15637,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -15578,18 +15651,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.type", "type": "string", "tags": [], "label": "type", @@ -15602,7 +15678,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".LIST" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15610,7 +15686,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -15624,7 +15700,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.validations", "type": "Array", "tags": [], "label": "validations", @@ -15638,7 +15714,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.value", "type": "string", "tags": [], "label": "value", @@ -15651,10 +15727,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token", "type": "Object", "tags": [], - "label": "ssl_enabled", + "label": "api_token", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15662,7 +15738,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -15676,13 +15752,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15690,7 +15766,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.display", "type": "string", "tags": [], "label": "display", @@ -15703,7 +15779,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15711,7 +15787,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.label", "type": "string", "tags": [], "label": "label", @@ -15722,7 +15798,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.options", "type": "Array", "tags": [], "label": "options", @@ -15736,7 +15812,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.order", "type": "number", "tags": [], "label": "order", @@ -15747,7 +15823,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.required", "type": "boolean", "tags": [], "label": "required", @@ -15761,13 +15837,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15775,7 +15851,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.tooltip", "type": "Uncategorized", "tags": [], "label": "tooltip", @@ -15789,7 +15865,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.type", "type": "string", "tags": [], "label": "type", @@ -15802,7 +15878,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15810,7 +15886,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -15824,7 +15900,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.validations", "type": "Array", "tags": [], "label": "validations", @@ -15838,14 +15914,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -15854,10 +15927,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url", "type": "Object", "tags": [], - "label": "ssl_ca", + "label": "jira_url", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15865,7 +15938,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -15879,13 +15952,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -15893,7 +15966,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.display", "type": "string", "tags": [], "label": "display", @@ -15914,7 +15987,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.label", "type": "string", "tags": [], "label": "label", @@ -15925,7 +15998,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.options", "type": "Array", "tags": [], "label": "options", @@ -15939,7 +16012,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.order", "type": "number", "tags": [], "label": "order", @@ -15950,7 +16023,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.required", "type": "boolean", "tags": [], "label": "required", @@ -15964,7 +16048,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -15978,7 +16062,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.tooltip", "type": "Uncategorized", "tags": [], "label": "tooltip", @@ -15992,7 +16076,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.type", "type": "string", "tags": [], "label": "type", @@ -16013,7 +16097,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -16027,7 +16111,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.validations", "type": "Array", "tags": [], "label": "validations", @@ -16041,7 +16125,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.value", "type": "string", "tags": [], "label": "value", @@ -16054,10 +16138,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects", "type": "Object", "tags": [], - "label": "retry_count", + "label": "projects", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16065,18 +16149,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -16090,7 +16177,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.display", "type": "string", "tags": [], "label": "display", @@ -16103,7 +16190,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTAREA" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16111,7 +16198,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.label", "type": "string", "tags": [], "label": "label", @@ -16122,7 +16209,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.options", "type": "Array", "tags": [], "label": "options", @@ -16136,7 +16223,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.order", "type": "number", "tags": [], "label": "order", @@ -16147,13 +16234,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16161,7 +16248,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -16175,21 +16262,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.type", "type": "string", "tags": [], "label": "type", @@ -16202,7 +16286,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".LIST" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16210,13 +16294,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16224,7 +16308,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.validations", "type": "Array", "tags": [], "label": "validations", @@ -16238,8 +16322,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -16251,10 +16335,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled", "type": "Object", "tags": [], - "label": "concurrent_downloads", + "label": "ssl_enabled", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16262,18 +16346,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -16287,7 +16374,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.display", "type": "string", "tags": [], "label": "display", @@ -16300,7 +16387,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16308,7 +16395,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.label", "type": "string", "tags": [], "label": "label", @@ -16319,7 +16406,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.options", "type": "Array", "tags": [], "label": "options", @@ -16333,7 +16420,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.order", "type": "number", "tags": [], "label": "order", @@ -16344,13 +16431,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16358,7 +16445,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -16372,7 +16459,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.tooltip", "type": "Uncategorized", "tags": [], "label": "tooltip", @@ -16386,7 +16473,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.type", "type": "string", "tags": [], "label": "type", @@ -16399,7 +16486,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16407,13 +16494,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16421,13 +16508,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.validations", "type": "Array", "tags": [], "label": "validations", "description": [], "signature": [ - "{ type: string; constraint: number; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16435,11 +16522,14 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -16448,10 +16538,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca", "type": "Object", "tags": [], - "label": "use_document_level_security", + "label": "ssl_ca", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16459,7 +16549,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -16473,13 +16563,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: string; }[]" + "{ field: string; value: true; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16487,7 +16577,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.display", "type": "string", "tags": [], "label": "display", @@ -16500,7 +16590,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16508,7 +16598,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.label", "type": "string", "tags": [], "label": "label", @@ -16519,7 +16609,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.options", "type": "Array", "tags": [], "label": "options", @@ -16533,7 +16623,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.order", "type": "number", "tags": [], "label": "order", @@ -16544,7 +16634,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.required", "type": "boolean", "tags": [], "label": "required", @@ -16558,7 +16648,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -16572,18 +16662,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.type", "type": "string", "tags": [], "label": "type", @@ -16596,7 +16689,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16604,7 +16697,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -16618,7 +16711,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.validations", "type": "Array", "tags": [], "label": "validations", @@ -16632,14 +16725,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -16648,10 +16738,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count", "type": "Object", "tags": [], - "label": "use_text_extraction_service", + "label": "retry_count", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16659,21 +16749,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.default_value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -16687,7 +16774,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.display", "type": "string", "tags": [], "label": "display", @@ -16700,7 +16787,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16708,7 +16795,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.label", "type": "string", "tags": [], "label": "label", @@ -16719,7 +16806,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.options", "type": "Array", "tags": [], "label": "options", @@ -16733,7 +16820,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.order", "type": "number", "tags": [], "label": "order", @@ -16744,13 +16831,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16758,7 +16845,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -16772,18 +16859,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.type", "type": "string", "tags": [], "label": "type", @@ -16796,7 +16886,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16804,7 +16894,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -16818,7 +16908,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.validations", "type": "Array", "tags": [], "label": "validations", @@ -16832,154 +16922,23 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.value", + "type": "number", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features", - "type": "Object", - "tags": [], - "label": "features", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES", - "type": "Object", - "tags": [], - "label": "[FeatureName.SYNC_RULES]", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.advanced", - "type": "Object", - "tags": [], - "label": "advanced", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.advanced.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.basic", - "type": "Object", - "tags": [], - "label": "basic", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.basic.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.serviceType", - "type": "string", - "tags": [], - "label": "serviceType", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb", - "type": "Object", - "tags": [], - "label": "mongodb", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration", - "type": "Object", - "tags": [], - "label": "configuration", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads", "type": "Object", "tags": [], - "label": "host", + "label": "concurrent_downloads", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -16987,8 +16946,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -16998,7 +16957,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -17012,7 +16971,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.display", "type": "string", "tags": [], "label": "display", @@ -17025,7 +16984,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17033,7 +16992,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.label", "type": "string", "tags": [], "label": "label", @@ -17044,7 +17003,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.options", "type": "Array", "tags": [], "label": "options", @@ -17058,7 +17017,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.order", "type": "number", "tags": [], "label": "order", @@ -17069,13 +17028,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17083,7 +17042,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -17097,18 +17056,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.type", "type": "string", "tags": [], "label": "type", @@ -17121,7 +17083,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17129,13 +17091,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17143,13 +17105,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.validations", "type": "Array", "tags": [], "label": "validations", "description": [], "signature": [ - "never[]" + "{ type: string; constraint: number; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17157,8 +17119,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -17170,10 +17132,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security", "type": "Object", "tags": [], - "label": "user", + "label": "use_document_level_security", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17181,24 +17143,27 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17206,7 +17171,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.display", "type": "string", "tags": [], "label": "display", @@ -17219,7 +17184,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17227,7 +17192,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.label", "type": "string", "tags": [], "label": "label", @@ -17238,7 +17203,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.options", "type": "Array", "tags": [], "label": "options", @@ -17252,7 +17217,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.order", "type": "number", "tags": [], "label": "order", @@ -17263,13 +17228,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17277,7 +17242,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -17291,7 +17256,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -17302,7 +17267,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.type", "type": "string", "tags": [], "label": "type", @@ -17315,7 +17280,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17323,7 +17288,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -17337,7 +17302,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.validations", "type": "Array", "tags": [], "label": "validations", @@ -17351,11 +17316,14 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_document_level_security.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -17364,10 +17332,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service", "type": "Object", "tags": [], - "label": "password", + "label": "use_text_extraction_service", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17375,18 +17343,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.default_value", + "type": "boolean", "tags": [], "label": "default_value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -17400,7 +17371,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.display", "type": "string", "tags": [], "label": "display", @@ -17413,7 +17384,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17421,7 +17392,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.label", "type": "string", "tags": [], "label": "label", @@ -17432,7 +17403,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.options", "type": "Array", "tags": [], "label": "options", @@ -17446,7 +17417,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.order", "type": "number", "tags": [], "label": "order", @@ -17457,13 +17428,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17471,13 +17442,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17485,7 +17456,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -17496,7 +17467,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.type", "type": "string", "tags": [], "label": "type", @@ -17509,7 +17480,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17517,13 +17488,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17531,7 +17502,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.validations", "type": "Array", "tags": [], "label": "validations", @@ -17545,23 +17516,39 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.use_text_extraction_service.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - }, + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES", "type": "Object", "tags": [], - "label": "database", + "label": "[FeatureName.SYNC_RULES]", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17569,78 +17556,220 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", "tags": [], - "label": "default_value", + "label": "advanced", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, - "trackAdoption": false + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.depends_on", - "type": "Array", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.basic", + "type": "Object", "tags": [], - "label": "depends_on", + "label": "basic", "description": [], - "signature": [ - "never[]" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, - "trackAdoption": false - }, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.DOCUMENT_LEVEL_SECURITY", + "type": "Object", + "tags": [], + "label": "[FeatureName.DOCUMENT_LEVEL_SECURITY]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.display", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.DOCUMENT_LEVEL_SECURITY.enabled", + "type": "boolean", "tags": [], - "label": "display", + "label": "enabled", "description": [], "signature": [ - { - "pluginId": "@kbn/search-connectors", - "scope": "common", - "docId": "kibKbnSearchConnectorsPluginApi", - "section": "def-common.DisplayType", - "text": "DisplayType" - }, - ".TEXTBOX" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.label", - "type": "string", - "tags": [], - "label": "label", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.options", - "type": "Array", - "tags": [], - "label": "options", - "description": [], - "signature": [ - "never[]" - ], + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb", + "type": "Object", + "tags": [], + "label": "mongodb", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host", + "type": "Object", + "tags": [], + "label": "host", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.order", "type": "number", "tags": [], "label": "order", @@ -17651,7 +17780,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.required", "type": "boolean", "tags": [], "label": "required", @@ -17665,7 +17794,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -17679,7 +17808,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -17690,7 +17819,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.type", "type": "string", "tags": [], "label": "type", @@ -17711,7 +17840,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -17725,7 +17854,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.validations", "type": "Array", "tags": [], "label": "validations", @@ -17739,7 +17868,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.value", "type": "string", "tags": [], "label": "value", @@ -17752,10 +17881,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user", "type": "Object", "tags": [], - "label": "collection", + "label": "user", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17763,7 +17892,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.default_value", "type": "string", "tags": [], "label": "default_value", @@ -17774,7 +17903,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -17788,7 +17917,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.display", "type": "string", "tags": [], "label": "display", @@ -17809,7 +17938,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.label", "type": "string", "tags": [], "label": "label", @@ -17820,7 +17949,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.options", "type": "Array", "tags": [], "label": "options", @@ -17834,7 +17963,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.order", "type": "number", "tags": [], "label": "order", @@ -17845,13 +17974,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17859,7 +17988,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -17873,7 +18002,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -17884,7 +18013,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.type", "type": "string", "tags": [], "label": "type", @@ -17905,7 +18034,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -17919,7 +18048,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.validations", "type": "Array", "tags": [], "label": "validations", @@ -17933,7 +18062,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.value", "type": "string", "tags": [], "label": "value", @@ -17946,10 +18075,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password", "type": "Object", "tags": [], - "label": "direct_connection", + "label": "password", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -17957,21 +18086,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.default_value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -17985,7 +18111,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.display", "type": "string", "tags": [], "label": "display", @@ -17998,7 +18124,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18006,7 +18132,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.label", "type": "string", "tags": [], "label": "label", @@ -18017,7 +18143,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.options", "type": "Array", "tags": [], "label": "options", @@ -18031,7 +18157,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.order", "type": "number", "tags": [], "label": "order", @@ -18042,13 +18168,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18056,13 +18182,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18070,7 +18196,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -18081,7 +18207,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.type", "type": "string", "tags": [], "label": "type", @@ -18094,7 +18220,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18102,7 +18228,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -18116,7 +18242,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.validations", "type": "Array", "tags": [], "label": "validations", @@ -18130,14 +18256,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -18146,10 +18269,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database", "type": "Object", "tags": [], - "label": "ssl_enabled", + "label": "database", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18157,21 +18280,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.default_value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -18185,7 +18305,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.display", "type": "string", "tags": [], "label": "display", @@ -18198,7 +18318,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18206,7 +18326,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.label", "type": "string", "tags": [], "label": "label", @@ -18217,7 +18337,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.options", "type": "Array", "tags": [], "label": "options", @@ -18231,7 +18351,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.order", "type": "number", "tags": [], "label": "order", @@ -18242,7 +18362,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.required", "type": "boolean", "tags": [], "label": "required", @@ -18256,7 +18376,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -18270,7 +18390,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -18281,7 +18401,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.type", "type": "string", "tags": [], "label": "type", @@ -18294,7 +18414,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18302,7 +18422,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -18316,7 +18436,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.validations", "type": "Array", "tags": [], "label": "validations", @@ -18330,14 +18450,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -18346,10 +18463,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection", "type": "Object", "tags": [], - "label": "ssl_ca", + "label": "collection", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18357,7 +18474,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.default_value", "type": "string", "tags": [], "label": "default_value", @@ -18368,13 +18485,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18382,7 +18499,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.display", "type": "string", "tags": [], "label": "display", @@ -18403,7 +18520,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.label", "type": "string", "tags": [], "label": "label", @@ -18414,7 +18531,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.options", "type": "Array", "tags": [], "label": "options", @@ -18428,7 +18545,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.order", "type": "number", "tags": [], "label": "order", @@ -18439,13 +18556,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18453,7 +18570,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -18467,7 +18584,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -18478,7 +18595,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.type", "type": "string", "tags": [], "label": "type", @@ -18499,7 +18616,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -18513,7 +18630,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.validations", "type": "Array", "tags": [], "label": "validations", @@ -18527,7 +18644,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.value", "type": "string", "tags": [], "label": "value", @@ -18540,10 +18657,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection", "type": "Object", "tags": [], - "label": "tls_insecure", + "label": "direct_connection", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18551,7 +18668,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.default_value", "type": "boolean", "tags": [], "label": "default_value", @@ -18565,13 +18682,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18579,7 +18696,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.display", "type": "string", "tags": [], "label": "display", @@ -18600,7 +18717,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.label", "type": "string", "tags": [], "label": "label", @@ -18611,7 +18728,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.options", "type": "Array", "tags": [], "label": "options", @@ -18625,7 +18742,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.order", "type": "number", "tags": [], "label": "order", @@ -18636,7 +18753,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.required", "type": "boolean", "tags": [], "label": "required", @@ -18650,7 +18767,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -18664,7 +18781,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -18675,7 +18792,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.type", "type": "string", "tags": [], "label": "type", @@ -18696,13 +18813,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18710,7 +18827,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.validations", "type": "Array", "tags": [], "label": "validations", @@ -18724,7 +18841,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.value", "type": "boolean", "tags": [], "label": "value", @@ -18737,169 +18854,13 @@ "trackAdoption": false } ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features", - "type": "Object", - "tags": [], - "label": "features", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.FILTERING_ADVANCED_CONFIG", - "type": "boolean", - "tags": [], - "label": "[FeatureName.FILTERING_ADVANCED_CONFIG]", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.FILTERING_RULES", - "type": "boolean", - "tags": [], - "label": "[FeatureName.FILTERING_RULES]", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES", - "type": "Object", - "tags": [], - "label": "[FeatureName.SYNC_RULES]", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.advanced", - "type": "Object", - "tags": [], - "label": "advanced", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.advanced.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.basic", - "type": "Object", - "tags": [], - "label": "basic", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.basic.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.serviceType", - "type": "string", - "tags": [], - "label": "serviceType", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql", - "type": "Object", - "tags": [], - "label": "mssql", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration", - "type": "Object", - "tags": [], - "label": "configuration", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled", "type": "Object", "tags": [], - "label": "host", + "label": "ssl_enabled", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18907,18 +18868,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.default_value", + "type": "boolean", "tags": [], "label": "default_value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -18932,7 +18896,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.display", "type": "string", "tags": [], "label": "display", @@ -18945,7 +18909,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -18953,7 +18917,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.label", "type": "string", "tags": [], "label": "label", @@ -18964,7 +18928,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.options", "type": "Array", "tags": [], "label": "options", @@ -18978,7 +18942,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.order", "type": "number", "tags": [], "label": "order", @@ -18989,7 +18953,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.required", "type": "boolean", "tags": [], "label": "required", @@ -19003,7 +18967,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -19017,7 +18981,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -19028,7 +18992,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.type", "type": "string", "tags": [], "label": "type", @@ -19041,7 +19005,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19049,7 +19013,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -19063,7 +19027,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.validations", "type": "Array", "tags": [], "label": "validations", @@ -19077,11 +19041,14 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_enabled.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -19090,10 +19057,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca", "type": "Object", "tags": [], - "label": "port", + "label": "ssl_ca", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19101,27 +19068,24 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: true; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19129,7 +19093,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.display", "type": "string", "tags": [], "label": "display", @@ -19142,7 +19106,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19150,7 +19114,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.label", "type": "string", "tags": [], "label": "label", @@ -19161,7 +19125,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.options", "type": "Array", "tags": [], "label": "options", @@ -19175,7 +19139,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.order", "type": "number", "tags": [], "label": "order", @@ -19186,13 +19150,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19200,7 +19164,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -19214,7 +19178,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -19225,7 +19189,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.type", "type": "string", "tags": [], "label": "type", @@ -19238,7 +19202,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19246,7 +19210,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -19260,7 +19224,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.validations", "type": "Array", "tags": [], "label": "validations", @@ -19274,8 +19238,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.ssl_ca.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -19287,10 +19251,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure", "type": "Object", "tags": [], - "label": "username", + "label": "tls_insecure", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19298,24 +19262,27 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.default_value", + "type": "boolean", "tags": [], "label": "default_value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: true; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19323,7 +19290,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.display", "type": "string", "tags": [], "label": "display", @@ -19336,7 +19303,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19344,7 +19311,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.label", "type": "string", "tags": [], "label": "label", @@ -19355,7 +19322,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.options", "type": "Array", "tags": [], "label": "options", @@ -19369,7 +19336,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.order", "type": "number", "tags": [], "label": "order", @@ -19380,7 +19347,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.required", "type": "boolean", "tags": [], "label": "required", @@ -19394,7 +19361,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -19408,7 +19375,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -19419,7 +19386,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.type", "type": "string", "tags": [], "label": "type", @@ -19432,7 +19399,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19440,13 +19407,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19454,7 +19421,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.validations", "type": "Array", "tags": [], "label": "validations", @@ -19468,23 +19435,67 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.tls_insecure.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.FILTERING_ADVANCED_CONFIG", + "type": "boolean", + "tags": [], + "label": "[FeatureName.FILTERING_ADVANCED_CONFIG]", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.FILTERING_RULES", + "type": "boolean", + "tags": [], + "label": "[FeatureName.FILTERING_RULES]", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES", "type": "Object", "tags": [], - "label": "password", + "label": "[FeatureName.SYNC_RULES]", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19492,193 +19503,114 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.default_value", - "type": "string", - "tags": [], - "label": "default_value", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.depends_on", - "type": "Array", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", "tags": [], - "label": "depends_on", + "label": "advanced", "description": [], - "signature": [ - "never[]" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.display", - "type": "string", - "tags": [], - "label": "display", - "description": [], - "signature": [ + "trackAdoption": false, + "children": [ { - "pluginId": "@kbn/search-connectors", - "scope": "common", - "docId": "kibKbnSearchConnectorsPluginApi", - "section": "def-common.DisplayType", - "text": "DisplayType" - }, - ".TEXTBOX" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.label", - "type": "string", - "tags": [], - "label": "label", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.options", - "type": "Array", - "tags": [], - "label": "options", - "description": [], - "signature": [ - "never[]" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.order", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.basic", + "type": "Object", "tags": [], - "label": "order", + "label": "basic", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.required", - "type": "boolean", - "tags": [], - "label": "required", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.sensitive", - "type": "boolean", - "tags": [], - "label": "sensitive", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.tooltip", - "type": "string", - "tags": [], - "label": "tooltip", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ + "trackAdoption": false, + "children": [ { - "pluginId": "@kbn/search-connectors", - "scope": "common", - "docId": "kibKbnSearchConnectorsPluginApi", - "section": "def-common.FieldType", - "text": "FieldType" - }, - ".STRING" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.ui_restrictions", - "type": "Array", - "tags": [], - "label": "ui_restrictions", - "description": [], - "signature": [ - "never[]" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.validations", - "type": "Array", - "tags": [], - "label": "validations", - "description": [], - "signature": [ - "never[]" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.value", - "type": "string", - "tags": [], - "label": "value", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ] - }, + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql", + "type": "Object", + "tags": [], + "label": "mssql", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host", "type": "Object", "tags": [], - "label": "database", + "label": "host", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19686,7 +19618,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.default_value", "type": "string", "tags": [], "label": "default_value", @@ -19697,7 +19629,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -19711,7 +19643,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.display", "type": "string", "tags": [], "label": "display", @@ -19732,7 +19664,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.label", "type": "string", "tags": [], "label": "label", @@ -19743,7 +19675,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.options", "type": "Array", "tags": [], "label": "options", @@ -19757,7 +19689,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.order", "type": "number", "tags": [], "label": "order", @@ -19768,7 +19700,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.required", "type": "boolean", "tags": [], "label": "required", @@ -19782,7 +19714,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -19796,7 +19728,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -19807,7 +19739,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.type", "type": "string", "tags": [], "label": "type", @@ -19828,7 +19760,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -19842,7 +19774,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.validations", "type": "Array", "tags": [], "label": "validations", @@ -19856,7 +19788,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.value", "type": "string", "tags": [], "label": "value", @@ -19869,10 +19801,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port", "type": "Object", "tags": [], - "label": "tables", + "label": "port", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19880,18 +19812,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -19905,7 +19840,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.display", "type": "string", "tags": [], "label": "display", @@ -19918,7 +19853,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTAREA" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -19926,7 +19861,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.label", "type": "string", "tags": [], "label": "label", @@ -19937,7 +19872,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.options", "type": "Array", "tags": [], "label": "options", @@ -19951,7 +19886,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.order", "type": "number", "tags": [], "label": "order", @@ -19962,7 +19897,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.required", "type": "boolean", "tags": [], "label": "required", @@ -19976,7 +19911,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -19990,7 +19925,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -20001,7 +19936,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.type", "type": "string", "tags": [], "label": "type", @@ -20014,7 +19949,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".LIST" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20022,7 +19957,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -20036,7 +19971,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.validations", "type": "Array", "tags": [], "label": "validations", @@ -20050,8 +19985,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -20063,10 +19998,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username", "type": "Object", "tags": [], - "label": "ssl_enabled", + "label": "username", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20074,21 +20009,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.default_value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -20102,7 +20034,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.display", "type": "string", "tags": [], "label": "display", @@ -20115,7 +20047,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20123,7 +20055,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.label", "type": "string", "tags": [], "label": "label", @@ -20134,7 +20066,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.options", "type": "Array", "tags": [], "label": "options", @@ -20148,7 +20080,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.order", "type": "number", "tags": [], "label": "order", @@ -20159,7 +20091,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.required", "type": "boolean", "tags": [], "label": "required", @@ -20173,7 +20105,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -20187,7 +20119,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -20198,7 +20130,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.type", "type": "string", "tags": [], "label": "type", @@ -20211,7 +20143,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20219,7 +20151,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -20233,7 +20165,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.validations", "type": "Array", "tags": [], "label": "validations", @@ -20247,14 +20179,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -20263,10 +20192,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password", "type": "Object", "tags": [], - "label": "ssl_ca", + "label": "password", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20274,7 +20203,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.default_value", "type": "string", "tags": [], "label": "default_value", @@ -20285,13 +20214,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20299,7 +20228,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.display", "type": "string", "tags": [], "label": "display", @@ -20320,7 +20249,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.label", "type": "string", "tags": [], "label": "label", @@ -20331,7 +20260,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.options", "type": "Array", "tags": [], "label": "options", @@ -20345,7 +20274,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.order", "type": "number", "tags": [], "label": "order", @@ -20356,7 +20285,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.required", "type": "boolean", "tags": [], "label": "required", @@ -20370,13 +20299,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20384,7 +20313,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -20395,7 +20324,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.type", "type": "string", "tags": [], "label": "type", @@ -20416,7 +20345,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -20430,7 +20359,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.validations", "type": "Array", "tags": [], "label": "validations", @@ -20444,7 +20373,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.value", "type": "string", "tags": [], "label": "value", @@ -20457,10 +20386,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database", "type": "Object", "tags": [], - "label": "schema", + "label": "database", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20468,7 +20397,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.default_value", "type": "string", "tags": [], "label": "default_value", @@ -20479,7 +20408,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -20493,7 +20422,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.display", "type": "string", "tags": [], "label": "display", @@ -20514,7 +20443,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.label", "type": "string", "tags": [], "label": "label", @@ -20525,7 +20454,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.options", "type": "Array", "tags": [], "label": "options", @@ -20539,7 +20468,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.order", "type": "number", "tags": [], "label": "order", @@ -20550,7 +20479,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.required", "type": "boolean", "tags": [], "label": "required", @@ -20564,7 +20493,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -20578,7 +20507,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -20589,7 +20518,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.type", "type": "string", "tags": [], "label": "type", @@ -20610,7 +20539,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -20624,7 +20553,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.validations", "type": "Array", "tags": [], "label": "validations", @@ -20638,7 +20567,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.value", "type": "string", "tags": [], "label": "value", @@ -20651,10 +20580,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables", "type": "Object", "tags": [], - "label": "fetch_size", + "label": "tables", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20662,8 +20591,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], @@ -20673,7 +20602,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -20687,7 +20616,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.display", "type": "string", "tags": [], "label": "display", @@ -20700,7 +20629,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTAREA" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20708,7 +20637,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.label", "type": "string", "tags": [], "label": "label", @@ -20719,7 +20648,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.options", "type": "Array", "tags": [], "label": "options", @@ -20733,7 +20662,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.order", "type": "number", "tags": [], "label": "order", @@ -20744,13 +20673,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20758,7 +20687,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -20772,7 +20701,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -20783,7 +20712,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.type", "type": "string", "tags": [], "label": "type", @@ -20796,7 +20725,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".LIST" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20804,13 +20733,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20818,7 +20747,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.validations", "type": "Array", "tags": [], "label": "validations", @@ -20832,8 +20761,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -20845,10 +20774,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled", "type": "Object", "tags": [], - "label": "retry_count", + "label": "ssl_enabled", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20856,18 +20785,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.default_value", + "type": "boolean", "tags": [], "label": "default_value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -20881,7 +20813,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.display", "type": "string", "tags": [], "label": "display", @@ -20894,7 +20826,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20902,7 +20834,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.label", "type": "string", "tags": [], "label": "label", @@ -20913,7 +20845,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.options", "type": "Array", "tags": [], "label": "options", @@ -20927,7 +20859,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.order", "type": "number", "tags": [], "label": "order", @@ -20938,13 +20870,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20952,7 +20884,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -20966,7 +20898,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -20977,7 +20909,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.type", "type": "string", "tags": [], "label": "type", @@ -20990,7 +20922,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -20998,13 +20930,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21012,7 +20944,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.validations", "type": "Array", "tags": [], "label": "validations", @@ -21026,11 +20958,14 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -21039,10 +20974,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca", "type": "Object", "tags": [], - "label": "validate_host", + "label": "ssl_ca", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21050,27 +20985,24 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.default_value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: true; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21078,7 +21010,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.display", "type": "string", "tags": [], "label": "display", @@ -21091,7 +21023,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21099,7 +21031,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.label", "type": "string", "tags": [], "label": "label", @@ -21110,7 +21042,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.options", "type": "Array", "tags": [], "label": "options", @@ -21124,7 +21056,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.order", "type": "number", "tags": [], "label": "order", @@ -21135,7 +21067,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.required", "type": "boolean", "tags": [], "label": "required", @@ -21149,7 +21081,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -21163,7 +21095,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -21174,7 +21106,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.type", "type": "string", "tags": [], "label": "type", @@ -21187,7 +21119,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21195,7 +21127,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -21209,7 +21141,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.validations", "type": "Array", "tags": [], "label": "validations", @@ -21223,39 +21155,23 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features", - "type": "Object", - "tags": [], - "label": "features", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema", "type": "Object", "tags": [], - "label": "[FeatureName.SYNC_RULES]", + "label": "schema", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21263,125 +21179,10 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.advanced", - "type": "Object", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.default_value", + "type": "string", "tags": [], - "label": "advanced", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.advanced.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "false" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.basic", - "type": "Object", - "tags": [], - "label": "basic", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.basic.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.serviceType", - "type": "string", - "tags": [], - "label": "serviceType", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql", - "type": "Object", - "tags": [], - "label": "mysql", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration", - "type": "Object", - "tags": [], - "label": "configuration", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host", - "type": "Object", - "tags": [], - "label": "host", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.default_value", - "type": "string", - "tags": [], - "label": "default_value", + "label": "default_value", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21389,7 +21190,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -21403,7 +21204,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.display", "type": "string", "tags": [], "label": "display", @@ -21424,7 +21225,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.label", "type": "string", "tags": [], "label": "label", @@ -21435,7 +21236,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.options", "type": "Array", "tags": [], "label": "options", @@ -21449,7 +21250,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.order", "type": "number", "tags": [], "label": "order", @@ -21460,7 +21261,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.required", "type": "boolean", "tags": [], "label": "required", @@ -21474,7 +21275,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -21488,7 +21289,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -21499,7 +21300,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.type", "type": "string", "tags": [], "label": "type", @@ -21520,7 +21321,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -21534,7 +21335,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.validations", "type": "Array", "tags": [], "label": "validations", @@ -21548,7 +21349,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.value", "type": "string", "tags": [], "label": "value", @@ -21561,10 +21362,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size", "type": "Object", "tags": [], - "label": "port", + "label": "fetch_size", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21572,21 +21373,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -21600,7 +21398,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.display", "type": "string", "tags": [], "label": "display", @@ -21621,7 +21419,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.label", "type": "string", "tags": [], "label": "label", @@ -21632,7 +21430,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.options", "type": "Array", "tags": [], "label": "options", @@ -21646,7 +21444,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.order", "type": "number", "tags": [], "label": "order", @@ -21657,13 +21455,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21671,7 +21469,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -21685,7 +21483,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -21696,7 +21494,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.type", "type": "string", "tags": [], "label": "type", @@ -21717,13 +21515,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21731,7 +21529,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.validations", "type": "Array", "tags": [], "label": "validations", @@ -21745,8 +21543,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -21758,10 +21556,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count", "type": "Object", "tags": [], - "label": "user", + "label": "retry_count", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21769,8 +21567,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -21780,7 +21578,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -21794,7 +21592,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.display", "type": "string", "tags": [], "label": "display", @@ -21807,7 +21605,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21815,7 +21613,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.label", "type": "string", "tags": [], "label": "label", @@ -21826,7 +21624,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.options", "type": "Array", "tags": [], "label": "options", @@ -21840,7 +21638,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.order", "type": "number", "tags": [], "label": "order", @@ -21851,7 +21649,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.required", "type": "boolean", "tags": [], "label": "required", @@ -21865,7 +21663,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -21879,7 +21677,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -21890,7 +21688,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.type", "type": "string", "tags": [], "label": "type", @@ -21903,7 +21701,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21911,13 +21709,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21925,7 +21723,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.validations", "type": "Array", "tags": [], "label": "validations", @@ -21939,8 +21737,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -21952,10 +21750,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host", "type": "Object", "tags": [], - "label": "password", + "label": "validate_host", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -21963,18 +21761,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.default_value", + "type": "boolean", "tags": [], "label": "default_value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -21988,7 +21789,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.display", "type": "string", "tags": [], "label": "display", @@ -22001,7 +21802,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22009,7 +21810,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.label", "type": "string", "tags": [], "label": "label", @@ -22020,7 +21821,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.options", "type": "Array", "tags": [], "label": "options", @@ -22034,7 +21835,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.order", "type": "number", "tags": [], "label": "order", @@ -22045,13 +21846,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22059,13 +21860,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22073,7 +21874,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -22084,7 +21885,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.type", "type": "string", "tags": [], "label": "type", @@ -22097,7 +21898,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22105,7 +21906,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -22119,7 +21920,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.validations", "type": "Array", "tags": [], "label": "validations", @@ -22133,23 +21934,39 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - }, + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES", "type": "Object", "tags": [], - "label": "database", + "label": "[FeatureName.SYNC_RULES]", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22157,7 +21974,122 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql", + "type": "Object", + "tags": [], + "label": "mysql", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host", + "type": "Object", + "tags": [], + "label": "host", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.default_value", "type": "string", "tags": [], "label": "default_value", @@ -22168,7 +22100,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -22182,7 +22114,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.display", "type": "string", "tags": [], "label": "display", @@ -22203,7 +22135,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.label", "type": "string", "tags": [], "label": "label", @@ -22214,7 +22146,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.options", "type": "Array", "tags": [], "label": "options", @@ -22228,7 +22160,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.order", "type": "number", "tags": [], "label": "order", @@ -22239,7 +22171,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.required", "type": "boolean", "tags": [], "label": "required", @@ -22253,7 +22185,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -22267,7 +22199,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -22278,7 +22210,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.type", "type": "string", "tags": [], "label": "type", @@ -22299,7 +22231,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -22313,7 +22245,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.validations", "type": "Array", "tags": [], "label": "validations", @@ -22327,7 +22259,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.value", "type": "string", "tags": [], "label": "value", @@ -22340,10 +22272,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port", "type": "Object", "tags": [], - "label": "tables", + "label": "port", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22351,18 +22283,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -22376,7 +22311,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.display", "type": "string", "tags": [], "label": "display", @@ -22389,7 +22324,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTAREA" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22397,7 +22332,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.label", "type": "string", "tags": [], "label": "label", @@ -22408,7 +22343,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.options", "type": "Array", "tags": [], "label": "options", @@ -22422,7 +22357,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.order", "type": "number", "tags": [], "label": "order", @@ -22433,7 +22368,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.required", "type": "boolean", "tags": [], "label": "required", @@ -22447,7 +22382,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -22461,7 +22396,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -22472,7 +22407,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.type", "type": "string", "tags": [], "label": "type", @@ -22485,7 +22420,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".LIST" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22493,7 +22428,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -22507,7 +22442,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.validations", "type": "Array", "tags": [], "label": "validations", @@ -22521,7 +22456,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.value", "type": "string", "tags": [], "label": "value", @@ -22534,10 +22469,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user", "type": "Object", "tags": [], - "label": "ssl_enabled", + "label": "user", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22545,21 +22480,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.default_value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -22573,7 +22505,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.display", "type": "string", "tags": [], "label": "display", @@ -22586,7 +22518,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22594,7 +22526,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.label", "type": "string", "tags": [], "label": "label", @@ -22605,7 +22537,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.options", "type": "Array", "tags": [], "label": "options", @@ -22619,7 +22551,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.order", "type": "number", "tags": [], "label": "order", @@ -22630,13 +22562,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22644,7 +22576,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -22658,7 +22590,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -22669,7 +22601,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.type", "type": "string", "tags": [], "label": "type", @@ -22682,7 +22614,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22690,7 +22622,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -22704,7 +22636,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.validations", "type": "Array", "tags": [], "label": "validations", @@ -22718,14 +22650,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -22734,10 +22663,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password", "type": "Object", "tags": [], - "label": "ssl_ca", + "label": "password", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22745,7 +22674,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.default_value", "type": "string", "tags": [], "label": "default_value", @@ -22756,13 +22685,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22770,7 +22699,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.display", "type": "string", "tags": [], "label": "display", @@ -22791,7 +22720,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.label", "type": "string", "tags": [], "label": "label", @@ -22802,7 +22731,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.options", "type": "Array", "tags": [], "label": "options", @@ -22816,7 +22745,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.order", "type": "number", "tags": [], "label": "order", @@ -22827,13 +22756,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22841,13 +22770,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22855,7 +22784,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -22866,7 +22795,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.type", "type": "string", "tags": [], "label": "type", @@ -22887,7 +22816,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -22901,7 +22830,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.validations", "type": "Array", "tags": [], "label": "validations", @@ -22915,7 +22844,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.value", "type": "string", "tags": [], "label": "value", @@ -22928,10 +22857,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database", "type": "Object", "tags": [], - "label": "fetch_size", + "label": "database", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22939,8 +22868,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], @@ -22950,7 +22879,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -22964,7 +22893,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.display", "type": "string", "tags": [], "label": "display", @@ -22977,7 +22906,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -22985,7 +22914,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.label", "type": "string", "tags": [], "label": "label", @@ -22996,7 +22925,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.options", "type": "Array", "tags": [], "label": "options", @@ -23010,7 +22939,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.order", "type": "number", "tags": [], "label": "order", @@ -23021,13 +22950,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23035,7 +22964,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -23049,7 +22978,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -23060,7 +22989,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.type", "type": "string", "tags": [], "label": "type", @@ -23073,7 +23002,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23081,13 +23010,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23095,7 +23024,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.validations", "type": "Array", "tags": [], "label": "validations", @@ -23109,8 +23038,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -23122,10 +23051,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables", "type": "Object", "tags": [], - "label": "retry_count", + "label": "tables", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23133,8 +23062,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], @@ -23144,7 +23073,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -23158,7 +23087,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.display", "type": "string", "tags": [], "label": "display", @@ -23171,7 +23100,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTAREA" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23179,7 +23108,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.label", "type": "string", "tags": [], "label": "label", @@ -23190,7 +23119,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.options", "type": "Array", "tags": [], "label": "options", @@ -23204,7 +23133,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.order", "type": "number", "tags": [], "label": "order", @@ -23215,13 +23144,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23229,7 +23158,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -23243,7 +23172,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -23254,7 +23183,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.type", "type": "string", "tags": [], "label": "type", @@ -23267,7 +23196,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".LIST" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23275,13 +23204,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23289,7 +23218,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.validations", "type": "Array", "tags": [], "label": "validations", @@ -23303,8 +23232,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -23313,141 +23242,13 @@ "trackAdoption": false } ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features", - "type": "Object", - "tags": [], - "label": "features", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES", - "type": "Object", - "tags": [], - "label": "[FeatureName.SYNC_RULES]", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.advanced", - "type": "Object", - "tags": [], - "label": "advanced", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.advanced.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.basic", - "type": "Object", - "tags": [], - "label": "basic", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.basic.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.serviceType", - "type": "string", - "tags": [], - "label": "serviceType", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive", - "type": "Object", - "tags": [], - "label": "network_drive", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration", - "type": "Object", - "tags": [], - "label": "configuration", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled", "type": "Object", "tags": [], - "label": "username", + "label": "ssl_enabled", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23455,13 +23256,13 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.default_value", + "type": "boolean", "tags": [], "label": "default_value", "description": [], "signature": [ - "null" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23469,7 +23270,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -23483,7 +23284,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.display", "type": "string", "tags": [], "label": "display", @@ -23496,7 +23297,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23504,7 +23305,3246 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca", + "type": "Object", + "tags": [], + "label": "ssl_ca", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size", + "type": "Object", + "tags": [], + "label": "fetch_size", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive", + "type": "Object", + "tags": [], + "label": "network_drive", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username", + "type": "Object", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip", + "type": "Object", + "tags": [], + "label": "server_ip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port", + "type": "Object", + "tags": [], + "label": "server_port", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path", + "type": "Object", + "tags": [], + "label": "drive_path", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security", + "type": "Object", + "tags": [], + "label": "use_document_level_security", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive", + "type": "Object", + "tags": [], + "label": "onedrive", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id", + "type": "Object", + "tags": [], + "label": "client_id", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret", + "type": "Object", + "tags": [], + "label": "client_secret", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id", + "type": "Object", + "tags": [], + "label": "tenant_id", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads", + "type": "Object", + "tags": [], + "label": "concurrent_downloads", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security", + "type": "Object", + "tags": [], + "label": "use_document_level_security", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.label", "type": "string", "tags": [], "label": "label", @@ -23515,7 +26555,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.options", "type": "Array", "tags": [], "label": "options", @@ -23529,7 +26569,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.order", "type": "number", "tags": [], "label": "order", @@ -23540,7 +26580,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.required", "type": "boolean", "tags": [], "label": "required", @@ -23554,7 +26594,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -23568,7 +26608,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -23579,7 +26619,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.type", "type": "string", "tags": [], "label": "type", @@ -23592,7 +26632,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23600,7 +26640,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -23614,7 +26654,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.validations", "type": "Array", "tags": [], "label": "validations", @@ -23628,11 +26668,14 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -23641,10 +26684,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service", "type": "Object", "tags": [], - "label": "password", + "label": "use_text_extraction_service", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23652,7 +26695,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -23666,7 +26709,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -23680,7 +26723,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.display", "type": "string", "tags": [], "label": "display", @@ -23693,7 +26736,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23701,7 +26744,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.label", "type": "string", "tags": [], "label": "label", @@ -23712,7 +26755,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.options", "type": "Array", "tags": [], "label": "options", @@ -23726,7 +26769,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.order", "type": "number", "tags": [], "label": "order", @@ -23737,7 +26780,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.required", "type": "boolean", "tags": [], "label": "required", @@ -23751,13 +26794,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23765,7 +26808,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -23776,7 +26819,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.type", "type": "string", "tags": [], "label": "type", @@ -23789,7 +26832,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23797,13 +26840,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23811,7 +26854,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.validations", "type": "Array", "tags": [], "label": "validations", @@ -23825,23 +26868,114 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - }, + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.features.FeatureName.DOCUMENT_LEVEL_SECURITY", + "type": "Object", + "tags": [], + "label": "[FeatureName.DOCUMENT_LEVEL_SECURITY]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.features.FeatureName.DOCUMENT_LEVEL_SECURITY.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle", + "type": "Object", + "tags": [], + "label": "oracle", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host", "type": "Object", "tags": [], - "label": "server_ip", + "label": "host", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -23849,21 +26983,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -23877,7 +27008,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.display", "type": "string", "tags": [], "label": "display", @@ -23898,7 +27029,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.label", "type": "string", "tags": [], "label": "label", @@ -23909,7 +27040,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.options", "type": "Array", "tags": [], "label": "options", @@ -23923,7 +27054,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.order", "type": "number", "tags": [], "label": "order", @@ -23934,18 +27065,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.placeholder", - "type": "string", - "tags": [], - "label": "placeholder", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.required", "type": "boolean", "tags": [], "label": "required", @@ -23959,7 +27079,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -23973,7 +27093,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -23984,7 +27104,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.type", "type": "string", "tags": [], "label": "type", @@ -24005,7 +27125,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -24019,7 +27139,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.validations", "type": "Array", "tags": [], "label": "validations", @@ -24033,7 +27153,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.value", "type": "string", "tags": [], "label": "value", @@ -24046,10 +27166,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port", "type": "Object", "tags": [], - "label": "server_port", + "label": "port", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24057,7 +27177,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -24071,7 +27191,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -24085,7 +27205,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.display", "type": "string", "tags": [], "label": "display", @@ -24106,7 +27226,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.label", "type": "string", "tags": [], "label": "label", @@ -24117,7 +27237,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.options", "type": "Array", "tags": [], "label": "options", @@ -24131,7 +27251,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.order", "type": "number", "tags": [], "label": "order", @@ -24142,7 +27262,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.required", "type": "boolean", "tags": [], "label": "required", @@ -24156,7 +27276,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -24170,7 +27290,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -24181,7 +27301,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.type", "type": "string", "tags": [], "label": "type", @@ -24202,7 +27322,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -24216,7 +27336,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.validations", "type": "Array", "tags": [], "label": "validations", @@ -24230,8 +27350,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -24243,10 +27363,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username", "type": "Object", "tags": [], - "label": "drive_path", + "label": "username", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24254,21 +27374,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -24282,7 +27399,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.display", "type": "string", "tags": [], "label": "display", @@ -24303,7 +27420,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.label", "type": "string", "tags": [], "label": "label", @@ -24314,7 +27431,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.options", "type": "Array", "tags": [], "label": "options", @@ -24328,7 +27445,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.order", "type": "number", "tags": [], "label": "order", @@ -24339,18 +27456,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.placeholder", - "type": "string", - "tags": [], - "label": "placeholder", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.required", "type": "boolean", "tags": [], "label": "required", @@ -24364,7 +27470,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -24378,7 +27484,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -24389,7 +27495,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.type", "type": "string", "tags": [], "label": "type", @@ -24410,7 +27516,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -24424,7 +27530,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.validations", "type": "Array", "tags": [], "label": "validations", @@ -24438,7 +27544,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.value", "type": "string", "tags": [], "label": "value", @@ -24451,10 +27557,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password", "type": "Object", "tags": [], - "label": "use_document_level_security", + "label": "password", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24462,21 +27568,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -24490,7 +27593,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.display", "type": "string", "tags": [], "label": "display", @@ -24503,7 +27606,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24511,7 +27614,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.label", "type": "string", "tags": [], "label": "label", @@ -24522,7 +27625,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.options", "type": "Array", "tags": [], "label": "options", @@ -24536,7 +27639,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.order", "type": "number", "tags": [], "label": "order", @@ -24547,7 +27650,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.required", "type": "boolean", "tags": [], "label": "required", @@ -24561,13 +27664,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24575,7 +27678,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -24586,7 +27689,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.type", "type": "string", "tags": [], "label": "type", @@ -24599,7 +27702,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24607,7 +27710,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -24621,7 +27724,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.validations", "type": "Array", "tags": [], "label": "validations", @@ -24635,154 +27738,23 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.use_document_level_security.value", - "type": "boolean", - "tags": [], - "label": "value", - "description": [], - "signature": [ - "false" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features", - "type": "Object", - "tags": [], - "label": "features", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES", - "type": "Object", - "tags": [], - "label": "[FeatureName.SYNC_RULES]", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.advanced", - "type": "Object", - "tags": [], - "label": "advanced", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.advanced.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "false" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.basic", - "type": "Object", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.value", + "type": "string", "tags": [], - "label": "basic", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.basic.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false } ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.serviceType", - "type": "string", - "tags": [], - "label": "serviceType", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive", - "type": "Object", - "tags": [], - "label": "onedrive", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration", - "type": "Object", - "tags": [], - "label": "configuration", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database", "type": "Object", "tags": [], - "label": "client_id", + "label": "database", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24790,21 +27762,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -24818,7 +27787,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.display", "type": "string", "tags": [], "label": "display", @@ -24839,7 +27808,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.label", "type": "string", "tags": [], "label": "label", @@ -24850,7 +27819,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.options", "type": "Array", "tags": [], "label": "options", @@ -24864,7 +27833,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.order", "type": "number", "tags": [], "label": "order", @@ -24875,7 +27844,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.required", "type": "boolean", "tags": [], "label": "required", @@ -24889,7 +27858,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -24903,21 +27872,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.type", "type": "string", "tags": [], "label": "type", @@ -24938,7 +27904,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -24952,7 +27918,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.validations", "type": "Array", "tags": [], "label": "validations", @@ -24966,7 +27932,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_id.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.value", "type": "string", "tags": [], "label": "value", @@ -24979,10 +27945,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables", "type": "Object", "tags": [], - "label": "client_secret", + "label": "tables", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -24990,21 +27956,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -25018,7 +27981,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.display", "type": "string", "tags": [], "label": "display", @@ -25031,7 +27994,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".TEXTAREA" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25039,7 +28002,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.label", "type": "string", "tags": [], "label": "label", @@ -25050,7 +28013,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.options", "type": "Array", "tags": [], "label": "options", @@ -25064,7 +28027,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.order", "type": "number", "tags": [], "label": "order", @@ -25075,7 +28038,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.required", "type": "boolean", "tags": [], "label": "required", @@ -25089,13 +28052,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25103,21 +28066,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.type", "type": "string", "tags": [], "label": "type", @@ -25130,7 +28090,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".LIST" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25138,7 +28098,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -25152,7 +28112,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.validations", "type": "Array", "tags": [], "label": "validations", @@ -25166,7 +28126,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.client_secret.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.value", "type": "string", "tags": [], "label": "value", @@ -25179,10 +28139,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size", "type": "Object", "tags": [], - "label": "tenant_id", + "label": "fetch_size", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25190,21 +28150,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -25218,7 +28175,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.display", "type": "string", "tags": [], "label": "display", @@ -25231,7 +28188,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25239,7 +28196,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.label", "type": "string", "tags": [], "label": "label", @@ -25250,7 +28207,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.options", "type": "Array", "tags": [], "label": "options", @@ -25264,7 +28221,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.order", "type": "number", "tags": [], "label": "order", @@ -25275,13 +28232,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25289,7 +28246,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -25303,21 +28260,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.type", "type": "string", "tags": [], "label": "type", @@ -25330,7 +28284,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25338,13 +28292,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25352,7 +28306,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.validations", "type": "Array", "tags": [], "label": "validations", @@ -25366,8 +28320,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.tenant_id.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -25379,7 +28333,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count", "type": "Object", "tags": [], "label": "retry_count", @@ -25390,7 +28344,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.default_value", "type": "number", "tags": [], "label": "default_value", @@ -25401,7 +28355,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -25415,7 +28369,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.display", "type": "string", "tags": [], "label": "display", @@ -25436,7 +28390,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.label", "type": "string", "tags": [], "label": "label", @@ -25447,7 +28401,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.options", "type": "Array", "tags": [], "label": "options", @@ -25461,7 +28415,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.order", "type": "number", "tags": [], "label": "order", @@ -25472,7 +28426,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.required", "type": "boolean", "tags": [], "label": "required", @@ -25486,7 +28440,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -25500,21 +28454,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.type", "type": "string", "tags": [], "label": "type", @@ -25535,7 +28486,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -25549,7 +28500,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.validations", "type": "Array", "tags": [], "label": "validations", @@ -25563,8 +28514,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.retry_count.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -25576,10 +28527,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol", "type": "Object", "tags": [], - "label": "concurrent_downloads", + "label": "oracle_protocol", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25587,8 +28538,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], @@ -25598,7 +28549,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -25612,7 +28563,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.display", "type": "string", "tags": [], "label": "display", @@ -25625,7 +28576,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".DROPDOWN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25633,7 +28584,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.label", "type": "string", "tags": [], "label": "label", @@ -25644,13 +28595,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.options", "type": "Array", "tags": [], "label": "options", "description": [], "signature": [ - "never[]" + "{ label: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25658,7 +28609,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.order", "type": "number", "tags": [], "label": "order", @@ -25669,13 +28620,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25683,7 +28634,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -25697,21 +28648,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.type", "type": "string", "tags": [], "label": "type", @@ -25724,7 +28672,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25732,7 +28680,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -25746,7 +28694,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.validations", "type": "Array", "tags": [], "label": "validations", @@ -25760,7 +28708,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.concurrent_downloads.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.value", "type": "string", "tags": [], "label": "value", @@ -25773,10 +28721,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home", "type": "Object", "tags": [], - "label": "use_document_level_security", + "label": "oracle_home", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25784,21 +28732,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -25812,7 +28757,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.display", "type": "string", "tags": [], "label": "display", @@ -25825,7 +28770,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25833,7 +28778,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.label", "type": "string", "tags": [], "label": "label", @@ -25844,7 +28789,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.options", "type": "Array", "tags": [], "label": "options", @@ -25858,7 +28803,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.order", "type": "number", "tags": [], "label": "order", @@ -25869,13 +28814,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25883,7 +28828,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -25897,7 +28842,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -25908,7 +28853,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.type", "type": "string", "tags": [], "label": "type", @@ -25921,7 +28866,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25929,13 +28874,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25943,7 +28888,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.validations", "type": "Array", "tags": [], "label": "validations", @@ -25957,14 +28902,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_document_level_security.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -25973,10 +28915,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path", "type": "Object", "tags": [], - "label": "use_text_extraction_service", + "label": "wallet_configuration_path", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -25984,21 +28926,18 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.default_value", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -26012,7 +28951,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.display", "type": "string", "tags": [], "label": "display", @@ -26025,7 +28964,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -26033,7 +28972,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.label", "type": "string", "tags": [], "label": "label", @@ -26044,7 +28983,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.options", "type": "Array", "tags": [], "label": "options", @@ -26058,7 +28997,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.order", "type": "number", "tags": [], "label": "order", @@ -26069,13 +29008,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -26083,7 +29022,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -26097,7 +29036,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -26108,7 +29047,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.type", "type": "string", "tags": [], "label": "type", @@ -26121,7 +29060,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -26129,7 +29068,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -26143,7 +29082,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.validations", "type": "Array", "tags": [], "label": "validations", @@ -26157,14 +29096,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.configuration.use_text_extraction_service.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -26175,18 +29111,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.features", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features", "type": "Object", "tags": [], "label": "features", @@ -26197,10 +29122,10 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.features.FeatureName.DOCUMENT_LEVEL_SECURITY", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES", "type": "Object", "tags": [], - "label": "[FeatureName.DOCUMENT_LEVEL_SECURITY]", + "label": "[FeatureName.SYNC_RULES]", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -26208,17 +29133,57 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.features.FeatureName.DOCUMENT_LEVEL_SECURITY.enabled", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", "tags": [], - "label": "enabled", + "label": "advanced", "description": [], - "signature": [ - "true" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, - "trackAdoption": false + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ] } @@ -26226,7 +29191,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.onedrive.serviceType", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.serviceType", "type": "string", "tags": [], "label": "serviceType", @@ -26239,10 +29215,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql", "type": "Object", "tags": [], - "label": "oracle", + "label": "postgresql", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -26250,7 +29226,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration", "type": "Object", "tags": [], "label": "configuration", @@ -26261,7 +29237,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host", "type": "Object", "tags": [], "label": "host", @@ -26272,7 +29248,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.default_value", "type": "string", "tags": [], "label": "default_value", @@ -26283,7 +29259,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -26297,7 +29273,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.display", "type": "string", "tags": [], "label": "display", @@ -26318,7 +29294,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.label", "type": "string", "tags": [], "label": "label", @@ -26329,7 +29305,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.options", "type": "Array", "tags": [], "label": "options", @@ -26343,7 +29319,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.order", "type": "number", "tags": [], "label": "order", @@ -26354,7 +29330,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.required", "type": "boolean", "tags": [], "label": "required", @@ -26368,7 +29344,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -26382,7 +29358,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -26393,7 +29369,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.type", "type": "string", "tags": [], "label": "type", @@ -26414,7 +29390,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -26428,7 +29404,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.validations", "type": "Array", "tags": [], "label": "validations", @@ -26442,7 +29418,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.host.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.value", "type": "string", "tags": [], "label": "value", @@ -26455,7 +29431,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port", "type": "Object", "tags": [], "label": "port", @@ -26466,7 +29442,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -26480,7 +29456,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -26494,7 +29470,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.display", "type": "string", "tags": [], "label": "display", @@ -26515,7 +29491,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.label", "type": "string", "tags": [], "label": "label", @@ -26526,7 +29502,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.options", "type": "Array", "tags": [], "label": "options", @@ -26540,7 +29516,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.order", "type": "number", "tags": [], "label": "order", @@ -26551,7 +29527,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.required", "type": "boolean", "tags": [], "label": "required", @@ -26565,7 +29541,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -26579,7 +29555,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -26590,7 +29566,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.type", "type": "string", "tags": [], "label": "type", @@ -26611,7 +29587,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -26625,7 +29601,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.validations", "type": "Array", "tags": [], "label": "validations", @@ -26638,9 +29614,9 @@ "trackAdoption": false }, { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.port.value", - "type": "string", + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -26652,7 +29628,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username", "type": "Object", "tags": [], "label": "username", @@ -26663,7 +29639,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.default_value", "type": "string", "tags": [], "label": "default_value", @@ -26674,7 +29650,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -26688,7 +29664,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.display", "type": "string", "tags": [], "label": "display", @@ -26709,7 +29685,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.label", "type": "string", "tags": [], "label": "label", @@ -26720,7 +29696,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.options", "type": "Array", "tags": [], "label": "options", @@ -26734,7 +29710,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.order", "type": "number", "tags": [], "label": "order", @@ -26745,7 +29721,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.required", "type": "boolean", "tags": [], "label": "required", @@ -26759,7 +29735,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -26773,7 +29749,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -26784,7 +29760,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.type", "type": "string", "tags": [], "label": "type", @@ -26805,7 +29781,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -26819,7 +29795,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.validations", "type": "Array", "tags": [], "label": "validations", @@ -26833,7 +29809,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.username.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.value", "type": "string", "tags": [], "label": "value", @@ -26846,7 +29822,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password", "type": "Object", "tags": [], "label": "password", @@ -26857,7 +29833,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.default_value", "type": "string", "tags": [], "label": "default_value", @@ -26868,7 +29844,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -26882,7 +29858,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.display", "type": "string", "tags": [], "label": "display", @@ -26903,7 +29879,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.label", "type": "string", "tags": [], "label": "label", @@ -26914,7 +29890,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.options", "type": "Array", "tags": [], "label": "options", @@ -26928,7 +29904,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.order", "type": "number", "tags": [], "label": "order", @@ -26939,7 +29915,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.required", "type": "boolean", "tags": [], "label": "required", @@ -26953,7 +29929,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -26967,7 +29943,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -26978,7 +29954,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.type", "type": "string", "tags": [], "label": "type", @@ -26999,7 +29975,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -27013,7 +29989,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.validations", "type": "Array", "tags": [], "label": "validations", @@ -27027,7 +30003,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.password.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.value", "type": "string", "tags": [], "label": "value", @@ -27040,7 +30016,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database", "type": "Object", "tags": [], "label": "database", @@ -27051,7 +30027,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.default_value", "type": "string", "tags": [], "label": "default_value", @@ -27062,7 +30038,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -27076,7 +30052,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.display", "type": "string", "tags": [], "label": "display", @@ -27097,7 +30073,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.label", "type": "string", "tags": [], "label": "label", @@ -27108,7 +30084,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.options", "type": "Array", "tags": [], "label": "options", @@ -27122,7 +30098,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.order", "type": "number", "tags": [], "label": "order", @@ -27133,7 +30109,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.required", "type": "boolean", "tags": [], "label": "required", @@ -27147,7 +30123,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -27161,7 +30137,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -27172,7 +30148,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.type", "type": "string", "tags": [], "label": "type", @@ -27193,7 +30169,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -27207,7 +30183,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.validations", "type": "Array", "tags": [], "label": "validations", @@ -27221,7 +30197,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.database.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.value", "type": "string", "tags": [], "label": "value", @@ -27234,10 +30210,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema", "type": "Object", "tags": [], - "label": "tables", + "label": "schema", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27245,7 +30221,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.default_value", "type": "string", "tags": [], "label": "default_value", @@ -27256,7 +30232,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -27270,7 +30246,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.display", "type": "string", "tags": [], "label": "display", @@ -27283,7 +30259,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTAREA" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27291,7 +30267,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.label", "type": "string", "tags": [], "label": "label", @@ -27302,7 +30278,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.options", "type": "Array", "tags": [], "label": "options", @@ -27316,7 +30292,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.order", "type": "number", "tags": [], "label": "order", @@ -27327,7 +30303,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.required", "type": "boolean", "tags": [], "label": "required", @@ -27341,7 +30317,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -27355,7 +30331,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -27366,7 +30342,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.type", "type": "string", "tags": [], "label": "type", @@ -27379,7 +30355,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".LIST" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27387,7 +30363,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -27401,7 +30377,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.validations", "type": "Array", "tags": [], "label": "validations", @@ -27415,7 +30391,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.tables.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.value", "type": "string", "tags": [], "label": "value", @@ -27428,10 +30404,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables", "type": "Object", "tags": [], - "label": "fetch_size", + "label": "tables", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27439,8 +30415,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.default_value", + "type": "string", "tags": [], "label": "default_value", "description": [], @@ -27450,7 +30426,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -27464,7 +30440,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.display", "type": "string", "tags": [], "label": "display", @@ -27477,7 +30453,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTAREA" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27485,7 +30461,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.label", "type": "string", "tags": [], "label": "label", @@ -27496,7 +30472,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.options", "type": "Array", "tags": [], "label": "options", @@ -27510,7 +30486,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.order", "type": "number", "tags": [], "label": "order", @@ -27521,13 +30497,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27535,7 +30511,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -27549,7 +30525,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -27560,7 +30536,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.type", "type": "string", "tags": [], "label": "type", @@ -27573,7 +30549,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".LIST" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27581,13 +30557,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27595,7 +30571,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.validations", "type": "Array", "tags": [], "label": "validations", @@ -27609,8 +30585,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.fetch_size.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -27622,10 +30598,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled", "type": "Object", "tags": [], - "label": "retry_count", + "label": "ssl_enabled", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27633,18 +30609,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.default_value", + "type": "boolean", "tags": [], "label": "default_value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -27658,7 +30637,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.display", "type": "string", "tags": [], "label": "display", @@ -27671,7 +30650,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27679,7 +30658,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.label", "type": "string", "tags": [], "label": "label", @@ -27690,7 +30669,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.options", "type": "Array", "tags": [], "label": "options", @@ -27704,7 +30683,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.order", "type": "number", "tags": [], "label": "order", @@ -27715,13 +30694,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27729,7 +30708,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -27743,7 +30722,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -27754,7 +30733,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.type", "type": "string", "tags": [], "label": "type", @@ -27767,7 +30746,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27775,13 +30754,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27789,7 +30768,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.validations", "type": "Array", "tags": [], "label": "validations", @@ -27803,11 +30782,14 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.retry_count.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -27816,10 +30798,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca", "type": "Object", "tags": [], - "label": "oracle_protocol", + "label": "ssl_ca", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27827,7 +30809,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.default_value", "type": "string", "tags": [], "label": "default_value", @@ -27838,13 +30820,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: true; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27852,7 +30834,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.display", "type": "string", "tags": [], "label": "display", @@ -27865,7 +30847,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".DROPDOWN" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27873,7 +30855,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.label", "type": "string", "tags": [], "label": "label", @@ -27884,13 +30866,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.options", "type": "Array", "tags": [], "label": "options", "description": [], "signature": [ - "{ label: string; value: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27898,7 +30880,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.order", "type": "number", "tags": [], "label": "order", @@ -27909,7 +30891,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.required", "type": "boolean", "tags": [], "label": "required", @@ -27923,7 +30905,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -27937,7 +30919,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -27948,7 +30930,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.type", "type": "string", "tags": [], "label": "type", @@ -27969,13 +30951,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -27983,7 +30965,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.validations", "type": "Array", "tags": [], "label": "validations", @@ -27997,7 +30979,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_protocol.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.value", "type": "string", "tags": [], "label": "value", @@ -28010,19 +30992,19 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size", "type": "Object", "tags": [], - "label": "oracle_home", + "label": "fetch_size", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false, "children": [ { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.default_value", - "type": "string", + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -28032,7 +31014,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -28046,7 +31028,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.display", "type": "string", "tags": [], "label": "display", @@ -28059,7 +31041,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28067,7 +31049,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.label", "type": "string", "tags": [], "label": "label", @@ -28078,7 +31060,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.options", "type": "Array", "tags": [], "label": "options", @@ -28092,7 +31074,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.order", "type": "number", "tags": [], "label": "order", @@ -28103,7 +31085,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.required", "type": "boolean", "tags": [], "label": "required", @@ -28117,7 +31099,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -28131,7 +31113,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -28142,7 +31124,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.type", "type": "string", "tags": [], "label": "type", @@ -28155,7 +31137,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28163,7 +31145,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -28177,7 +31159,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.validations", "type": "Array", "tags": [], "label": "validations", @@ -28191,8 +31173,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.oracle_home.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -28204,10 +31186,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count", "type": "Object", "tags": [], - "label": "wallet_configuration_path", + "label": "retry_count", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28215,8 +31197,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -28226,7 +31208,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -28240,7 +31222,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.display", "type": "string", "tags": [], "label": "display", @@ -28253,7 +31235,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28261,7 +31243,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.label", "type": "string", "tags": [], "label": "label", @@ -28272,7 +31254,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.options", "type": "Array", "tags": [], "label": "options", @@ -28286,7 +31268,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.order", "type": "number", "tags": [], "label": "order", @@ -28297,7 +31279,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.required", "type": "boolean", "tags": [], "label": "required", @@ -28311,7 +31293,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -28325,7 +31307,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -28336,7 +31318,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.type", "type": "string", "tags": [], "label": "type", @@ -28349,7 +31331,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28357,7 +31339,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -28371,7 +31353,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.validations", "type": "Array", "tags": [], "label": "validations", @@ -28385,8 +31367,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.configuration.wallet_configuration_path.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.value", + "type": "number", "tags": [], "label": "value", "description": [], @@ -28400,7 +31382,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features", "type": "Object", "tags": [], "label": "features", @@ -28411,7 +31393,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES", "type": "Object", "tags": [], "label": "[FeatureName.SYNC_RULES]", @@ -28422,7 +31404,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.advanced", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.advanced", "type": "Object", "tags": [], "label": "advanced", @@ -28433,7 +31415,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.advanced.enabled", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.advanced.enabled", "type": "boolean", "tags": [], "label": "enabled", @@ -28449,7 +31431,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.basic", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.basic", "type": "Object", "tags": [], "label": "basic", @@ -28460,7 +31442,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.features.FeatureName.SYNC_RULES.basic.enabled", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.basic.enabled", "type": "boolean", "tags": [], "label": "enabled", @@ -28480,7 +31462,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.name", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.name", "type": "string", "tags": [], "label": "name", @@ -28491,7 +31473,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.oracle.serviceType", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.serviceType", "type": "string", "tags": [], "label": "serviceType", @@ -28504,10 +31486,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3", "type": "Object", "tags": [], - "label": "postgresql", + "label": "s3", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28515,7 +31497,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration", "type": "Object", "tags": [], "label": "configuration", @@ -28526,10 +31508,207 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets", + "type": "Object", + "tags": [], + "label": "buckets", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.buckets.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id", "type": "Object", "tags": [], - "label": "host", + "label": "aws_access_key_id", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28537,18 +31716,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -28562,7 +31744,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.display", "type": "string", "tags": [], "label": "display", @@ -28583,7 +31765,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.label", "type": "string", "tags": [], "label": "label", @@ -28594,7 +31776,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.options", "type": "Array", "tags": [], "label": "options", @@ -28608,7 +31790,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.order", "type": "number", "tags": [], "label": "order", @@ -28619,7 +31801,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.required", "type": "boolean", "tags": [], "label": "required", @@ -28633,7 +31815,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -28647,18 +31829,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.type", "type": "string", "tags": [], "label": "type", @@ -28679,7 +31864,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -28693,7 +31878,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.validations", "type": "Array", "tags": [], "label": "validations", @@ -28707,7 +31892,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_access_key_id.value", "type": "string", "tags": [], "label": "value", @@ -28720,10 +31905,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key", "type": "Object", "tags": [], - "label": "port", + "label": "aws_secret_access_key", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28731,7 +31916,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -28745,7 +31930,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -28759,7 +31944,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.display", "type": "string", "tags": [], "label": "display", @@ -28772,7 +31957,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28780,7 +31965,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.label", "type": "string", "tags": [], "label": "label", @@ -28791,7 +31976,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.options", "type": "Array", "tags": [], "label": "options", @@ -28805,7 +31990,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.order", "type": "number", "tags": [], "label": "order", @@ -28816,7 +32001,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.required", "type": "boolean", "tags": [], "label": "required", @@ -28830,13 +32015,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28844,18 +32029,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.type", "type": "string", "tags": [], "label": "type", @@ -28868,7 +32056,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28876,7 +32064,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -28890,7 +32078,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.validations", "type": "Array", "tags": [], "label": "validations", @@ -28904,8 +32092,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.aws_secret_access_key.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -28917,10 +32105,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout", "type": "Object", "tags": [], - "label": "username", + "label": "read_timeout", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28928,8 +32116,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -28939,7 +32127,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -28953,7 +32141,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.display", "type": "string", "tags": [], "label": "display", @@ -28966,7 +32154,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -28974,7 +32162,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.label", "type": "string", "tags": [], "label": "label", @@ -28985,7 +32173,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.options", "type": "Array", "tags": [], "label": "options", @@ -28999,7 +32187,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.order", "type": "number", "tags": [], "label": "order", @@ -29010,13 +32198,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29024,7 +32212,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -29038,18 +32226,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.type", "type": "string", "tags": [], "label": "type", @@ -29062,7 +32253,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29070,13 +32261,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29084,7 +32275,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.validations", "type": "Array", "tags": [], "label": "validations", @@ -29098,7 +32289,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.read_timeout.value", "type": "string", "tags": [], "label": "value", @@ -29111,10 +32302,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout", "type": "Object", "tags": [], - "label": "password", + "label": "connect_timeout", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29122,8 +32313,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -29133,7 +32324,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -29147,7 +32338,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.display", "type": "string", "tags": [], "label": "display", @@ -29160,7 +32351,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29168,7 +32359,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.label", "type": "string", "tags": [], "label": "label", @@ -29179,7 +32370,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.options", "type": "Array", "tags": [], "label": "options", @@ -29193,7 +32384,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.order", "type": "number", "tags": [], "label": "order", @@ -29204,13 +32395,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29218,13 +32409,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29232,18 +32423,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.type", "type": "string", "tags": [], "label": "type", @@ -29256,7 +32450,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29264,13 +32458,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29278,7 +32472,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.validations", "type": "Array", "tags": [], "label": "validations", @@ -29292,7 +32486,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.connect_timeout.value", "type": "string", "tags": [], "label": "value", @@ -29305,10 +32499,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts", "type": "Object", "tags": [], - "label": "database", + "label": "max_attempts", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29316,8 +32510,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -29327,7 +32521,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -29341,7 +32535,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.display", "type": "string", "tags": [], "label": "display", @@ -29354,7 +32548,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29362,7 +32556,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.label", "type": "string", "tags": [], "label": "label", @@ -29373,7 +32567,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.options", "type": "Array", "tags": [], "label": "options", @@ -29387,7 +32581,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.order", "type": "number", "tags": [], "label": "order", @@ -29398,13 +32592,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29412,7 +32606,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -29426,18 +32620,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.type", "type": "string", "tags": [], "label": "type", @@ -29450,7 +32647,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29458,13 +32655,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29472,7 +32669,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.validations", "type": "Array", "tags": [], "label": "validations", @@ -29486,7 +32683,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.max_attempts.value", "type": "string", "tags": [], "label": "value", @@ -29499,10 +32696,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size", "type": "Object", "tags": [], - "label": "schema", + "label": "page_size", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29510,8 +32707,8 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.default_value", + "type": "number", "tags": [], "label": "default_value", "description": [], @@ -29521,7 +32718,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -29535,7 +32732,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.display", "type": "string", "tags": [], "label": "display", @@ -29548,7 +32745,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".NUMERIC" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29556,7 +32753,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.label", "type": "string", "tags": [], "label": "label", @@ -29567,7 +32764,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.options", "type": "Array", "tags": [], "label": "options", @@ -29581,7 +32778,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.order", "type": "number", "tags": [], "label": "order", @@ -29592,13 +32789,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29606,7 +32803,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -29620,18 +32817,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.type", "type": "string", "tags": [], "label": "type", @@ -29644,7 +32844,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".STRING" + ".INTEGER" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29652,13 +32852,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29666,7 +32866,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.validations", "type": "Array", "tags": [], "label": "validations", @@ -29680,7 +32880,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.schema.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.page_size.value", "type": "string", "tags": [], "label": "value", @@ -29693,10 +32893,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service", "type": "Object", "tags": [], - "label": "tables", + "label": "use_text_extraction_service", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29704,18 +32904,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -29729,7 +32932,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.display", "type": "string", "tags": [], "label": "display", @@ -29742,7 +32945,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTAREA" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29750,7 +32953,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.label", "type": "string", "tags": [], "label": "label", @@ -29761,7 +32964,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.options", "type": "Array", "tags": [], "label": "options", @@ -29775,7 +32978,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.order", "type": "number", "tags": [], "label": "order", @@ -29786,7 +32989,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.required", "type": "boolean", "tags": [], "label": "required", @@ -29800,7 +33003,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -29814,7 +33017,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -29825,7 +33028,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.type", "type": "string", "tags": [], "label": "type", @@ -29838,7 +33041,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".LIST" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29846,13 +33049,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "never[]" + "string[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29860,7 +33063,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.validations", "type": "Array", "tags": [], "label": "validations", @@ -29874,23 +33077,98 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.configuration.use_text_extraction_service.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false } ] - }, + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.s3.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce", + "type": "Object", + "tags": [], + "label": "salesforce", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain", "type": "Object", "tags": [], - "label": "ssl_enabled", + "label": "domain", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29898,13 +33176,13 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.default_value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], "signature": [ - "false" + "null" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29912,7 +33190,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -29926,7 +33204,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.display", "type": "string", "tags": [], "label": "display", @@ -29939,7 +33217,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TOGGLE" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -29947,7 +33225,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.label", "type": "string", "tags": [], "label": "label", @@ -29958,7 +33236,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.options", "type": "Array", "tags": [], "label": "options", @@ -29972,7 +33250,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.order", "type": "number", "tags": [], "label": "order", @@ -29983,7 +33261,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.required", "type": "boolean", "tags": [], "label": "required", @@ -29997,7 +33275,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -30011,7 +33289,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -30022,7 +33300,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.type", "type": "string", "tags": [], "label": "type", @@ -30035,7 +33313,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".BOOLEAN" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30043,7 +33321,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -30057,7 +33335,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.validations", "type": "Array", "tags": [], "label": "validations", @@ -30071,14 +33349,11 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.value", - "type": "boolean", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.domain.value", + "type": "string", "tags": [], "label": "value", "description": [], - "signature": [ - "false" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -30087,10 +33362,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id", "type": "Object", "tags": [], - "label": "ssl_ca", + "label": "client_id", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30098,24 +33373,27 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.default_value", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: true; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30123,7 +33401,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.display", "type": "string", "tags": [], "label": "display", @@ -30144,7 +33422,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.label", "type": "string", "tags": [], "label": "label", @@ -30155,7 +33433,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.options", "type": "Array", "tags": [], "label": "options", @@ -30169,7 +33447,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.order", "type": "number", "tags": [], "label": "order", @@ -30180,7 +33458,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.required", "type": "boolean", "tags": [], "label": "required", @@ -30194,13 +33472,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30208,7 +33486,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -30219,7 +33497,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.type", "type": "string", "tags": [], "label": "type", @@ -30240,7 +33518,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -30254,7 +33532,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.validations", "type": "Array", "tags": [], "label": "validations", @@ -30268,7 +33546,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_id.value", "type": "string", "tags": [], "label": "value", @@ -30281,10 +33559,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret", "type": "Object", "tags": [], - "label": "fetch_size", + "label": "client_secret", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30292,18 +33570,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -30317,7 +33598,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.display", "type": "string", "tags": [], "label": "display", @@ -30330,7 +33611,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30338,7 +33619,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.label", "type": "string", "tags": [], "label": "label", @@ -30349,7 +33630,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.options", "type": "Array", "tags": [], "label": "options", @@ -30363,7 +33644,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.order", "type": "number", "tags": [], "label": "order", @@ -30374,13 +33655,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30388,13 +33669,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30402,7 +33683,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -30413,7 +33694,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.type", "type": "string", "tags": [], "label": "type", @@ -30426,7 +33707,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".STRING" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30434,13 +33715,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", "description": [], "signature": [ - "string[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30448,7 +33729,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.validations", "type": "Array", "tags": [], "label": "validations", @@ -30462,8 +33743,8 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.client_secret.value", + "type": "string", "tags": [], "label": "value", "description": [], @@ -30475,10 +33756,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service", "type": "Object", "tags": [], - "label": "retry_count", + "label": "use_text_extraction_service", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30486,18 +33767,21 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.default_value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.default_value", + "type": "Uncategorized", "tags": [], "label": "default_value", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -30511,7 +33795,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.display", "type": "string", "tags": [], "label": "display", @@ -30524,7 +33808,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".NUMERIC" + ".TOGGLE" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30532,7 +33816,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.label", "type": "string", "tags": [], "label": "label", @@ -30543,7 +33827,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.options", "type": "Array", "tags": [], "label": "options", @@ -30557,7 +33841,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.order", "type": "number", "tags": [], "label": "order", @@ -30568,13 +33852,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.required", "type": "boolean", "tags": [], "label": "required", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30582,7 +33866,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -30596,7 +33880,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.tooltip", "type": "string", "tags": [], "label": "tooltip", @@ -30607,7 +33891,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.type", "type": "string", "tags": [], "label": "type", @@ -30620,7 +33904,7 @@ "section": "def-common.FieldType", "text": "FieldType" }, - ".INTEGER" + ".BOOLEAN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -30628,7 +33912,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -30642,7 +33926,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.validations", "type": "Array", "tags": [], "label": "validations", @@ -30656,11 +33940,14 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.value", - "type": "number", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.configuration.use_text_extraction_service.value", + "type": "boolean", "tags": [], "label": "value", "description": [], + "signature": [ + "false" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false @@ -30671,87 +33958,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features", - "type": "Object", - "tags": [], - "label": "features", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES", - "type": "Object", - "tags": [], - "label": "[FeatureName.SYNC_RULES]", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.advanced", - "type": "Object", - "tags": [], - "label": "advanced", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.advanced.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "false" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.basic", - "type": "Object", - "tags": [], - "label": "basic", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.basic.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "true" - ], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ] - } - ] - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.name", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.name", "type": "string", "tags": [], "label": "name", @@ -30762,7 +33969,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.serviceType", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.salesforce.serviceType", "type": "string", "tags": [], "label": "serviceType", @@ -31434,6 +34641,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/search-connectors", "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.display", @@ -31455,17 +34673,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.label", - "type": "string", - "tags": [], - "label": "label", - "description": [], - "path": "packages/kbn-search-connectors/types/native_connectors.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "@kbn/search-connectors", "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.options", diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index a6b7bde99b33b..4233d24ba2e1b 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.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 | |-------------------|-----------|------------------------|-----------------| -| 2420 | 0 | 2420 | 0 | +| 2649 | 0 | 2649 | 0 | ## Common diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 359241925b497..2a3033823dc99 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index cc2de3f8eb92c..51f9271840cdb 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 11673f03f3cda..e305b135925a1 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-12-13 +date: 2023-12-18 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_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index c31259d11e263..b104851d38d04 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index ca42a20309108..565460d330f87 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 40b205d9510a4..862232dddb45f 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 0412538358863..f941c95b5492a 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-12-13 +date: 2023-12-18 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 9ea0c03982ef9..f8e4514621e0d 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-12-13 +date: 2023-12-18 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 461a568f66a26..8d88f8f766145 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-12-13 +date: 2023-12-18 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 43ce233338174..558a321b34c40 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-12-13 +date: 2023-12-18 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 ce29c635fc6da..f81cff1580b37 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-12-13 +date: 2023-12-18 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 fdab05ab2d86f..0734c7895794a 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-12-13 +date: 2023-12-18 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 0716f9ffa4a93..1ddaf187b9405 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-12-13 +date: 2023-12-18 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 034b40e76fa77..232cabc415b3e 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-12-13 +date: 2023-12-18 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.devdocs.json b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json index 43eab9a3b5012..e264ff91b5597 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json +++ b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json @@ -834,7 +834,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"legend\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -848,7 +848,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"legend\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -987,7 +987,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"legend\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1001,7 +1001,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"legend\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index f8ccc961fa071..f4ce5b2c33425 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-12-13 +date: 2023-12-18 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 98867ef6793c1..b34092f1299da 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-12-13 +date: 2023-12-18 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 201a188001d44..2d709d970aab7 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-12-13 +date: 2023-12-18 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 fca5f19ec9b9b..794f6994a43d9 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-12-13 +date: 2023-12-18 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 3b505b114f173..47e4d3d1698f7 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-12-13 +date: 2023-12-18 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 8e1e922f060e2..5eeea34474fac 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-12-13 +date: 2023-12-18 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 9fa60c98c2011..16b9039f15918 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-12-13 +date: 2023-12-18 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 f47925c97ef4d..e629a0f6eba7a 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-12-13 +date: 2023-12-18 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 150138ee44af1..80b230c8d46e3 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-12-13 +date: 2023-12-18 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 82da11c352188..152a29347baf4 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-12-13 +date: 2023-12-18 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 49f3f2ac8a8ab..ce858771df565 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-12-13 +date: 2023-12-18 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 e36b530bc5cc4..886d2450e6e87 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-12-13 +date: 2023-12-18 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 527f5ea1a897f..9a1683a04c3fe 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-12-13 +date: 2023-12-18 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 c0025f7d91ef9..b46bd21aa7cbc 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-12-13 +date: 2023-12-18 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 d6c1ccbcfecd0..a73d0f0c940f9 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-12-13 +date: 2023-12-18 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 ac8d9ff93f0e2..64b0c05e696e2 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 6370d56895d71..c0ed52337a806 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 62a5ed6b1f908..826f6bbd13786 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index fdc617b8a9794..c18a6016926af 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 4842a4c95bfb3..8e71bae2f10c4 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index a6d18ff4a80a1..713af7177d262 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 26be90fdc941a..8a06726da63a5 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-12-13 +date: 2023-12-18 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 6c7517d2d2b4e..33d60f338abfa 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-12-13 +date: 2023-12-18 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 09278bcf76055..9d37c94515baa 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-12-13 +date: 2023-12-18 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_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 5f0eab9a7f498..6796d67826dbf 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-12-13 +date: 2023-12-18 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_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 0ee07a1fa95c9..3cfcbfe1cf56b 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-12-13 +date: 2023-12-18 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 5a603d226a9f6..7b82f8bf7a12f 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-12-13 +date: 2023-12-18 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 737850b312962..73d5bd9822f40 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-12-13 +date: 2023-12-18 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 3996273c15066..13b0593b32f7f 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index c4c864d6c943c..770188c461e6b 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 88b0c10a6403a..b6f213e2b889d 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-12-13 +date: 2023-12-18 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 19312fd73ac5d..62d8c13116cf4 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-12-13 +date: 2023-12-18 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 6113e98a39e64..20a8cd1a7304d 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-12-13 +date: 2023-12-18 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 9a548cc0598ce..dda277828c555 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-12-13 +date: 2023-12-18 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 db8faa85c799a..16303365d02de 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-12-13 +date: 2023-12-18 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 d3e08fc66fef7..4971654e8995c 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-12-13 +date: 2023-12-18 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 0aa3188b83c7f..5a42c087ad818 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-12-13 +date: 2023-12-18 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 79c4ed8378c4a..5d839db1ae2d3 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-12-13 +date: 2023-12-18 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 3fb53edd87a66..851638927b347 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-12-13 +date: 2023-12-18 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 6b6892008dcc0..1531e216ee8f0 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-12-13 +date: 2023-12-18 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 35bc5527a3856..056c8cfc8fe4b 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-12-13 +date: 2023-12-18 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 d4307eaddf09a..cd973e58175c4 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-12-13 +date: 2023-12-18 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 a8764a0396885..d28204f8e0ef1 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-12-13 +date: 2023-12-18 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 bafdf2b2e2ece..bf1d71aac2182 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-12-13 +date: 2023-12-18 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 f61ab20d66900..76f5d2e4a7b83 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-12-13 +date: 2023-12-18 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 46f685ddf488f..c96a252daac27 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-12-13 +date: 2023-12-18 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 435885429fa5b..d6942b6e883e7 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-12-13 +date: 2023-12-18 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 711b4010257fb..06b8260282c9c 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-12-13 +date: 2023-12-18 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 823df2a2d123f..d8fb3c8e668fc 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-12-13 +date: 2023-12-18 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 31e9355e8c276..d5811ca35d963 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-12-13 +date: 2023-12-18 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 ab449b4a7a702..ec1df21af75ff 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-12-13 +date: 2023-12-18 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 015299f8e1ab1..4c1ae63ef23d6 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-12-13 +date: 2023-12-18 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 c92148d59799a..1d60efdc319e1 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-12-13 +date: 2023-12-18 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 f78c738eb9a6a..d53224c0c6dd6 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-12-13 +date: 2023-12-18 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 f89668409aa3a..2ebfc1cab9d65 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-12-13 +date: 2023-12-18 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 4238c987f78f1..1d3d99307f263 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-12-13 +date: 2023-12-18 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 8b7dcae80e360..0a0fbb25be8c2 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-12-13 +date: 2023-12-18 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 94789eafd32ea..3318844c77741 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-12-13 +date: 2023-12-18 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 04e14a2cbf87e..16d54f2874c78 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-12-13 +date: 2023-12-18 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 b30bc1175d276..22d6951ee70df 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-12-13 +date: 2023-12-18 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 7efc1d670402c..5e8b55c98b511 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index a4fca13fe7f8d..2a4c1f6a65b60 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 5628267c70971..4091ee447146e 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-12-13 +date: 2023-12-18 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 bad71a7da23cb..cbfc7c80261a0 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-12-13 +date: 2023-12-18 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 41564d347d1b9..effc39ee2bb8b 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-12-13 +date: 2023-12-18 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 36047818ab02e..7182df0229b50 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-12-13 +date: 2023-12-18 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 3b9675bfc4c1c..fc6aae98b33a9 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-12-13 +date: 2023-12-18 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 2a1424281575e..9333f4c683f64 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-12-13 +date: 2023-12-18 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 c9f7ab98d67d5..e7c4f9bf8301f 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-12-13 +date: 2023-12-18 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 9c3f4b922194d..46748c575ba1b 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 176eec58b7221..63832380c8aff 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index d16e6c6f4c688..b1fa1491dc3d1 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index a1ea065074a2f..3bde02022c6ec 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 78c0909d1b313..c11843d57cfea 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-12-13 +date: 2023-12-18 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 f997749e29829..dfaa593b0ad1d 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-12-13 +date: 2023-12-18 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 d387828a98405..5f14bcb010a03 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-12-13 +date: 2023-12-18 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 fb8018caca1f7..b636b1ac63633 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-12-13 +date: 2023-12-18 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 5a9b28bbfaf0a..fc6d26b343b07 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-12-13 +date: 2023-12-18 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 752163ee9c93c..c787f2b04a6c0 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-12-13 +date: 2023-12-18 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 e747c34786fb4..9f077fa04a2e1 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-12-13 +date: 2023-12-18 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 1823a2ebf138a..fa90e68b0eeef 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 5dbf6040fb04e..800253d53a2af 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 1b6372a9362a0..328404b2c8a82 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-12-13 +date: 2023-12-18 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 5a703e961a081..a732165ddef17 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-12-13 +date: 2023-12-18 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 9f3699b145955..5ab3bb80c3ab4 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-12-13 +date: 2023-12-18 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 54cf676b81ef5..502f2daeb8a49 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-12-13 +date: 2023-12-18 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 3ca0131ed9c47..ee0c0b15f8306 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-12-13 +date: 2023-12-18 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 5619f252630df..817bbbbb73542 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-12-13 +date: 2023-12-18 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 3bbace52503e0..b019dbd181e30 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 79f3a8a236bce..ea803dbe48088 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 1a1a8ce6eb3f5..16f190685441b 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 08a518c7b88dd..74399577dc23d 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 6d9de209bcccc..ddffd9447c909 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 681f9d3be2560..4678f399d55f6 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-12-13 +date: 2023-12-18 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 71ecfa55073da..e23a4fb2f5783 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -1347,6 +1347,58 @@ "plugin": "ml", "path": "x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx" }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_imports.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/application.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/application.tsx" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/public/application.tsx" + }, { "plugin": "profiling", "path": "x-pack/plugins/profiling/public/app.tsx" @@ -1483,18 +1535,6 @@ "plugin": "crossClusterReplication", "path": "x-pack/plugins/cross_cluster_replication/public/app/index.tsx" }, - { - "plugin": "enterpriseSearch", - "path": "x-pack/plugins/enterprise_search/public/applications/index.tsx" - }, - { - "plugin": "enterpriseSearch", - "path": "x-pack/plugins/enterprise_search/public/applications/index.tsx" - }, - { - "plugin": "enterpriseSearch", - "path": "x-pack/plugins/enterprise_search/public/applications/index.tsx" - }, { "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/plugin.tsx" @@ -1603,58 +1643,6 @@ "plugin": "observabilityOnboarding", "path": "x-pack/plugins/observability_onboarding/public/application/app.tsx" }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_imports.ts" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/application.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/application.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/application.tsx" - }, { "plugin": "devTools", "path": "src/plugins/dev_tools/public/application.tsx" @@ -3012,6 +3000,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/render_app.tsx" }, + { + "plugin": "timelines", + "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx" + }, + { + "plugin": "timelines", + "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx" + }, { "plugin": "banners", "path": "x-pack/plugins/banners/public/plugin.tsx" @@ -3096,14 +3092,6 @@ "plugin": "reporting", "path": "x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.tsx" }, - { - "plugin": "timelines", - "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx" - }, - { - "plugin": "timelines", - "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx" - }, { "plugin": "cloudSecurityPosture", "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 08450777ca866..a342e8b7d4044 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-12-13 +date: 2023-12-18 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 c530a713b1810..75a7a3908353f 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-12-13 +date: 2023-12-18 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 7efe5a7bb03c8..bde43df0d53ec 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 8e19ab8a174f2..48dc406105739 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -8880,7 +8880,7 @@ "CustomXDomain", " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_renderers.ts", "deprecated": false, @@ -10891,7 +10891,7 @@ "CustomXDomain", " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> | Partial | undefined; legendSort?: \"ignore\" | undefined; }>> | Partial; topNFunctionsLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "TopNFunctionsLocatorParams", - ">; stacktracesLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "StacktracesLocatorParams", - ">; }; }; navigation: { registerSections: (sections$: ", + "{ locators: ObservabilitySharedLocators; navigation: { registerSections: (sections$: ", "Observable", "<", { @@ -2702,6 +2672,27 @@ "path": "x-pack/plugins/observability/public/plugin.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityPublicPluginsSetup.serverless", + "type": "Object", + "tags": [], + "label": "serverless", + "description": [], + "signature": [ + { + "pluginId": "serverless", + "scope": "public", + "docId": "kibServerlessPluginApi", + "section": "def-public.ServerlessPluginSetup", + "text": "ServerlessPluginSetup" + }, + " | undefined" + ], + "path": "x-pack/plugins/observability/public/plugin.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -3029,7 +3020,7 @@ "label": "observabilityShared", "description": [], "signature": [ - "{ navigation: { PageTemplate: (pageTemplateProps: ", + "{ locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", ") => JSX.Element; registerSections: (sections$: ", "Observable", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 2a8b80a105e03..9f09249d454ad 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 599 | 2 | 590 | 17 | +| 600 | 2 | 591 | 17 | ## Client diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index 43d05f250de6e..bde01c0fbede4 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -684,7 +684,11 @@ "ObservabilityAIAssistantRouteCreateOptions", "; \"GET /internal/observability_ai_assistant/kb/status\": { endpoint: \"GET /internal/observability_ai_assistant/kb/status\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - ") => Promise<{ ready: boolean; error?: any; deployment_state?: string | undefined; allocation_state?: string | undefined; }>; } & ", + ") => Promise<{ ready: boolean; error?: any; deployment_state?: ", + "MlDeploymentState", + " | undefined; allocation_state?: ", + "MlDeploymentAllocationState", + " | undefined; model_name?: string | undefined; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/kb/setup\": { endpoint: \"POST /internal/observability_ai_assistant/kb/setup\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", @@ -1186,7 +1190,11 @@ "ObservabilityAIAssistantRouteCreateOptions", "; \"GET /internal/observability_ai_assistant/kb/status\": { endpoint: \"GET /internal/observability_ai_assistant/kb/status\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - ") => Promise<{ ready: boolean; error?: any; deployment_state?: string | undefined; allocation_state?: string | undefined; }>; } & ", + ") => Promise<{ ready: boolean; error?: any; deployment_state?: ", + "MlDeploymentState", + " | undefined; allocation_state?: ", + "MlDeploymentAllocationState", + " | undefined; model_name?: string | undefined; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/kb/setup\": { endpoint: \"POST /internal/observability_ai_assistant/kb/setup\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", @@ -1928,7 +1936,11 @@ "ObservabilityAIAssistantRouteCreateOptions", "; \"GET /internal/observability_ai_assistant/kb/status\": { endpoint: \"GET /internal/observability_ai_assistant/kb/status\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - ") => Promise<{ ready: boolean; error?: any; deployment_state?: string | undefined; allocation_state?: string | undefined; }>; } & ", + ") => Promise<{ ready: boolean; error?: any; deployment_state?: ", + "MlDeploymentState", + " | undefined; allocation_state?: ", + "MlDeploymentAllocationState", + " | undefined; model_name?: string | undefined; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/kb/setup\": { endpoint: \"POST /internal/observability_ai_assistant/kb/setup\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", @@ -2439,7 +2451,11 @@ "ObservabilityAIAssistantRouteCreateOptions", "; \"GET /internal/observability_ai_assistant/kb/status\": { endpoint: \"GET /internal/observability_ai_assistant/kb/status\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - ") => Promise<{ ready: boolean; error?: any; deployment_state?: string | undefined; allocation_state?: string | undefined; }>; } & ", + ") => Promise<{ ready: boolean; error?: any; deployment_state?: ", + "MlDeploymentState", + " | undefined; allocation_state?: ", + "MlDeploymentAllocationState", + " | undefined; model_name?: string | undefined; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/kb/setup\": { endpoint: \"POST /internal/observability_ai_assistant/kb/setup\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", @@ -3028,7 +3044,11 @@ "ObservabilityAIAssistantRouteCreateOptions", "; \"GET /internal/observability_ai_assistant/kb/status\": { endpoint: \"GET /internal/observability_ai_assistant/kb/status\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - ") => Promise<{ ready: boolean; error?: any; deployment_state?: string | undefined; allocation_state?: string | undefined; }>; } & ", + ") => Promise<{ ready: boolean; error?: any; deployment_state?: ", + "MlDeploymentState", + " | undefined; allocation_state?: ", + "MlDeploymentAllocationState", + " | undefined; model_name?: string | undefined; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/kb/setup\": { endpoint: \"POST /internal/observability_ai_assistant/kb/setup\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", @@ -3530,7 +3550,11 @@ "ObservabilityAIAssistantRouteCreateOptions", "; \"GET /internal/observability_ai_assistant/kb/status\": { endpoint: \"GET /internal/observability_ai_assistant/kb/status\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - ") => Promise<{ ready: boolean; error?: any; deployment_state?: string | undefined; allocation_state?: string | undefined; }>; } & ", + ") => Promise<{ ready: boolean; error?: any; deployment_state?: ", + "MlDeploymentState", + " | undefined; allocation_state?: ", + "MlDeploymentAllocationState", + " | undefined; model_name?: string | undefined; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/kb/setup\": { endpoint: \"POST /internal/observability_ai_assistant/kb/setup\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", @@ -4254,7 +4278,11 @@ "ObservabilityAIAssistantRouteCreateOptions", "; \"GET /internal/observability_ai_assistant/kb/status\": { endpoint: \"GET /internal/observability_ai_assistant/kb/status\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - ") => Promise<{ ready: boolean; error?: any; deployment_state?: string | undefined; allocation_state?: string | undefined; }>; } & ", + ") => Promise<{ ready: boolean; error?: any; deployment_state?: ", + "MlDeploymentState", + " | undefined; allocation_state?: ", + "MlDeploymentAllocationState", + " | undefined; model_name?: string | undefined; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/kb/setup\": { endpoint: \"POST /internal/observability_ai_assistant/kb/setup\"; params?: undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index a3dcc07b4d5ed..5fdf528c1314e 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index 450a4d4a5771a..00ffdc1bb040a 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index dc7a06343e49f..a68cc0e1298d3 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index 938f26fbaf7dd..5c0c77dba50b7 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -65,37 +65,7 @@ }, ", pluginsSetup: ", "ObservabilitySharedSetup", - ") => { locators: { profiling: { flamegraphLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "FlamegraphLocatorParams", - ">; topNFunctionsLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "TopNFunctionsLocatorParams", - ">; stacktracesLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "StacktracesLocatorParams", - ">; }; }; navigation: { registerSections: (sections$: ", + ") => { locators: ObservabilitySharedLocators; navigation: { registerSections: (sections$: ", "Observable", "<", { @@ -169,7 +139,7 @@ }, ", plugins: ", "ObservabilitySharedStart", - ") => { navigation: { PageTemplate: (pageTemplateProps: ", + ") => { locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", ") => JSX.Element; registerSections: (sections$: ", "Observable", @@ -1268,17 +1238,19 @@ }, { "parentPluginId": "observabilityShared", - "id": "def-public.useChartTheme", + "id": "def-public.useChartThemes", "type": "Function", "tags": [], - "label": "useChartTheme", + "label": "useChartThemes", "description": [], "signature": [ - "() => ", + "() => { baseTheme: ", + "Theme", + "; theme: ", "RecursivePartial", "<", "Theme", - ">[]" + ">[]; }" ], "path": "x-pack/plugins/observability_shared/public/hooks/use_chart_theme.tsx", "deprecated": false, @@ -2944,37 +2916,7 @@ "label": "ObservabilitySharedPluginSetup", "description": [], "signature": [ - "{ locators: { profiling: { flamegraphLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "FlamegraphLocatorParams", - ">; topNFunctionsLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "TopNFunctionsLocatorParams", - ">; stacktracesLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "StacktracesLocatorParams", - ">; }; }; navigation: { registerSections: (sections$: ", + "{ locators: ObservabilitySharedLocators; navigation: { registerSections: (sections$: ", "Observable", "<", { @@ -2999,7 +2941,7 @@ "label": "ObservabilitySharedPluginStart", "description": [], "signature": [ - "{ navigation: { PageTemplate: (pageTemplateProps: ", + "{ locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", ") => JSX.Element; registerSections: (sections$: ", "Observable", @@ -3060,36 +3002,12 @@ "description": [], "signature": [ "{ flamegraphLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "FlamegraphLocatorParams", - ">; topNFunctionsLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "TopNFunctionsLocatorParams", - ">; stacktracesLocator: ", - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - "StacktracesLocatorParams", - ">; }" + "FlamegraphLocator", + "; topNFunctionsLocator: ", + "TopNFunctionsLocator", + "; stacktracesLocator: ", + "StacktracesLocator", + "; }" ], "path": "x-pack/plugins/observability_shared/public/plugin.ts", "deprecated": false, diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 10c54acb98e1c..58f3c99e86bf3 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-12-13 +date: 2023-12-18 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 69b4b6a7ef2c8..833d6ba89b409 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 7014db6c900b3..f947ef7c14321 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 41fc7ab92b9f8..d830e5d207c89 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 77666 | 235 | 66394 | 1632 | +| 77928 | 235 | 66650 | 1632 | ## Plugin Directory @@ -69,7 +69,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 141 | 0 | 96 | 21 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 37 | 0 | 35 | 2 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | -| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Server APIs for the Elastic AI Assistant | 4 | 0 | 2 | 0 | +| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Server APIs for the Elastic AI Assistant | 36 | 0 | 28 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 547 | 1 | 446 | 8 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 14 | 0 | 14 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | @@ -141,7 +141,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/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 599 | 2 | 590 | 17 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 600 | 2 | 591 | 17 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 91 | 0 | 86 | 12 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 18 | 0 | 18 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 14 | 0 | 14 | 0 | @@ -573,7 +573,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 119 | 0 | 116 | 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) | - | 75 | 0 | 75 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2420 | 0 | 2420 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2649 | 0 | 2649 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 27 | 1 | 26 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index cd2f4c3906f75..56d411f372a83 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-12-13 +date: 2023-12-18 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 e19ac7f3e2f25..cd5f9aef06137 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-12-13 +date: 2023-12-18 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 dbe18d4751cf2..82f2fba2ab656 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-12-13 +date: 2023-12-18 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 f4fe8d843b520..843201c2c9bd7 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-12-13 +date: 2023-12-18 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 6ed537f495929..aadfbb6835041 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-12-13 +date: 2023-12-18 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 527f3e4e44fad..ab6692138298d 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-12-13 +date: 2023-12-18 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 fde9f5cacb7a4..187729bd86d62 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-12-13 +date: 2023-12-18 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 d909c4190c7d2..792383846db51 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-12-13 +date: 2023-12-18 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 f22f44c953929..ad12abf48f4ec 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-12-13 +date: 2023-12-18 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 0987ea89b1213..eaccbc443819c 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-12-13 +date: 2023-12-18 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 04edf1533c3a6..f4977b8f11824 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-12-13 +date: 2023-12-18 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 9ae525c765d88..b1618e20483af 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-12-13 +date: 2023-12-18 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 fbf90b54e6d9f..7d9a91de7914e 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-12-13 +date: 2023-12-18 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 b89e9ee31a2a6..36f043d93a37c 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-12-13 +date: 2023-12-18 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 2c966b4d79652..7628d91c6364e 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-12-13 +date: 2023-12-18 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 4da181ff1e482..89ff7204e4f85 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-12-13 +date: 2023-12-18 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 f051295150042..640d6981eec03 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-12-13 +date: 2023-12-18 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 30a16529afcd2..ff60d373990aa 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-12-13 +date: 2023-12-18 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 0c14de5067456..825eda7748872 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-12-13 +date: 2023-12-18 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 73ebf41473545..3b7b945f26c6e 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-12-13 +date: 2023-12-18 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 c52b0ae30c813..685489e4d6fa9 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-12-13 +date: 2023-12-18 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 d4f5deba1abb8..7c49f7f5e65be 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-12-13 +date: 2023-12-18 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 f68a4546c2110..fa626da1593ef 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-12-13 +date: 2023-12-18 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 d9ad924531e16..d5c6cdc62f49f 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-12-13 +date: 2023-12-18 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 915df7c382e7f..23d7dc5446c36 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-12-13 +date: 2023-12-18 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 ce3f26f563b65..5fcf16314ab22 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-12-13 +date: 2023-12-18 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 3202de6d32957..f8b794b4fd474 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 704f0e612a852..4ad95ad4213ed 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index e9648651b78ef..cdb64355fe080 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-12-13 +date: 2023-12-18 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 748e15857205e..3ecebb2ca3ab6 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-12-13 +date: 2023-12-18 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 b801b30dec7a2..11b9cacaf47c6 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-12-13 +date: 2023-12-18 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 fabb1c8da10fd..96056c8d85239 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-12-13 +date: 2023-12-18 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 b70a9f34459cf..cdb82ee2be71b 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-12-13 +date: 2023-12-18 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 39b8639ced195..e208be5033030 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index ad8a6c2eb58b4..0bcece016430a 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index edc93ac9166bd..d2f28f9420611 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-12-13 +date: 2023-12-18 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 62ad63dfc5a19..9278473f3ceae 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-12-13 +date: 2023-12-18 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 2203ee25d71ae..215cdbb85dafc 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index e8f917bf9c427..eaa39b0f255e6 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index ef88412c75787..ee1e01cb9cd16 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-12-13 +date: 2023-12-18 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 811786e0c0dd3..4eb8145503466 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-12-13 +date: 2023-12-18 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 8e51dc9383e6d..ae96e33156eb0 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-12-13 +date: 2023-12-18 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 fa290623d336d..0e29b844faa71 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-12-13 +date: 2023-12-18 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 6a1a87a987ce7..4f447ab053d20 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-12-13 +date: 2023-12-18 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 2ecbe1ae1760e..0047bfc6cabdd 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-12-13 +date: 2023-12-18 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 7d3f265993649..09abfa73cbb71 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-12-13 +date: 2023-12-18 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 9e4d25fb12892..51e9fadf1012f 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-12-13 +date: 2023-12-18 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 358674e87da11..fe81d5d23f5cf 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-12-13 +date: 2023-12-18 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 faaaa178d0b99..77f941dd5a728 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-12-13 +date: 2023-12-18 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 17b06547b474f..6e291caca1dc0 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-12-13 +date: 2023-12-18 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 d1c9105d22ed9..cb9aa5567950b 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-12-13 +date: 2023-12-18 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 8df33a2b0cd66..f7c8606da3860 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-12-13 +date: 2023-12-18 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 bb0f94b486415..07f993dba7cb1 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-12-13 +date: 2023-12-18 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 2154e74df7f8d..57c3308879c83 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-12-13 +date: 2023-12-18 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 6ecefb481de62..500d2dbfbcf43 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-12-13 +date: 2023-12-18 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 47c2586768a12..e65f58f5a38b7 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-12-13 +date: 2023-12-18 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 e800328abf1b5..0c3aabf3cf038 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-12-13 +date: 2023-12-18 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 fe445fc3f0c08..dc9b21c52fa71 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-12-13 +date: 2023-12-18 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 865d2c0fa1d1e..bf0c5ff50627b 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index a3d45a2b139d9..e94e1d35c22d9 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -6710,7 +6710,15 @@ "section": "def-common.AggregateQuery", "text": "AggregateQuery" }, - " | undefined>; openInspector: () => ", + " | undefined>; getFilters: () => Promise<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[]>; openInspector: () => ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "common", @@ -6876,15 +6884,7 @@ }, " | undefined; updateOutput: (outputChanges: Partial<", "VisualizeOutput", - ">) => void; supportedTriggers: () => string[]; getFilters: () => Promise<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[]>; getVis: () => ", + ">) => void; supportedTriggers: () => string[]; getVis: () => ", { "pluginId": "visualizations", "scope": "public", diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 0dfd52881332d..3b7a0e17af6b8 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-12-13 +date: 2023-12-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/docs/management/connectors/action-types/servicenow-itom.asciidoc b/docs/management/connectors/action-types/servicenow-itom.asciidoc index 70ee48ccccd7b..ea21cb72248f7 100644 --- a/docs/management/connectors/action-types/servicenow-itom.asciidoc +++ b/docs/management/connectors/action-types/servicenow-itom.asciidoc @@ -31,16 +31,14 @@ image::management/connectors/images/servicenow-itom-connector-oauth.png[{sn-itom [[servicenow-itom-connector-configuration]] ==== Connector configuration -{sn-itom} connectors have the following configuration properties: +{sn-itom} connectors have a name and the following configuration properties: Client ID:: The client identifier assigned to your OAuth application. Client secret:: The client secret assigned to your OAuth application. -JWT key ID:: +JWT verifier key ID:: The key identifier assigned to the JWT verifier map of your OAuth application. -Connector name:: -The name is used to identify a connector in the management UI connector listing or in the connector list when configuring an action. Password:: The password for HTTP basic authentication. Private key:: diff --git a/docs/management/connectors/action-types/servicenow.asciidoc b/docs/management/connectors/action-types/servicenow.asciidoc index f3c636df29b6b..db0b9b3183a6f 100644 --- a/docs/management/connectors/action-types/servicenow.asciidoc +++ b/docs/management/connectors/action-types/servicenow.asciidoc @@ -12,9 +12,108 @@ The {sn-itsm} connector uses the https://developer.servicenow.com/dev.do#!/reference/api/sandiego/rest/c_ImportSetAPI[import set API] to create {sn} incidents. You can use the connector for rule actions and cases. +[float] +[[define-servicenow-ui]] +=== Create connectors in {kib} + +You can create connectors in *{stack-manage-app} > {connectors-ui}* +or as needed when you're creating a rule. You must choose whether to use OAuth for authentication. + +[role="screenshot"] +image::management/connectors/images/servicenow-connector-basic.png[ServiceNow connector using basic auth] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + + +[role="screenshot"] +image::management/connectors/images/servicenow-connector-oauth.png[ServiceNow connector using OAuth] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +[float] +[[servicenow-connector-configuration]] +==== Connector configuration + +{sn-itsm} connectors have a name and the following configuration properties: + +Client ID:: +The client identifier assigned to your OAuth application. +Client secret:: +The client secret assigned to your OAuth application. +JWT verifier key ID:: +The key identifier assigned to the JWT verifier map of your OAuth application. +Password:: +The password for HTTP basic authentication. +Private key:: +The RSA private key that you created for use in {sn}. +Private key password:: +The password for the RSA private key. +This values is required if you set a password for your private key. +{sn} instance URL:: +The full URL for the {sn} instance. +Use OAuth authentication:: +By default, basic authentication is used instead of open authorization (OAuth). +User identifier:: +The identifier to use for OAuth type authentication. +This identifier should be the user field you selected during setup. For example, if the selected user field is `Email`, the user identifier should be the user's email address. +Username:: +The username for HTTP basic authentication. + +[float] +[[servicenow-action-configuration]] +=== Test connectors + +You can test connectors with the <> or +as you're creating or editing the connector in {kib}. For example: + +[role="screenshot"] +image::management/connectors/images/servicenow-params-test.png[ServiceNow params test] + +{sn-itsm} actions have the following configuration properties. + +Additional comments:: +Additional information for the client, such as how to troubleshoot the issue. +Category:: +The category of the incident. +Correlation ID:: +Connectors using the same correlation ID will be associated with the same {sn} incident. +This value determines whether a new {sn} incident will be created or an existing one is updated. +Modifying this value is optional; if not modified, the rule ID and alert ID are combined as `{{ruleID}}:{{alert ID}}` to form the correlation ID value in {sn}. +The maximum character length for this value is 100 characters. ++ +-- +NOTE: Using the default configuration of `{{ruleID}}:{{alert ID}}` ensures that {sn} will create a separate incident record for every generated alert that uses a unique alert ID. If the rule generates multiple alerts that use the same alert IDs, {sn} creates and continually updates a single incident record for the alert. +-- + +Correlation display:: +A descriptive label of the alert for correlation purposes in {sn}. +Description:: +The details about the incident. +Impact:: +The effect an incident has on business. +It can be measured by the number of affected users or by how critical it is to the business in question. +Severity:: +The severity of the incident. +Short description:: +A short description for the incident, used for searching the contents of the knowledge base. +Subcategory:: +The category of the incident. +Urgency:: +The extent to which the incident resolution can delay. + +[float] +[[servicenow-connector-networking-configuration]] +=== Connector networking configuration + +Use the <> to customize connector networking configurations, such as proxies, certificates, or TLS settings. You can set configurations that apply to all your connectors or use `xpack.actions.customHostSettings` to set per-host configurations. + +[float] +[[configuring-servicenow]] +=== Configure {sn} + +{sn} offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. + [float] [[servicenow-itsm-connector-prerequisites]] -=== Prerequisites +==== Prerequisites After upgrading from {stack} version 7.15.0 or earlier to version 7.16.0 or later, you must complete the following steps within your {sn} instance before @@ -23,13 +122,56 @@ creating a new {sn-itsm} connector or . Install https://store.servicenow.com/sn_appstore_store.do#!/store/application/7148dbc91bf1f450ced060a7234bcb88[Elastic for ITSM] -from the {sn} Store. +from the {sn} store. +. <>. . <>. . <>. . If you use open authorization (OAuth), you must also: .. <>. .. <>. +[float] +[[servicenow-itsm-connector-privileges]] +==== Assign cross-scope privileges + +The Elastic for ITSM app requires specific cross-scope privilege records to run successfully. +In particular, you must have a privilege record for the `Elastic for ITSM` application and source scope with a `global` target scope for each of the following targets: + +|=== +|Target name, type|Operation|Status + +|GlideRecord.insert, Scriptable +|Execute API +|Allowed + +|GlideRecord.setValue, Scriptable +|Execute API +|Allowed + +|GlideRecordSecure.getValue, Scriptable +|Execute API +|Allowed + +|Incident, Table +|Read +|Allowed + +|ScriptableServiceResultBuilder.setBody, Scriptable +|Execute API +|Allowed + +|ScopedGlideElement, Scriptable +|Execute API +|Allowed +|=== + +To access the cross scope privileges table: + +1. Log into {sn} and set your application scope to Elastic for ITSM. +2. Click *All* and search for `sys_scope_privilege`. + +For more details, refer to the https://docs.servicenow.com/[{sn} product documentation]. + [float] [[servicenow-itsm-connector-prerequisites-integration-user]] ==== Create a {sn} integration user @@ -174,77 +316,7 @@ To update a deprecated connector: . Select the deprecated connector to open the *Edit connector* flyout. . In the warning message, click *Update this connector*. . Complete the guided steps in the *Edit connector* flyout. -.. Install https://store.servicenow.com/sn_appstore_store.do#!/store/application/7148dbc91bf1f450ced060a7234bcb88[Elastic for ITSM] and complete the <>. +.. Install https://store.servicenow.com/sn_appstore_store.do#!/store/application/7148dbc91bf1f450ced060a7234bcb88[Elastic for ITSM] and complete the <>. .. Enter the URL of your {sn} instance. .. Enter the username and password of your {sn} instance. . Click *Update*. - -[float] -[[define-servicenow-ui]] -=== Create connectors in {kib} - -You can create connectors in *{stack-manage-app} > {connectors-ui}* -or as needed when you're creating a rule. You must choose whether to use OAuth for authentication. - -[role="screenshot"] -image::management/connectors/images/servicenow-connector-basic.png[ServiceNow connector using basic auth] - -[role="screenshot"] -image::management/connectors/images/servicenow-connector-oauth.png[ServiceNow connector using OAuth] - -[float] -[[servicenow-connector-configuration]] -==== Connector configuration - -{sn-itsm} connectors have the following configuration properties: - -Name:: The name of the connector. -Is OAuth:: The type of authentication to use. -URL:: {sn} instance URL. -Username:: Username for HTTP Basic authentication. -Password:: Password for HTTP Basic authentication. -User Identifier:: Identifier to use for OAuth type authentication. This identifier should be the *User field* you selected during setup. For example, if the selected *User field* is *Email*, the user identifier should be the user's email address. -Client ID:: The client ID assigned to your OAuth application. -Client Secret:: The client secret assigned to your OAuth application. -JWT Key ID:: The key ID assigned to the JWT Verifier Map of your OAuth application. -Private Key:: The RSA private key generated during setup. -Private Key Password:: The password for the RSA private key generated during setup, if set. - -[float] -[[servicenow-action-configuration]] -=== Test connectors - -You can test connectors with the <> or -as you're creating or editing the connector in {kib}. For example: - -[role="screenshot"] -image::management/connectors/images/servicenow-params-test.png[ServiceNow params test] - - -{sn-itsm} actions have the following configuration properties. - -Urgency:: The extent to which the incident resolution can delay. -Severity:: The severity of the incident. -Impact:: The effect an incident has on business. Can be measured by the number of affected users or by how critical it is to the business in question. -Category:: The category of the incident. -Subcategory:: The category of the incident. -Correlation ID:: Connectors using the same Correlation ID will be associated with the same {sn} incident. This value determines whether a new {sn} incident will be created or an existing one is updated. Modifying this value is optional; if not modified, the rule ID and alert ID are combined as `{{ruleID}}:{{alert ID}}` to form the Correlation ID value in {sn}. The maximum character length for this value is 100 characters. - -NOTE: Using the default configuration of `{{ruleID}}:{{alert ID}}` ensures that {sn} will create a separate incident record for every generated alert that uses a unique alert ID. If the rule generates multiple alerts that use the same alert IDs, {sn} creates and continually updates a single incident record for the alert. - -Correlation Display:: A descriptive label of the alert for correlation purposes in {sn}. -Short description:: A short description for the incident, used for searching the contents of the knowledge base. -Description:: The details about the incident. -Additional comments:: Additional information for the client, such as how to troubleshoot the issue. - -[float] -[[servicenow-connector-networking-configuration]] -=== Connector networking configuration - -Use the <> to customize connector networking configurations, such as proxies, certificates, or TLS settings. You can set configurations that apply to all your connectors or use `xpack.actions.customHostSettings` to set per-host configurations. - -[float] -[[configuring-servicenow]] -=== Configure {sn} - -{sn} offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. diff --git a/docs/management/connectors/images/servicenow-connector-basic.png b/docs/management/connectors/images/servicenow-connector-basic.png index e2bf73ad14594..4cf1f19fe8173 100644 Binary files a/docs/management/connectors/images/servicenow-connector-basic.png and b/docs/management/connectors/images/servicenow-connector-basic.png differ diff --git a/docs/management/connectors/images/servicenow-connector-oauth.png b/docs/management/connectors/images/servicenow-connector-oauth.png index f0124d39cfde9..8f818185f686b 100644 Binary files a/docs/management/connectors/images/servicenow-connector-oauth.png and b/docs/management/connectors/images/servicenow-connector-oauth.png differ diff --git a/docs/settings/fleet-settings.asciidoc b/docs/settings/fleet-settings.asciidoc index d3cad6b4dfdbc..a85c4b67063e6 100644 --- a/docs/settings/fleet-settings.asciidoc +++ b/docs/settings/fleet-settings.asciidoc @@ -13,7 +13,10 @@ In {ecloud}, {fleet} flags are already configured. You can configure `xpack.fleet` settings in your `kibana.yml`. By default, {fleet} is enabled. To use {fleet}, you also need to configure {kib} and {es} hosts. -See the {fleet-guide}/index.html[{fleet}] docs for more information. +Many {fleet} settings can also be configured directly through the {fleet} UI. +See {fleet-guide}/fleet-settings.html[Fleet UI settings] for details. + +See the {fleet-guide}/index.html[{fleet}] docs for more information about {fleet}. [[general-fleet-settings-kb]] ==== General {fleet} settings @@ -174,6 +177,8 @@ xpack.fleet.agentPolicies: `xpack.fleet.outputs`:: List of outputs that are configured when the {fleet} app starts. + +Certain types of outputs have additional required and optional settings. Refer to {fleet-guide}/fleet-settings.html#output-settings[Output settings] in the {fleet} and {agent} Guide for the full list of settings for each output type. ++ If configured in your `kibana.yml`, output settings are grayed out and unavailable in the {fleet} UI. To make these settings editable in the UI, do not configure them in the configuration file. @@ -188,13 +193,9 @@ NOTE: The `xpack.fleet.outputs` settings are intended for advanced configuration `name`::: Output name. `type`::: - Type of Output. Currently we support "elasticsearch", "logstash", "kafka". + Type of Output. Currently we support "elasticsearch", "logstash", "kafka", and "remote_elasticsearch". `hosts`::: Array that contains the list of host for that output. - `config`::: - Extra config for that output. - `proxy_id`::: - Unique ID of a proxy to access the output. ===== + .Optional properties of `xpack.fleet.outputs` @@ -204,7 +205,46 @@ NOTE: The `xpack.fleet.outputs` settings are intended for advanced configuration If `true`, the output specified in `xpack.fleet.outputs` will be the one used to send agent data unless there is another one configured specifically for the agent policy. `is_default_monitoring`::: If `true`, the output specified in `xpack.fleet.outputs` will be the one used to send agent monitoring data unless there is another one configured specifically for the agent policy. + `config`::: + Extra config for that output. + `proxy_id`::: + Unique ID of a proxy to access the output. + `ssl`::: + Set to enable authentication using the Secure Sockets Layer (SSL) protocol. ++ +.Properties of `ssl` +[%collapsible%open] +======= + `certificate`:::: + The SSL certificate that {agents} use to authenticate with the output. Include the full contents of the certificate here. +======= + + `secrets`::: + Include here any values for preconfigured outputs that should be stored as secrets. A secret value is replaced in the `kibana.yml` settings file with a reference, with the original value stored externally as a secure hash. Note that this type of secret storage requires all configured {fleet-server}s to be on version 8.12.0 or later. ++ +.Properties of `secrets` +[%collapsible%open] +======= + `key`::::: + The private certificate key that {agents} use to authenticate with the output. +======= ===== ++ +Example `xpack.fleet.outputs` configuration: ++ +[source,yaml] +---- +xpack.fleet.outputs: + - id: my-logstash-output-with-a-secret + name: preconfigured logstash output with a secret + type: logstash + hosts: ["localhost:9999"] + ssl: + certificate: xxxxxxxxxx + secrets: + ssl: + key: securekey +---- `xpack.fleet.fleetServerHosts`:: List of {fleet-server} hosts that are configured when the {fleet} app starts. diff --git a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx index a55f25292cf5d..cfa672748f7ff 100644 --- a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx +++ b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx @@ -8,7 +8,15 @@ import React, { useEffect, useState, FC } from 'react'; -import { Chart, Settings, Axis, BarSeries, Position, ScaleType } from '@elastic/charts'; +import { + Chart, + Settings, + Axis, + BarSeries, + Position, + ScaleType, + LEGACY_LIGHT_THEME, +} from '@elastic/charts'; import { EuiBadge, @@ -113,7 +121,11 @@ export const PageReducerStream: FC = () => {
- + diff --git a/package.json b/package.json index 6c1ff7e4effcb..d85136a35d99b 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "@dnd-kit/utilities": "^2.0.0", "@elastic/apm-rum": "^5.15.0", "@elastic/apm-rum-react": "^2.0.1", - "@elastic/charts": "60.0.1", + "@elastic/charts": "61.0.3", "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.9.1-canary.1", "@elastic/ems-client": "8.5.1", @@ -897,7 +897,7 @@ "canvg": "^3.0.9", "cbor-x": "^1.3.3", "chalk": "^4.1.0", - "cheerio": "^1.0.0-rc.10", + "cheerio": "^1.0.0-rc.12", "chroma-js": "^2.1.0", "classnames": "2.2.6", "color": "^4.2.3", @@ -934,6 +934,7 @@ "exponential-backoff": "^3.1.1", "extract-zip": "^2.0.1", "fast-deep-equal": "^3.1.1", + "fast-glob": "^3.3.2", "fflate": "^0.6.9", "file-saver": "^1.3.8", "fnv-plus": "^1.3.1", @@ -1337,6 +1338,7 @@ "@types/chroma-js": "^2.1.0", "@types/chromedriver": "^81.0.5", "@types/classnames": "^2.2.9", + "@types/cli-progress": "^3.11.5", "@types/color": "^3.0.3", "@types/cytoscape": "^3.14.0", "@types/d3": "^3.5.43", @@ -1499,6 +1501,7 @@ "chance": "1.0.18", "chromedriver": "^119.0.1", "clean-webpack-plugin": "^3.0.0", + "cli-progress": "^3.12.0", "cli-table3": "^0.6.1", "copy-webpack-plugin": "^6.0.2", "cpy": "^8.1.1", @@ -1634,6 +1637,7 @@ "supertest": "^6.3.3", "supports-color": "^7.0.0", "svgo": "^2.8.0", + "table": "^6.8.1", "tape": "^5.0.1", "tempy": "^0.3.0", "terser": "^5.16.5", diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/README.md b/packages/core/saved-objects/core-saved-objects-api-server-internal/README.md index b25fd29f5441c..5adcfcfea3750 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/README.md +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/README.md @@ -28,4 +28,7 @@ helpers to have to pass all the parameters again. ### lib/apis/internals I would call them 'utilities with business logic'. These are the 'big' chunks of logic called by the APIs. -E.g preflightCheckForCreate, internalBulkResolve and so on. \ No newline at end of file +E.g preflightCheckForCreate, internalBulkResolve and so on. + +### Unit tests +Unit tests should be kept close to the implementation. While not always possible to customize test fixtures and mocks completely, it is perfectly acceptible to duplicate code, with a focus on code coverage. diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.test.ts index 3faeee08048ef..91df493dcad88 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.test.ts @@ -56,7 +56,6 @@ import { mockTimestampFieldsWithCreated, } from '../../test_helpers/repository.test.common'; -// BEWARE: The SavedObjectClient depends on the implementation details of the SavedObjectsRepository // so any breaking changes to this repository are considered breaking changes to the SavedObjectsClient. interface ExpectedErrorResult { @@ -65,7 +64,7 @@ interface ExpectedErrorResult { error: Record; } -describe('SavedObjectsRepository', () => { +describe('#bulkCreate', () => { let client: ReturnType; let repository: SavedObjectsRepository; let migrator: ReturnType; @@ -135,7 +134,7 @@ describe('SavedObjectsRepository', () => { references: [{ name: 'search_0', type: 'search', id: '123' }], }); - describe('#bulkCreate', () => { + describe('performBulkCreate', () => { beforeEach(() => { mockPreflightCheckForCreate.mockReset(); mockPreflightCheckForCreate.mockImplementation(({ objects }) => { diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_delete.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_delete.test.ts new file mode 100644 index 0000000000000..15b7cf5164abb --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_delete.test.ts @@ -0,0 +1,600 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetBulkOperationError, + mockGetCurrentTime, + mockDeleteLegacyUrlAliases, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { Payload } from '@hapi/boom'; +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { + SavedObjectsBulkDeleteObject, + SavedObjectsBulkDeleteOptions, +} from '@kbn/core-saved-objects-api-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + getMockMgetResponse, + type TypeIdTuple, + createSpySerializer, + expectErrorInvalidType, + expectErrorNotFound, + createBadRequestErrorPayload, + getMockEsBulkDeleteResponse, + bulkDeleteSuccess, + createBulkDeleteSuccessStatus, +} from '../../test_helpers/repository.test.common'; + +interface ExpectedErrorResult { + type: string; + id: string; + error: Record; +} + +describe('#bulkDelete', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + // Setup migration mock for creating an object + + describe('performBulkDelete', () => { + const obj1: SavedObjectsBulkDeleteObject = { + type: 'config', + id: '6.0.0-alpha1', + }; + const obj2: SavedObjectsBulkDeleteObject = { + type: 'index-pattern', + id: 'logstash-*', + }; + + const namespace = 'foo-namespace'; + + const createNamespaceAwareGetId = (type: string, id: string) => + `${registry.isSingleNamespace(type) && namespace ? `${namespace}:` : ''}${type}:${id}`; + + // bulk delete calls only has one object for each source -- the action + const expectClientCallBulkDeleteArgsAction = ( + objects: TypeIdTuple[], + { + method, + _index = expect.any(String), + getId = () => expect.any(String), + overrides = {}, + }: { + method: string; + _index?: string; + getId?: (type: string, id: string) => string; + overrides?: Record; + } + ) => { + const body = []; + for (const { type, id } of objects) { + body.push({ + [method]: { + _index, + _id: getId(type, id), + ...overrides, + }, + }); + } + + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }; + + const createBulkDeleteFailStatus = ({ + type, + id, + error, + }: { + type: string; + id: string; + error?: ExpectedErrorResult['error']; + }) => ({ + type, + id, + success: false, + error: error ?? SavedObjectsErrorHelpers.createBadRequestError(), + }); + + // mocks a combination of success, error results for hidden and unknown object object types. + const repositoryBulkDeleteError = async ( + obj: SavedObjectsBulkDeleteObject, + isBulkError: boolean, + expectedErrorResult: ExpectedErrorResult + ) => { + const objects = [obj1, obj, obj2]; + const mockedBulkDeleteResponse = getMockEsBulkDeleteResponse(registry, objects); + if (isBulkError) { + mockGetBulkOperationError.mockReturnValueOnce(undefined); + mockGetBulkOperationError.mockReturnValueOnce(expectedErrorResult.error as Payload); + } + client.bulk.mockResponseOnce(mockedBulkDeleteResponse); + + const result = await repository.bulkDelete(objects); + expect(client.bulk).toHaveBeenCalled(); + expect(result).toEqual({ + statuses: [ + createBulkDeleteSuccessStatus(obj1), + createBulkDeleteFailStatus({ ...obj, error: expectedErrorResult.error }), + createBulkDeleteSuccessStatus(obj2), + ], + }); + }; + + const expectClientCallArgsAction = ( + objects: TypeIdTuple[], + { + method, + _index = expect.any(String), + getId = () => expect.any(String), + overrides = {}, + }: { + method: string; + _index?: string; + getId?: (type: string, id: string) => string; + overrides?: Record; + } + ) => { + const body = []; + for (const { type, id } of objects) { + body.push({ + [method]: { + _index, + _id: getId(type, id), + ...overrides, + }, + }); + } + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }; + + const bulkDeleteMultiNamespaceError = async ( + [obj1, _obj, obj2]: SavedObjectsBulkDeleteObject[], + options: SavedObjectsBulkDeleteOptions | undefined, + mgetResponse: estypes.MgetResponse, + mgetOptions?: { statusCode?: number } + ) => { + const getId = (type: string, id: string) => `${options?.namespace}:${type}:${id}`; + // mock the response for the not found doc + client.mget.mockResponseOnce(mgetResponse, { statusCode: mgetOptions?.statusCode }); + // get a mocked response for the valid docs + const bulkResponse = getMockEsBulkDeleteResponse(registry, [obj1, obj2], { namespace }); + client.bulk.mockResponseOnce(bulkResponse); + + const result = await repository.bulkDelete([obj1, _obj, obj2], options); + expect(client.bulk).toHaveBeenCalledTimes(1); + expect(client.mget).toHaveBeenCalledTimes(1); + + expectClientCallArgsAction([obj1, obj2], { method: 'delete', getId }); + expect(result).toEqual({ + statuses: [ + createBulkDeleteSuccessStatus(obj1), + { ...expectErrorNotFound(_obj), success: false }, + createBulkDeleteSuccessStatus(obj2), + ], + }); + }; + + beforeEach(() => { + mockDeleteLegacyUrlAliases.mockClear(); + mockDeleteLegacyUrlAliases.mockResolvedValue(); + }); + + describe('client calls', () => { + it(`should use the ES bulk action by default`, async () => { + await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); + expect(client.bulk).toHaveBeenCalled(); + }); + + it(`should use the ES mget action before bulk action for any types that are multi-namespace`, async () => { + const objects = [obj1, { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }]; + await bulkDeleteSuccess(client, repository, registry, objects); + expect(client.bulk).toHaveBeenCalled(); + expect(client.mget).toHaveBeenCalled(); + + const docs = [ + expect.objectContaining({ _id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${obj2.id}` }), + ]; + expect(client.mget).toHaveBeenCalledWith( + expect.objectContaining({ body: { docs } }), + expect.anything() + ); + }); + + it(`should not use the ES bulk action when there are no valid documents to delete`, async () => { + const objects = [obj1, obj2].map((x) => ({ ...x, type: 'unknownType' })); + await repository.bulkDelete(objects); + expect(client.bulk).toHaveBeenCalledTimes(0); + }); + + it(`formats the ES request`, async () => { + const getId = createNamespaceAwareGetId; + await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { namespace }); + expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); + }); + + it(`formats the ES request for any types that are multi-namespace`, async () => { + const _obj2 = { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }; + const getId = createNamespaceAwareGetId; + await bulkDeleteSuccess(client, repository, registry, [obj1, _obj2], { namespace }); + expectClientCallBulkDeleteArgsAction([obj1, _obj2], { method: 'delete', getId }); + }); + + it(`defaults to a refresh setting of wait_for`, async () => { + await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ refresh: 'wait_for' }), + expect.anything() + ); + }); + + it(`does not include the version of the existing document when not using a multi-namespace type`, async () => { + const objects = [obj1, { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE }]; + await bulkDeleteSuccess(client, repository, registry, objects); + expectClientCallBulkDeleteArgsAction(objects, { method: 'delete' }); + }); + + it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { + const getId = createNamespaceAwareGetId; + await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { namespace }); + expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); + }); + + it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; + await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); + expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; + await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { + namespace: 'default', + }); + expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); + }); + + it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; // not expecting namespace prefix; + const _obj1 = { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }; + const _obj2 = { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }; + + await bulkDeleteSuccess(client, repository, registry, [_obj1, _obj2], { namespace }); + expectClientCallBulkDeleteArgsAction([_obj1, _obj2], { method: 'delete', getId }); + }); + }); + + describe('legacy URL aliases', () => { + it(`doesn't delete legacy URL aliases for single-namespace object types`, async () => { + await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); + expect(mockDeleteLegacyUrlAliases).not.toHaveBeenCalled(); + }); + + it(`deletes legacy URL aliases for multi-namespace object types (all spaces)`, async () => { + const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; + const internalOptions = { + mockMGetResponseObjects: [ + { + ...testObject, + initialNamespaces: [ALL_NAMESPACES_STRING], + }, + ], + }; + await bulkDeleteSuccess( + client, + repository, + registry, + [testObject], + { namespace, force: true }, + internalOptions + ); + expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( + expect.objectContaining({ + type: MULTI_NAMESPACE_TYPE, + id: testObject.id, + namespaces: [], + deleteBehavior: 'exclusive', + }) + ); + }); + + it(`deletes legacy URL aliases for multi-namespace object types (specific space)`, async () => { + const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; + const internalOptions = { + mockMGetResponseObjects: [ + { + ...testObject, + initialNamespaces: [namespace], + }, + ], + }; + // specifically test against the current namespace + await bulkDeleteSuccess( + client, + repository, + registry, + [testObject], + { namespace }, + internalOptions + ); + expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( + expect.objectContaining({ + type: MULTI_NAMESPACE_TYPE, + id: testObject.id, + namespaces: [namespace], + deleteBehavior: 'inclusive', + }) + ); + }); + + it(`deletes legacy URL aliases for multi-namespace object types shared to many specific spaces`, async () => { + const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; + const initialTestObjectNamespaces = [namespace, 'bar-namespace']; + const internalOptions = { + mockMGetResponseObjects: [ + { + ...testObject, + initialNamespaces: initialTestObjectNamespaces, + }, + ], + }; + // specifically test against named spaces ('*' is handled specifically, this assures we also take care of named spaces) + await bulkDeleteSuccess( + client, + repository, + registry, + [testObject], + { namespace, force: true }, + internalOptions + ); + expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( + expect.objectContaining({ + type: MULTI_NAMESPACE_TYPE, + id: testObject.id, + namespaces: initialTestObjectNamespaces, + deleteBehavior: 'inclusive', + }) + ); + }); + + it(`logs a message when deleteLegacyUrlAliases returns an error`, async () => { + const testObject = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: obj1.id }; + + client.mget.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise( + getMockMgetResponse(registry, [testObject], namespace) + ) + ); + const mockedBulkResponse = getMockEsBulkDeleteResponse(registry, [testObject], { + namespace, + }); + client.bulk.mockResolvedValueOnce(mockedBulkResponse); + + mockDeleteLegacyUrlAliases.mockRejectedValueOnce(new Error('Oh no!')); + + await repository.bulkDelete([testObject], { namespace }); + + expect(client.mget).toHaveBeenCalledTimes(1); + expect(logger.error).toHaveBeenCalledTimes(1); + expect(logger.error).toHaveBeenCalledWith( + 'Unable to delete aliases when deleting an object: Oh no!' + ); + }); + }); + + describe('errors', () => { + it(`throws an error when options.namespace is '*'`, async () => { + await expect( + repository.bulkDelete([obj1], { namespace: ALL_NAMESPACES_STRING }) + ).rejects.toThrowError( + SavedObjectsErrorHelpers.createBadRequestError('"options.namespace" cannot be "*"') + ); + }); + + it(`throws an error when client bulk response is not defined`, async () => { + client.mget.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise( + getMockMgetResponse(registry, [obj1], namespace) + ) + ); + const mockedBulkResponse = undefined; + // we have to cast here to test the assumption we always get a response. + client.bulk.mockResponseOnce(mockedBulkResponse as unknown as estypes.BulkResponse); + await expect(repository.bulkDelete([obj1], { namespace })).rejects.toThrowError( + 'Unexpected error in bulkDelete saved objects: bulkDeleteResponse is undefined' + ); + }); + + it(`returns an error for the object when the object's type is invalid`, async () => { + const unknownObjType = { ...obj1, type: 'unknownType' }; + await repositoryBulkDeleteError( + unknownObjType, + false, + expectErrorInvalidType(unknownObjType) + ); + }); + + it(`returns an error for an object when the object's type is hidden`, async () => { + const hiddenObject = { ...obj1, type: HIDDEN_TYPE }; + await repositoryBulkDeleteError(hiddenObject, false, expectErrorInvalidType(hiddenObject)); + }); + + it(`returns an error when ES is unable to find the document during mget`, async () => { + const notFoundObj = { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, found: false }; + const mgetResponse = getMockMgetResponse(registry, [notFoundObj], namespace); + await bulkDeleteMultiNamespaceError([obj1, notFoundObj, obj2], { namespace }, mgetResponse); + }); + + it(`returns an error when ES is unable to find the index during mget`, async () => { + const notFoundObj = { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, found: false }; + await bulkDeleteMultiNamespaceError( + [obj1, notFoundObj, obj2], + { namespace }, + {} as estypes.MgetResponse, + { + statusCode: 404, + } + ); + }); + + it(`returns an error when the type is multi-namespace and the document exists, but not in this namespace`, async () => { + const obj = { + type: MULTI_NAMESPACE_ISOLATED_TYPE, + id: 'three', + namespace: 'bar-namespace', + }; + const mgetResponse = getMockMgetResponse(registry, [obj], namespace); + await bulkDeleteMultiNamespaceError([obj1, obj, obj2], { namespace }, mgetResponse); + }); + + it(`returns an error when the type is multi-namespace and the document has multiple namespaces and the force option is not enabled`, async () => { + const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; + const internalOptions = { + mockMGetResponseObjects: [ + { + ...testObject, + initialNamespaces: [namespace, 'bar-namespace'], + }, + ], + }; + const result = await bulkDeleteSuccess( + client, + repository, + registry, + [testObject], + { namespace }, + internalOptions + ); + expect(result.statuses[0]).toStrictEqual( + createBulkDeleteFailStatus({ + ...testObject, + error: createBadRequestErrorPayload( + 'Unable to delete saved object that exists in multiple namespaces, use the `force` option to delete it anyway' + ), + }) + ); + }); + + it(`returns an error when the type is multi-namespace and the document has all namespaces and the force option is not enabled`, async () => { + const testObject = { ...obj1, type: ALL_NAMESPACES_STRING }; + const internalOptions = { + mockMGetResponseObjects: [ + { + ...testObject, + initialNamespaces: [namespace, 'bar-namespace'], + }, + ], + }; + const result = await bulkDeleteSuccess( + client, + repository, + registry, + [testObject], + { namespace }, + internalOptions + ); + expect(result.statuses[0]).toStrictEqual( + createBulkDeleteFailStatus({ + ...testObject, + error: createBadRequestErrorPayload("Unsupported saved object type: '*'"), + }) + ); + }); + }); + + describe('returns', () => { + it(`returns early for empty objects argument`, async () => { + await repository.bulkDelete([], { namespace }); + expect(client.bulk).toHaveBeenCalledTimes(0); + }); + + it(`formats the ES response`, async () => { + const response = await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { + namespace, + }); + expect(response).toEqual({ + statuses: [obj1, obj2].map(createBulkDeleteSuccessStatus), + }); + }); + + it(`handles a mix of successful deletes and errors`, async () => { + const notFoundObj = { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, found: false }; + await bulkDeleteMultiNamespaceError( + [obj1, notFoundObj, obj2], + { namespace }, + {} as estypes.MgetResponse, + { statusCode: 404 } + ); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.test.ts new file mode 100644 index 0000000000000..35e9b554a16c9 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.test.ts @@ -0,0 +1,420 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + pointInTimeFinderMock, + mockGetBulkOperationError, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { Payload } from '@hapi/boom'; +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { SavedObjectsBulkGetObject } from '@kbn/core-saved-objects-api-server'; +import { type SavedObjectsRawDocSource, type SavedObject } from '@kbn/core-saved-objects-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { + SavedObjectsSerializer, + encodeHitVersion, +} from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockTimestamp, + mappings, + bulkGetSuccess, + createRegistry, + createDocumentMigrator, + getMockMgetResponse, + type TypeIdTuple, + createSpySerializer, + bulkGet, + expectErrorResult, + expectErrorInvalidType, + expectErrorNotFound, + expectError, + createBadRequestErrorPayload, +} from '../../test_helpers/repository.test.common'; + +interface ExpectedErrorResult { + type: string; + id: string; + error: Record; +} + +describe('#bulkGet', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + const expectSuccess = ({ type, id }: { type: string; id: string }) => { + // @ts-expect-error TS is not aware of the extension + return expect.toBeDocumentWithoutError(type, id); + }; + + const expectMigrationArgs = (args: unknown, contains = true, n = 1) => { + const obj = contains ? expect.objectContaining(args) : expect.not.objectContaining(args); + expect(migrator.migrateDocument).toHaveBeenNthCalledWith( + n, + obj, + expect.objectContaining({ + allowDowngrade: expect.any(Boolean), + }) + ); + }; + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performBulkGet', () => { + const obj1: SavedObject = { + type: 'config', + id: '6.0.0-alpha1', + attributes: { title: 'Testing' }, + references: [ + { + name: 'ref_0', + type: 'test', + id: '1', + }, + ], + originId: 'some-origin-id', // only one of the results has an originId, this is intentional to test both a positive and negative case + }; + const obj2: SavedObject = { + type: 'index-pattern', + id: 'logstash-*', + attributes: { title: 'Testing' }, + references: [ + { + name: 'ref_0', + type: 'test', + id: '2', + }, + ], + }; + const namespace = 'foo-namespace'; + + const _expectClientCallArgs = ( + objects: TypeIdTuple[], + { + _index = expect.any(String), + getId = () => expect.any(String), + }: { _index?: string; getId?: (type: string, id: string) => string } + ) => { + expect(client.mget).toHaveBeenCalledWith( + expect.objectContaining({ + body: { + docs: objects.map(({ type, id }) => + expect.objectContaining({ + _index, + _id: getId(type, id), + }) + ), + }, + }), + expect.anything() + ); + }; + + describe('client calls', () => { + it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { + const getId = (type: string, id: string) => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) + await bulkGetSuccess(client, repository, registry, [obj1, obj2], { namespace }); + _expectClientCallArgs([obj1, obj2], { getId }); + }); + + it(`prepends namespace to the id when providing namespaces for single-namespace type`, async () => { + const getId = (type: string, id: string) => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) + const objects = [obj1, obj2].map((obj) => ({ ...obj, namespaces: [namespace] })); + await bulkGetSuccess(client, repository, registry, objects, { namespace: 'some-other-ns' }); + _expectClientCallArgs([obj1, obj2], { getId }); + }); + + it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + await bulkGetSuccess(client, repository, registry, [obj1, obj2]); + _expectClientCallArgs([obj1, obj2], { getId }); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + await bulkGetSuccess(client, repository, registry, [obj1, obj2], { namespace: 'default' }); + _expectClientCallArgs([obj1, obj2], { getId }); + }); + + it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + let objects = [obj1, obj2].map((obj) => ({ ...obj, type: NAMESPACE_AGNOSTIC_TYPE })); + await bulkGetSuccess(client, repository, registry, objects, { namespace }); + _expectClientCallArgs(objects, { getId }); + + client.mget.mockClear(); + objects = [obj1, { ...obj2, namespaces: ['some-other-ns'] }].map((obj) => ({ + ...obj, + type: MULTI_NAMESPACE_ISOLATED_TYPE, + })); + await bulkGetSuccess(client, repository, registry, objects, { namespace }); + _expectClientCallArgs(objects, { getId }); + }); + }); + + describe('errors', () => { + const bulkGetError = async ( + obj: SavedObjectsBulkGetObject & { found?: boolean }, + isBulkError: boolean, + expectedErrorResult: ExpectedErrorResult + ) => { + let response; + if (isBulkError) { + // mock the bulk error for only the second object + mockGetBulkOperationError.mockReturnValueOnce(undefined); + mockGetBulkOperationError.mockReturnValueOnce(expectedErrorResult.error as Payload); + response = getMockMgetResponse(registry, [obj1, obj, obj2]); + } else { + response = getMockMgetResponse(registry, [obj1, obj2]); + } + client.mget.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + + const objects = [obj1, obj, obj2]; + const result = await bulkGet(repository, objects); + expect(client.mget).toHaveBeenCalled(); + expect(result).toEqual({ + saved_objects: [expectSuccess(obj1), expectedErrorResult, expectSuccess(obj2)], + }); + }; + + it(`throws when options.namespace is '*'`, async () => { + const obj = { type: 'dashboard', id: 'three' }; + await expect( + repository.bulkGet([obj], { namespace: ALL_NAMESPACES_STRING }) + ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); + }); + + it(`returns error when namespaces is used with a space-agnostic object`, async () => { + const obj = { type: NAMESPACE_AGNOSTIC_TYPE, id: 'three', namespaces: [] }; + await bulkGetError( + obj, + false, + expectErrorResult( + obj, + createBadRequestErrorPayload('"namespaces" cannot be used on space-agnostic types') + ) + ); + }); + + it(`returns error when namespaces is used with a space-isolated object and does not specify a single space`, async () => { + const doTest = async (objType: string, namespaces?: string[]) => { + const obj = { type: objType, id: 'three', namespaces }; + await bulkGetError( + obj, + false, + expectErrorResult( + obj, + createBadRequestErrorPayload( + '"namespaces" can only specify a single space when used with space-isolated types' + ) + ) + ); + }; + await doTest('dashboard', ['spacex', 'spacey']); + await doTest('dashboard', ['*']); + await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['spacex', 'spacey']); + await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['*']); + }); + + it(`returns error when type is invalid`, async () => { + const obj: SavedObjectsBulkGetObject = { type: 'unknownType', id: 'three' }; + await bulkGetError(obj, false, expectErrorInvalidType(obj)); + }); + + it(`returns error when type is hidden`, async () => { + const obj: SavedObjectsBulkGetObject = { type: HIDDEN_TYPE, id: 'three' }; + await bulkGetError(obj, false, expectErrorInvalidType(obj)); + }); + + it(`returns error when document is not found`, async () => { + const obj: SavedObjectsBulkGetObject & { found: boolean } = { + type: 'dashboard', + id: 'three', + found: false, + }; + await bulkGetError(obj, true, expectErrorNotFound(obj)); + }); + + it(`handles missing ids gracefully`, async () => { + const obj: SavedObjectsBulkGetObject & { found: boolean } = { + type: 'dashboard', + // @ts-expect-error id is undefined + id: undefined, + found: false, + }; + await bulkGetError(obj, true, expectErrorNotFound(obj)); + }); + + it(`returns error when type is multi-namespace and the document exists, but not in this namespace`, async () => { + const obj = { + type: MULTI_NAMESPACE_ISOLATED_TYPE, + id: 'three', + namespace: 'bar-namespace', + }; + await bulkGetError(obj, true, expectErrorNotFound(obj)); + }); + }); + + describe('returns', () => { + const expectSuccessResult = ( + { type, id }: TypeIdTuple, + doc: estypes.GetGetResult + ) => ({ + type, + id, + namespaces: doc._source!.namespaces ?? ['default'], + ...(doc._source!.originId && { originId: doc._source!.originId }), + ...(doc._source!.updated_at && { updated_at: doc._source!.updated_at }), + ...(doc._source!.created_at && { created_at: doc._source!.created_at }), + version: encodeHitVersion(doc), + attributes: doc._source![type], + references: doc._source!.references || [], + coreMigrationVersion: expect.any(String), + typeMigrationVersion: expect.any(String), + managed: expect.any(Boolean), + }); + + it(`returns early for empty objects argument`, async () => { + const result = await bulkGet(repository, []); + expect(result).toEqual({ saved_objects: [] }); + expect(client.mget).not.toHaveBeenCalled(); + }); + + it(`formats the ES response`, async () => { + const response = getMockMgetResponse(registry, [obj1, obj2]); + client.mget.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + const result = await bulkGet(repository, [obj1, obj2]); + expect(client.mget).toHaveBeenCalledTimes(1); + expect(result).toEqual({ + saved_objects: [ + expectSuccessResult( + obj1, + response.docs[0] as estypes.GetGetResult + ), + expectSuccessResult( + obj2, + response.docs[1] as estypes.GetGetResult + ), + ], + }); + }); + + it(`handles a mix of successful gets and errors`, async () => { + const response = getMockMgetResponse(registry, [obj1, obj2]); + client.mget.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + const obj: SavedObject = { + type: 'unknownType', + id: 'three', + attributes: {}, + references: [], + }; + const result = await bulkGet(repository, [obj1, obj, obj2]); + expect(client.mget).toHaveBeenCalledTimes(1); + expect(result).toEqual({ + saved_objects: [ + expectSuccessResult( + obj1, + response.docs[0] as estypes.GetGetResult + ), + expectError(obj), + expectSuccessResult( + obj2, + response.docs[1] as estypes.GetGetResult + ), + ], + }); + }); + + it(`includes namespaces property for single-namespace and multi-namespace documents`, async () => { + const obj: SavedObject = { + type: MULTI_NAMESPACE_ISOLATED_TYPE, + id: 'three', + attributes: {}, + references: [], + }; + const { result } = await bulkGetSuccess(client, repository, registry, [obj1, obj]); + expect(result).toEqual({ + saved_objects: [ + expect.objectContaining({ namespaces: ['default'] }), + expect.objectContaining({ namespaces: expect.any(Array) }), + ], + }); + }); + + it('migrates the fetched documents', async () => { + const response = getMockMgetResponse(registry, [obj1, obj2]); + client.mget.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + migrator.migrateDocument.mockReturnValue( + 'migrated' as unknown as ReturnType + ); + + await expect(bulkGet(repository, [obj1, obj2])).resolves.toHaveProperty('saved_objects', [ + 'migrated', + 'migrated', + ]); + expect(migrator.migrateDocument).toHaveBeenCalledTimes(2); + expectMigrationArgs({ id: obj1.id }, true, 1); + expectMigrationArgs({ id: obj2.id }, true, 2); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.test.ts new file mode 100644 index 0000000000000..a71f8e27ccb98 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.test.ts @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + pointInTimeFinderMock, + mockInternalBulkResolve, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + createSpySerializer, +} from '../../test_helpers/repository.test.common'; + +describe('#bulkResolve', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performBulkResolve', () => { + afterEach(() => { + mockInternalBulkResolve.mockReset(); + }); + + it('passes arguments to the internalBulkResolve module and returns the expected results', async () => { + mockInternalBulkResolve.mockResolvedValue({ + resolved_objects: [ + { + saved_object: { type: 'mock', id: 'mock-object', attributes: {}, references: [] }, + outcome: 'exactMatch', + }, + { + type: 'obj-type', + id: 'obj-id-2', + error: SavedObjectsErrorHelpers.createGenericNotFoundError('obj-type', 'obj-id-2'), + }, + ], + }); + + const objects = [ + { type: 'obj-type', id: 'obj-id-1' }, + { type: 'obj-type', id: 'obj-id-2' }, + ]; + await expect(repository.bulkResolve(objects)).resolves.toEqual({ + resolved_objects: [ + { + saved_object: { type: 'mock', id: 'mock-object', attributes: {}, references: [] }, + outcome: 'exactMatch', + }, + { + saved_object: { + type: 'obj-type', + id: 'obj-id-2', + error: { + error: 'Not Found', + message: 'Saved object [obj-type/obj-id-2] not found', + statusCode: 404, + }, + }, + outcome: 'exactMatch', + }, + ], + }); + expect(mockInternalBulkResolve).toHaveBeenCalledTimes(1); + expect(mockInternalBulkResolve).toHaveBeenCalledWith(expect.objectContaining({ objects })); + }); + + it('throws when internalBulkResolve throws', async () => { + const error = new Error('Oh no!'); + mockInternalBulkResolve.mockRejectedValue(error); + + await expect(repository.resolve('some-type', 'some-id')).rejects.toEqual(error); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.test.ts index 60deaa64e3e63..983021d99005c 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.test.ts @@ -60,7 +60,7 @@ interface ExpectedErrorResult { error: Record; } -describe('SavedObjectsRepository', () => { +describe('#bulkUpdate', () => { let client: ReturnType; let repository: SavedObjectsRepository; let migrator: ReturnType; @@ -117,7 +117,7 @@ describe('SavedObjectsRepository', () => { mockGetSearchDsl.mockClear(); }); - describe('#bulkUpdate', () => { + describe('performBulkUpdate', () => { const obj1: SavedObjectsBulkUpdateObject = { type: 'config', id: '6.0.0-alpha1', diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/check_conflicts.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/check_conflicts.test.ts new file mode 100644 index 0000000000000..bce3a8be40d23 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/check_conflicts.test.ts @@ -0,0 +1,201 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + getMockGetResponse, + type TypeIdTuple, + createSpySerializer, + checkConflicts, + checkConflictsSuccess, + createBadRequestErrorPayload, + createUnsupportedTypeErrorPayload, + createConflictErrorPayload, +} from '../../test_helpers/repository.test.common'; + +describe('#checkConflicts', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performCheckConflicts', () => { + const obj1 = { type: 'dashboard', id: 'one' }; + const obj2 = { type: 'dashboard', id: 'two' }; + const obj3 = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: 'three' }; + const obj4 = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: 'four' }; + const obj5 = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: 'five' }; + const obj6 = { type: NAMESPACE_AGNOSTIC_TYPE, id: 'six' }; + const obj7 = { type: NAMESPACE_AGNOSTIC_TYPE, id: 'seven' }; + const namespace = 'foo-namespace'; + + const _expectClientCallArgs = ( + objects: TypeIdTuple[], + { + _index = expect.any(String), + getId = () => expect.any(String), + }: { _index?: string; getId?: (type: string, id: string) => string } + ) => { + expect(client.mget).toHaveBeenCalledWith( + expect.objectContaining({ + body: { + docs: objects.map(({ type, id }) => + expect.objectContaining({ + _index, + _id: getId(type, id), + }) + ), + }, + }), + expect.anything() + ); + }; + + describe('client calls', () => { + it(`doesn't make a cluster call if the objects array is empty`, async () => { + await checkConflicts(repository, []); + expect(client.mget).not.toHaveBeenCalled(); + }); + + it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { + const getId = (type: string, id: string) => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) + await checkConflictsSuccess(client, repository, registry, [obj1, obj2], { namespace }); + _expectClientCallArgs([obj1, obj2], { getId }); + }); + + it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + await checkConflictsSuccess(client, repository, registry, [obj1, obj2]); + _expectClientCallArgs([obj1, obj2], { getId }); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + await checkConflictsSuccess(client, repository, registry, [obj1, obj2], { + namespace: 'default', + }); + _expectClientCallArgs([obj1, obj2], { getId }); + }); + + it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { + const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + // obj3 is multi-namespace, and obj6 is namespace-agnostic + await checkConflictsSuccess(client, repository, registry, [obj3, obj6], { namespace }); + _expectClientCallArgs([obj3, obj6], { getId }); + }); + }); + + describe('errors', () => { + it(`throws when options.namespace is '*'`, async () => { + await expect( + repository.checkConflicts([obj1], { namespace: ALL_NAMESPACES_STRING }) + ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); + }); + }); + + describe('returns', () => { + it(`expected results`, async () => { + const unknownTypeObj = { type: 'unknownType', id: 'three' }; + const hiddenTypeObj = { type: HIDDEN_TYPE, id: 'three' }; + const objects = [unknownTypeObj, hiddenTypeObj, obj1, obj2, obj3, obj4, obj5, obj6, obj7]; + const response = { + docs: [ + getMockGetResponse(registry, obj1), + { found: false }, + getMockGetResponse(registry, obj3), + getMockGetResponse(registry, { ...obj4, namespace: 'bar-namespace' }), + { found: false }, + getMockGetResponse(registry, obj6), + { found: false }, + ], + } as estypes.MgetResponse; + client.mget.mockResolvedValue( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + + const result = await checkConflicts(repository, objects); + expect(client.mget).toHaveBeenCalledTimes(1); + expect(result).toEqual({ + errors: [ + { ...unknownTypeObj, error: createUnsupportedTypeErrorPayload(unknownTypeObj.type) }, + { ...hiddenTypeObj, error: createUnsupportedTypeErrorPayload(hiddenTypeObj.type) }, + { ...obj1, error: createConflictErrorPayload(obj1.type, obj1.id) }, + // obj2 was not found so it does not result in a conflict error + { ...obj3, error: createConflictErrorPayload(obj3.type, obj3.id) }, + { + ...obj4, + error: { + ...createConflictErrorPayload(obj4.type, obj4.id), + metadata: { isNotOverwritable: true }, + }, + }, + // obj5 was not found so it does not result in a conflict error + { ...obj6, error: createConflictErrorPayload(obj6.type, obj6.id) }, + // obj7 was not found so it does not result in a conflict error + ], + }); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/collect_multinamespace_references.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/collect_multinamespace_references.test.ts new file mode 100644 index 0000000000000..0f793d58c7dff --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/collect_multinamespace_references.test.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + pointInTimeFinderMock, + mockCollectMultiNamespaceReferences, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { + SavedObjectsCollectMultiNamespaceReferencesObject, + SavedObjectsCollectMultiNamespaceReferencesResponse, +} from '@kbn/core-saved-objects-api-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + createSpySerializer, +} from '../../test_helpers/repository.test.common'; + +describe('#collectMultiNamespaceReferences', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performCollectMultiNamespaceReferences', () => { + afterEach(() => { + mockCollectMultiNamespaceReferences.mockReset(); + }); + + it('passes arguments to the collectMultiNamespaceReferences module and returns the result', async () => { + const objects: SavedObjectsCollectMultiNamespaceReferencesObject[] = [ + { type: 'foo', id: 'bar' }, + ]; + const expectedResult: SavedObjectsCollectMultiNamespaceReferencesResponse = { + objects: [{ type: 'foo', id: 'bar', spaces: ['ns-1'], inboundReferences: [] }], + }; + mockCollectMultiNamespaceReferences.mockResolvedValue(expectedResult); + + await expect(repository.collectMultiNamespaceReferences(objects)).resolves.toEqual( + expectedResult + ); + expect(mockCollectMultiNamespaceReferences).toHaveBeenCalledTimes(1); + expect(mockCollectMultiNamespaceReferences).toHaveBeenCalledWith( + expect.objectContaining({ objects }) + ); + }); + + it('returns an error from the collectMultiNamespaceReferences module', async () => { + const expectedResult = new Error('Oh no!'); + mockCollectMultiNamespaceReferences.mockRejectedValue(expectedResult); + + await expect(repository.collectMultiNamespaceReferences([])).rejects.toEqual(expectedResult); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts new file mode 100644 index 0000000000000..336c2bb2d4899 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.test.ts @@ -0,0 +1,831 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockPreflightCheckForCreate, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { SavedObjectsCreateOptions } from '@kbn/core-saved-objects-api-server'; +import { + type SavedObjectsRawDoc, + type SavedObjectsRawDocSource, + type SavedObjectUnsanitizedDoc, + type SavedObjectReference, +} from '@kbn/core-saved-objects-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + CUSTOM_INDEX_TYPE, + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockVersionProps, + mockTimestamp, + mappings, + mockVersion, + createRegistry, + createDocumentMigrator, + createSpySerializer, + createBadRequestErrorPayload, + createUnsupportedTypeErrorPayload, + createConflictErrorPayload, + mockTimestampFieldsWithCreated, +} from '../../test_helpers/repository.test.common'; + +describe('#create', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + const expectMigrationArgs = (args: unknown, contains = true, n = 1) => { + const obj = contains ? expect.objectContaining(args) : expect.not.objectContaining(args); + expect(migrator.migrateDocument).toHaveBeenNthCalledWith( + n, + obj, + expect.objectContaining({ + allowDowngrade: expect.any(Boolean), + }) + ); + }; + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + // Setup migration mock for creating an object + const mockMigrationVersion = { foo: '2.3.4' }; + const mockMigrateDocument = (doc: SavedObjectUnsanitizedDoc) => ({ + ...doc, + attributes: { + ...doc.attributes, + ...(doc.attributes?.title && { title: `${doc.attributes.title}!!` }), + }, + migrationVersion: mockMigrationVersion, + managed: doc.managed ?? false, + references: [{ name: 'search_0', type: 'search', id: '123' }], + }); + + describe('performCreate', () => { + beforeEach(() => { + mockPreflightCheckForCreate.mockReset(); + mockPreflightCheckForCreate.mockImplementation(({ objects }) => { + return Promise.resolve(objects.map(({ type, id }) => ({ type, id }))); // respond with no errors by default + }); + client.create.mockResponseImplementation((params) => { + return { + body: { + _id: params.id, + ...mockVersionProps, + } as estypes.CreateResponse, + }; + }); + }); + + const type = 'index-pattern'; + const attributes = { title: 'Logstash' }; + const id = 'logstash-*'; + const namespace = 'foo-namespace'; + const references = [ + { + name: 'ref_0', + type: 'test', + id: '123', + }, + ]; + + const createSuccess = async ( + type: string, + attributes: T, + options?: SavedObjectsCreateOptions + ) => { + return await repository.create(type, attributes, options); + }; + + describe('client calls', () => { + it(`should use the ES index action if ID is not defined`, async () => { + await createSuccess(type, attributes, { overwrite: true }); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.index).toHaveBeenCalled(); + }); + + it(`should use the ES index action if ID is not defined and a doc has managed=true`, async () => { + await createSuccess(type, attributes, { overwrite: true, managed: true }); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.index).toHaveBeenCalled(); + }); + + it(`should use the ES index action if ID is not defined and a doc has managed=false`, async () => { + await createSuccess(type, attributes, { overwrite: true, managed: false }); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.index).toHaveBeenCalled(); + }); + + it(`should use the ES create action if ID is not defined and overwrite=false`, async () => { + await createSuccess(type, attributes); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.create).toHaveBeenCalled(); + }); + + it(`should use the ES create action if ID is not defined, overwrite=false and a doc has managed=true`, async () => { + await createSuccess(type, attributes, { managed: true }); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.create).toHaveBeenCalled(); + }); + + it(`should use the ES create action if ID is not defined, overwrite=false and a doc has managed=false`, async () => { + await createSuccess(type, attributes, { managed: false }); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.create).toHaveBeenCalled(); + }); + + it(`should use the ES index with version if ID and version are defined and overwrite=true`, async () => { + await createSuccess(type, attributes, { id, overwrite: true, version: mockVersion }); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.index).toHaveBeenCalled(); + expect(client.index.mock.calls[0][0]).toMatchObject({ + if_seq_no: mockVersionProps._seq_no, + if_primary_term: mockVersionProps._primary_term, + }); + }); + + it(`should use the ES create action if ID is defined and overwrite=false`, async () => { + await createSuccess(type, attributes, { id }); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.create).toHaveBeenCalled(); + }); + + it(`should use the preflightCheckForCreate action then create action if type is multi-namespace, ID is defined, and overwrite=false`, async () => { + await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { id }); + expect(mockPreflightCheckForCreate).toHaveBeenCalled(); + expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( + expect.objectContaining({ + objects: [ + { type: MULTI_NAMESPACE_TYPE, id, overwrite: false, namespaces: ['default'] }, + ], + }) + ); + expect(client.create).toHaveBeenCalled(); + }); + + it(`should use the preflightCheckForCreate action then index action if type is multi-namespace, ID is defined, and overwrite=true`, async () => { + await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id, overwrite: true }); + expect(mockPreflightCheckForCreate).toHaveBeenCalled(); + expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( + expect.objectContaining({ + objects: [ + { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, overwrite: true, namespaces: ['default'] }, + ], + }) + ); + expect(client.index).toHaveBeenCalled(); + }); + + it(`defaults to empty references array`, async () => { + await createSuccess(type, attributes, { id }); + expect( + (client.create.mock.calls[0][0] as estypes.CreateRequest).body! + .references + ).toEqual([]); + }); + + it(`accepts custom references array`, async () => { + const test = async (references: SavedObjectReference[]) => { + await createSuccess(type, attributes, { id, references }); + expect( + (client.create.mock.calls[0][0] as estypes.CreateRequest) + .body!.references + ).toEqual(references); + client.create.mockClear(); + }; + await test(references); + await test([{ type: 'type', id: 'id', name: 'some ref' }]); + await test([]); + }); + + it(`doesn't accept custom references if not an array`, async () => { + const test = async (references: unknown) => { + // @ts-expect-error references is unknown + await createSuccess(type, attributes, { id, references }); + expect( + (client.create.mock.calls[0][0] as estypes.CreateRequest) + .body!.references + ).not.toBeDefined(); + client.create.mockClear(); + }; + await test('string'); + await test(123); + await test(true); + await test(null); + }); + + describe('originId', () => { + for (const objType of [type, NAMESPACE_AGNOSTIC_TYPE]) { + it(`throws an error if originId is set for non-multi-namespace type`, async () => { + await expect( + repository.create(objType, attributes, { originId: 'some-originId' }) + ).rejects.toThrowError( + createBadRequestErrorPayload( + '"originId" can only be set for multi-namespace object types' + ) + ); + }); + } + + for (const objType of [MULTI_NAMESPACE_TYPE, MULTI_NAMESPACE_ISOLATED_TYPE]) { + it(`${objType} defaults to no originId`, async () => { + await createSuccess(objType, attributes, { id }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.not.objectContaining({ originId: expect.anything() }), + }), + expect.anything() + ); + }); + + describe(`${objType} with existing originId`, () => { + beforeEach(() => { + mockPreflightCheckForCreate.mockImplementation(({ objects }) => { + const existingDocument = { + _source: { originId: 'existing-originId' }, + } as SavedObjectsRawDoc; + return Promise.resolve( + objects.map(({ type, id }) => ({ type, id, existingDocument })) + ); + }); + }); + + it(`accepts custom originId for multi-namespace type`, async () => { + // The preflight result has `existing-originId`, but that is discarded + await createSuccess(objType, attributes, { id, originId: 'some-originId' }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ originId: 'some-originId' }), + }), + expect.anything() + ); + }); + + it(`accepts undefined originId`, async () => { + // The preflight result has `existing-originId`, but that is discarded + await createSuccess(objType, attributes, { id, originId: undefined }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.not.objectContaining({ originId: expect.anything() }), + }), + expect.anything() + ); + }); + + it(`preserves existing originId if originId option is not set`, async () => { + await createSuccess(objType, attributes, { id }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ originId: 'existing-originId' }), + }), + expect.anything() + ); + }); + }); + } + }); + + it(`defaults to a refresh setting of wait_for`, async () => { + await createSuccess(type, attributes); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ refresh: 'wait_for' }), + expect.anything() + ); + }); + + it(`should use default index`, async () => { + await createSuccess(type, attributes, { id }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ index: '.kibana-test_8.0.0-testing' }), + expect.anything() + ); + }); + + it(`should use custom index`, async () => { + await createSuccess(CUSTOM_INDEX_TYPE, attributes, { id }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ index: 'custom_8.0.0-testing' }), + expect.anything() + ); + }); + + it(`self-generates an id if none is provided`, async () => { + await createSuccess(type, attributes); + expect(client.create).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + id: expect.objectContaining(/index-pattern:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}/), + }), + expect.anything() + ); + await createSuccess(type, attributes, { id: '' }); + expect(client.create).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + id: expect.objectContaining(/index-pattern:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}/), + }), + expect.anything() + ); + }); + + it(`prepends namespace to the id and adds namespace to the body when providing namespace for single-namespace type`, async () => { + await createSuccess(type, attributes, { id, namespace }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${namespace}:${type}:${id}`, + body: expect.objectContaining({ namespace }), + }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id or add namespace to the body when providing no namespace for single-namespace type`, async () => { + await createSuccess(type, attributes, { id }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${type}:${id}`, + body: expect.not.objectContaining({ namespace: expect.anything() }), + }), + expect.anything() + ); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + await createSuccess(type, attributes, { id, namespace: 'default' }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${type}:${id}`, + body: expect.not.objectContaining({ namespace: expect.anything() }), + }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id and adds namespaces to body when using multi-namespace type`, async () => { + // first object does not have an existing document to overwrite + await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { id, namespace }); + mockPreflightCheckForCreate.mockResolvedValueOnce([ + { + type: MULTI_NAMESPACE_TYPE, + id, + existingDocument: { + _id: id, + _source: { type: MULTI_NAMESPACE_TYPE, namespaces: ['*'] }, + }, // second object does have an existing document to overwrite + }, + ]); + await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { + id, + namespace, + overwrite: true, + }); + + expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(2); + expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + objects: [ + { type: MULTI_NAMESPACE_TYPE, id, overwrite: false, namespaces: [namespace] }, + ], + }) + ); + expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + objects: [ + { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, overwrite: true, namespaces: [namespace] }, + ], + }) + ); + + expect(client.create).toHaveBeenCalledTimes(1); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${MULTI_NAMESPACE_TYPE}:${id}`, + body: expect.objectContaining({ namespaces: [namespace] }), + }), + expect.anything() + ); + expect(client.index).toHaveBeenCalledTimes(1); + expect(client.index).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, + body: expect.objectContaining({ namespaces: ['*'] }), + }), + expect.anything() + ); + }); + + it(`adds initialNamespaces instead of namespace`, async () => { + const ns2 = 'bar-namespace'; + const ns3 = 'baz-namespace'; + // first object does not get passed in to preflightCheckForCreate at all + await repository.create('dashboard', attributes, { + id, + namespace, + initialNamespaces: [ns2], + }); + // second object does not have an existing document to overwrite + await repository.create(MULTI_NAMESPACE_TYPE, attributes, { + id, + namespace, + initialNamespaces: [ns2, ns3], + }); + mockPreflightCheckForCreate.mockResolvedValueOnce([ + { + type: MULTI_NAMESPACE_ISOLATED_TYPE, + id, + existingDocument: { + _id: id, + _source: { type: MULTI_NAMESPACE_ISOLATED_TYPE, namespaces: ['something-else'] }, + }, // third object does have an existing document to overwrite + }, + ]); + await repository.create(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { + id, + namespace, + initialNamespaces: [ns2], + overwrite: true, + }); + + expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(2); + expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + objects: [{ type: MULTI_NAMESPACE_TYPE, id, overwrite: false, namespaces: [ns2, ns3] }], + }) + ); + expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + objects: [ + { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, overwrite: true, namespaces: [ns2] }, + ], + }) + ); + + expect(client.create).toHaveBeenCalledTimes(2); + expect(client.create).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + id: `${ns2}:dashboard:${id}`, + body: expect.objectContaining({ namespace: ns2 }), + }), + expect.anything() + ); + expect(client.create).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + id: `${MULTI_NAMESPACE_TYPE}:${id}`, + body: expect.objectContaining({ namespaces: [ns2, ns3] }), + }), + expect.anything() + ); + expect(client.index).toHaveBeenCalledTimes(1); + expect(client.index).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, + body: expect.objectContaining({ namespaces: [ns2] }), + }), + expect.anything() + ); + }); + + it(`normalizes initialNamespaces from 'default' to undefined`, async () => { + await repository.create('dashboard', attributes, { + id, + namespace, + initialNamespaces: ['default'], + }); + + expect(client.create).toHaveBeenCalledTimes(1); + expect(client.create).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + id: `dashboard:${id}`, + body: expect.not.objectContaining({ namespace: 'default' }), + }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id or add namespace or namespaces fields when using namespace-agnostic type`, async () => { + await createSuccess(NAMESPACE_AGNOSTIC_TYPE, attributes, { id, namespace }); + expect(client.create).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}`, + body: expect.not.objectContaining({ + namespace: expect.anything(), + namespaces: expect.anything(), + }), + }), + expect.anything() + ); + }); + }); + + describe('errors', () => { + it(`throws when options.initialNamespaces is used with a space-agnostic object`, async () => { + await expect( + repository.create(NAMESPACE_AGNOSTIC_TYPE, attributes, { + initialNamespaces: [namespace], + }) + ).rejects.toThrowError( + createBadRequestErrorPayload('"initialNamespaces" cannot be used on space-agnostic types') + ); + }); + + it(`throws when options.initialNamespaces is empty`, async () => { + await expect( + repository.create(MULTI_NAMESPACE_TYPE, attributes, { initialNamespaces: [] }) + ).rejects.toThrowError( + createBadRequestErrorPayload('"initialNamespaces" must be a non-empty array of strings') + ); + }); + + it(`throws when options.initialNamespaces is used with a space-isolated object and does not specify a single space`, async () => { + const doTest = async (objType: string, initialNamespaces?: string[]) => { + await expect( + repository.create(objType, attributes, { initialNamespaces }) + ).rejects.toThrowError( + createBadRequestErrorPayload( + '"initialNamespaces" can only specify a single space when used with space-isolated types' + ) + ); + }; + await doTest('dashboard', ['spacex', 'spacey']); + await doTest('dashboard', ['*']); + await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['spacex', 'spacey']); + await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['*']); + }); + + it(`throws when options.namespace is '*'`, async () => { + await expect( + repository.create(type, attributes, { namespace: ALL_NAMESPACES_STRING }) + ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); + }); + + it(`throws when type is invalid`, async () => { + await expect(repository.create('unknownType', attributes)).rejects.toThrowError( + createUnsupportedTypeErrorPayload('unknownType') + ); + expect(client.create).not.toHaveBeenCalled(); + }); + + it(`throws when type is hidden`, async () => { + await expect(repository.create(HIDDEN_TYPE, attributes)).rejects.toThrowError( + createUnsupportedTypeErrorPayload(HIDDEN_TYPE) + ); + expect(client.create).not.toHaveBeenCalled(); + }); + + it(`throws when schema validation fails`, async () => { + await expect( + repository.create('dashboard', { title: 123 }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"[attributes.title]: expected value of type [string] but got [number]: Bad Request"` + ); + expect(client.create).not.toHaveBeenCalled(); + }); + + it(`throws when there is a conflict from preflightCheckForCreate`, async () => { + mockPreflightCheckForCreate.mockResolvedValueOnce([ + { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, error: { type: 'unresolvableConflict' } }, // error type and metadata dont matter + ]); + await expect( + repository.create(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { + id, + overwrite: true, + namespace, + }) + ).rejects.toThrowError(createConflictErrorPayload(MULTI_NAMESPACE_ISOLATED_TYPE, id)); + expect(mockPreflightCheckForCreate).toHaveBeenCalled(); + }); + + it.todo(`throws when automatic index creation fails`); + + it.todo(`throws when an unexpected failure occurs`); + }); + + describe('migration', () => { + beforeEach(() => { + migrator.migrateDocument.mockImplementation(mockMigrateDocument); + }); + + it(`migrates a document and serializes the migrated doc`, async () => { + const migrationVersion = mockMigrationVersion; + const coreMigrationVersion = '8.0.0'; + const managed = false; + await createSuccess(type, attributes, { + id, + references, + migrationVersion, + coreMigrationVersion, + managed, + }); + const doc = { + type, + id, + attributes, + references, + managed, + migrationVersion, + coreMigrationVersion, + ...mockTimestampFieldsWithCreated, + }; + expectMigrationArgs(doc); + + const migratedDoc = migrator.migrateDocument(doc); + expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); + }); + + it(`migrates a document, adds managed=false and serializes the migrated doc`, async () => { + const migrationVersion = mockMigrationVersion; + const coreMigrationVersion = '8.0.0'; + await createSuccess(type, attributes, { + id, + references, + migrationVersion, + coreMigrationVersion, + managed: undefined, + }); + const doc = { + type, + id, + attributes, + references, + managed: undefined, + migrationVersion, + coreMigrationVersion, + ...mockTimestampFieldsWithCreated, + }; + expectMigrationArgs({ ...doc, managed: false }); + + const migratedDoc = migrator.migrateDocument(doc); + expect(migratedDoc.managed).toBe(false); + expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); + }); + + it(`migrates a document, does not change managed=true to managed=false and serializes the migrated doc`, async () => { + const migrationVersion = mockMigrationVersion; + const coreMigrationVersion = '8.0.0'; + await createSuccess(type, attributes, { + id, + references, + migrationVersion, + coreMigrationVersion, + managed: true, + }); + const doc = { + type, + id, + attributes, + references, + managed: true, + migrationVersion, + coreMigrationVersion, + ...mockTimestampFieldsWithCreated, + }; + expectMigrationArgs(doc); + + const migratedDoc = migrator.migrateDocument(doc); + expect(migratedDoc.managed).toBe(true); + expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); + }); + + it(`adds namespace to body when providing namespace for single-namespace type`, async () => { + await createSuccess(type, attributes, { id, namespace }); + expectMigrationArgs({ namespace }); + }); + + it(`doesn't add namespace to body when providing no namespace for single-namespace type`, async () => { + await createSuccess(type, attributes, { id }); + expectMigrationArgs({ namespace: expect.anything() }, false); + }); + + it(`doesn't add namespace to body when not using single-namespace type`, async () => { + await createSuccess(NAMESPACE_AGNOSTIC_TYPE, attributes, { id, namespace }); + expectMigrationArgs({ namespace: expect.anything() }, false, 1); + + client.create.mockClear(); + await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id }); + expectMigrationArgs({ namespace: expect.anything() }, false, 2); + }); + + it(`adds namespaces to body when providing namespace for multi-namespace type`, async () => { + await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id, namespace }); + expectMigrationArgs({ namespaces: [namespace] }); + }); + + it(`adds default namespaces to body when providing no namespace for multi-namespace type`, async () => { + await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id }); + expectMigrationArgs({ namespaces: ['default'] }); + }); + + it(`doesn't add namespaces to body when not using multi-namespace type`, async () => { + await createSuccess(type, attributes, { id }); + expectMigrationArgs({ namespaces: expect.anything() }, false, 1); + + client.create.mockClear(); + await createSuccess(NAMESPACE_AGNOSTIC_TYPE, attributes, { id }); + expectMigrationArgs({ namespaces: expect.anything() }, false, 2); + }); + }); + + describe('returns', () => { + it(`formats the ES response`, async () => { + const result = await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { + id, + namespace, + references, + }); + expect(result).toEqual({ + type: MULTI_NAMESPACE_TYPE, + id, + ...mockTimestampFieldsWithCreated, + version: mockVersion, + attributes, + references, + namespaces: [namespace ?? 'default'], + coreMigrationVersion: expect.any(String), + typeMigrationVersion: '1.1.1', + managed: false, + }); + }); + it(`allows setting 'managed' to true`, async () => { + const result = await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { + id, + namespace, + references, + managed: true, + }); + expect(result).toEqual({ + type: MULTI_NAMESPACE_TYPE, + id, + ...mockTimestampFieldsWithCreated, + version: mockVersion, + attributes, + references, + namespaces: [namespace ?? 'default'], + coreMigrationVersion: expect.any(String), + typeMigrationVersion: '1.1.1', + managed: true, + }); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/delete.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/delete.test.ts new file mode 100644 index 0000000000000..d852bf0906b3c --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/delete.test.ts @@ -0,0 +1,382 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockDeleteLegacyUrlAliases, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { SavedObjectsDeleteOptions } from '@kbn/core-saved-objects-api-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; + +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockVersionProps, + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + getMockGetResponse, + createSpySerializer, + deleteSuccess, + createBadRequestErrorPayload, + createGenericNotFoundErrorPayload, +} from '../../test_helpers/repository.test.common'; + +describe('#delete', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performDelete', () => { + const type = 'index-pattern'; + const id = 'logstash-*'; + const namespace = 'foo-namespace'; + + beforeEach(() => { + mockDeleteLegacyUrlAliases.mockClear(); + mockDeleteLegacyUrlAliases.mockResolvedValue(); + }); + + describe('client calls', () => { + it(`should use the ES delete action when not using a multi-namespace type`, async () => { + await deleteSuccess(client, repository, registry, type, id); + expect(client.get).not.toHaveBeenCalled(); + expect(client.delete).toHaveBeenCalledTimes(1); + }); + + it(`should use ES get action then delete action when using a multi-namespace type`, async () => { + await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id); + expect(client.get).toHaveBeenCalledTimes(1); + expect(client.delete).toHaveBeenCalledTimes(1); + }); + + it(`does not includes the version of the existing document when using a multi-namespace type`, async () => { + await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id); + const versionProperties = { + if_seq_no: mockVersionProps._seq_no, + if_primary_term: mockVersionProps._primary_term, + }; + expect(client.delete).toHaveBeenCalledWith( + expect.not.objectContaining(versionProperties), + expect.anything() + ); + }); + + it(`defaults to a refresh setting of wait_for`, async () => { + await deleteSuccess(client, repository, registry, type, id); + expect(client.delete).toHaveBeenCalledWith( + expect.objectContaining({ refresh: 'wait_for' }), + expect.anything() + ); + }); + + it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { + await deleteSuccess(client, repository, registry, type, id, { namespace }); + expect(client.delete).toHaveBeenCalledWith( + expect.objectContaining({ id: `${namespace}:${type}:${id}` }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { + await deleteSuccess(client, repository, registry, type, id); + expect(client.delete).toHaveBeenCalledWith( + expect.objectContaining({ id: `${type}:${id}` }), + expect.anything() + ); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + await deleteSuccess(client, repository, registry, type, id, { namespace: 'default' }); + expect(client.delete).toHaveBeenCalledWith( + expect.objectContaining({ id: `${type}:${id}` }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { + await deleteSuccess(client, repository, registry, NAMESPACE_AGNOSTIC_TYPE, id, { + namespace, + }); + expect(client.delete).toHaveBeenCalledWith( + expect.objectContaining({ id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}` }), + expect.anything() + ); + + client.delete.mockClear(); + await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id, { + namespace, + }); + expect(client.delete).toHaveBeenCalledWith( + expect.objectContaining({ id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}` }), + expect.anything() + ); + }); + }); + + describe('legacy URL aliases', () => { + it(`doesn't delete legacy URL aliases for single-namespace object types`, async () => { + await deleteSuccess(client, repository, registry, type, id, { namespace }); + expect(mockDeleteLegacyUrlAliases).not.toHaveBeenCalled(); + }); + + // We intentionally do not include a test case for a multi-namespace object with a "not found" preflight result, because that throws + // an error (without deleting aliases) and we already have a test case for that + + it(`deletes legacy URL aliases for multi-namespace object types (all spaces)`, async () => { + const internalOptions = { + mockGetResponseValue: getMockGetResponse( + registry, + { type: MULTI_NAMESPACE_TYPE, id }, + ALL_NAMESPACES_STRING + ), + }; + await deleteSuccess( + client, + repository, + registry, + MULTI_NAMESPACE_TYPE, + id, + { namespace, force: true }, + internalOptions + ); + expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( + expect.objectContaining({ + type: MULTI_NAMESPACE_TYPE, + id, + namespaces: [], + deleteBehavior: 'exclusive', + }) + ); + }); + + it(`deletes legacy URL aliases for multi-namespace object types (specific spaces)`, async () => { + await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_TYPE, id, { namespace }); // this function mocks a preflight response with the given namespace by default + expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( + expect.objectContaining({ + type: MULTI_NAMESPACE_TYPE, + id, + namespaces: [namespace], + deleteBehavior: 'inclusive', + }) + ); + }); + + it(`logs a message when deleteLegacyUrlAliases returns an error`, async () => { + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise( + getMockGetResponse(registry, { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, namespace }) + ) + ); + client.delete.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + result: 'deleted', + } as estypes.DeleteResponse) + ); + mockDeleteLegacyUrlAliases.mockRejectedValueOnce(new Error('Oh no!')); + await repository.delete(MULTI_NAMESPACE_ISOLATED_TYPE, id, { namespace }); + expect(client.get).toHaveBeenCalledTimes(1); + expect(logger.error).toHaveBeenCalledTimes(1); + expect(logger.error).toHaveBeenCalledWith( + 'Unable to delete aliases when deleting an object: Oh no!' + ); + }); + }); + + describe('errors', () => { + const expectNotFoundError = async ( + type: string, + id: string, + options?: SavedObjectsDeleteOptions + ) => { + await expect(repository.delete(type, id, options)).rejects.toThrowError( + createGenericNotFoundErrorPayload(type, id) + ); + }; + + it(`throws when options.namespace is '*'`, async () => { + await expect( + repository.delete(type, id, { namespace: ALL_NAMESPACES_STRING }) + ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); + }); + + it(`throws when type is invalid`, async () => { + await expectNotFoundError('unknownType', id); + expect(client.delete).not.toHaveBeenCalled(); + }); + + it(`throws when type is hidden`, async () => { + await expectNotFoundError(HIDDEN_TYPE, id); + expect(client.delete).not.toHaveBeenCalled(); + }); + + it(`throws when ES is unable to find the document during get`, async () => { + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + found: false, + } as estypes.GetResponse) + ); + await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`throws when ES is unable to find the index during get`, async () => { + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({} as estypes.GetResponse, { + statusCode: 404, + }) + ); + await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`throws when the type is multi-namespace and the document exists, but not in this namespace`, async () => { + const response = getMockGetResponse( + registry, + { type: MULTI_NAMESPACE_ISOLATED_TYPE, id }, + namespace + ); + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id, { + namespace: 'bar-namespace', + }); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`throws when the type is multi-namespace and the document has multiple namespaces and the force option is not enabled`, async () => { + const response = getMockGetResponse(registry, { + type: MULTI_NAMESPACE_ISOLATED_TYPE, + id, + namespace, + }); + response._source!.namespaces = [namespace, 'bar-namespace']; + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + await expect( + repository.delete(MULTI_NAMESPACE_ISOLATED_TYPE, id, { namespace }) + ).rejects.toThrowError( + 'Unable to delete saved object that exists in multiple namespaces, use the `force` option to delete it anyway' + ); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`throws when the type is multi-namespace and the document has all namespaces and the force option is not enabled`, async () => { + const response = getMockGetResponse(registry, { + type: MULTI_NAMESPACE_ISOLATED_TYPE, + id, + namespace, + }); + response._source!.namespaces = ['*']; + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + await expect( + repository.delete(MULTI_NAMESPACE_ISOLATED_TYPE, id, { namespace }) + ).rejects.toThrowError( + 'Unable to delete saved object that exists in multiple namespaces, use the `force` option to delete it anyway' + ); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`throws when ES is unable to find the document during delete`, async () => { + client.delete.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + result: 'not_found', + } as estypes.DeleteResponse) + ); + await expectNotFoundError(type, id); + expect(client.delete).toHaveBeenCalledTimes(1); + }); + + it(`throws when ES is unable to find the index during delete`, async () => { + client.delete.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + // @elastic/elasticsearch doesn't declare error on DeleteResponse + error: { type: 'index_not_found_exception' }, + } as unknown as estypes.DeleteResponse) + ); + await expectNotFoundError(type, id); + expect(client.delete).toHaveBeenCalledTimes(1); + }); + + it(`throws when ES returns an unexpected response`, async () => { + client.delete.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + result: 'something unexpected' as estypes.Result, + } as estypes.DeleteResponse) + ); + await expect(repository.delete(type, id)).rejects.toThrowError( + 'Unexpected Elasticsearch DELETE response' + ); + expect(client.delete).toHaveBeenCalledTimes(1); + }); + }); + + describe('returns', () => { + it(`returns an empty object on success`, async () => { + const result = await deleteSuccess(client, repository, registry, type, id); + expect(result).toEqual({}); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/delete_by_namespace.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/delete_by_namespace.test.ts new file mode 100644 index 0000000000000..f0208d4cc056b --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/delete_by_namespace.test.ts @@ -0,0 +1,162 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { SavedObjectsDeleteByNamespaceOptions } from '@kbn/core-saved-objects-api-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { + SavedObjectsSerializer, + LEGACY_URL_ALIAS_TYPE, +} from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + createSpySerializer, +} from '../../test_helpers/repository.test.common'; + +describe('#deleteByNamespace', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performDeleteByNamespace', () => { + const namespace = 'foo-namespace'; + const mockUpdateResults = { + took: 15, + timed_out: false, + total: 3, + updated: 2, + deleted: 1, + batches: 1, + version_conflicts: 0, + noops: 0, + retries: { bulk: 0, search: 0 }, + throttled_millis: 0, + requests_per_second: -1.0, + throttled_until_millis: 0, + failures: [], + }; + + const deleteByNamespaceSuccess = async ( + namespace: string, + options?: SavedObjectsDeleteByNamespaceOptions + ) => { + client.updateByQuery.mockResponseOnce(mockUpdateResults); + const result = await repository.deleteByNamespace(namespace, options); + expect(mockGetSearchDsl).toHaveBeenCalledTimes(1); + expect(client.updateByQuery).toHaveBeenCalledTimes(1); + return result; + }; + + describe('client calls', () => { + it(`should use the ES updateByQuery action`, async () => { + await deleteByNamespaceSuccess(namespace); + expect(client.updateByQuery).toHaveBeenCalledTimes(1); + }); + + it(`should use all indices for types that are not namespace-agnostic`, async () => { + await deleteByNamespaceSuccess(namespace); + expect(client.updateByQuery).toHaveBeenCalledWith( + expect.objectContaining({ + index: ['.kibana-test_8.0.0-testing', 'custom_8.0.0-testing'], + }), + expect.anything() + ); + }); + }); + + describe('errors', () => { + it(`throws when namespace is not a string or is '*'`, async () => { + const test = async (namespace: unknown) => { + // @ts-expect-error namespace is unknown + await expect(repository.deleteByNamespace(namespace)).rejects.toThrowError( + `namespace is required, and must be a string` + ); + expect(client.updateByQuery).not.toHaveBeenCalled(); + }; + await test(undefined); + await test(['namespace']); + await test(123); + await test(true); + await test(ALL_NAMESPACES_STRING); + }); + }); + + describe('returns', () => { + it(`returns the query results on success`, async () => { + const result = await deleteByNamespaceSuccess(namespace); + expect(result).toEqual(mockUpdateResults); + }); + }); + + describe('search dsl', () => { + it(`constructs a query using all multi-namespace types, and another using all single-namespace types`, async () => { + await deleteByNamespaceSuccess(namespace); + const allTypes = registry.getAllTypes().map((type) => type.name); + expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { + namespaces: [namespace], + type: [ + ...allTypes.filter((type) => !registry.isNamespaceAgnostic(type)), + LEGACY_URL_ALIAS_TYPE, + ], + kueryNode: expect.anything(), + }); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts new file mode 100644 index 0000000000000..6a16b71b1d9af --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts @@ -0,0 +1,521 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { SavedObjectsFindOptions } from '@kbn/core-saved-objects-api-server'; + +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; +import * as esKuery from '@kbn/es-query'; + +import { + NAMESPACE_AGNOSTIC_TYPE, + HIDDEN_TYPE, + mockTimestampFields, + mockTimestamp, + mappings, + mockVersion, + createRegistry, + createDocumentMigrator, + createSpySerializer, + generateIndexPatternSearchResults, + findSuccess, +} from '../../test_helpers/repository.test.common'; + +const { nodeTypes } = esKuery; + +describe('find', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + const expectMigrationArgs = (args: unknown, contains = true, n = 1) => { + const obj = contains ? expect.objectContaining(args) : expect.not.objectContaining(args); + expect(migrator.migrateDocument).toHaveBeenNthCalledWith( + n, + obj, + expect.objectContaining({ + allowDowngrade: expect.any(Boolean), + }) + ); + }; + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performFind', () => { + const type = 'index-pattern'; + const namespace = 'foo-namespace'; + + describe('client calls', () => { + it(`should use the ES search action`, async () => { + await findSuccess(client, repository, { type }); + expect(client.search).toHaveBeenCalledTimes(1); + }); + + it(`merges output of getSearchDsl into es request body`, async () => { + const query = { query: 1, aggregations: 2 }; + mockGetSearchDsl.mockReturnValue(query); + await findSuccess(client, repository, { type }); + + expect(client.search).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ ...query }), + }), + expect.anything() + ); + }); + + it(`accepts per_page/page`, async () => { + await findSuccess(client, repository, { type, perPage: 10, page: 6 }); + expect(client.search).toHaveBeenCalledWith( + expect.objectContaining({ + size: 10, + from: 50, + }), + expect.anything() + ); + }); + + it(`accepts preference`, async () => { + await findSuccess(client, repository, { type, preference: 'pref' }); + expect(client.search).toHaveBeenCalledWith( + expect.objectContaining({ + preference: 'pref', + }), + expect.anything() + ); + }); + + it(`can filter by fields`, async () => { + await findSuccess(client, repository, { type, fields: ['title'] }); + expect(client.search).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ + _source: [ + `${type}.title`, + 'namespace', + 'namespaces', + 'type', + 'references', + 'migrationVersion', + 'coreMigrationVersion', + 'typeMigrationVersion', + 'managed', + 'updated_at', + 'created_at', + 'originId', + ], + }), + }), + expect.anything() + ); + }); + + it(`should set rest_total_hits_as_int to true on a request`, async () => { + await findSuccess(client, repository, { type }); + expect(client.search).toHaveBeenCalledWith( + expect.objectContaining({ + rest_total_hits_as_int: true, + }), + expect.anything() + ); + }); + + it(`should not make a client call when attempting to find only invalid or hidden types`, async () => { + const test = async (types: string | string[]) => { + await repository.find({ type: types }); + expect(client.search).not.toHaveBeenCalled(); + }; + + await test('unknownType'); + await test(HIDDEN_TYPE); + await test(['unknownType', HIDDEN_TYPE]); + }); + }); + + describe('errors', () => { + it(`throws when type is not defined`, async () => { + // @ts-expect-error type should be defined + await expect(repository.find({})).rejects.toThrowError( + 'options.type must be a string or an array of strings' + ); + expect(client.search).not.toHaveBeenCalled(); + }); + + it(`throws when namespaces is an empty array`, async () => { + await expect(repository.find({ type: 'foo', namespaces: [] })).rejects.toThrowError( + 'options.namespaces cannot be an empty array' + ); + expect(client.search).not.toHaveBeenCalled(); + }); + + it(`throws when searchFields is defined but not an array`, async () => { + await expect( + // @ts-expect-error searchFields is an array + repository.find({ type, searchFields: 'string' }) + ).rejects.toThrowError('options.searchFields must be an array'); + expect(client.search).not.toHaveBeenCalled(); + }); + + it(`throws when fields is defined but not an array`, async () => { + // @ts-expect-error fields is an array + await expect(repository.find({ type, fields: 'string' })).rejects.toThrowError( + 'options.fields must be an array' + ); + expect(client.search).not.toHaveBeenCalled(); + }); + + it(`throws when a preference is provided with pit`, async () => { + await expect( + repository.find({ type: 'foo', pit: { id: 'abc123' }, preference: 'hi' }) + ).rejects.toThrowError('options.preference must be excluded when options.pit is used'); + expect(client.search).not.toHaveBeenCalled(); + }); + + it(`throws when KQL filter syntax is invalid`, async () => { + const findOpts: SavedObjectsFindOptions = { + namespaces: [namespace], + search: 'foo*', + searchFields: ['foo'], + type: ['dashboard'], + sortField: 'name', + sortOrder: 'desc', + defaultSearchOperator: 'AND', + hasReference: { + type: 'foo', + id: '1', + }, + filter: 'dashboard.attributes.otherField:<', + }; + + await expect(repository.find(findOpts)).rejects.toMatchInlineSnapshot(` + [Error: KQLSyntaxError: Expected "(", "{", value, whitespace but "<" found. + dashboard.attributes.otherField:< + --------------------------------^: Bad Request] + `); + expect(mockGetSearchDsl).not.toHaveBeenCalled(); + expect(client.search).not.toHaveBeenCalled(); + }); + }); + + describe('returns', () => { + it(`formats the ES response when there is no namespace`, async () => { + const noNamespaceSearchResults = generateIndexPatternSearchResults(); + client.search.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(noNamespaceSearchResults) + ); + const count = noNamespaceSearchResults.hits.hits.length; + + const response = await repository.find({ type }); + + expect(response.total).toBe(count); + expect(response.saved_objects).toHaveLength(count); + + noNamespaceSearchResults.hits.hits.forEach((doc, i) => { + expect(response.saved_objects[i]).toEqual({ + id: doc._id.replace(/(index-pattern|config|globalType)\:/, ''), + type: doc._source!.type, + originId: doc._source!.originId, + ...mockTimestampFields, + version: mockVersion, + score: doc._score, + attributes: doc._source![doc._source!.type], + references: [], + namespaces: doc._source!.type === NAMESPACE_AGNOSTIC_TYPE ? undefined : ['default'], + coreMigrationVersion: expect.any(String), + typeMigrationVersion: expect.any(String), + managed: expect.any(Boolean), + }); + }); + }); + + it(`formats the ES response when there is a namespace`, async () => { + const namespacedSearchResults = generateIndexPatternSearchResults(namespace); + client.search.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(namespacedSearchResults) + ); + const count = namespacedSearchResults.hits.hits.length; + + const response = await repository.find({ type, namespaces: [namespace] }); + + expect(response.total).toBe(count); + expect(response.saved_objects).toHaveLength(count); + + namespacedSearchResults.hits.hits.forEach((doc, i) => { + expect(response.saved_objects[i]).toEqual({ + id: doc._id.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), + type: doc._source!.type, + originId: doc._source!.originId, + ...mockTimestampFields, + version: mockVersion, + score: doc._score, + attributes: doc._source![doc._source!.type], + references: [], + namespaces: doc._source!.type === NAMESPACE_AGNOSTIC_TYPE ? undefined : [namespace], + coreMigrationVersion: expect.any(String), + typeMigrationVersion: expect.any(String), + managed: expect.any(Boolean), + }); + }); + }); + + it(`should return empty results when attempting to find only invalid or hidden types`, async () => { + const test = async (types: string | string[]) => { + const result = await repository.find({ type: types }); + expect(result).toEqual(expect.objectContaining({ saved_objects: [] })); + expect(client.search).not.toHaveBeenCalled(); + }; + + await test('unknownType'); + await test(HIDDEN_TYPE); + await test(['unknownType', HIDDEN_TYPE]); + }); + + it('migrates the found document', async () => { + const noNamespaceSearchResults = generateIndexPatternSearchResults(); + client.search.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(noNamespaceSearchResults) + ); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + await expect(repository.find({ type })).resolves.toHaveProperty( + 'saved_objects.0.migrated', + true + ); + expect(migrator.migrateDocument).toHaveBeenCalledTimes( + noNamespaceSearchResults.hits.hits.length + ); + expectMigrationArgs({ + type, + id: noNamespaceSearchResults.hits.hits[0]._id.replace( + /(index-pattern|config|globalType)\:/, + '' + ), + }); + }); + }); + + describe('search dsl', () => { + const commonOptions: SavedObjectsFindOptions = { + type: [type], + namespaces: [namespace], + search: 'foo*', + searchFields: ['foo'], + sortField: 'name', + sortOrder: 'desc', + defaultSearchOperator: 'AND', + hasReference: { + type: 'foo', + id: '1', + }, + hasNoReference: { + type: 'bar', + id: '1', + }, + }; + + it(`passes mappings, registry, and search options to getSearchDsl`, async () => { + await findSuccess(client, repository, commonOptions, namespace); + expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, commonOptions); + }); + + it(`accepts hasReferenceOperator`, async () => { + const relevantOpts: SavedObjectsFindOptions = { + ...commonOptions, + hasReferenceOperator: 'AND', + }; + + await findSuccess(client, repository, relevantOpts, namespace); + expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { + ...relevantOpts, + hasReferenceOperator: 'AND', + }); + }); + + it(`accepts searchAfter`, async () => { + const relevantOpts: SavedObjectsFindOptions = { + ...commonOptions, + searchAfter: ['1', 'a'], + }; + + await findSuccess(client, repository, relevantOpts, namespace); + expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { + ...relevantOpts, + searchAfter: ['1', 'a'], + }); + }); + + it(`accepts pit`, async () => { + const relevantOpts: SavedObjectsFindOptions = { + ...commonOptions, + pit: { id: 'abc123', keepAlive: '2m' }, + }; + + await findSuccess(client, repository, relevantOpts, namespace); + expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { + ...relevantOpts, + pit: { id: 'abc123', keepAlive: '2m' }, + }); + }); + + it(`accepts KQL expression filter and passes KueryNode to getSearchDsl`, async () => { + const findOpts: SavedObjectsFindOptions = { + namespaces: [namespace], + search: 'foo*', + searchFields: ['foo'], + type: ['dashboard'], + sortField: 'name', + sortOrder: 'desc', + defaultSearchOperator: 'AND', + hasReference: { + type: 'foo', + id: '1', + }, + filter: 'dashboard.attributes.otherField: *', + }; + + await findSuccess(client, repository, findOpts, namespace); + const { kueryNode } = mockGetSearchDsl.mock.calls[0][2]; + expect(kueryNode).toMatchInlineSnapshot(` + Object { + "arguments": Array [ + Object { + "isQuoted": false, + "type": "literal", + "value": "dashboard.otherField", + }, + Object { + "type": "wildcard", + "value": "@kuery-wildcard@", + }, + ], + "function": "is", + "type": "function", + } + `); + }); + + it(`accepts KQL KueryNode filter and passes KueryNode to getSearchDsl`, async () => { + const findOpts: SavedObjectsFindOptions = { + namespaces: [namespace], + search: 'foo*', + searchFields: ['foo'], + type: ['dashboard'], + sortField: 'name', + sortOrder: 'desc', + defaultSearchOperator: 'AND', + hasReference: { + type: 'foo', + id: '1', + }, + filter: nodeTypes.function.buildNode('is', `dashboard.attributes.otherField`, '*'), + }; + + await findSuccess(client, repository, findOpts, namespace); + const { kueryNode } = mockGetSearchDsl.mock.calls[0][2]; + expect(kueryNode).toMatchInlineSnapshot(` + Object { + "arguments": Array [ + Object { + "isQuoted": false, + "type": "literal", + "value": "dashboard.otherField", + }, + Object { + "type": "wildcard", + "value": "@kuery-wildcard@", + }, + ], + "function": "is", + "type": "function", + } + `); + }); + + it(`supports multiple types`, async () => { + const types = ['config', 'index-pattern']; + await findSuccess(client, repository, { type: types }); + + expect(mockGetSearchDsl).toHaveBeenCalledWith( + mappings, + registry, + expect.objectContaining({ + type: types, + }) + ); + }); + + it(`filters out invalid types`, async () => { + const types = ['config', 'unknownType', 'index-pattern']; + await findSuccess(client, repository, { type: types }); + + expect(mockGetSearchDsl).toHaveBeenCalledWith( + mappings, + registry, + expect.objectContaining({ + type: ['config', 'index-pattern'], + }) + ); + }); + + it(`filters out hidden types`, async () => { + const types = ['config', HIDDEN_TYPE, 'index-pattern']; + await findSuccess(client, repository, { type: types }); + + expect(mockGetSearchDsl).toHaveBeenCalledWith( + mappings, + registry, + expect.objectContaining({ + type: ['config', 'index-pattern'], + }) + ); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.test.ts new file mode 100644 index 0000000000000..c1896e67a6205 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.test.ts @@ -0,0 +1,279 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { SavedObjectsBaseOptions } from '@kbn/core-saved-objects-api-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockTimestamp, + mappings, + mockVersion, + createRegistry, + createDocumentMigrator, + getMockGetResponse, + createSpySerializer, + getSuccess, + createBadRequestErrorPayload, + createGenericNotFoundErrorPayload, +} from '../../test_helpers/repository.test.common'; + +describe('#get', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + const expectMigrationArgs = (args: unknown, contains = true, n = 1) => { + const obj = contains ? expect.objectContaining(args) : expect.not.objectContaining(args); + expect(migrator.migrateDocument).toHaveBeenNthCalledWith( + n, + obj, + expect.objectContaining({ + allowDowngrade: expect.any(Boolean), + }) + ); + }; + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performGet', () => { + const type = 'index-pattern'; + const id = 'logstash-*'; + const namespace = 'foo-namespace'; + const originId = 'some-origin-id'; + + describe('client calls', () => { + it(`should use the ES get action`, async () => { + await getSuccess(client, repository, registry, type, id); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { + await getSuccess(client, repository, registry, type, id, { namespace }); + expect(client.get).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${namespace}:${type}:${id}`, + }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { + await getSuccess(client, repository, registry, type, id); + expect(client.get).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${type}:${id}`, + }), + expect.anything() + ); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + await getSuccess(client, repository, registry, type, id, { namespace: 'default' }); + expect(client.get).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${type}:${id}`, + }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { + await getSuccess(client, repository, registry, NAMESPACE_AGNOSTIC_TYPE, id, { namespace }); + expect(client.get).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}`, + }), + expect.anything() + ); + + client.get.mockClear(); + await getSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id, { + namespace, + }); + expect(client.get).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, + }), + expect.anything() + ); + }); + }); + + describe('errors', () => { + const expectNotFoundError = async ( + type: string, + id: string, + options?: SavedObjectsBaseOptions + ) => { + await expect(repository.get(type, id, options)).rejects.toThrowError( + createGenericNotFoundErrorPayload(type, id) + ); + }; + + it(`throws when options.namespace is '*'`, async () => { + await expect( + repository.get(type, id, { namespace: ALL_NAMESPACES_STRING }) + ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); + }); + + it(`throws when type is invalid`, async () => { + await expectNotFoundError('unknownType', id); + expect(client.get).not.toHaveBeenCalled(); + }); + + it(`throws when type is hidden`, async () => { + await expectNotFoundError(HIDDEN_TYPE, id); + expect(client.get).not.toHaveBeenCalled(); + }); + + it(`throws when ES is unable to find the document during get`, async () => { + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + found: false, + } as estypes.GetResponse) + ); + await expectNotFoundError(type, id); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`throws when ES is unable to find the index during get`, async () => { + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({} as estypes.GetResponse, { + statusCode: 404, + }) + ); + await expectNotFoundError(type, id); + expect(client.get).toHaveBeenCalledTimes(1); + }); + + it(`throws when type is multi-namespace and the document exists, but not in this namespace`, async () => { + const response = getMockGetResponse( + registry, + { type: MULTI_NAMESPACE_ISOLATED_TYPE, id }, + namespace + ); + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id, { + namespace: 'bar-namespace', + }); + expect(client.get).toHaveBeenCalledTimes(1); + }); + }); + + describe('returns', () => { + it(`formats the ES response`, async () => { + const result = await getSuccess(client, repository, registry, type, id); + expect(result).toEqual({ + id, + type, + updated_at: mockTimestamp, + version: mockVersion, + attributes: { + title: 'Testing', + }, + references: [], + namespaces: ['default'], + coreMigrationVersion: expect.any(String), + typeMigrationVersion: expect.any(String), + managed: expect.any(Boolean), + }); + }); + + it(`includes namespaces if type is multi-namespace`, async () => { + const result = await getSuccess( + client, + repository, + registry, + MULTI_NAMESPACE_ISOLATED_TYPE, + id + ); + expect(result).toMatchObject({ + namespaces: expect.any(Array), + }); + }); + + it(`include namespaces if type is not multi-namespace`, async () => { + const result = await getSuccess(client, repository, registry, type, id); + expect(result).toMatchObject({ + namespaces: ['default'], + }); + }); + + it(`includes originId property if present in cluster call response`, async () => { + const result = await getSuccess(client, repository, registry, type, id, {}, originId); + expect(result).toMatchObject({ originId }); + }); + }); + + it('migrates the fetched document', async () => { + migrator.migrateDocument.mockReturnValueOnce( + 'migrated' as unknown as ReturnType + ); + await expect(getSuccess(client, repository, registry, type, id)).resolves.toBe('migrated'); + expect(migrator.migrateDocument).toHaveBeenCalledTimes(1); + expectMigrationArgs({ + id, + type, + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/increment_counter.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/increment_counter.test.ts new file mode 100644 index 0000000000000..3e976295dc59e --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/increment_counter.test.ts @@ -0,0 +1,530 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockPreflightCheckForCreate, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { + SavedObjectsIncrementCounterField, + SavedObjectsIncrementCounterOptions, +} from '@kbn/core-saved-objects-api-server'; +import { + type SavedObjectUnsanitizedDoc, + MAIN_SAVED_OBJECT_INDEX, +} from '@kbn/core-saved-objects-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockVersionProps, + mockTimestampFields, + mockTimestamp, + mappings, + mockVersion, + createRegistry, + createDocumentMigrator, + getMockGetResponse, + createSpySerializer, + createBadRequestErrorPayload, + createUnsupportedTypeErrorPayload, + createConflictErrorPayload, +} from '../../test_helpers/repository.test.common'; + +describe('#incrementCounter', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + const expectMigrationArgs = (args: unknown, contains = true, n = 1) => { + const obj = contains ? expect.objectContaining(args) : expect.not.objectContaining(args); + expect(migrator.migrateDocument).toHaveBeenNthCalledWith( + n, + obj, + expect.objectContaining({ + allowDowngrade: expect.any(Boolean), + }) + ); + }; + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + // Setup migration mock for creating an object + const mockMigrationVersion = { foo: '2.3.4' }; + const mockMigrateDocument = (doc: SavedObjectUnsanitizedDoc) => ({ + ...doc, + attributes: { + ...doc.attributes, + ...(doc.attributes?.title && { title: `${doc.attributes.title}!!` }), + }, + migrationVersion: mockMigrationVersion, + managed: doc.managed ?? false, + references: [{ name: 'search_0', type: 'search', id: '123' }], + }); + + describe('performIncrementCounter', () => { + const type = 'config'; + const id = 'one'; + const counterFields = ['buildNum', 'apiCallsCount']; + const namespace = 'foo-namespace'; + const originId = 'some-origin-id'; + + const incrementCounterSuccess = async ( + type: string, + id: string, + fields: Array, + options?: SavedObjectsIncrementCounterOptions, + internalOptions: { mockGetResponseValue?: estypes.GetResponse } = {} + ) => { + const { mockGetResponseValue } = internalOptions; + const isMultiNamespace = registry.isMultiNamespace(type); + if (isMultiNamespace) { + const response = + mockGetResponseValue ?? getMockGetResponse(registry, { type, id }, options?.namespace); + client.get.mockResponseOnce(response); + } + + client.update.mockResponseImplementation((params) => { + return { + body: { + _id: params.id, + ...mockVersionProps, + _index: MAIN_SAVED_OBJECT_INDEX, + get: { + found: true, + _source: { + type, + ...mockTimestampFields, + [type]: { + ...fields.reduce((acc, field) => { + acc[typeof field === 'string' ? field : field.fieldName] = 8468; + return acc; + }, {} as Record), + defaultIndex: 'logstash-*', + }, + }, + }, + } as estypes.UpdateResponse, + }; + }); + + const result = await repository.incrementCounter(type, id, fields, options); + expect(client.get).toHaveBeenCalledTimes(isMultiNamespace ? 1 : 0); + return result; + }; + + beforeEach(() => { + mockPreflightCheckForCreate.mockReset(); + mockPreflightCheckForCreate.mockImplementation(({ objects }) => { + return Promise.resolve(objects.map(({ type, id }) => ({ type, id }))); // respond with no errors by default + }); + }); + + describe('client calls', () => { + it(`should use the ES update action if type is not multi-namespace`, async () => { + await incrementCounterSuccess(type, id, counterFields, { namespace }); + expect(client.get).not.toHaveBeenCalled(); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.update).toHaveBeenCalledTimes(1); + }); + + it(`should use the ES get action then update action if type is multi-namespace, ID is defined, and overwrite=true`, async () => { + await incrementCounterSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { + namespace, + }); + expect(client.get).toHaveBeenCalledTimes(1); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.update).toHaveBeenCalledTimes(1); + }); + + it(`should check for alias conflicts if a new multi-namespace object would be created`, async () => { + await incrementCounterSuccess( + MULTI_NAMESPACE_ISOLATED_TYPE, + id, + counterFields, + { namespace }, + { mockGetResponseValue: { found: false } as estypes.GetResponse } + ); + expect(client.get).toHaveBeenCalledTimes(1); + expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); + expect(client.update).toHaveBeenCalledTimes(1); + }); + + it(`defaults to a refresh setting of wait_for`, async () => { + await incrementCounterSuccess(type, id, counterFields, { namespace }); + expect(client.update).toHaveBeenCalledWith( + expect.objectContaining({ + refresh: 'wait_for', + }), + expect.anything() + ); + }); + + it(`uses the 'upsertAttributes' option when specified`, async () => { + const upsertAttributes = { + foo: 'bar', + hello: 'dolly', + }; + await incrementCounterSuccess(type, id, counterFields, { namespace, upsertAttributes }); + expect(client.update).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ + upsert: expect.objectContaining({ + [type]: { + foo: 'bar', + hello: 'dolly', + ...counterFields.reduce((aggs, field) => { + return { + ...aggs, + [field]: 1, + }; + }, {}), + }, + }), + }), + }), + expect.anything() + ); + }); + + it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { + await incrementCounterSuccess(type, id, counterFields, { namespace }); + expect(client.update).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${namespace}:${type}:${id}`, + }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { + await incrementCounterSuccess(type, id, counterFields); + expect(client.update).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${type}:${id}`, + }), + expect.anything() + ); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + await incrementCounterSuccess(type, id, counterFields, { namespace: 'default' }); + expect(client.update).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${type}:${id}`, + }), + expect.anything() + ); + }); + + it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { + await incrementCounterSuccess(NAMESPACE_AGNOSTIC_TYPE, id, counterFields, { namespace }); + expect(client.update).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}`, + }), + expect.anything() + ); + + client.update.mockClear(); + await incrementCounterSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { + namespace, + }); + expect(client.update).toHaveBeenCalledWith( + expect.objectContaining({ + id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, + }), + expect.anything() + ); + }); + }); + + describe('errors', () => { + const expectUnsupportedTypeError = async ( + type: string, + id: string, + field: Array + ) => { + await expect(repository.incrementCounter(type, id, field)).rejects.toThrowError( + createUnsupportedTypeErrorPayload(type) + ); + }; + + it(`throws when options.namespace is '*'`, async () => { + await expect( + repository.incrementCounter(type, id, counterFields, { + namespace: ALL_NAMESPACES_STRING, + }) + ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); + }); + + it(`throws when type is not a string`, async () => { + const test = async (type: unknown) => { + await expect( + // @ts-expect-error type is supposed to be a string + repository.incrementCounter(type, id, counterFields) + ).rejects.toThrowError(`"type" argument must be a string`); + expect(client.update).not.toHaveBeenCalled(); + }; + + await test(null); + await test(42); + await test(false); + await test({}); + }); + + it(`throws when id is empty`, async () => { + await expect(repository.incrementCounter(type, '', counterFields)).rejects.toThrowError( + createBadRequestErrorPayload('id cannot be empty') + ); + expect(client.update).not.toHaveBeenCalled(); + }); + + it(`throws when counterField is not CounterField type`, async () => { + const test = async (field: unknown[]) => { + await expect( + // @ts-expect-error field is of wrong type + repository.incrementCounter(type, id, field) + ).rejects.toThrowError( + `"counterFields" argument must be of type Array` + ); + expect(client.update).not.toHaveBeenCalled(); + }; + + await test([null]); + await test([42]); + await test([false]); + await test([{}]); + await test([{}, false, 42, null, 'string']); + await test([{ fieldName: 'string' }, false, null, 'string']); + }); + + it(`throws when type is invalid`, async () => { + await expectUnsupportedTypeError('unknownType', id, counterFields); + expect(client.update).not.toHaveBeenCalled(); + }); + + it(`throws when type is hidden`, async () => { + await expectUnsupportedTypeError(HIDDEN_TYPE, id, counterFields); + expect(client.update).not.toHaveBeenCalled(); + }); + + it(`throws when there is a conflict with an existing multi-namespace saved object (get)`, async () => { + const response = getMockGetResponse( + registry, + { type: MULTI_NAMESPACE_ISOLATED_TYPE, id }, + 'bar-namespace' + ); + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(response) + ); + await expect( + repository.incrementCounter(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { + namespace, + }) + ).rejects.toThrowError(createConflictErrorPayload(MULTI_NAMESPACE_ISOLATED_TYPE, id)); + expect(client.get).toHaveBeenCalledTimes(1); + expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); + expect(client.update).not.toHaveBeenCalled(); + }); + + it(`throws when there is an alias conflict from preflightCheckForCreate`, async () => { + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + found: false, + } as estypes.GetResponse) + ); + mockPreflightCheckForCreate.mockResolvedValue([ + { type: 'foo', id: 'bar', error: { type: 'aliasConflict' } }, + ]); + await expect( + repository.incrementCounter(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { + namespace, + }) + ).rejects.toThrowError(createConflictErrorPayload(MULTI_NAMESPACE_ISOLATED_TYPE, id)); + expect(client.get).toHaveBeenCalledTimes(1); + expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); + expect(client.update).not.toHaveBeenCalled(); + }); + + it(`does not throw when there is a different error from preflightCheckForCreate`, async () => { + client.get.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + found: false, + } as estypes.GetResponse) + ); + mockPreflightCheckForCreate.mockResolvedValue([ + { type: 'foo', id: 'bar', error: { type: 'conflict' } }, + ]); + await incrementCounterSuccess( + MULTI_NAMESPACE_ISOLATED_TYPE, + id, + counterFields, + { namespace }, + { mockGetResponseValue: { found: false } as estypes.GetResponse } + ); + expect(client.get).toHaveBeenCalledTimes(1); + expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); + expect(client.update).toHaveBeenCalledTimes(1); + }); + }); + + describe('migration', () => { + beforeEach(() => { + migrator.migrateDocument.mockImplementation(mockMigrateDocument); + }); + + it(`migrates a document and serializes the migrated doc`, async () => { + const migrationVersion = mockMigrationVersion; + await incrementCounterSuccess(type, id, counterFields, { migrationVersion }); + const attributes = { buildNum: 1, apiCallsCount: 1 }; // this is added by the incrementCounter function + const doc = { type, id, attributes, migrationVersion, ...mockTimestampFields }; + expectMigrationArgs(doc); + + const migratedDoc = migrator.migrateDocument(doc); + expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); + }); + }); + + describe('returns', () => { + it(`formats the ES response`, async () => { + client.update.mockResponseImplementation((params) => { + return { + body: { + _id: params.id, + ...mockVersionProps, + _index: MAIN_SAVED_OBJECT_INDEX, + get: { + found: true, + _source: { + type: 'config', + ...mockTimestampFields, + config: { + buildNum: 8468, + apiCallsCount: 100, + defaultIndex: 'logstash-*', + }, + originId, + }, + }, + } as estypes.UpdateResponse, + }; + }); + + const response = await repository.incrementCounter( + 'config', + '6.0.0-alpha1', + ['buildNum', 'apiCallsCount'], + { + namespace: 'foo-namespace', + } + ); + + expect(response).toEqual({ + type: 'config', + id: '6.0.0-alpha1', + ...mockTimestampFields, + version: mockVersion, + references: [], + attributes: { + buildNum: 8468, + apiCallsCount: 100, + defaultIndex: 'logstash-*', + }, + originId, + }); + }); + + it('increments counter by incrementBy config', async () => { + await incrementCounterSuccess(type, id, [{ fieldName: counterFields[0], incrementBy: 3 }]); + + expect(client.update).toBeCalledTimes(1); + expect(client.update).toBeCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ + script: expect.objectContaining({ + params: expect.objectContaining({ + counterFieldNames: [counterFields[0]], + counts: [3], + }), + }), + }), + }), + expect.anything() + ); + }); + + it('does not increment counter when incrementBy is 0', async () => { + await incrementCounterSuccess(type, id, [{ fieldName: counterFields[0], incrementBy: 0 }]); + + expect(client.update).toBeCalledTimes(1); + expect(client.update).toBeCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ + script: expect.objectContaining({ + params: expect.objectContaining({ + counterFieldNames: [counterFields[0]], + counts: [0], + }), + }), + }), + }), + expect.anything() + ); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/open_point_in_time.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/open_point_in_time.test.ts new file mode 100644 index 0000000000000..04b107d0a1028 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/open_point_in_time.test.ts @@ -0,0 +1,237 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { + SavedObjectsCreatePointInTimeFinderDependencies, + SavedObjectsCreatePointInTimeFinderOptions, + SavedObjectsOpenPointInTimeOptions, +} from '@kbn/core-saved-objects-api-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + HIDDEN_TYPE, + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + createSpySerializer, + createGenericNotFoundErrorPayload, +} from '../../test_helpers/repository.test.common'; +import { PointInTimeFinder } from '../point_in_time_finder'; + +describe('SavedObjectsRepository', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('#openPointInTimeForType', () => { + const type = 'index-pattern'; + + const generateResults = (id?: string) => ({ id: id || 'id' }); + const successResponse = async (type: string, options?: SavedObjectsOpenPointInTimeOptions) => { + client.openPointInTime.mockResponseOnce(generateResults()); + const result = await repository.openPointInTimeForType(type, options); + expect(client.openPointInTime).toHaveBeenCalledTimes(1); + return result; + }; + + describe('client calls', () => { + it(`should use the ES PIT API`, async () => { + await successResponse(type); + expect(client.openPointInTime).toHaveBeenCalledTimes(1); + }); + + it(`accepts preference`, async () => { + await successResponse(type, { preference: 'pref' }); + expect(client.openPointInTime).toHaveBeenCalledWith( + expect.objectContaining({ + preference: 'pref', + }), + expect.anything() + ); + }); + + it(`accepts keepAlive`, async () => { + await successResponse(type, { keepAlive: '2m' }); + expect(client.openPointInTime).toHaveBeenCalledWith( + expect.objectContaining({ + keep_alive: '2m', + }), + expect.anything() + ); + }); + + it(`defaults keepAlive to 5m`, async () => { + await successResponse(type); + expect(client.openPointInTime).toHaveBeenCalledWith( + expect.objectContaining({ + keep_alive: '5m', + }), + expect.anything() + ); + }); + }); + + describe('errors', () => { + const expectNotFoundError = async (types: string | string[]) => { + await expect(repository.openPointInTimeForType(types)).rejects.toThrowError( + createGenericNotFoundErrorPayload() + ); + }; + + it(`throws when ES is unable to find the index`, async () => { + client.openPointInTime.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise( + { id: 'error' }, + { statusCode: 404 } + ) + ); + await expectNotFoundError(type); + expect(client.openPointInTime).toHaveBeenCalledTimes(1); + }); + + it(`should return generic not found error when attempting to find only invalid or hidden types`, async () => { + const test = async (types: string | string[]) => { + await expectNotFoundError(types); + expect(client.openPointInTime).not.toHaveBeenCalled(); + }; + + await test('unknownType'); + await test(HIDDEN_TYPE); + await test(['unknownType', HIDDEN_TYPE]); + }); + }); + + describe('returns', () => { + it(`returns id in the expected format`, async () => { + const id = 'abc123'; + const results = generateResults(id); + client.openPointInTime.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise(results) + ); + const response = await repository.openPointInTimeForType(type); + expect(response).toEqual({ id }); + }); + }); + }); + + describe('#closePointInTime', () => { + const generateResults = () => ({ succeeded: true, num_freed: 3 }); + const successResponse = async (id: string) => { + client.closePointInTime.mockResponseOnce(generateResults()); + const result = await repository.closePointInTime(id); + expect(client.closePointInTime).toHaveBeenCalledTimes(1); + return result; + }; + + describe('client calls', () => { + it(`should use the ES PIT API`, async () => { + await successResponse('abc123'); + expect(client.closePointInTime).toHaveBeenCalledTimes(1); + }); + + it(`accepts id`, async () => { + await successResponse('abc123'); + expect(client.closePointInTime).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ + id: 'abc123', + }), + }), + expect.anything() + ); + }); + }); + + describe('returns', () => { + it(`returns response body from ES`, async () => { + const results = generateResults(); + client.closePointInTime.mockResponseOnce(results); + const response = await repository.closePointInTime('abc123'); + expect(response).toEqual(results); + }); + }); + }); + + describe('#createPointInTimeFinder', () => { + it('returns a new PointInTimeFinder instance', async () => { + const result = await repository.createPointInTimeFinder({ type: 'PIT' }); + expect(result).toBeInstanceOf(PointInTimeFinder); + }); + + it('calls PointInTimeFinder with the provided options and dependencies', async () => { + const options: SavedObjectsCreatePointInTimeFinderOptions = { + type: 'my-type', + }; + const dependencies: SavedObjectsCreatePointInTimeFinderDependencies = { + client: { + find: jest.fn(), + openPointInTimeForType: jest.fn(), + closePointInTime: jest.fn(), + }, + }; + + await repository.createPointInTimeFinder(options, dependencies); + expect(pointInTimeFinderMock).toHaveBeenCalledWith( + options, + expect.objectContaining({ + ...dependencies, + logger, + }) + ); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/remove_references_to.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/remove_references_to.test.ts index 78c3e8d1faf92..70e601235f184 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/remove_references_to.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/remove_references_to.test.ts @@ -6,71 +6,277 @@ * Side Public License, v 1. */ -import { apiContextMock, ApiExecutionContextMock } from '../../mocks'; -import { createType } from '../../test_helpers/repository.test.common'; +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { apiContextMock, ApiExecutionContextMock, kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + removeReferencesToSuccess, + createSpySerializer, + createConflictErrorPayload, + createType, +} from '../../test_helpers/repository.test.common'; import { performRemoveReferencesTo } from './remove_references_to'; -const fooType = createType('foo', {}); -const barType = createType('bar', {}); +describe('SavedObjectsRepository', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; -describe('performRemoveReferencesTo', () => { - const namespace = 'some_ns'; - const indices = ['.kib_1', '.kib_2']; - let apiExecutionContext: ApiExecutionContextMock; + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + const fooType = createType('foo', {}); + const barType = createType('bar', {}); beforeEach(() => { - apiExecutionContext = apiContextMock.create(); - apiExecutionContext.registry.registerType(fooType); - apiExecutionContext.registry.registerType(barType); - - apiExecutionContext.helpers.common.getCurrentNamespace.mockImplementation( - (space) => space ?? 'default' - ); - apiExecutionContext.helpers.common.getIndicesForTypes.mockReturnValue(indices); + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); }); - describe('with all extensions enabled', () => { - it('calls getCurrentNamespace with the correct parameters', async () => { - await performRemoveReferencesTo( - { type: 'foo', id: 'id', options: { namespace } }, - apiExecutionContext - ); + describe('#removeReferencesTo', () => { + const type = 'type'; + const id = 'id'; + const defaultOptions = {}; + const updatedCount = 42; + + describe('client calls', () => { + it('should use the ES updateByQuery action', async () => { + await removeReferencesToSuccess(client, repository, type, id); + expect(client.updateByQuery).toHaveBeenCalledTimes(1); + }); - const commonHelper = apiExecutionContext.helpers.common; - expect(commonHelper.getCurrentNamespace).toHaveBeenCalledTimes(1); - expect(commonHelper.getCurrentNamespace).toHaveBeenLastCalledWith(namespace); + it('uses the correct default `refresh` value', async () => { + await removeReferencesToSuccess(client, repository, type, id); + expect(client.updateByQuery).toHaveBeenCalledWith( + expect.objectContaining({ + refresh: true, + }), + expect.any(Object) + ); + }); + + it('merges output of getSearchDsl into es request body', async () => { + const query = { query: 1, aggregations: 2 }; + mockGetSearchDsl.mockReturnValue(query); + await removeReferencesToSuccess(client, repository, type, id, { type }); + + expect(client.updateByQuery).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ ...query }), + }), + expect.anything() + ); + }); + + it('should set index to all known SO indices on the request', async () => { + await removeReferencesToSuccess(client, repository, type, id); + expect(client.updateByQuery).toHaveBeenCalledWith( + expect.objectContaining({ + index: ['.kibana-test_8.0.0-testing', 'custom_8.0.0-testing'], + }), + expect.anything() + ); + }); + + it('should use the `refresh` option in the request', async () => { + const refresh = Symbol(); + + await removeReferencesToSuccess(client, repository, type, id, { refresh }); + expect(client.updateByQuery).toHaveBeenCalledWith( + expect.objectContaining({ + refresh, + }), + expect.anything() + ); + }); + + it('should pass the correct parameters to the update script', async () => { + await removeReferencesToSuccess(client, repository, type, id); + expect(client.updateByQuery).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ + script: expect.objectContaining({ + params: { + type, + id, + }, + }), + }), + }), + expect.anything() + ); + }); }); - it('calls authorizeRemoveReferences with the correct parameters', async () => { - await performRemoveReferencesTo( - { type: 'foo', id: 'id', options: { namespace } }, - apiExecutionContext - ); + describe('search dsl', () => { + it(`passes mappings and registry to getSearchDsl`, async () => { + await removeReferencesToSuccess(client, repository, type, id); + expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, expect.anything()); + }); + + it('passes namespace to getSearchDsl', async () => { + await removeReferencesToSuccess(client, repository, type, id, { namespace: 'some-ns' }); + expect(mockGetSearchDsl).toHaveBeenCalledWith( + mappings, + registry, + expect.objectContaining({ + namespaces: ['some-ns'], + }) + ); + }); - const securityExt = apiExecutionContext.extensions.securityExtension!; - expect(securityExt.authorizeRemoveReferences).toHaveBeenCalledTimes(1); - expect(securityExt.authorizeRemoveReferences).toHaveBeenLastCalledWith({ - namespace, - object: { type: 'foo', id: 'id' }, + it('passes hasReference to getSearchDsl', async () => { + await removeReferencesToSuccess(client, repository, type, id); + expect(mockGetSearchDsl).toHaveBeenCalledWith( + mappings, + registry, + expect.objectContaining({ + hasReference: { + type, + id, + }, + }) + ); + }); + + it('passes all known types to getSearchDsl', async () => { + await removeReferencesToSuccess(client, repository, type, id); + expect(mockGetSearchDsl).toHaveBeenCalledWith( + mappings, + registry, + expect.objectContaining({ + type: registry.getAllTypes().map((type) => type.name), + }) + ); }); }); - it('calls client.updateByQuery with the correct parameters', async () => { - await performRemoveReferencesTo( - { type: 'foo', id: 'id', options: { namespace, refresh: false } }, - apiExecutionContext - ); + describe('returns', () => { + it('returns the updated count from the ES response', async () => { + const response = await removeReferencesToSuccess(client, repository, type, id); + expect(response.updated).toBe(updatedCount); + }); + }); + + describe('errors', () => { + it(`throws when ES returns failures`, async () => { + client.updateByQuery.mockResponseOnce({ + updated: 7, + failures: [ + { id: 'failure' } as estypes.BulkIndexByScrollFailure, + { id: 'another-failure' } as estypes.BulkIndexByScrollFailure, + ], + }); + + await expect(repository.removeReferencesTo(type, id, defaultOptions)).rejects.toThrowError( + createConflictErrorPayload(type, id) + ); + }); + }); + }); + describe('performRemoveReferencesTo', () => { + const namespace = 'some_ns'; + const indices = ['.kib_1', '.kib_2']; + let apiExecutionContext: ApiExecutionContextMock; + + beforeEach(() => { + apiExecutionContext = apiContextMock.create(); + apiExecutionContext.registry.registerType(fooType); + apiExecutionContext.registry.registerType(barType); - const client = apiExecutionContext.client; - expect(client.updateByQuery).toHaveBeenCalledTimes(1); - expect(client.updateByQuery).toHaveBeenLastCalledWith( - { - refresh: false, - index: indices, - body: expect.any(Object), - }, - { ignore: [404], meta: true } + apiExecutionContext.helpers.common.getCurrentNamespace.mockImplementation( + (space) => space ?? 'default' ); + apiExecutionContext.helpers.common.getIndicesForTypes.mockReturnValue(indices); + }); + + describe('with all extensions enabled', () => { + it('calls getCurrentNamespace with the correct parameters', async () => { + await performRemoveReferencesTo( + { type: 'foo', id: 'id', options: { namespace } }, + apiExecutionContext + ); + + const commonHelper = apiExecutionContext.helpers.common; + expect(commonHelper.getCurrentNamespace).toHaveBeenCalledTimes(1); + expect(commonHelper.getCurrentNamespace).toHaveBeenLastCalledWith(namespace); + }); + + it('calls authorizeRemoveReferences with the correct parameters', async () => { + await performRemoveReferencesTo( + { type: 'foo', id: 'id', options: { namespace } }, + apiExecutionContext + ); + + const securityExt = apiExecutionContext.extensions.securityExtension!; + expect(securityExt.authorizeRemoveReferences).toHaveBeenCalledTimes(1); + expect(securityExt.authorizeRemoveReferences).toHaveBeenLastCalledWith({ + namespace, + object: { type: 'foo', id: 'id' }, + }); + }); + + it('calls client.updateByQuery with the correct parameters', async () => { + await performRemoveReferencesTo( + { type: 'foo', id: 'id', options: { namespace, refresh: false } }, + apiExecutionContext + ); + + const client = apiExecutionContext.client; + expect(client.updateByQuery).toHaveBeenCalledTimes(1); + expect(client.updateByQuery).toHaveBeenLastCalledWith( + { + refresh: false, + index: indices, + body: expect.any(Object), + }, + { ignore: [404], meta: true } + ); + }); }); }); }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.test.ts new file mode 100644 index 0000000000000..25acc55cc77c2 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.test.ts @@ -0,0 +1,108 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + pointInTimeFinderMock, + mockInternalBulkResolve, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { SavedObjectsResolveResponse } from '@kbn/core-saved-objects-api-server'; +import { type BulkResolveError } from '@kbn/core-saved-objects-server'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + createSpySerializer, +} from '../../test_helpers/repository.test.common'; + +describe('SavedObjectsRepository', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('#resolve', () => { + afterEach(() => { + mockInternalBulkResolve.mockReset(); + }); + + it('passes arguments to the internalBulkResolve module and returns the result', async () => { + const expectedResult: SavedObjectsResolveResponse = { + saved_object: { type: 'type', id: 'id', attributes: {}, references: [] }, + outcome: 'exactMatch', + }; + mockInternalBulkResolve.mockResolvedValue({ resolved_objects: [expectedResult] }); + + await expect(repository.resolve('obj-type', 'obj-id')).resolves.toEqual(expectedResult); + expect(mockInternalBulkResolve).toHaveBeenCalledTimes(1); + expect(mockInternalBulkResolve).toHaveBeenCalledWith( + expect.objectContaining({ objects: [{ type: 'obj-type', id: 'obj-id' }] }) + ); + }); + + it('throws when internalBulkResolve result is an error', async () => { + const error = SavedObjectsErrorHelpers.decorateBadRequestError(new Error('Oh no!')); + const expectedResult: BulkResolveError = { type: 'obj-type', id: 'obj-id', error }; + mockInternalBulkResolve.mockResolvedValue({ resolved_objects: [expectedResult] }); + + await expect(repository.resolve('foo', '2')).rejects.toEqual(error); + }); + + it('throws when internalBulkResolve throws', async () => { + const error = new Error('Oh no!'); + mockInternalBulkResolve.mockRejectedValue(error); + + await expect(repository.resolve('foo', '2')).rejects.toEqual(error); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts index dd5c51c6b433d..67076f912973a 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts @@ -45,7 +45,7 @@ import { updateSuccess, } from '../../test_helpers/repository.test.common'; -describe('SavedObjectsRepository', () => { +describe('#update', () => { let client: ReturnType; let repository: SavedObjectsRepository; let migrator: ReturnType; @@ -95,7 +95,7 @@ describe('SavedObjectsRepository', () => { mockGetCurrentTime.mockReturnValue(mockTimestamp); }); - describe('#update', () => { + describe('performUpdate', () => { const id = 'logstash-*'; const type = 'index-pattern'; const attributes = { title: 'Testing' }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update_objects_spaces.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update_objects_spaces.test.ts new file mode 100644 index 0000000000000..b88d0007bcd55 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update_objects_spaces.test.ts @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + pointInTimeFinderMock, + mockUpdateObjectsSpaces, + mockGetCurrentTime, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { + SavedObjectsUpdateObjectsSpacesResponse, + SavedObjectsUpdateObjectsSpacesObject, + SavedObjectsUpdateObjectsSpacesOptions, +} from '@kbn/core-saved-objects-api-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + mockTimestamp, + mappings, + createRegistry, + createDocumentMigrator, + createSpySerializer, +} from '../../test_helpers/repository.test.common'; + +describe('#updateObjectsSpaces', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + describe('performUpdateObjectsSpaces', () => { + afterEach(() => { + mockUpdateObjectsSpaces.mockReset(); + }); + + it('passes arguments to the updateObjectsSpaces module and returns the result', async () => { + const objects: SavedObjectsUpdateObjectsSpacesObject[] = [{ type: 'type', id: 'id' }]; + const spacesToAdd = ['to-add', 'also-to-add']; + const spacesToRemove = ['to-remove']; + const options: SavedObjectsUpdateObjectsSpacesOptions = { namespace: 'ns-1' }; + const expectedResult: SavedObjectsUpdateObjectsSpacesResponse = { + objects: [ + { + type: 'type', + id: 'id', + spaces: ['foo', 'bar'], + }, + ], + }; + mockUpdateObjectsSpaces.mockResolvedValue(expectedResult); + + await expect( + repository.updateObjectsSpaces(objects, spacesToAdd, spacesToRemove, options) + ).resolves.toEqual(expectedResult); + expect(mockUpdateObjectsSpaces).toHaveBeenCalledTimes(1); + expect(mockUpdateObjectsSpaces).toHaveBeenCalledWith( + expect.objectContaining({ objects, spacesToAdd, spacesToRemove, options }) + ); + }); + + it('returns an error from the updateObjectsSpaces module', async () => { + const expectedResult = new Error('Oh no!'); + mockUpdateObjectsSpaces.mockRejectedValue(expectedResult); + + await expect(repository.updateObjectsSpaces([], [], [])).rejects.toEqual(expectedResult); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts index 3547d653e3de4..27f45aaa9c084 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts @@ -6,118 +6,26 @@ * Side Public License, v 1. */ -/* eslint-disable @typescript-eslint/no-shadow */ - import { pointInTimeFinderMock, - mockCollectMultiNamespaceReferences, - mockGetBulkOperationError, - mockInternalBulkResolve, - mockUpdateObjectsSpaces, mockGetCurrentTime, - mockPreflightCheckForCreate, - mockDeleteLegacyUrlAliases, mockGetSearchDsl, } from './repository.test.mock'; -import type { Payload } from '@hapi/boom'; -import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; - -import type { - SavedObjectsBaseOptions, - SavedObjectsFindOptions, - SavedObjectsUpdateObjectsSpacesResponse, - SavedObjectsDeleteByNamespaceOptions, - SavedObjectsIncrementCounterField, - SavedObjectsIncrementCounterOptions, - SavedObjectsCreatePointInTimeFinderDependencies, - SavedObjectsCreatePointInTimeFinderOptions, - SavedObjectsBulkGetObject, - SavedObjectsCreateOptions, - SavedObjectsDeleteOptions, - SavedObjectsOpenPointInTimeOptions, - SavedObjectsResolveResponse, - SavedObjectsCollectMultiNamespaceReferencesObject, - SavedObjectsCollectMultiNamespaceReferencesResponse, - SavedObjectsUpdateObjectsSpacesObject, - SavedObjectsUpdateObjectsSpacesOptions, - SavedObjectsBulkDeleteObject, - SavedObjectsBulkDeleteOptions, -} from '@kbn/core-saved-objects-api-server'; -import { - type SavedObjectsRawDoc, - type SavedObjectsRawDocSource, - type SavedObjectUnsanitizedDoc, - type SavedObject, - type SavedObjectReference, - type BulkResolveError, - MAIN_SAVED_OBJECT_INDEX, -} from '@kbn/core-saved-objects-server'; -import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; -import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; import { SavedObjectsRepository } from './repository'; -import { PointInTimeFinder } from './point_in_time_finder'; import { loggerMock } from '@kbn/logging-mocks'; -import { - SavedObjectsSerializer, - encodeHitVersion, - LEGACY_URL_ALIAS_TYPE, -} from '@kbn/core-saved-objects-base-server-internal'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; import { kibanaMigratorMock } from '../mocks'; import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; -import * as esKuery from '@kbn/es-query'; import { - CUSTOM_INDEX_TYPE, - NAMESPACE_AGNOSTIC_TYPE, - MULTI_NAMESPACE_TYPE, - MULTI_NAMESPACE_ISOLATED_TYPE, - HIDDEN_TYPE, - mockVersionProps, - mockTimestampFields, mockTimestamp, mappings, - mockVersion, - bulkGetSuccess, createRegistry, createDocumentMigrator, - getMockGetResponse, - getMockMgetResponse, - type TypeIdTuple, createSpySerializer, - bulkGet, - expectErrorResult, - expectErrorInvalidType, - expectErrorNotFound, - expectError, - generateIndexPatternSearchResults, - findSuccess, - deleteSuccess, - removeReferencesToSuccess, - checkConflicts, - checkConflictsSuccess, - getSuccess, - createBadRequestErrorPayload, - createUnsupportedTypeErrorPayload, - createConflictErrorPayload, - createGenericNotFoundErrorPayload, - mockTimestampFieldsWithCreated, - getMockEsBulkDeleteResponse, - bulkDeleteSuccess, - createBulkDeleteSuccessStatus, } from '../test_helpers/repository.test.common'; -const { nodeTypes } = esKuery; - -// BEWARE: The SavedObjectClient depends on the implementation details of the SavedObjectsRepository -// so any breaking changes to this repository are considered breaking changes to the SavedObjectsClient. - -interface ExpectedErrorResult { - type: string; - id: string; - error: Record; -} - describe('SavedObjectsRepository', () => { let client: ReturnType; let repository: SavedObjectsRepository; @@ -128,22 +36,6 @@ describe('SavedObjectsRepository', () => { const registry = createRegistry(); const documentMigrator = createDocumentMigrator(registry); - const expectSuccess = ({ type, id }: { type: string; id: string }) => { - // @ts-expect-error TS is not aware of the extension - return expect.toBeDocumentWithoutError(type, id); - }; - - const expectMigrationArgs = (args: unknown, contains = true, n = 1) => { - const obj = contains ? expect.objectContaining(args) : expect.not.objectContaining(args); - expect(migrator.migrateDocument).toHaveBeenNthCalledWith( - n, - obj, - expect.objectContaining({ - allowDowngrade: expect.any(Boolean), - }) - ); - }; - beforeEach(() => { pointInTimeFinderMock.mockClear(); client = elasticsearchClientMock.createElasticsearchClient(); @@ -175,3527 +67,6 @@ describe('SavedObjectsRepository', () => { mockGetSearchDsl.mockClear(); }); - // Setup migration mock for creating an object - const mockMigrationVersion = { foo: '2.3.4' }; - const mockMigrateDocument = (doc: SavedObjectUnsanitizedDoc) => ({ - ...doc, - attributes: { - ...doc.attributes, - ...(doc.attributes?.title && { title: `${doc.attributes.title}!!` }), - }, - migrationVersion: mockMigrationVersion, - managed: doc.managed ?? false, - references: [{ name: 'search_0', type: 'search', id: '123' }], - }); - - describe('#bulkGet', () => { - const obj1: SavedObject = { - type: 'config', - id: '6.0.0-alpha1', - attributes: { title: 'Testing' }, - references: [ - { - name: 'ref_0', - type: 'test', - id: '1', - }, - ], - originId: 'some-origin-id', // only one of the results has an originId, this is intentional to test both a positive and negative case - }; - const obj2: SavedObject = { - type: 'index-pattern', - id: 'logstash-*', - attributes: { title: 'Testing' }, - references: [ - { - name: 'ref_0', - type: 'test', - id: '2', - }, - ], - }; - const namespace = 'foo-namespace'; - - const _expectClientCallArgs = ( - objects: TypeIdTuple[], - { - _index = expect.any(String), - getId = () => expect.any(String), - }: { _index?: string; getId?: (type: string, id: string) => string } - ) => { - expect(client.mget).toHaveBeenCalledWith( - expect.objectContaining({ - body: { - docs: objects.map(({ type, id }) => - expect.objectContaining({ - _index, - _id: getId(type, id), - }) - ), - }, - }), - expect.anything() - ); - }; - - describe('client calls', () => { - it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { - const getId = (type: string, id: string) => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) - await bulkGetSuccess(client, repository, registry, [obj1, obj2], { namespace }); - _expectClientCallArgs([obj1, obj2], { getId }); - }); - - it(`prepends namespace to the id when providing namespaces for single-namespace type`, async () => { - const getId = (type: string, id: string) => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) - const objects = [obj1, obj2].map((obj) => ({ ...obj, namespaces: [namespace] })); - await bulkGetSuccess(client, repository, registry, objects, { namespace: 'some-other-ns' }); - _expectClientCallArgs([obj1, obj2], { getId }); - }); - - it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - await bulkGetSuccess(client, repository, registry, [obj1, obj2]); - _expectClientCallArgs([obj1, obj2], { getId }); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - await bulkGetSuccess(client, repository, registry, [obj1, obj2], { namespace: 'default' }); - _expectClientCallArgs([obj1, obj2], { getId }); - }); - - it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - let objects = [obj1, obj2].map((obj) => ({ ...obj, type: NAMESPACE_AGNOSTIC_TYPE })); - await bulkGetSuccess(client, repository, registry, objects, { namespace }); - _expectClientCallArgs(objects, { getId }); - - client.mget.mockClear(); - objects = [obj1, { ...obj2, namespaces: ['some-other-ns'] }].map((obj) => ({ - ...obj, - type: MULTI_NAMESPACE_ISOLATED_TYPE, - })); - await bulkGetSuccess(client, repository, registry, objects, { namespace }); - _expectClientCallArgs(objects, { getId }); - }); - }); - - describe('errors', () => { - const bulkGetError = async ( - obj: SavedObjectsBulkGetObject & { found?: boolean }, - isBulkError: boolean, - expectedErrorResult: ExpectedErrorResult - ) => { - let response; - if (isBulkError) { - // mock the bulk error for only the second object - mockGetBulkOperationError.mockReturnValueOnce(undefined); - mockGetBulkOperationError.mockReturnValueOnce(expectedErrorResult.error as Payload); - response = getMockMgetResponse(registry, [obj1, obj, obj2]); - } else { - response = getMockMgetResponse(registry, [obj1, obj2]); - } - client.mget.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - - const objects = [obj1, obj, obj2]; - const result = await bulkGet(repository, objects); - expect(client.mget).toHaveBeenCalled(); - expect(result).toEqual({ - saved_objects: [expectSuccess(obj1), expectedErrorResult, expectSuccess(obj2)], - }); - }; - - it(`throws when options.namespace is '*'`, async () => { - const obj = { type: 'dashboard', id: 'three' }; - await expect( - repository.bulkGet([obj], { namespace: ALL_NAMESPACES_STRING }) - ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); - }); - - it(`returns error when namespaces is used with a space-agnostic object`, async () => { - const obj = { type: NAMESPACE_AGNOSTIC_TYPE, id: 'three', namespaces: [] }; - await bulkGetError( - obj, - false, - expectErrorResult( - obj, - createBadRequestErrorPayload('"namespaces" cannot be used on space-agnostic types') - ) - ); - }); - - it(`returns error when namespaces is used with a space-isolated object and does not specify a single space`, async () => { - const doTest = async (objType: string, namespaces?: string[]) => { - const obj = { type: objType, id: 'three', namespaces }; - await bulkGetError( - obj, - false, - expectErrorResult( - obj, - createBadRequestErrorPayload( - '"namespaces" can only specify a single space when used with space-isolated types' - ) - ) - ); - }; - await doTest('dashboard', ['spacex', 'spacey']); - await doTest('dashboard', ['*']); - await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['spacex', 'spacey']); - await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['*']); - }); - - it(`returns error when type is invalid`, async () => { - const obj: SavedObjectsBulkGetObject = { type: 'unknownType', id: 'three' }; - await bulkGetError(obj, false, expectErrorInvalidType(obj)); - }); - - it(`returns error when type is hidden`, async () => { - const obj: SavedObjectsBulkGetObject = { type: HIDDEN_TYPE, id: 'three' }; - await bulkGetError(obj, false, expectErrorInvalidType(obj)); - }); - - it(`returns error when document is not found`, async () => { - const obj: SavedObjectsBulkGetObject & { found: boolean } = { - type: 'dashboard', - id: 'three', - found: false, - }; - await bulkGetError(obj, true, expectErrorNotFound(obj)); - }); - - it(`handles missing ids gracefully`, async () => { - const obj: SavedObjectsBulkGetObject & { found: boolean } = { - type: 'dashboard', - // @ts-expect-error id is undefined - id: undefined, - found: false, - }; - await bulkGetError(obj, true, expectErrorNotFound(obj)); - }); - - it(`returns error when type is multi-namespace and the document exists, but not in this namespace`, async () => { - const obj = { - type: MULTI_NAMESPACE_ISOLATED_TYPE, - id: 'three', - namespace: 'bar-namespace', - }; - await bulkGetError(obj, true, expectErrorNotFound(obj)); - }); - }); - - describe('returns', () => { - const expectSuccessResult = ( - { type, id }: TypeIdTuple, - doc: estypes.GetGetResult - ) => ({ - type, - id, - namespaces: doc._source!.namespaces ?? ['default'], - ...(doc._source!.originId && { originId: doc._source!.originId }), - ...(doc._source!.updated_at && { updated_at: doc._source!.updated_at }), - ...(doc._source!.created_at && { created_at: doc._source!.created_at }), - version: encodeHitVersion(doc), - attributes: doc._source![type], - references: doc._source!.references || [], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: expect.any(String), - managed: expect.any(Boolean), - }); - - it(`returns early for empty objects argument`, async () => { - const result = await bulkGet(repository, []); - expect(result).toEqual({ saved_objects: [] }); - expect(client.mget).not.toHaveBeenCalled(); - }); - - it(`formats the ES response`, async () => { - const response = getMockMgetResponse(registry, [obj1, obj2]); - client.mget.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - const result = await bulkGet(repository, [obj1, obj2]); - expect(client.mget).toHaveBeenCalledTimes(1); - expect(result).toEqual({ - saved_objects: [ - expectSuccessResult( - obj1, - response.docs[0] as estypes.GetGetResult - ), - expectSuccessResult( - obj2, - response.docs[1] as estypes.GetGetResult - ), - ], - }); - }); - - it(`handles a mix of successful gets and errors`, async () => { - const response = getMockMgetResponse(registry, [obj1, obj2]); - client.mget.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - const obj: SavedObject = { - type: 'unknownType', - id: 'three', - attributes: {}, - references: [], - }; - const result = await bulkGet(repository, [obj1, obj, obj2]); - expect(client.mget).toHaveBeenCalledTimes(1); - expect(result).toEqual({ - saved_objects: [ - expectSuccessResult( - obj1, - response.docs[0] as estypes.GetGetResult - ), - expectError(obj), - expectSuccessResult( - obj2, - response.docs[1] as estypes.GetGetResult - ), - ], - }); - }); - - it(`includes namespaces property for single-namespace and multi-namespace documents`, async () => { - const obj: SavedObject = { - type: MULTI_NAMESPACE_ISOLATED_TYPE, - id: 'three', - attributes: {}, - references: [], - }; - const { result } = await bulkGetSuccess(client, repository, registry, [obj1, obj]); - expect(result).toEqual({ - saved_objects: [ - expect.objectContaining({ namespaces: ['default'] }), - expect.objectContaining({ namespaces: expect.any(Array) }), - ], - }); - }); - - it('migrates the fetched documents', async () => { - const response = getMockMgetResponse(registry, [obj1, obj2]); - client.mget.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - migrator.migrateDocument.mockReturnValue( - 'migrated' as unknown as ReturnType - ); - - await expect(bulkGet(repository, [obj1, obj2])).resolves.toHaveProperty('saved_objects', [ - 'migrated', - 'migrated', - ]); - expect(migrator.migrateDocument).toHaveBeenCalledTimes(2); - expectMigrationArgs({ id: obj1.id }, true, 1); - expectMigrationArgs({ id: obj2.id }, true, 2); - }); - }); - }); - - describe('#bulkResolve', () => { - afterEach(() => { - mockInternalBulkResolve.mockReset(); - }); - - it('passes arguments to the internalBulkResolve module and returns the expected results', async () => { - mockInternalBulkResolve.mockResolvedValue({ - resolved_objects: [ - { - saved_object: { type: 'mock', id: 'mock-object', attributes: {}, references: [] }, - outcome: 'exactMatch', - }, - { - type: 'obj-type', - id: 'obj-id-2', - error: SavedObjectsErrorHelpers.createGenericNotFoundError('obj-type', 'obj-id-2'), - }, - ], - }); - - const objects = [ - { type: 'obj-type', id: 'obj-id-1' }, - { type: 'obj-type', id: 'obj-id-2' }, - ]; - await expect(repository.bulkResolve(objects)).resolves.toEqual({ - resolved_objects: [ - { - saved_object: { type: 'mock', id: 'mock-object', attributes: {}, references: [] }, - outcome: 'exactMatch', - }, - { - saved_object: { - type: 'obj-type', - id: 'obj-id-2', - error: { - error: 'Not Found', - message: 'Saved object [obj-type/obj-id-2] not found', - statusCode: 404, - }, - }, - outcome: 'exactMatch', - }, - ], - }); - expect(mockInternalBulkResolve).toHaveBeenCalledTimes(1); - expect(mockInternalBulkResolve).toHaveBeenCalledWith(expect.objectContaining({ objects })); - }); - - it('throws when internalBulkResolve throws', async () => { - const error = new Error('Oh no!'); - mockInternalBulkResolve.mockRejectedValue(error); - - await expect(repository.resolve('some-type', 'some-id')).rejects.toEqual(error); - }); - }); - - describe('#bulkDelete', () => { - const obj1: SavedObjectsBulkDeleteObject = { - type: 'config', - id: '6.0.0-alpha1', - }; - const obj2: SavedObjectsBulkDeleteObject = { - type: 'index-pattern', - id: 'logstash-*', - }; - - const namespace = 'foo-namespace'; - - const createNamespaceAwareGetId = (type: string, id: string) => - `${registry.isSingleNamespace(type) && namespace ? `${namespace}:` : ''}${type}:${id}`; - - // bulk delete calls only has one object for each source -- the action - const expectClientCallBulkDeleteArgsAction = ( - objects: TypeIdTuple[], - { - method, - _index = expect.any(String), - getId = () => expect.any(String), - overrides = {}, - }: { - method: string; - _index?: string; - getId?: (type: string, id: string) => string; - overrides?: Record; - } - ) => { - const body = []; - for (const { type, id } of objects) { - body.push({ - [method]: { - _index, - _id: getId(type, id), - ...overrides, - }, - }); - } - - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }; - - const createBulkDeleteFailStatus = ({ - type, - id, - error, - }: { - type: string; - id: string; - error?: ExpectedErrorResult['error']; - }) => ({ - type, - id, - success: false, - error: error ?? SavedObjectsErrorHelpers.createBadRequestError(), - }); - - // mocks a combination of success, error results for hidden and unknown object object types. - const repositoryBulkDeleteError = async ( - obj: SavedObjectsBulkDeleteObject, - isBulkError: boolean, - expectedErrorResult: ExpectedErrorResult - ) => { - const objects = [obj1, obj, obj2]; - const mockedBulkDeleteResponse = getMockEsBulkDeleteResponse(registry, objects); - if (isBulkError) { - mockGetBulkOperationError.mockReturnValueOnce(undefined); - mockGetBulkOperationError.mockReturnValueOnce(expectedErrorResult.error as Payload); - } - client.bulk.mockResponseOnce(mockedBulkDeleteResponse); - - const result = await repository.bulkDelete(objects); - expect(client.bulk).toHaveBeenCalled(); - expect(result).toEqual({ - statuses: [ - createBulkDeleteSuccessStatus(obj1), - createBulkDeleteFailStatus({ ...obj, error: expectedErrorResult.error }), - createBulkDeleteSuccessStatus(obj2), - ], - }); - }; - - const expectClientCallArgsAction = ( - objects: TypeIdTuple[], - { - method, - _index = expect.any(String), - getId = () => expect.any(String), - overrides = {}, - }: { - method: string; - _index?: string; - getId?: (type: string, id: string) => string; - overrides?: Record; - } - ) => { - const body = []; - for (const { type, id } of objects) { - body.push({ - [method]: { - _index, - _id: getId(type, id), - ...overrides, - }, - }); - } - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }; - - const bulkDeleteMultiNamespaceError = async ( - [obj1, _obj, obj2]: SavedObjectsBulkDeleteObject[], - options: SavedObjectsBulkDeleteOptions | undefined, - mgetResponse: estypes.MgetResponse, - mgetOptions?: { statusCode?: number } - ) => { - const getId = (type: string, id: string) => `${options?.namespace}:${type}:${id}`; - // mock the response for the not found doc - client.mget.mockResponseOnce(mgetResponse, { statusCode: mgetOptions?.statusCode }); - // get a mocked response for the valid docs - const bulkResponse = getMockEsBulkDeleteResponse(registry, [obj1, obj2], { namespace }); - client.bulk.mockResponseOnce(bulkResponse); - - const result = await repository.bulkDelete([obj1, _obj, obj2], options); - expect(client.bulk).toHaveBeenCalledTimes(1); - expect(client.mget).toHaveBeenCalledTimes(1); - - expectClientCallArgsAction([obj1, obj2], { method: 'delete', getId }); - expect(result).toEqual({ - statuses: [ - createBulkDeleteSuccessStatus(obj1), - { ...expectErrorNotFound(_obj), success: false }, - createBulkDeleteSuccessStatus(obj2), - ], - }); - }; - - beforeEach(() => { - mockDeleteLegacyUrlAliases.mockClear(); - mockDeleteLegacyUrlAliases.mockResolvedValue(); - }); - - describe('client calls', () => { - it(`should use the ES bulk action by default`, async () => { - await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); - expect(client.bulk).toHaveBeenCalled(); - }); - - it(`should use the ES mget action before bulk action for any types that are multi-namespace`, async () => { - const objects = [obj1, { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }]; - await bulkDeleteSuccess(client, repository, registry, objects); - expect(client.bulk).toHaveBeenCalled(); - expect(client.mget).toHaveBeenCalled(); - - const docs = [ - expect.objectContaining({ _id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${obj2.id}` }), - ]; - expect(client.mget).toHaveBeenCalledWith( - expect.objectContaining({ body: { docs } }), - expect.anything() - ); - }); - - it(`should not use the ES bulk action when there are no valid documents to delete`, async () => { - const objects = [obj1, obj2].map((x) => ({ ...x, type: 'unknownType' })); - await repository.bulkDelete(objects); - expect(client.bulk).toHaveBeenCalledTimes(0); - }); - - it(`formats the ES request`, async () => { - const getId = createNamespaceAwareGetId; - await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { namespace }); - expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); - }); - - it(`formats the ES request for any types that are multi-namespace`, async () => { - const _obj2 = { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }; - const getId = createNamespaceAwareGetId; - await bulkDeleteSuccess(client, repository, registry, [obj1, _obj2], { namespace }); - expectClientCallBulkDeleteArgsAction([obj1, _obj2], { method: 'delete', getId }); - }); - - it(`defaults to a refresh setting of wait_for`, async () => { - await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ refresh: 'wait_for' }), - expect.anything() - ); - }); - - it(`does not include the version of the existing document when not using a multi-namespace type`, async () => { - const objects = [obj1, { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE }]; - await bulkDeleteSuccess(client, repository, registry, objects); - expectClientCallBulkDeleteArgsAction(objects, { method: 'delete' }); - }); - - it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { - const getId = createNamespaceAwareGetId; - await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { namespace }); - expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); - }); - - it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; - await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); - expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; - await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { - namespace: 'default', - }); - expectClientCallBulkDeleteArgsAction([obj1, obj2], { method: 'delete', getId }); - }); - - it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; // not expecting namespace prefix; - const _obj1 = { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }; - const _obj2 = { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }; - - await bulkDeleteSuccess(client, repository, registry, [_obj1, _obj2], { namespace }); - expectClientCallBulkDeleteArgsAction([_obj1, _obj2], { method: 'delete', getId }); - }); - }); - - describe('legacy URL aliases', () => { - it(`doesn't delete legacy URL aliases for single-namespace object types`, async () => { - await bulkDeleteSuccess(client, repository, registry, [obj1, obj2]); - expect(mockDeleteLegacyUrlAliases).not.toHaveBeenCalled(); - }); - - it(`deletes legacy URL aliases for multi-namespace object types (all spaces)`, async () => { - const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; - const internalOptions = { - mockMGetResponseObjects: [ - { - ...testObject, - initialNamespaces: [ALL_NAMESPACES_STRING], - }, - ], - }; - await bulkDeleteSuccess( - client, - repository, - registry, - [testObject], - { namespace, force: true }, - internalOptions - ); - expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( - expect.objectContaining({ - type: MULTI_NAMESPACE_TYPE, - id: testObject.id, - namespaces: [], - deleteBehavior: 'exclusive', - }) - ); - }); - - it(`deletes legacy URL aliases for multi-namespace object types (specific space)`, async () => { - const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; - const internalOptions = { - mockMGetResponseObjects: [ - { - ...testObject, - initialNamespaces: [namespace], - }, - ], - }; - // specifically test against the current namespace - await bulkDeleteSuccess( - client, - repository, - registry, - [testObject], - { namespace }, - internalOptions - ); - expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( - expect.objectContaining({ - type: MULTI_NAMESPACE_TYPE, - id: testObject.id, - namespaces: [namespace], - deleteBehavior: 'inclusive', - }) - ); - }); - - it(`deletes legacy URL aliases for multi-namespace object types shared to many specific spaces`, async () => { - const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; - const initialTestObjectNamespaces = [namespace, 'bar-namespace']; - const internalOptions = { - mockMGetResponseObjects: [ - { - ...testObject, - initialNamespaces: initialTestObjectNamespaces, - }, - ], - }; - // specifically test against named spaces ('*' is handled specifically, this assures we also take care of named spaces) - await bulkDeleteSuccess( - client, - repository, - registry, - [testObject], - { namespace, force: true }, - internalOptions - ); - expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( - expect.objectContaining({ - type: MULTI_NAMESPACE_TYPE, - id: testObject.id, - namespaces: initialTestObjectNamespaces, - deleteBehavior: 'inclusive', - }) - ); - }); - - it(`logs a message when deleteLegacyUrlAliases returns an error`, async () => { - const testObject = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: obj1.id }; - - client.mget.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise( - getMockMgetResponse(registry, [testObject], namespace) - ) - ); - const mockedBulkResponse = getMockEsBulkDeleteResponse(registry, [testObject], { - namespace, - }); - client.bulk.mockResolvedValueOnce(mockedBulkResponse); - - mockDeleteLegacyUrlAliases.mockRejectedValueOnce(new Error('Oh no!')); - - await repository.bulkDelete([testObject], { namespace }); - - expect(client.mget).toHaveBeenCalledTimes(1); - expect(logger.error).toHaveBeenCalledTimes(1); - expect(logger.error).toHaveBeenCalledWith( - 'Unable to delete aliases when deleting an object: Oh no!' - ); - }); - }); - - describe('errors', () => { - it(`throws an error when options.namespace is '*'`, async () => { - await expect( - repository.bulkDelete([obj1], { namespace: ALL_NAMESPACES_STRING }) - ).rejects.toThrowError( - SavedObjectsErrorHelpers.createBadRequestError('"options.namespace" cannot be "*"') - ); - }); - - it(`throws an error when client bulk response is not defined`, async () => { - client.mget.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise( - getMockMgetResponse(registry, [obj1], namespace) - ) - ); - const mockedBulkResponse = undefined; - // we have to cast here to test the assumption we always get a response. - client.bulk.mockResponseOnce(mockedBulkResponse as unknown as estypes.BulkResponse); - await expect(repository.bulkDelete([obj1], { namespace })).rejects.toThrowError( - 'Unexpected error in bulkDelete saved objects: bulkDeleteResponse is undefined' - ); - }); - - it(`returns an error for the object when the object's type is invalid`, async () => { - const unknownObjType = { ...obj1, type: 'unknownType' }; - await repositoryBulkDeleteError( - unknownObjType, - false, - expectErrorInvalidType(unknownObjType) - ); - }); - - it(`returns an error for an object when the object's type is hidden`, async () => { - const hiddenObject = { ...obj1, type: HIDDEN_TYPE }; - await repositoryBulkDeleteError(hiddenObject, false, expectErrorInvalidType(hiddenObject)); - }); - - it(`returns an error when ES is unable to find the document during mget`, async () => { - const notFoundObj = { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, found: false }; - const mgetResponse = getMockMgetResponse(registry, [notFoundObj], namespace); - await bulkDeleteMultiNamespaceError([obj1, notFoundObj, obj2], { namespace }, mgetResponse); - }); - - it(`returns an error when ES is unable to find the index during mget`, async () => { - const notFoundObj = { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, found: false }; - await bulkDeleteMultiNamespaceError( - [obj1, notFoundObj, obj2], - { namespace }, - {} as estypes.MgetResponse, - { - statusCode: 404, - } - ); - }); - - it(`returns an error when the type is multi-namespace and the document exists, but not in this namespace`, async () => { - const obj = { - type: MULTI_NAMESPACE_ISOLATED_TYPE, - id: 'three', - namespace: 'bar-namespace', - }; - const mgetResponse = getMockMgetResponse(registry, [obj], namespace); - await bulkDeleteMultiNamespaceError([obj1, obj, obj2], { namespace }, mgetResponse); - }); - - it(`returns an error when the type is multi-namespace and the document has multiple namespaces and the force option is not enabled`, async () => { - const testObject = { ...obj1, type: MULTI_NAMESPACE_TYPE }; - const internalOptions = { - mockMGetResponseObjects: [ - { - ...testObject, - initialNamespaces: [namespace, 'bar-namespace'], - }, - ], - }; - const result = await bulkDeleteSuccess( - client, - repository, - registry, - [testObject], - { namespace }, - internalOptions - ); - expect(result.statuses[0]).toStrictEqual( - createBulkDeleteFailStatus({ - ...testObject, - error: createBadRequestErrorPayload( - 'Unable to delete saved object that exists in multiple namespaces, use the `force` option to delete it anyway' - ), - }) - ); - }); - - it(`returns an error when the type is multi-namespace and the document has all namespaces and the force option is not enabled`, async () => { - const testObject = { ...obj1, type: ALL_NAMESPACES_STRING }; - const internalOptions = { - mockMGetResponseObjects: [ - { - ...testObject, - initialNamespaces: [namespace, 'bar-namespace'], - }, - ], - }; - const result = await bulkDeleteSuccess( - client, - repository, - registry, - [testObject], - { namespace }, - internalOptions - ); - expect(result.statuses[0]).toStrictEqual( - createBulkDeleteFailStatus({ - ...testObject, - error: createBadRequestErrorPayload("Unsupported saved object type: '*'"), - }) - ); - }); - }); - - describe('returns', () => { - it(`returns early for empty objects argument`, async () => { - await repository.bulkDelete([], { namespace }); - expect(client.bulk).toHaveBeenCalledTimes(0); - }); - - it(`formats the ES response`, async () => { - const response = await bulkDeleteSuccess(client, repository, registry, [obj1, obj2], { - namespace, - }); - expect(response).toEqual({ - statuses: [obj1, obj2].map(createBulkDeleteSuccessStatus), - }); - }); - - it(`handles a mix of successful deletes and errors`, async () => { - const notFoundObj = { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, found: false }; - await bulkDeleteMultiNamespaceError( - [obj1, notFoundObj, obj2], - { namespace }, - {} as estypes.MgetResponse, - { statusCode: 404 } - ); - }); - }); - }); - - describe('#checkConflicts', () => { - const obj1 = { type: 'dashboard', id: 'one' }; - const obj2 = { type: 'dashboard', id: 'two' }; - const obj3 = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: 'three' }; - const obj4 = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: 'four' }; - const obj5 = { type: MULTI_NAMESPACE_ISOLATED_TYPE, id: 'five' }; - const obj6 = { type: NAMESPACE_AGNOSTIC_TYPE, id: 'six' }; - const obj7 = { type: NAMESPACE_AGNOSTIC_TYPE, id: 'seven' }; - const namespace = 'foo-namespace'; - - const _expectClientCallArgs = ( - objects: TypeIdTuple[], - { - _index = expect.any(String), - getId = () => expect.any(String), - }: { _index?: string; getId?: (type: string, id: string) => string } - ) => { - expect(client.mget).toHaveBeenCalledWith( - expect.objectContaining({ - body: { - docs: objects.map(({ type, id }) => - expect.objectContaining({ - _index, - _id: getId(type, id), - }) - ), - }, - }), - expect.anything() - ); - }; - - describe('client calls', () => { - it(`doesn't make a cluster call if the objects array is empty`, async () => { - await checkConflicts(repository, []); - expect(client.mget).not.toHaveBeenCalled(); - }); - - it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { - const getId = (type: string, id: string) => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) - await checkConflictsSuccess(client, repository, registry, [obj1, obj2], { namespace }); - _expectClientCallArgs([obj1, obj2], { getId }); - }); - - it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - await checkConflictsSuccess(client, repository, registry, [obj1, obj2]); - _expectClientCallArgs([obj1, obj2], { getId }); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - await checkConflictsSuccess(client, repository, registry, [obj1, obj2], { - namespace: 'default', - }); - _expectClientCallArgs([obj1, obj2], { getId }); - }); - - it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { - const getId = (type: string, id: string) => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - // obj3 is multi-namespace, and obj6 is namespace-agnostic - await checkConflictsSuccess(client, repository, registry, [obj3, obj6], { namespace }); - _expectClientCallArgs([obj3, obj6], { getId }); - }); - }); - - describe('errors', () => { - it(`throws when options.namespace is '*'`, async () => { - await expect( - repository.checkConflicts([obj1], { namespace: ALL_NAMESPACES_STRING }) - ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); - }); - }); - - describe('returns', () => { - it(`expected results`, async () => { - const unknownTypeObj = { type: 'unknownType', id: 'three' }; - const hiddenTypeObj = { type: HIDDEN_TYPE, id: 'three' }; - const objects = [unknownTypeObj, hiddenTypeObj, obj1, obj2, obj3, obj4, obj5, obj6, obj7]; - const response = { - docs: [ - getMockGetResponse(registry, obj1), - { found: false }, - getMockGetResponse(registry, obj3), - getMockGetResponse(registry, { ...obj4, namespace: 'bar-namespace' }), - { found: false }, - getMockGetResponse(registry, obj6), - { found: false }, - ], - } as estypes.MgetResponse; - client.mget.mockResolvedValue( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - - const result = await checkConflicts(repository, objects); - expect(client.mget).toHaveBeenCalledTimes(1); - expect(result).toEqual({ - errors: [ - { ...unknownTypeObj, error: createUnsupportedTypeErrorPayload(unknownTypeObj.type) }, - { ...hiddenTypeObj, error: createUnsupportedTypeErrorPayload(hiddenTypeObj.type) }, - { ...obj1, error: createConflictErrorPayload(obj1.type, obj1.id) }, - // obj2 was not found so it does not result in a conflict error - { ...obj3, error: createConflictErrorPayload(obj3.type, obj3.id) }, - { - ...obj4, - error: { - ...createConflictErrorPayload(obj4.type, obj4.id), - metadata: { isNotOverwritable: true }, - }, - }, - // obj5 was not found so it does not result in a conflict error - { ...obj6, error: createConflictErrorPayload(obj6.type, obj6.id) }, - // obj7 was not found so it does not result in a conflict error - ], - }); - }); - }); - }); - - describe('#create', () => { - beforeEach(() => { - mockPreflightCheckForCreate.mockReset(); - mockPreflightCheckForCreate.mockImplementation(({ objects }) => { - return Promise.resolve(objects.map(({ type, id }) => ({ type, id }))); // respond with no errors by default - }); - client.create.mockResponseImplementation((params) => { - return { - body: { - _id: params.id, - ...mockVersionProps, - } as estypes.CreateResponse, - }; - }); - }); - - const type = 'index-pattern'; - const attributes = { title: 'Logstash' }; - const id = 'logstash-*'; - const namespace = 'foo-namespace'; - const references = [ - { - name: 'ref_0', - type: 'test', - id: '123', - }, - ]; - - const createSuccess = async ( - type: string, - attributes: T, - options?: SavedObjectsCreateOptions - ) => { - return await repository.create(type, attributes, options); - }; - - describe('client calls', () => { - it(`should use the ES index action if ID is not defined`, async () => { - await createSuccess(type, attributes, { overwrite: true }); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.index).toHaveBeenCalled(); - }); - - it(`should use the ES index action if ID is not defined and a doc has managed=true`, async () => { - await createSuccess(type, attributes, { overwrite: true, managed: true }); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.index).toHaveBeenCalled(); - }); - - it(`should use the ES index action if ID is not defined and a doc has managed=false`, async () => { - await createSuccess(type, attributes, { overwrite: true, managed: false }); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.index).toHaveBeenCalled(); - }); - - it(`should use the ES create action if ID is not defined and overwrite=false`, async () => { - await createSuccess(type, attributes); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.create).toHaveBeenCalled(); - }); - - it(`should use the ES create action if ID is not defined, overwrite=false and a doc has managed=true`, async () => { - await createSuccess(type, attributes, { managed: true }); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.create).toHaveBeenCalled(); - }); - - it(`should use the ES create action if ID is not defined, overwrite=false and a doc has managed=false`, async () => { - await createSuccess(type, attributes, { managed: false }); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.create).toHaveBeenCalled(); - }); - - it(`should use the ES index with version if ID and version are defined and overwrite=true`, async () => { - await createSuccess(type, attributes, { id, overwrite: true, version: mockVersion }); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.index).toHaveBeenCalled(); - expect(client.index.mock.calls[0][0]).toMatchObject({ - if_seq_no: mockVersionProps._seq_no, - if_primary_term: mockVersionProps._primary_term, - }); - }); - - it(`should use the ES create action if ID is defined and overwrite=false`, async () => { - await createSuccess(type, attributes, { id }); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.create).toHaveBeenCalled(); - }); - - it(`should use the preflightCheckForCreate action then create action if type is multi-namespace, ID is defined, and overwrite=false`, async () => { - await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { id }); - expect(mockPreflightCheckForCreate).toHaveBeenCalled(); - expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( - expect.objectContaining({ - objects: [ - { type: MULTI_NAMESPACE_TYPE, id, overwrite: false, namespaces: ['default'] }, - ], - }) - ); - expect(client.create).toHaveBeenCalled(); - }); - - it(`should use the preflightCheckForCreate action then index action if type is multi-namespace, ID is defined, and overwrite=true`, async () => { - await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id, overwrite: true }); - expect(mockPreflightCheckForCreate).toHaveBeenCalled(); - expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( - expect.objectContaining({ - objects: [ - { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, overwrite: true, namespaces: ['default'] }, - ], - }) - ); - expect(client.index).toHaveBeenCalled(); - }); - - it(`defaults to empty references array`, async () => { - await createSuccess(type, attributes, { id }); - expect( - (client.create.mock.calls[0][0] as estypes.CreateRequest).body! - .references - ).toEqual([]); - }); - - it(`accepts custom references array`, async () => { - const test = async (references: SavedObjectReference[]) => { - await createSuccess(type, attributes, { id, references }); - expect( - (client.create.mock.calls[0][0] as estypes.CreateRequest) - .body!.references - ).toEqual(references); - client.create.mockClear(); - }; - await test(references); - await test([{ type: 'type', id: 'id', name: 'some ref' }]); - await test([]); - }); - - it(`doesn't accept custom references if not an array`, async () => { - const test = async (references: unknown) => { - // @ts-expect-error references is unknown - await createSuccess(type, attributes, { id, references }); - expect( - (client.create.mock.calls[0][0] as estypes.CreateRequest) - .body!.references - ).not.toBeDefined(); - client.create.mockClear(); - }; - await test('string'); - await test(123); - await test(true); - await test(null); - }); - - describe('originId', () => { - for (const objType of [type, NAMESPACE_AGNOSTIC_TYPE]) { - it(`throws an error if originId is set for non-multi-namespace type`, async () => { - await expect( - repository.create(objType, attributes, { originId: 'some-originId' }) - ).rejects.toThrowError( - createBadRequestErrorPayload( - '"originId" can only be set for multi-namespace object types' - ) - ); - }); - } - - for (const objType of [MULTI_NAMESPACE_TYPE, MULTI_NAMESPACE_ISOLATED_TYPE]) { - it(`${objType} defaults to no originId`, async () => { - await createSuccess(objType, attributes, { id }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.not.objectContaining({ originId: expect.anything() }), - }), - expect.anything() - ); - }); - - describe(`${objType} with existing originId`, () => { - beforeEach(() => { - mockPreflightCheckForCreate.mockImplementation(({ objects }) => { - const existingDocument = { - _source: { originId: 'existing-originId' }, - } as SavedObjectsRawDoc; - return Promise.resolve( - objects.map(({ type, id }) => ({ type, id, existingDocument })) - ); - }); - }); - - it(`accepts custom originId for multi-namespace type`, async () => { - // The preflight result has `existing-originId`, but that is discarded - await createSuccess(objType, attributes, { id, originId: 'some-originId' }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ originId: 'some-originId' }), - }), - expect.anything() - ); - }); - - it(`accepts undefined originId`, async () => { - // The preflight result has `existing-originId`, but that is discarded - await createSuccess(objType, attributes, { id, originId: undefined }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.not.objectContaining({ originId: expect.anything() }), - }), - expect.anything() - ); - }); - - it(`preserves existing originId if originId option is not set`, async () => { - await createSuccess(objType, attributes, { id }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ originId: 'existing-originId' }), - }), - expect.anything() - ); - }); - }); - } - }); - - it(`defaults to a refresh setting of wait_for`, async () => { - await createSuccess(type, attributes); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ refresh: 'wait_for' }), - expect.anything() - ); - }); - - it(`should use default index`, async () => { - await createSuccess(type, attributes, { id }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ index: '.kibana-test_8.0.0-testing' }), - expect.anything() - ); - }); - - it(`should use custom index`, async () => { - await createSuccess(CUSTOM_INDEX_TYPE, attributes, { id }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ index: 'custom_8.0.0-testing' }), - expect.anything() - ); - }); - - it(`self-generates an id if none is provided`, async () => { - await createSuccess(type, attributes); - expect(client.create).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - id: expect.objectContaining(/index-pattern:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}/), - }), - expect.anything() - ); - await createSuccess(type, attributes, { id: '' }); - expect(client.create).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - id: expect.objectContaining(/index-pattern:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}/), - }), - expect.anything() - ); - }); - - it(`prepends namespace to the id and adds namespace to the body when providing namespace for single-namespace type`, async () => { - await createSuccess(type, attributes, { id, namespace }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${namespace}:${type}:${id}`, - body: expect.objectContaining({ namespace }), - }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id or add namespace to the body when providing no namespace for single-namespace type`, async () => { - await createSuccess(type, attributes, { id }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${type}:${id}`, - body: expect.not.objectContaining({ namespace: expect.anything() }), - }), - expect.anything() - ); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - await createSuccess(type, attributes, { id, namespace: 'default' }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${type}:${id}`, - body: expect.not.objectContaining({ namespace: expect.anything() }), - }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id and adds namespaces to body when using multi-namespace type`, async () => { - // first object does not have an existing document to overwrite - await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { id, namespace }); - mockPreflightCheckForCreate.mockResolvedValueOnce([ - { - type: MULTI_NAMESPACE_TYPE, - id, - existingDocument: { - _id: id, - _source: { type: MULTI_NAMESPACE_TYPE, namespaces: ['*'] }, - }, // second object does have an existing document to overwrite - }, - ]); - await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { - id, - namespace, - overwrite: true, - }); - - expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(2); - expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - objects: [ - { type: MULTI_NAMESPACE_TYPE, id, overwrite: false, namespaces: [namespace] }, - ], - }) - ); - expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - objects: [ - { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, overwrite: true, namespaces: [namespace] }, - ], - }) - ); - - expect(client.create).toHaveBeenCalledTimes(1); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${MULTI_NAMESPACE_TYPE}:${id}`, - body: expect.objectContaining({ namespaces: [namespace] }), - }), - expect.anything() - ); - expect(client.index).toHaveBeenCalledTimes(1); - expect(client.index).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, - body: expect.objectContaining({ namespaces: ['*'] }), - }), - expect.anything() - ); - }); - - it(`adds initialNamespaces instead of namespace`, async () => { - const ns2 = 'bar-namespace'; - const ns3 = 'baz-namespace'; - // first object does not get passed in to preflightCheckForCreate at all - await repository.create('dashboard', attributes, { - id, - namespace, - initialNamespaces: [ns2], - }); - // second object does not have an existing document to overwrite - await repository.create(MULTI_NAMESPACE_TYPE, attributes, { - id, - namespace, - initialNamespaces: [ns2, ns3], - }); - mockPreflightCheckForCreate.mockResolvedValueOnce([ - { - type: MULTI_NAMESPACE_ISOLATED_TYPE, - id, - existingDocument: { - _id: id, - _source: { type: MULTI_NAMESPACE_ISOLATED_TYPE, namespaces: ['something-else'] }, - }, // third object does have an existing document to overwrite - }, - ]); - await repository.create(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { - id, - namespace, - initialNamespaces: [ns2], - overwrite: true, - }); - - expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(2); - expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - objects: [{ type: MULTI_NAMESPACE_TYPE, id, overwrite: false, namespaces: [ns2, ns3] }], - }) - ); - expect(mockPreflightCheckForCreate).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - objects: [ - { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, overwrite: true, namespaces: [ns2] }, - ], - }) - ); - - expect(client.create).toHaveBeenCalledTimes(2); - expect(client.create).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - id: `${ns2}:dashboard:${id}`, - body: expect.objectContaining({ namespace: ns2 }), - }), - expect.anything() - ); - expect(client.create).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - id: `${MULTI_NAMESPACE_TYPE}:${id}`, - body: expect.objectContaining({ namespaces: [ns2, ns3] }), - }), - expect.anything() - ); - expect(client.index).toHaveBeenCalledTimes(1); - expect(client.index).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, - body: expect.objectContaining({ namespaces: [ns2] }), - }), - expect.anything() - ); - }); - - it(`normalizes initialNamespaces from 'default' to undefined`, async () => { - await repository.create('dashboard', attributes, { - id, - namespace, - initialNamespaces: ['default'], - }); - - expect(client.create).toHaveBeenCalledTimes(1); - expect(client.create).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - id: `dashboard:${id}`, - body: expect.not.objectContaining({ namespace: 'default' }), - }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id or add namespace or namespaces fields when using namespace-agnostic type`, async () => { - await createSuccess(NAMESPACE_AGNOSTIC_TYPE, attributes, { id, namespace }); - expect(client.create).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}`, - body: expect.not.objectContaining({ - namespace: expect.anything(), - namespaces: expect.anything(), - }), - }), - expect.anything() - ); - }); - }); - - describe('errors', () => { - it(`throws when options.initialNamespaces is used with a space-agnostic object`, async () => { - await expect( - repository.create(NAMESPACE_AGNOSTIC_TYPE, attributes, { - initialNamespaces: [namespace], - }) - ).rejects.toThrowError( - createBadRequestErrorPayload('"initialNamespaces" cannot be used on space-agnostic types') - ); - }); - - it(`throws when options.initialNamespaces is empty`, async () => { - await expect( - repository.create(MULTI_NAMESPACE_TYPE, attributes, { initialNamespaces: [] }) - ).rejects.toThrowError( - createBadRequestErrorPayload('"initialNamespaces" must be a non-empty array of strings') - ); - }); - - it(`throws when options.initialNamespaces is used with a space-isolated object and does not specify a single space`, async () => { - const doTest = async (objType: string, initialNamespaces?: string[]) => { - await expect( - repository.create(objType, attributes, { initialNamespaces }) - ).rejects.toThrowError( - createBadRequestErrorPayload( - '"initialNamespaces" can only specify a single space when used with space-isolated types' - ) - ); - }; - await doTest('dashboard', ['spacex', 'spacey']); - await doTest('dashboard', ['*']); - await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['spacex', 'spacey']); - await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['*']); - }); - - it(`throws when options.namespace is '*'`, async () => { - await expect( - repository.create(type, attributes, { namespace: ALL_NAMESPACES_STRING }) - ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); - }); - - it(`throws when type is invalid`, async () => { - await expect(repository.create('unknownType', attributes)).rejects.toThrowError( - createUnsupportedTypeErrorPayload('unknownType') - ); - expect(client.create).not.toHaveBeenCalled(); - }); - - it(`throws when type is hidden`, async () => { - await expect(repository.create(HIDDEN_TYPE, attributes)).rejects.toThrowError( - createUnsupportedTypeErrorPayload(HIDDEN_TYPE) - ); - expect(client.create).not.toHaveBeenCalled(); - }); - - it(`throws when schema validation fails`, async () => { - await expect( - repository.create('dashboard', { title: 123 }) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"[attributes.title]: expected value of type [string] but got [number]: Bad Request"` - ); - expect(client.create).not.toHaveBeenCalled(); - }); - - it(`throws when there is a conflict from preflightCheckForCreate`, async () => { - mockPreflightCheckForCreate.mockResolvedValueOnce([ - { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, error: { type: 'unresolvableConflict' } }, // error type and metadata dont matter - ]); - await expect( - repository.create(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { - id, - overwrite: true, - namespace, - }) - ).rejects.toThrowError(createConflictErrorPayload(MULTI_NAMESPACE_ISOLATED_TYPE, id)); - expect(mockPreflightCheckForCreate).toHaveBeenCalled(); - }); - - it.todo(`throws when automatic index creation fails`); - - it.todo(`throws when an unexpected failure occurs`); - }); - - describe('migration', () => { - beforeEach(() => { - migrator.migrateDocument.mockImplementation(mockMigrateDocument); - }); - - it(`migrates a document and serializes the migrated doc`, async () => { - const migrationVersion = mockMigrationVersion; - const coreMigrationVersion = '8.0.0'; - const managed = false; - await createSuccess(type, attributes, { - id, - references, - migrationVersion, - coreMigrationVersion, - managed, - }); - const doc = { - type, - id, - attributes, - references, - managed, - migrationVersion, - coreMigrationVersion, - ...mockTimestampFieldsWithCreated, - }; - expectMigrationArgs(doc); - - const migratedDoc = migrator.migrateDocument(doc); - expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); - }); - - it(`migrates a document, adds managed=false and serializes the migrated doc`, async () => { - const migrationVersion = mockMigrationVersion; - const coreMigrationVersion = '8.0.0'; - await createSuccess(type, attributes, { - id, - references, - migrationVersion, - coreMigrationVersion, - managed: undefined, - }); - const doc = { - type, - id, - attributes, - references, - managed: undefined, - migrationVersion, - coreMigrationVersion, - ...mockTimestampFieldsWithCreated, - }; - expectMigrationArgs({ ...doc, managed: false }); - - const migratedDoc = migrator.migrateDocument(doc); - expect(migratedDoc.managed).toBe(false); - expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); - }); - - it(`migrates a document, does not change managed=true to managed=false and serializes the migrated doc`, async () => { - const migrationVersion = mockMigrationVersion; - const coreMigrationVersion = '8.0.0'; - await createSuccess(type, attributes, { - id, - references, - migrationVersion, - coreMigrationVersion, - managed: true, - }); - const doc = { - type, - id, - attributes, - references, - managed: true, - migrationVersion, - coreMigrationVersion, - ...mockTimestampFieldsWithCreated, - }; - expectMigrationArgs(doc); - - const migratedDoc = migrator.migrateDocument(doc); - expect(migratedDoc.managed).toBe(true); - expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); - }); - - it(`adds namespace to body when providing namespace for single-namespace type`, async () => { - await createSuccess(type, attributes, { id, namespace }); - expectMigrationArgs({ namespace }); - }); - - it(`doesn't add namespace to body when providing no namespace for single-namespace type`, async () => { - await createSuccess(type, attributes, { id }); - expectMigrationArgs({ namespace: expect.anything() }, false); - }); - - it(`doesn't add namespace to body when not using single-namespace type`, async () => { - await createSuccess(NAMESPACE_AGNOSTIC_TYPE, attributes, { id, namespace }); - expectMigrationArgs({ namespace: expect.anything() }, false, 1); - - client.create.mockClear(); - await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id }); - expectMigrationArgs({ namespace: expect.anything() }, false, 2); - }); - - it(`adds namespaces to body when providing namespace for multi-namespace type`, async () => { - await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id, namespace }); - expectMigrationArgs({ namespaces: [namespace] }); - }); - - it(`adds default namespaces to body when providing no namespace for multi-namespace type`, async () => { - await createSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, attributes, { id }); - expectMigrationArgs({ namespaces: ['default'] }); - }); - - it(`doesn't add namespaces to body when not using multi-namespace type`, async () => { - await createSuccess(type, attributes, { id }); - expectMigrationArgs({ namespaces: expect.anything() }, false, 1); - - client.create.mockClear(); - await createSuccess(NAMESPACE_AGNOSTIC_TYPE, attributes, { id }); - expectMigrationArgs({ namespaces: expect.anything() }, false, 2); - }); - }); - - describe('returns', () => { - it(`formats the ES response`, async () => { - const result = await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { - id, - namespace, - references, - }); - expect(result).toEqual({ - type: MULTI_NAMESPACE_TYPE, - id, - ...mockTimestampFieldsWithCreated, - version: mockVersion, - attributes, - references, - namespaces: [namespace ?? 'default'], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '1.1.1', - managed: false, - }); - }); - it(`allows setting 'managed' to true`, async () => { - const result = await createSuccess(MULTI_NAMESPACE_TYPE, attributes, { - id, - namespace, - references, - managed: true, - }); - expect(result).toEqual({ - type: MULTI_NAMESPACE_TYPE, - id, - ...mockTimestampFieldsWithCreated, - version: mockVersion, - attributes, - references, - namespaces: [namespace ?? 'default'], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '1.1.1', - managed: true, - }); - }); - }); - }); - - describe('#delete', () => { - const type = 'index-pattern'; - const id = 'logstash-*'; - const namespace = 'foo-namespace'; - - beforeEach(() => { - mockDeleteLegacyUrlAliases.mockClear(); - mockDeleteLegacyUrlAliases.mockResolvedValue(); - }); - - describe('client calls', () => { - it(`should use the ES delete action when not using a multi-namespace type`, async () => { - await deleteSuccess(client, repository, registry, type, id); - expect(client.get).not.toHaveBeenCalled(); - expect(client.delete).toHaveBeenCalledTimes(1); - }); - - it(`should use ES get action then delete action when using a multi-namespace type`, async () => { - await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id); - expect(client.get).toHaveBeenCalledTimes(1); - expect(client.delete).toHaveBeenCalledTimes(1); - }); - - it(`does not includes the version of the existing document when using a multi-namespace type`, async () => { - await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id); - const versionProperties = { - if_seq_no: mockVersionProps._seq_no, - if_primary_term: mockVersionProps._primary_term, - }; - expect(client.delete).toHaveBeenCalledWith( - expect.not.objectContaining(versionProperties), - expect.anything() - ); - }); - - it(`defaults to a refresh setting of wait_for`, async () => { - await deleteSuccess(client, repository, registry, type, id); - expect(client.delete).toHaveBeenCalledWith( - expect.objectContaining({ refresh: 'wait_for' }), - expect.anything() - ); - }); - - it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { - await deleteSuccess(client, repository, registry, type, id, { namespace }); - expect(client.delete).toHaveBeenCalledWith( - expect.objectContaining({ id: `${namespace}:${type}:${id}` }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { - await deleteSuccess(client, repository, registry, type, id); - expect(client.delete).toHaveBeenCalledWith( - expect.objectContaining({ id: `${type}:${id}` }), - expect.anything() - ); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - await deleteSuccess(client, repository, registry, type, id, { namespace: 'default' }); - expect(client.delete).toHaveBeenCalledWith( - expect.objectContaining({ id: `${type}:${id}` }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { - await deleteSuccess(client, repository, registry, NAMESPACE_AGNOSTIC_TYPE, id, { - namespace, - }); - expect(client.delete).toHaveBeenCalledWith( - expect.objectContaining({ id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}` }), - expect.anything() - ); - - client.delete.mockClear(); - await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id, { - namespace, - }); - expect(client.delete).toHaveBeenCalledWith( - expect.objectContaining({ id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}` }), - expect.anything() - ); - }); - }); - - describe('legacy URL aliases', () => { - it(`doesn't delete legacy URL aliases for single-namespace object types`, async () => { - await deleteSuccess(client, repository, registry, type, id, { namespace }); - expect(mockDeleteLegacyUrlAliases).not.toHaveBeenCalled(); - }); - - // We intentionally do not include a test case for a multi-namespace object with a "not found" preflight result, because that throws - // an error (without deleting aliases) and we already have a test case for that - - it(`deletes legacy URL aliases for multi-namespace object types (all spaces)`, async () => { - const internalOptions = { - mockGetResponseValue: getMockGetResponse( - registry, - { type: MULTI_NAMESPACE_TYPE, id }, - ALL_NAMESPACES_STRING - ), - }; - await deleteSuccess( - client, - repository, - registry, - MULTI_NAMESPACE_TYPE, - id, - { namespace, force: true }, - internalOptions - ); - expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( - expect.objectContaining({ - type: MULTI_NAMESPACE_TYPE, - id, - namespaces: [], - deleteBehavior: 'exclusive', - }) - ); - }); - - it(`deletes legacy URL aliases for multi-namespace object types (specific spaces)`, async () => { - await deleteSuccess(client, repository, registry, MULTI_NAMESPACE_TYPE, id, { namespace }); // this function mocks a preflight response with the given namespace by default - expect(mockDeleteLegacyUrlAliases).toHaveBeenCalledWith( - expect.objectContaining({ - type: MULTI_NAMESPACE_TYPE, - id, - namespaces: [namespace], - deleteBehavior: 'inclusive', - }) - ); - }); - - it(`logs a message when deleteLegacyUrlAliases returns an error`, async () => { - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise( - getMockGetResponse(registry, { type: MULTI_NAMESPACE_ISOLATED_TYPE, id, namespace }) - ) - ); - client.delete.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - result: 'deleted', - } as estypes.DeleteResponse) - ); - mockDeleteLegacyUrlAliases.mockRejectedValueOnce(new Error('Oh no!')); - await repository.delete(MULTI_NAMESPACE_ISOLATED_TYPE, id, { namespace }); - expect(client.get).toHaveBeenCalledTimes(1); - expect(logger.error).toHaveBeenCalledTimes(1); - expect(logger.error).toHaveBeenCalledWith( - 'Unable to delete aliases when deleting an object: Oh no!' - ); - }); - }); - - describe('errors', () => { - const expectNotFoundError = async ( - type: string, - id: string, - options?: SavedObjectsDeleteOptions - ) => { - await expect(repository.delete(type, id, options)).rejects.toThrowError( - createGenericNotFoundErrorPayload(type, id) - ); - }; - - it(`throws when options.namespace is '*'`, async () => { - await expect( - repository.delete(type, id, { namespace: ALL_NAMESPACES_STRING }) - ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); - }); - - it(`throws when type is invalid`, async () => { - await expectNotFoundError('unknownType', id); - expect(client.delete).not.toHaveBeenCalled(); - }); - - it(`throws when type is hidden`, async () => { - await expectNotFoundError(HIDDEN_TYPE, id); - expect(client.delete).not.toHaveBeenCalled(); - }); - - it(`throws when ES is unable to find the document during get`, async () => { - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - found: false, - } as estypes.GetResponse) - ); - await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`throws when ES is unable to find the index during get`, async () => { - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({} as estypes.GetResponse, { - statusCode: 404, - }) - ); - await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`throws when the type is multi-namespace and the document exists, but not in this namespace`, async () => { - const response = getMockGetResponse( - registry, - { type: MULTI_NAMESPACE_ISOLATED_TYPE, id }, - namespace - ); - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id, { - namespace: 'bar-namespace', - }); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`throws when the type is multi-namespace and the document has multiple namespaces and the force option is not enabled`, async () => { - const response = getMockGetResponse(registry, { - type: MULTI_NAMESPACE_ISOLATED_TYPE, - id, - namespace, - }); - response._source!.namespaces = [namespace, 'bar-namespace']; - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - await expect( - repository.delete(MULTI_NAMESPACE_ISOLATED_TYPE, id, { namespace }) - ).rejects.toThrowError( - 'Unable to delete saved object that exists in multiple namespaces, use the `force` option to delete it anyway' - ); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`throws when the type is multi-namespace and the document has all namespaces and the force option is not enabled`, async () => { - const response = getMockGetResponse(registry, { - type: MULTI_NAMESPACE_ISOLATED_TYPE, - id, - namespace, - }); - response._source!.namespaces = ['*']; - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - await expect( - repository.delete(MULTI_NAMESPACE_ISOLATED_TYPE, id, { namespace }) - ).rejects.toThrowError( - 'Unable to delete saved object that exists in multiple namespaces, use the `force` option to delete it anyway' - ); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`throws when ES is unable to find the document during delete`, async () => { - client.delete.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - result: 'not_found', - } as estypes.DeleteResponse) - ); - await expectNotFoundError(type, id); - expect(client.delete).toHaveBeenCalledTimes(1); - }); - - it(`throws when ES is unable to find the index during delete`, async () => { - client.delete.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - // @elastic/elasticsearch doesn't declare error on DeleteResponse - error: { type: 'index_not_found_exception' }, - } as unknown as estypes.DeleteResponse) - ); - await expectNotFoundError(type, id); - expect(client.delete).toHaveBeenCalledTimes(1); - }); - - it(`throws when ES returns an unexpected response`, async () => { - client.delete.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - result: 'something unexpected' as estypes.Result, - } as estypes.DeleteResponse) - ); - await expect(repository.delete(type, id)).rejects.toThrowError( - 'Unexpected Elasticsearch DELETE response' - ); - expect(client.delete).toHaveBeenCalledTimes(1); - }); - }); - - describe('returns', () => { - it(`returns an empty object on success`, async () => { - const result = await deleteSuccess(client, repository, registry, type, id); - expect(result).toEqual({}); - }); - }); - }); - - describe('#deleteByNamespace', () => { - const namespace = 'foo-namespace'; - const mockUpdateResults = { - took: 15, - timed_out: false, - total: 3, - updated: 2, - deleted: 1, - batches: 1, - version_conflicts: 0, - noops: 0, - retries: { bulk: 0, search: 0 }, - throttled_millis: 0, - requests_per_second: -1.0, - throttled_until_millis: 0, - failures: [], - }; - - const deleteByNamespaceSuccess = async ( - namespace: string, - options?: SavedObjectsDeleteByNamespaceOptions - ) => { - client.updateByQuery.mockResponseOnce(mockUpdateResults); - const result = await repository.deleteByNamespace(namespace, options); - expect(mockGetSearchDsl).toHaveBeenCalledTimes(1); - expect(client.updateByQuery).toHaveBeenCalledTimes(1); - return result; - }; - - describe('client calls', () => { - it(`should use the ES updateByQuery action`, async () => { - await deleteByNamespaceSuccess(namespace); - expect(client.updateByQuery).toHaveBeenCalledTimes(1); - }); - - it(`should use all indices for types that are not namespace-agnostic`, async () => { - await deleteByNamespaceSuccess(namespace); - expect(client.updateByQuery).toHaveBeenCalledWith( - expect.objectContaining({ - index: ['.kibana-test_8.0.0-testing', 'custom_8.0.0-testing'], - }), - expect.anything() - ); - }); - }); - - describe('errors', () => { - it(`throws when namespace is not a string or is '*'`, async () => { - const test = async (namespace: unknown) => { - // @ts-expect-error namespace is unknown - await expect(repository.deleteByNamespace(namespace)).rejects.toThrowError( - `namespace is required, and must be a string` - ); - expect(client.updateByQuery).not.toHaveBeenCalled(); - }; - await test(undefined); - await test(['namespace']); - await test(123); - await test(true); - await test(ALL_NAMESPACES_STRING); - }); - }); - - describe('returns', () => { - it(`returns the query results on success`, async () => { - const result = await deleteByNamespaceSuccess(namespace); - expect(result).toEqual(mockUpdateResults); - }); - }); - - describe('search dsl', () => { - it(`constructs a query using all multi-namespace types, and another using all single-namespace types`, async () => { - await deleteByNamespaceSuccess(namespace); - const allTypes = registry.getAllTypes().map((type) => type.name); - expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { - namespaces: [namespace], - type: [ - ...allTypes.filter((type) => !registry.isNamespaceAgnostic(type)), - LEGACY_URL_ALIAS_TYPE, - ], - kueryNode: expect.anything(), - }); - }); - }); - }); - - describe('#removeReferencesTo', () => { - const type = 'type'; - const id = 'id'; - const defaultOptions = {}; - const updatedCount = 42; - - describe('client calls', () => { - it('should use the ES updateByQuery action', async () => { - await removeReferencesToSuccess(client, repository, type, id); - expect(client.updateByQuery).toHaveBeenCalledTimes(1); - }); - - it('uses the correct default `refresh` value', async () => { - await removeReferencesToSuccess(client, repository, type, id); - expect(client.updateByQuery).toHaveBeenCalledWith( - expect.objectContaining({ - refresh: true, - }), - expect.any(Object) - ); - }); - - it('merges output of getSearchDsl into es request body', async () => { - const query = { query: 1, aggregations: 2 }; - mockGetSearchDsl.mockReturnValue(query); - await removeReferencesToSuccess(client, repository, type, id, { type }); - - expect(client.updateByQuery).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ ...query }), - }), - expect.anything() - ); - }); - - it('should set index to all known SO indices on the request', async () => { - await removeReferencesToSuccess(client, repository, type, id); - expect(client.updateByQuery).toHaveBeenCalledWith( - expect.objectContaining({ - index: ['.kibana-test_8.0.0-testing', 'custom_8.0.0-testing'], - }), - expect.anything() - ); - }); - - it('should use the `refresh` option in the request', async () => { - const refresh = Symbol(); - - await removeReferencesToSuccess(client, repository, type, id, { refresh }); - expect(client.updateByQuery).toHaveBeenCalledWith( - expect.objectContaining({ - refresh, - }), - expect.anything() - ); - }); - - it('should pass the correct parameters to the update script', async () => { - await removeReferencesToSuccess(client, repository, type, id); - expect(client.updateByQuery).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ - script: expect.objectContaining({ - params: { - type, - id, - }, - }), - }), - }), - expect.anything() - ); - }); - }); - - describe('search dsl', () => { - it(`passes mappings and registry to getSearchDsl`, async () => { - await removeReferencesToSuccess(client, repository, type, id); - expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, expect.anything()); - }); - - it('passes namespace to getSearchDsl', async () => { - await removeReferencesToSuccess(client, repository, type, id, { namespace: 'some-ns' }); - expect(mockGetSearchDsl).toHaveBeenCalledWith( - mappings, - registry, - expect.objectContaining({ - namespaces: ['some-ns'], - }) - ); - }); - - it('passes hasReference to getSearchDsl', async () => { - await removeReferencesToSuccess(client, repository, type, id); - expect(mockGetSearchDsl).toHaveBeenCalledWith( - mappings, - registry, - expect.objectContaining({ - hasReference: { - type, - id, - }, - }) - ); - }); - - it('passes all known types to getSearchDsl', async () => { - await removeReferencesToSuccess(client, repository, type, id); - expect(mockGetSearchDsl).toHaveBeenCalledWith( - mappings, - registry, - expect.objectContaining({ - type: registry.getAllTypes().map((type) => type.name), - }) - ); - }); - }); - - describe('returns', () => { - it('returns the updated count from the ES response', async () => { - const response = await removeReferencesToSuccess(client, repository, type, id); - expect(response.updated).toBe(updatedCount); - }); - }); - - describe('errors', () => { - it(`throws when ES returns failures`, async () => { - client.updateByQuery.mockResponseOnce({ - updated: 7, - failures: [ - { id: 'failure' } as estypes.BulkIndexByScrollFailure, - { id: 'another-failure' } as estypes.BulkIndexByScrollFailure, - ], - }); - - await expect(repository.removeReferencesTo(type, id, defaultOptions)).rejects.toThrowError( - createConflictErrorPayload(type, id) - ); - }); - }); - }); - - describe('#find', () => { - const type = 'index-pattern'; - const namespace = 'foo-namespace'; - - describe('client calls', () => { - it(`should use the ES search action`, async () => { - await findSuccess(client, repository, { type }); - expect(client.search).toHaveBeenCalledTimes(1); - }); - - it(`merges output of getSearchDsl into es request body`, async () => { - const query = { query: 1, aggregations: 2 }; - mockGetSearchDsl.mockReturnValue(query); - await findSuccess(client, repository, { type }); - - expect(client.search).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ ...query }), - }), - expect.anything() - ); - }); - - it(`accepts per_page/page`, async () => { - await findSuccess(client, repository, { type, perPage: 10, page: 6 }); - expect(client.search).toHaveBeenCalledWith( - expect.objectContaining({ - size: 10, - from: 50, - }), - expect.anything() - ); - }); - - it(`accepts preference`, async () => { - await findSuccess(client, repository, { type, preference: 'pref' }); - expect(client.search).toHaveBeenCalledWith( - expect.objectContaining({ - preference: 'pref', - }), - expect.anything() - ); - }); - - it(`can filter by fields`, async () => { - await findSuccess(client, repository, { type, fields: ['title'] }); - expect(client.search).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ - _source: [ - `${type}.title`, - 'namespace', - 'namespaces', - 'type', - 'references', - 'migrationVersion', - 'coreMigrationVersion', - 'typeMigrationVersion', - 'managed', - 'updated_at', - 'created_at', - 'originId', - ], - }), - }), - expect.anything() - ); - }); - - it(`should set rest_total_hits_as_int to true on a request`, async () => { - await findSuccess(client, repository, { type }); - expect(client.search).toHaveBeenCalledWith( - expect.objectContaining({ - rest_total_hits_as_int: true, - }), - expect.anything() - ); - }); - - it(`should not make a client call when attempting to find only invalid or hidden types`, async () => { - const test = async (types: string | string[]) => { - await repository.find({ type: types }); - expect(client.search).not.toHaveBeenCalled(); - }; - - await test('unknownType'); - await test(HIDDEN_TYPE); - await test(['unknownType', HIDDEN_TYPE]); - }); - }); - - describe('errors', () => { - it(`throws when type is not defined`, async () => { - // @ts-expect-error type should be defined - await expect(repository.find({})).rejects.toThrowError( - 'options.type must be a string or an array of strings' - ); - expect(client.search).not.toHaveBeenCalled(); - }); - - it(`throws when namespaces is an empty array`, async () => { - await expect(repository.find({ type: 'foo', namespaces: [] })).rejects.toThrowError( - 'options.namespaces cannot be an empty array' - ); - expect(client.search).not.toHaveBeenCalled(); - }); - - it(`throws when searchFields is defined but not an array`, async () => { - await expect( - // @ts-expect-error searchFields is an array - repository.find({ type, searchFields: 'string' }) - ).rejects.toThrowError('options.searchFields must be an array'); - expect(client.search).not.toHaveBeenCalled(); - }); - - it(`throws when fields is defined but not an array`, async () => { - // @ts-expect-error fields is an array - await expect(repository.find({ type, fields: 'string' })).rejects.toThrowError( - 'options.fields must be an array' - ); - expect(client.search).not.toHaveBeenCalled(); - }); - - it(`throws when a preference is provided with pit`, async () => { - await expect( - repository.find({ type: 'foo', pit: { id: 'abc123' }, preference: 'hi' }) - ).rejects.toThrowError('options.preference must be excluded when options.pit is used'); - expect(client.search).not.toHaveBeenCalled(); - }); - - it(`throws when KQL filter syntax is invalid`, async () => { - const findOpts: SavedObjectsFindOptions = { - namespaces: [namespace], - search: 'foo*', - searchFields: ['foo'], - type: ['dashboard'], - sortField: 'name', - sortOrder: 'desc', - defaultSearchOperator: 'AND', - hasReference: { - type: 'foo', - id: '1', - }, - filter: 'dashboard.attributes.otherField:<', - }; - - await expect(repository.find(findOpts)).rejects.toMatchInlineSnapshot(` - [Error: KQLSyntaxError: Expected "(", "{", value, whitespace but "<" found. - dashboard.attributes.otherField:< - --------------------------------^: Bad Request] - `); - expect(mockGetSearchDsl).not.toHaveBeenCalled(); - expect(client.search).not.toHaveBeenCalled(); - }); - }); - - describe('returns', () => { - it(`formats the ES response when there is no namespace`, async () => { - const noNamespaceSearchResults = generateIndexPatternSearchResults(); - client.search.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(noNamespaceSearchResults) - ); - const count = noNamespaceSearchResults.hits.hits.length; - - const response = await repository.find({ type }); - - expect(response.total).toBe(count); - expect(response.saved_objects).toHaveLength(count); - - noNamespaceSearchResults.hits.hits.forEach((doc, i) => { - expect(response.saved_objects[i]).toEqual({ - id: doc._id.replace(/(index-pattern|config|globalType)\:/, ''), - type: doc._source!.type, - originId: doc._source!.originId, - ...mockTimestampFields, - version: mockVersion, - score: doc._score, - attributes: doc._source![doc._source!.type], - references: [], - namespaces: doc._source!.type === NAMESPACE_AGNOSTIC_TYPE ? undefined : ['default'], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: expect.any(String), - managed: expect.any(Boolean), - }); - }); - }); - - it(`formats the ES response when there is a namespace`, async () => { - const namespacedSearchResults = generateIndexPatternSearchResults(namespace); - client.search.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(namespacedSearchResults) - ); - const count = namespacedSearchResults.hits.hits.length; - - const response = await repository.find({ type, namespaces: [namespace] }); - - expect(response.total).toBe(count); - expect(response.saved_objects).toHaveLength(count); - - namespacedSearchResults.hits.hits.forEach((doc, i) => { - expect(response.saved_objects[i]).toEqual({ - id: doc._id.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), - type: doc._source!.type, - originId: doc._source!.originId, - ...mockTimestampFields, - version: mockVersion, - score: doc._score, - attributes: doc._source![doc._source!.type], - references: [], - namespaces: doc._source!.type === NAMESPACE_AGNOSTIC_TYPE ? undefined : [namespace], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: expect.any(String), - managed: expect.any(Boolean), - }); - }); - }); - - it(`should return empty results when attempting to find only invalid or hidden types`, async () => { - const test = async (types: string | string[]) => { - const result = await repository.find({ type: types }); - expect(result).toEqual(expect.objectContaining({ saved_objects: [] })); - expect(client.search).not.toHaveBeenCalled(); - }; - - await test('unknownType'); - await test(HIDDEN_TYPE); - await test(['unknownType', HIDDEN_TYPE]); - }); - - it('migrates the found document', async () => { - const noNamespaceSearchResults = generateIndexPatternSearchResults(); - client.search.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(noNamespaceSearchResults) - ); - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); - await expect(repository.find({ type })).resolves.toHaveProperty( - 'saved_objects.0.migrated', - true - ); - expect(migrator.migrateDocument).toHaveBeenCalledTimes( - noNamespaceSearchResults.hits.hits.length - ); - expectMigrationArgs({ - type, - id: noNamespaceSearchResults.hits.hits[0]._id.replace( - /(index-pattern|config|globalType)\:/, - '' - ), - }); - }); - }); - - describe('search dsl', () => { - const commonOptions: SavedObjectsFindOptions = { - type: [type], - namespaces: [namespace], - search: 'foo*', - searchFields: ['foo'], - sortField: 'name', - sortOrder: 'desc', - defaultSearchOperator: 'AND', - hasReference: { - type: 'foo', - id: '1', - }, - hasNoReference: { - type: 'bar', - id: '1', - }, - }; - - it(`passes mappings, registry, and search options to getSearchDsl`, async () => { - await findSuccess(client, repository, commonOptions, namespace); - expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, commonOptions); - }); - - it(`accepts hasReferenceOperator`, async () => { - const relevantOpts: SavedObjectsFindOptions = { - ...commonOptions, - hasReferenceOperator: 'AND', - }; - - await findSuccess(client, repository, relevantOpts, namespace); - expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { - ...relevantOpts, - hasReferenceOperator: 'AND', - }); - }); - - it(`accepts searchAfter`, async () => { - const relevantOpts: SavedObjectsFindOptions = { - ...commonOptions, - searchAfter: ['1', 'a'], - }; - - await findSuccess(client, repository, relevantOpts, namespace); - expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { - ...relevantOpts, - searchAfter: ['1', 'a'], - }); - }); - - it(`accepts pit`, async () => { - const relevantOpts: SavedObjectsFindOptions = { - ...commonOptions, - pit: { id: 'abc123', keepAlive: '2m' }, - }; - - await findSuccess(client, repository, relevantOpts, namespace); - expect(mockGetSearchDsl).toHaveBeenCalledWith(mappings, registry, { - ...relevantOpts, - pit: { id: 'abc123', keepAlive: '2m' }, - }); - }); - - it(`accepts KQL expression filter and passes KueryNode to getSearchDsl`, async () => { - const findOpts: SavedObjectsFindOptions = { - namespaces: [namespace], - search: 'foo*', - searchFields: ['foo'], - type: ['dashboard'], - sortField: 'name', - sortOrder: 'desc', - defaultSearchOperator: 'AND', - hasReference: { - type: 'foo', - id: '1', - }, - filter: 'dashboard.attributes.otherField: *', - }; - - await findSuccess(client, repository, findOpts, namespace); - const { kueryNode } = mockGetSearchDsl.mock.calls[0][2]; - expect(kueryNode).toMatchInlineSnapshot(` - Object { - "arguments": Array [ - Object { - "isQuoted": false, - "type": "literal", - "value": "dashboard.otherField", - }, - Object { - "type": "wildcard", - "value": "@kuery-wildcard@", - }, - ], - "function": "is", - "type": "function", - } - `); - }); - - it(`accepts KQL KueryNode filter and passes KueryNode to getSearchDsl`, async () => { - const findOpts: SavedObjectsFindOptions = { - namespaces: [namespace], - search: 'foo*', - searchFields: ['foo'], - type: ['dashboard'], - sortField: 'name', - sortOrder: 'desc', - defaultSearchOperator: 'AND', - hasReference: { - type: 'foo', - id: '1', - }, - filter: nodeTypes.function.buildNode('is', `dashboard.attributes.otherField`, '*'), - }; - - await findSuccess(client, repository, findOpts, namespace); - const { kueryNode } = mockGetSearchDsl.mock.calls[0][2]; - expect(kueryNode).toMatchInlineSnapshot(` - Object { - "arguments": Array [ - Object { - "isQuoted": false, - "type": "literal", - "value": "dashboard.otherField", - }, - Object { - "type": "wildcard", - "value": "@kuery-wildcard@", - }, - ], - "function": "is", - "type": "function", - } - `); - }); - - it(`supports multiple types`, async () => { - const types = ['config', 'index-pattern']; - await findSuccess(client, repository, { type: types }); - - expect(mockGetSearchDsl).toHaveBeenCalledWith( - mappings, - registry, - expect.objectContaining({ - type: types, - }) - ); - }); - - it(`filters out invalid types`, async () => { - const types = ['config', 'unknownType', 'index-pattern']; - await findSuccess(client, repository, { type: types }); - - expect(mockGetSearchDsl).toHaveBeenCalledWith( - mappings, - registry, - expect.objectContaining({ - type: ['config', 'index-pattern'], - }) - ); - }); - - it(`filters out hidden types`, async () => { - const types = ['config', HIDDEN_TYPE, 'index-pattern']; - await findSuccess(client, repository, { type: types }); - - expect(mockGetSearchDsl).toHaveBeenCalledWith( - mappings, - registry, - expect.objectContaining({ - type: ['config', 'index-pattern'], - }) - ); - }); - }); - }); - - describe('#get', () => { - const type = 'index-pattern'; - const id = 'logstash-*'; - const namespace = 'foo-namespace'; - const originId = 'some-origin-id'; - - describe('client calls', () => { - it(`should use the ES get action`, async () => { - await getSuccess(client, repository, registry, type, id); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { - await getSuccess(client, repository, registry, type, id, { namespace }); - expect(client.get).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${namespace}:${type}:${id}`, - }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { - await getSuccess(client, repository, registry, type, id); - expect(client.get).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${type}:${id}`, - }), - expect.anything() - ); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - await getSuccess(client, repository, registry, type, id, { namespace: 'default' }); - expect(client.get).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${type}:${id}`, - }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { - await getSuccess(client, repository, registry, NAMESPACE_AGNOSTIC_TYPE, id, { namespace }); - expect(client.get).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}`, - }), - expect.anything() - ); - - client.get.mockClear(); - await getSuccess(client, repository, registry, MULTI_NAMESPACE_ISOLATED_TYPE, id, { - namespace, - }); - expect(client.get).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, - }), - expect.anything() - ); - }); - }); - - describe('errors', () => { - const expectNotFoundError = async ( - type: string, - id: string, - options?: SavedObjectsBaseOptions - ) => { - await expect(repository.get(type, id, options)).rejects.toThrowError( - createGenericNotFoundErrorPayload(type, id) - ); - }; - - it(`throws when options.namespace is '*'`, async () => { - await expect( - repository.get(type, id, { namespace: ALL_NAMESPACES_STRING }) - ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); - }); - - it(`throws when type is invalid`, async () => { - await expectNotFoundError('unknownType', id); - expect(client.get).not.toHaveBeenCalled(); - }); - - it(`throws when type is hidden`, async () => { - await expectNotFoundError(HIDDEN_TYPE, id); - expect(client.get).not.toHaveBeenCalled(); - }); - - it(`throws when ES is unable to find the document during get`, async () => { - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - found: false, - } as estypes.GetResponse) - ); - await expectNotFoundError(type, id); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`throws when ES is unable to find the index during get`, async () => { - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({} as estypes.GetResponse, { - statusCode: 404, - }) - ); - await expectNotFoundError(type, id); - expect(client.get).toHaveBeenCalledTimes(1); - }); - - it(`throws when type is multi-namespace and the document exists, but not in this namespace`, async () => { - const response = getMockGetResponse( - registry, - { type: MULTI_NAMESPACE_ISOLATED_TYPE, id }, - namespace - ); - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - await expectNotFoundError(MULTI_NAMESPACE_ISOLATED_TYPE, id, { - namespace: 'bar-namespace', - }); - expect(client.get).toHaveBeenCalledTimes(1); - }); - }); - - describe('returns', () => { - it(`formats the ES response`, async () => { - const result = await getSuccess(client, repository, registry, type, id); - expect(result).toEqual({ - id, - type, - updated_at: mockTimestamp, - version: mockVersion, - attributes: { - title: 'Testing', - }, - references: [], - namespaces: ['default'], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: expect.any(String), - managed: expect.any(Boolean), - }); - }); - - it(`includes namespaces if type is multi-namespace`, async () => { - const result = await getSuccess( - client, - repository, - registry, - MULTI_NAMESPACE_ISOLATED_TYPE, - id - ); - expect(result).toMatchObject({ - namespaces: expect.any(Array), - }); - }); - - it(`include namespaces if type is not multi-namespace`, async () => { - const result = await getSuccess(client, repository, registry, type, id); - expect(result).toMatchObject({ - namespaces: ['default'], - }); - }); - - it(`includes originId property if present in cluster call response`, async () => { - const result = await getSuccess(client, repository, registry, type, id, {}, originId); - expect(result).toMatchObject({ originId }); - }); - }); - - it('migrates the fetched document', async () => { - migrator.migrateDocument.mockReturnValueOnce( - 'migrated' as unknown as ReturnType - ); - await expect(getSuccess(client, repository, registry, type, id)).resolves.toBe('migrated'); - expect(migrator.migrateDocument).toHaveBeenCalledTimes(1); - expectMigrationArgs({ - id, - type, - }); - }); - }); - - describe('#resolve', () => { - afterEach(() => { - mockInternalBulkResolve.mockReset(); - }); - - it('passes arguments to the internalBulkResolve module and returns the result', async () => { - const expectedResult: SavedObjectsResolveResponse = { - saved_object: { type: 'type', id: 'id', attributes: {}, references: [] }, - outcome: 'exactMatch', - }; - mockInternalBulkResolve.mockResolvedValue({ resolved_objects: [expectedResult] }); - - await expect(repository.resolve('obj-type', 'obj-id')).resolves.toEqual(expectedResult); - expect(mockInternalBulkResolve).toHaveBeenCalledTimes(1); - expect(mockInternalBulkResolve).toHaveBeenCalledWith( - expect.objectContaining({ objects: [{ type: 'obj-type', id: 'obj-id' }] }) - ); - }); - - it('throws when internalBulkResolve result is an error', async () => { - const error = SavedObjectsErrorHelpers.decorateBadRequestError(new Error('Oh no!')); - const expectedResult: BulkResolveError = { type: 'obj-type', id: 'obj-id', error }; - mockInternalBulkResolve.mockResolvedValue({ resolved_objects: [expectedResult] }); - - await expect(repository.resolve('foo', '2')).rejects.toEqual(error); - }); - - it('throws when internalBulkResolve throws', async () => { - const error = new Error('Oh no!'); - mockInternalBulkResolve.mockRejectedValue(error); - - await expect(repository.resolve('foo', '2')).rejects.toEqual(error); - }); - }); - - describe('#incrementCounter', () => { - const type = 'config'; - const id = 'one'; - const counterFields = ['buildNum', 'apiCallsCount']; - const namespace = 'foo-namespace'; - const originId = 'some-origin-id'; - - const incrementCounterSuccess = async ( - type: string, - id: string, - fields: Array, - options?: SavedObjectsIncrementCounterOptions, - internalOptions: { mockGetResponseValue?: estypes.GetResponse } = {} - ) => { - const { mockGetResponseValue } = internalOptions; - const isMultiNamespace = registry.isMultiNamespace(type); - if (isMultiNamespace) { - const response = - mockGetResponseValue ?? getMockGetResponse(registry, { type, id }, options?.namespace); - client.get.mockResponseOnce(response); - } - - client.update.mockResponseImplementation((params) => { - return { - body: { - _id: params.id, - ...mockVersionProps, - _index: MAIN_SAVED_OBJECT_INDEX, - get: { - found: true, - _source: { - type, - ...mockTimestampFields, - [type]: { - ...fields.reduce((acc, field) => { - acc[typeof field === 'string' ? field : field.fieldName] = 8468; - return acc; - }, {} as Record), - defaultIndex: 'logstash-*', - }, - }, - }, - } as estypes.UpdateResponse, - }; - }); - - const result = await repository.incrementCounter(type, id, fields, options); - expect(client.get).toHaveBeenCalledTimes(isMultiNamespace ? 1 : 0); - return result; - }; - - beforeEach(() => { - mockPreflightCheckForCreate.mockReset(); - mockPreflightCheckForCreate.mockImplementation(({ objects }) => { - return Promise.resolve(objects.map(({ type, id }) => ({ type, id }))); // respond with no errors by default - }); - }); - - describe('client calls', () => { - it(`should use the ES update action if type is not multi-namespace`, async () => { - await incrementCounterSuccess(type, id, counterFields, { namespace }); - expect(client.get).not.toHaveBeenCalled(); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.update).toHaveBeenCalledTimes(1); - }); - - it(`should use the ES get action then update action if type is multi-namespace, ID is defined, and overwrite=true`, async () => { - await incrementCounterSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { - namespace, - }); - expect(client.get).toHaveBeenCalledTimes(1); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.update).toHaveBeenCalledTimes(1); - }); - - it(`should check for alias conflicts if a new multi-namespace object would be created`, async () => { - await incrementCounterSuccess( - MULTI_NAMESPACE_ISOLATED_TYPE, - id, - counterFields, - { namespace }, - { mockGetResponseValue: { found: false } as estypes.GetResponse } - ); - expect(client.get).toHaveBeenCalledTimes(1); - expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); - expect(client.update).toHaveBeenCalledTimes(1); - }); - - it(`defaults to a refresh setting of wait_for`, async () => { - await incrementCounterSuccess(type, id, counterFields, { namespace }); - expect(client.update).toHaveBeenCalledWith( - expect.objectContaining({ - refresh: 'wait_for', - }), - expect.anything() - ); - }); - - it(`uses the 'upsertAttributes' option when specified`, async () => { - const upsertAttributes = { - foo: 'bar', - hello: 'dolly', - }; - await incrementCounterSuccess(type, id, counterFields, { namespace, upsertAttributes }); - expect(client.update).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ - upsert: expect.objectContaining({ - [type]: { - foo: 'bar', - hello: 'dolly', - ...counterFields.reduce((aggs, field) => { - return { - ...aggs, - [field]: 1, - }; - }, {}), - }, - }), - }), - }), - expect.anything() - ); - }); - - it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { - await incrementCounterSuccess(type, id, counterFields, { namespace }); - expect(client.update).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${namespace}:${type}:${id}`, - }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { - await incrementCounterSuccess(type, id, counterFields); - expect(client.update).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${type}:${id}`, - }), - expect.anything() - ); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - await incrementCounterSuccess(type, id, counterFields, { namespace: 'default' }); - expect(client.update).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${type}:${id}`, - }), - expect.anything() - ); - }); - - it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { - await incrementCounterSuccess(NAMESPACE_AGNOSTIC_TYPE, id, counterFields, { namespace }); - expect(client.update).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${NAMESPACE_AGNOSTIC_TYPE}:${id}`, - }), - expect.anything() - ); - - client.update.mockClear(); - await incrementCounterSuccess(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { - namespace, - }); - expect(client.update).toHaveBeenCalledWith( - expect.objectContaining({ - id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${id}`, - }), - expect.anything() - ); - }); - }); - - describe('errors', () => { - const expectUnsupportedTypeError = async ( - type: string, - id: string, - field: Array - ) => { - await expect(repository.incrementCounter(type, id, field)).rejects.toThrowError( - createUnsupportedTypeErrorPayload(type) - ); - }; - - it(`throws when options.namespace is '*'`, async () => { - await expect( - repository.incrementCounter(type, id, counterFields, { - namespace: ALL_NAMESPACES_STRING, - }) - ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); - }); - - it(`throws when type is not a string`, async () => { - const test = async (type: unknown) => { - await expect( - // @ts-expect-error type is supposed to be a string - repository.incrementCounter(type, id, counterFields) - ).rejects.toThrowError(`"type" argument must be a string`); - expect(client.update).not.toHaveBeenCalled(); - }; - - await test(null); - await test(42); - await test(false); - await test({}); - }); - - it(`throws when id is empty`, async () => { - await expect(repository.incrementCounter(type, '', counterFields)).rejects.toThrowError( - createBadRequestErrorPayload('id cannot be empty') - ); - expect(client.update).not.toHaveBeenCalled(); - }); - - it(`throws when counterField is not CounterField type`, async () => { - const test = async (field: unknown[]) => { - await expect( - // @ts-expect-error field is of wrong type - repository.incrementCounter(type, id, field) - ).rejects.toThrowError( - `"counterFields" argument must be of type Array` - ); - expect(client.update).not.toHaveBeenCalled(); - }; - - await test([null]); - await test([42]); - await test([false]); - await test([{}]); - await test([{}, false, 42, null, 'string']); - await test([{ fieldName: 'string' }, false, null, 'string']); - }); - - it(`throws when type is invalid`, async () => { - await expectUnsupportedTypeError('unknownType', id, counterFields); - expect(client.update).not.toHaveBeenCalled(); - }); - - it(`throws when type is hidden`, async () => { - await expectUnsupportedTypeError(HIDDEN_TYPE, id, counterFields); - expect(client.update).not.toHaveBeenCalled(); - }); - - it(`throws when there is a conflict with an existing multi-namespace saved object (get)`, async () => { - const response = getMockGetResponse( - registry, - { type: MULTI_NAMESPACE_ISOLATED_TYPE, id }, - 'bar-namespace' - ); - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(response) - ); - await expect( - repository.incrementCounter(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { - namespace, - }) - ).rejects.toThrowError(createConflictErrorPayload(MULTI_NAMESPACE_ISOLATED_TYPE, id)); - expect(client.get).toHaveBeenCalledTimes(1); - expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); - expect(client.update).not.toHaveBeenCalled(); - }); - - it(`throws when there is an alias conflict from preflightCheckForCreate`, async () => { - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - found: false, - } as estypes.GetResponse) - ); - mockPreflightCheckForCreate.mockResolvedValue([ - { type: 'foo', id: 'bar', error: { type: 'aliasConflict' } }, - ]); - await expect( - repository.incrementCounter(MULTI_NAMESPACE_ISOLATED_TYPE, id, counterFields, { - namespace, - }) - ).rejects.toThrowError(createConflictErrorPayload(MULTI_NAMESPACE_ISOLATED_TYPE, id)); - expect(client.get).toHaveBeenCalledTimes(1); - expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); - expect(client.update).not.toHaveBeenCalled(); - }); - - it(`does not throw when there is a different error from preflightCheckForCreate`, async () => { - client.get.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - found: false, - } as estypes.GetResponse) - ); - mockPreflightCheckForCreate.mockResolvedValue([ - { type: 'foo', id: 'bar', error: { type: 'conflict' } }, - ]); - await incrementCounterSuccess( - MULTI_NAMESPACE_ISOLATED_TYPE, - id, - counterFields, - { namespace }, - { mockGetResponseValue: { found: false } as estypes.GetResponse } - ); - expect(client.get).toHaveBeenCalledTimes(1); - expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); - expect(client.update).toHaveBeenCalledTimes(1); - }); - }); - - describe('migration', () => { - beforeEach(() => { - migrator.migrateDocument.mockImplementation(mockMigrateDocument); - }); - - it(`migrates a document and serializes the migrated doc`, async () => { - const migrationVersion = mockMigrationVersion; - await incrementCounterSuccess(type, id, counterFields, { migrationVersion }); - const attributes = { buildNum: 1, apiCallsCount: 1 }; // this is added by the incrementCounter function - const doc = { type, id, attributes, migrationVersion, ...mockTimestampFields }; - expectMigrationArgs(doc); - - const migratedDoc = migrator.migrateDocument(doc); - expect(serializer.savedObjectToRaw).toHaveBeenLastCalledWith(migratedDoc); - }); - }); - - describe('returns', () => { - it(`formats the ES response`, async () => { - client.update.mockResponseImplementation((params) => { - return { - body: { - _id: params.id, - ...mockVersionProps, - _index: MAIN_SAVED_OBJECT_INDEX, - get: { - found: true, - _source: { - type: 'config', - ...mockTimestampFields, - config: { - buildNum: 8468, - apiCallsCount: 100, - defaultIndex: 'logstash-*', - }, - originId, - }, - }, - } as estypes.UpdateResponse, - }; - }); - - const response = await repository.incrementCounter( - 'config', - '6.0.0-alpha1', - ['buildNum', 'apiCallsCount'], - { - namespace: 'foo-namespace', - } - ); - - expect(response).toEqual({ - type: 'config', - id: '6.0.0-alpha1', - ...mockTimestampFields, - version: mockVersion, - references: [], - attributes: { - buildNum: 8468, - apiCallsCount: 100, - defaultIndex: 'logstash-*', - }, - originId, - }); - }); - - it('increments counter by incrementBy config', async () => { - await incrementCounterSuccess(type, id, [{ fieldName: counterFields[0], incrementBy: 3 }]); - - expect(client.update).toBeCalledTimes(1); - expect(client.update).toBeCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ - script: expect.objectContaining({ - params: expect.objectContaining({ - counterFieldNames: [counterFields[0]], - counts: [3], - }), - }), - }), - }), - expect.anything() - ); - }); - - it('does not increment counter when incrementBy is 0', async () => { - await incrementCounterSuccess(type, id, [{ fieldName: counterFields[0], incrementBy: 0 }]); - - expect(client.update).toBeCalledTimes(1); - expect(client.update).toBeCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ - script: expect.objectContaining({ - params: expect.objectContaining({ - counterFieldNames: [counterFields[0]], - counts: [0], - }), - }), - }), - }), - expect.anything() - ); - }); - }); - }); - - describe('#openPointInTimeForType', () => { - const type = 'index-pattern'; - - const generateResults = (id?: string) => ({ id: id || 'id' }); - const successResponse = async (type: string, options?: SavedObjectsOpenPointInTimeOptions) => { - client.openPointInTime.mockResponseOnce(generateResults()); - const result = await repository.openPointInTimeForType(type, options); - expect(client.openPointInTime).toHaveBeenCalledTimes(1); - return result; - }; - - describe('client calls', () => { - it(`should use the ES PIT API`, async () => { - await successResponse(type); - expect(client.openPointInTime).toHaveBeenCalledTimes(1); - }); - - it(`accepts preference`, async () => { - await successResponse(type, { preference: 'pref' }); - expect(client.openPointInTime).toHaveBeenCalledWith( - expect.objectContaining({ - preference: 'pref', - }), - expect.anything() - ); - }); - - it(`accepts keepAlive`, async () => { - await successResponse(type, { keepAlive: '2m' }); - expect(client.openPointInTime).toHaveBeenCalledWith( - expect.objectContaining({ - keep_alive: '2m', - }), - expect.anything() - ); - }); - - it(`defaults keepAlive to 5m`, async () => { - await successResponse(type); - expect(client.openPointInTime).toHaveBeenCalledWith( - expect.objectContaining({ - keep_alive: '5m', - }), - expect.anything() - ); - }); - }); - - describe('errors', () => { - const expectNotFoundError = async (types: string | string[]) => { - await expect(repository.openPointInTimeForType(types)).rejects.toThrowError( - createGenericNotFoundErrorPayload() - ); - }; - - it(`throws when ES is unable to find the index`, async () => { - client.openPointInTime.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise( - { id: 'error' }, - { statusCode: 404 } - ) - ); - await expectNotFoundError(type); - expect(client.openPointInTime).toHaveBeenCalledTimes(1); - }); - - it(`should return generic not found error when attempting to find only invalid or hidden types`, async () => { - const test = async (types: string | string[]) => { - await expectNotFoundError(types); - expect(client.openPointInTime).not.toHaveBeenCalled(); - }; - - await test('unknownType'); - await test(HIDDEN_TYPE); - await test(['unknownType', HIDDEN_TYPE]); - }); - }); - - describe('returns', () => { - it(`returns id in the expected format`, async () => { - const id = 'abc123'; - const results = generateResults(id); - client.openPointInTime.mockResolvedValueOnce( - elasticsearchClientMock.createSuccessTransportRequestPromise(results) - ); - const response = await repository.openPointInTimeForType(type); - expect(response).toEqual({ id }); - }); - }); - }); - - describe('#closePointInTime', () => { - const generateResults = () => ({ succeeded: true, num_freed: 3 }); - const successResponse = async (id: string) => { - client.closePointInTime.mockResponseOnce(generateResults()); - const result = await repository.closePointInTime(id); - expect(client.closePointInTime).toHaveBeenCalledTimes(1); - return result; - }; - - describe('client calls', () => { - it(`should use the ES PIT API`, async () => { - await successResponse('abc123'); - expect(client.closePointInTime).toHaveBeenCalledTimes(1); - }); - - it(`accepts id`, async () => { - await successResponse('abc123'); - expect(client.closePointInTime).toHaveBeenCalledWith( - expect.objectContaining({ - body: expect.objectContaining({ - id: 'abc123', - }), - }), - expect.anything() - ); - }); - }); - - describe('returns', () => { - it(`returns response body from ES`, async () => { - const results = generateResults(); - client.closePointInTime.mockResponseOnce(results); - const response = await repository.closePointInTime('abc123'); - expect(response).toEqual(results); - }); - }); - }); - - describe('#createPointInTimeFinder', () => { - it('returns a new PointInTimeFinder instance', async () => { - const result = await repository.createPointInTimeFinder({ type: 'PIT' }); - expect(result).toBeInstanceOf(PointInTimeFinder); - }); - - it('calls PointInTimeFinder with the provided options and dependencies', async () => { - const options: SavedObjectsCreatePointInTimeFinderOptions = { - type: 'my-type', - }; - const dependencies: SavedObjectsCreatePointInTimeFinderDependencies = { - client: { - find: jest.fn(), - openPointInTimeForType: jest.fn(), - closePointInTime: jest.fn(), - }, - }; - - await repository.createPointInTimeFinder(options, dependencies); - expect(pointInTimeFinderMock).toHaveBeenCalledWith( - options, - expect.objectContaining({ - ...dependencies, - logger, - }) - ); - }); - }); - - describe('#collectMultiNamespaceReferences', () => { - afterEach(() => { - mockCollectMultiNamespaceReferences.mockReset(); - }); - - it('passes arguments to the collectMultiNamespaceReferences module and returns the result', async () => { - const objects: SavedObjectsCollectMultiNamespaceReferencesObject[] = [ - { type: 'foo', id: 'bar' }, - ]; - const expectedResult: SavedObjectsCollectMultiNamespaceReferencesResponse = { - objects: [{ type: 'foo', id: 'bar', spaces: ['ns-1'], inboundReferences: [] }], - }; - mockCollectMultiNamespaceReferences.mockResolvedValue(expectedResult); - - await expect(repository.collectMultiNamespaceReferences(objects)).resolves.toEqual( - expectedResult - ); - expect(mockCollectMultiNamespaceReferences).toHaveBeenCalledTimes(1); - expect(mockCollectMultiNamespaceReferences).toHaveBeenCalledWith( - expect.objectContaining({ objects }) - ); - }); - - it('returns an error from the collectMultiNamespaceReferences module', async () => { - const expectedResult = new Error('Oh no!'); - mockCollectMultiNamespaceReferences.mockRejectedValue(expectedResult); - - await expect(repository.collectMultiNamespaceReferences([])).rejects.toEqual(expectedResult); - }); - }); - - describe('#updateObjectsSpaces', () => { - afterEach(() => { - mockUpdateObjectsSpaces.mockReset(); - }); - - it('passes arguments to the updateObjectsSpaces module and returns the result', async () => { - const objects: SavedObjectsUpdateObjectsSpacesObject[] = [{ type: 'type', id: 'id' }]; - const spacesToAdd = ['to-add', 'also-to-add']; - const spacesToRemove = ['to-remove']; - const options: SavedObjectsUpdateObjectsSpacesOptions = { namespace: 'ns-1' }; - const expectedResult: SavedObjectsUpdateObjectsSpacesResponse = { - objects: [ - { - type: 'type', - id: 'id', - spaces: ['foo', 'bar'], - }, - ], - }; - mockUpdateObjectsSpaces.mockResolvedValue(expectedResult); - - await expect( - repository.updateObjectsSpaces(objects, spacesToAdd, spacesToRemove, options) - ).resolves.toEqual(expectedResult); - expect(mockUpdateObjectsSpaces).toHaveBeenCalledTimes(1); - expect(mockUpdateObjectsSpaces).toHaveBeenCalledWith( - expect.objectContaining({ objects, spacesToAdd, spacesToRemove, options }) - ); - }); - - it('returns an error from the updateObjectsSpaces module', async () => { - const expectedResult = new Error('Oh no!'); - mockUpdateObjectsSpaces.mockRejectedValue(expectedResult); - - await expect(repository.updateObjectsSpaces([], [], [])).rejects.toEqual(expectedResult); - }); - }); - describe('#getCurrentNamespace', () => { it('returns `undefined` for `undefined` namespace argument', async () => { expect(repository.getCurrentNamespace()).toBeUndefined(); diff --git a/packages/core/status/core-status-server-internal/src/routes/status.ts b/packages/core/status/core-status-server-internal/src/routes/status.ts index e06d667b4c78b..59c7aa23c51d4 100644 --- a/packages/core/status/core-status-server-internal/src/routes/status.ts +++ b/packages/core/status/core-status-server-internal/src/routes/status.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { Observable, combineLatest, ReplaySubject, firstValueFrom } from 'rxjs'; +import { type Observable, combineLatest, ReplaySubject, firstValueFrom, startWith } from 'rxjs'; import { schema } from '@kbn/config-schema'; import type { PackageInfo } from '@kbn/config'; import type { PluginName } from '@kbn/core-base-common'; @@ -15,12 +15,12 @@ import type { MetricsServiceSetup } from '@kbn/core-metrics-server'; import type { CoreIncrementUsageCounter } from '@kbn/core-usage-data-server'; import type { StatusResponse } from '@kbn/core-status-common-internal'; import { - ServiceStatus, - ServiceStatusLevel, - CoreStatus, + type ServiceStatus, + type ServiceStatusLevel, + type CoreStatus, ServiceStatusLevels, } from '@kbn/core-status-common'; -import { calculateLegacyStatus, LegacyStatusInfo } from '../legacy_status'; +import { calculateLegacyStatus, type LegacyStatusInfo } from '../legacy_status'; const SNAPSHOT_POSTFIX = /-SNAPSHOT$/; @@ -61,6 +61,11 @@ export interface RedactedStatusHttpBody { }; } +const SERVICE_UNAVAILABLE_NOT_REPORTED: ServiceStatus = { + level: ServiceStatusLevels.unavailable, + summary: 'Status not yet reported', +}; + export const registerStatusRoute = ({ router, config, @@ -73,9 +78,17 @@ export const registerStatusRoute = ({ const combinedStatus$ = new ReplaySubject< [ServiceStatus, ServiceStatus, CoreStatus, Record>] >(1); - combineLatest([status.overall$, status.coreOverall$, status.core$, status.plugins$]).subscribe( - combinedStatus$ - ); + combineLatest([ + status.overall$.pipe(startWith(SERVICE_UNAVAILABLE_NOT_REPORTED)), + status.coreOverall$.pipe(startWith(SERVICE_UNAVAILABLE_NOT_REPORTED)), + status.core$.pipe( + startWith({ + elasticsearch: SERVICE_UNAVAILABLE_NOT_REPORTED, + savedObjects: SERVICE_UNAVAILABLE_NOT_REPORTED, + }) + ), + status.plugins$.pipe(startWith({})), + ]).subscribe(combinedStatus$); router.get( { diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts index 26b0c1282d514..c93e37b4f99b3 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts @@ -25,7 +25,7 @@ const scenario: Scenario = async (runOptions) => { const instances = [...Array(numServices).keys()].map((index) => apm - .service({ name: `synth-go-${index}`, environment: ENVIRONMENT, agentName: 'go' }) + .service({ name: `synth-node-${index}`, environment: ENVIRONMENT, agentName: 'nodejs' }) .instance('instance') ); const instanceSpans = (instance: Instance) => { diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index c5c253af7717a..a697000bbebbf 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -781,6 +781,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D elasticAgentInputConfiguration: `${FLEET_DOCS}elastic-agent-input-configuration.html`, policySecrets: `${FLEET_DOCS}agent-policy.html#agent-policy-secret-values`, remoteESOoutput: `${FLEET_DOCS}monitor-elastic-agent.html#external-elasticsearch-monitoring`, + performancePresets: `${FLEET_DOCS}es-output-settings.html#es-output-settings-performance-tuning-settings`, }, ecs: { guide: `${ELASTIC_WEBSITE_URL}guide/en/ecs/current/index.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 3b3b26be0426e..3b6d22a190244 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -536,6 +536,7 @@ export interface DocLinks { elasticAgentInputConfiguration: string; policySecrets: string; remoteESOoutput: string; + performancePresets: string; }>; readonly ecs: { readonly guide: string; diff --git a/packages/kbn-ecs/package.json b/packages/kbn-ecs/package.json index ad23a36d8f82a..07ffc9fed886a 100644 --- a/packages/kbn-ecs/package.json +++ b/packages/kbn-ecs/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ecs", "version": "1.0.0", "private": true, - "license": "SSPL-1.0 OR Elastic License 2.0" + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false } diff --git a/packages/kbn-search-api-panels/components/cloud_details.tsx b/packages/kbn-search-api-panels/components/cloud_details.tsx index 2354ca4b345f2..25e7e660ee356 100644 --- a/packages/kbn-search-api-panels/components/cloud_details.tsx +++ b/packages/kbn-search-api-panels/components/cloud_details.tsx @@ -22,6 +22,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/react'; import { OverviewPanel } from '..'; import { ELASTICSEARCH_URL_PLACEHOLDER } from '../constants'; @@ -49,7 +50,15 @@ export const CloudDetailsPanel = ({ const panelContent = ( - + {selectedDetail === CloudDetail.CloudId && cloudId} {selectedDetail === CloudDetail.ElasticsearchEndpoint && elasticsearchUrl} diff --git a/packages/kbn-search-connectors/connectors.ts b/packages/kbn-search-connectors/connectors.ts index 199a96308631c..998fc3bf2a2a7 100644 --- a/packages/kbn-search-connectors/connectors.ts +++ b/packages/kbn-search-connectors/connectors.ts @@ -25,7 +25,7 @@ export interface ConnectorServerSideDefinition { export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { iconPath: 'azure_blob_storage.svg', - isBeta: true, + isBeta: false, isNative: true, keywords: ['cloud', 'azure', 'blob', 's3', 'connector'], name: i18n.translate('searchConnectors.content.nativeConnectors.azureBlob.name', { @@ -76,8 +76,8 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ }, { iconPath: 'google_cloud_storage.svg', - isBeta: true, - isNative: false, + isBeta: false, + isNative: true, keywords: ['google', 'cloud', 'blob', 's3', 'connector'], name: i18n.translate('searchConnectors.content.nativeConnectors.googleCloud.name', { defaultMessage: 'Google Cloud Storage', @@ -116,7 +116,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ }, { iconPath: 'mssql.svg', - isBeta: true, + isBeta: false, isNative: true, keywords: ['mssql', 'microsoft', 'sql', 'database', 'connector'], name: i18n.translate('searchConnectors.content.nativeConnectors.microsoftSQL.name', { @@ -136,7 +136,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ }, { iconPath: 'postgresql.svg', - isBeta: true, + isBeta: false, isNative: true, keywords: ['postgresql', 'sql', 'database', 'connector'], name: i18n.translate('searchConnectors.content.nativeConnectors.postgresql.name', { @@ -147,7 +147,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { iconPath: 'salesforce.svg', isBeta: true, - isNative: false, + isNative: true, isTechPreview: false, keywords: ['salesforce', 'cloud', 'connector'], name: i18n.translate('searchConnectors.content.nativeConnectors.salesforce.name', { @@ -191,7 +191,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { iconPath: 'oracle.svg', isBeta: true, - isNative: false, + isNative: true, keywords: ['oracle', 'sql', 'database', 'connector'], name: i18n.translate('searchConnectors.content.nativeConnectors.oracle.name', { defaultMessage: 'Oracle', @@ -210,8 +210,8 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ }, { iconPath: 's3.svg', - isBeta: true, - isNative: false, + isBeta: false, + isNative: true, keywords: ['s3', 'cloud', 'amazon', 'connector'], name: i18n.translate('searchConnectors.content.nativeConnectors.s3.name', { defaultMessage: 'S3', diff --git a/packages/kbn-search-connectors/types/native_connectors.ts b/packages/kbn-search-connectors/types/native_connectors.ts index 232484011a1c1..b4efc74ba7969 100644 --- a/packages/kbn-search-connectors/types/native_connectors.ts +++ b/packages/kbn-search-connectors/types/native_connectors.ts @@ -489,6 +489,9 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record = ({ }; }, []); - const chartTheme = charts.theme.useChartsTheme(); const chartBaseTheme = charts.theme.useChartsBaseTheme(); - const customChartTheme: typeof chartTheme = useMemo(() => { + const chartThemeOverrides = useMemo(() => { return color ? { - ...chartTheme, barSeriesStyle: { - ...chartTheme.barSeriesStyle, rect: { - ...(chartTheme.barSeriesStyle?.rect || {}), fill: color, }, }, } - : chartTheme; - }, [chartTheme, color]); + : {}; + }, [color]); const { isLoading, @@ -486,7 +483,7 @@ const FieldStatsComponent: React.FC = ({ = ({ diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/split_failed_to_clone.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/split_failed_to_clone.test.ts index da9657e1765d1..1642e4059a885 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/split_failed_to_clone.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/split_failed_to_clone.test.ts @@ -59,7 +59,8 @@ const RELOCATE_TYPES: Record = { export const logFilePath = Path.join(__dirname, 'split_failed_to_clone.test.log'); -describe('when splitting .kibana into multiple indices and one clone fails', () => { +// Failing: See https://github.com/elastic/kibana/issues/163253 +describe.skip('when splitting .kibana into multiple indices and one clone fails', () => { let esServer: TestElasticsearchUtils['es']; let typeRegistry: ISavedObjectTypeRegistry; let migratorTestKitFactory: () => Promise; diff --git a/src/plugins/ai_assistant_management/observability/public/hooks/use_create_knowledge_base_entry.ts b/src/plugins/ai_assistant_management/observability/public/hooks/use_create_knowledge_base_entry.ts index 5d367a8e66023..9c68437774255 100644 --- a/src/plugins/ai_assistant_management/observability/public/hooks/use_create_knowledge_base_entry.ts +++ b/src/plugins/ai_assistant_management/observability/public/hooks/use_create_knowledge_base_entry.ts @@ -29,7 +29,7 @@ export function useCreateKnowledgeBaseEntry() { { entry: Omit< KnowledgeBaseEntry, - '@timestamp' | 'confidence' | 'is_correction' | 'public' | 'labels' | 'role' + '@timestamp' | 'confidence' | 'is_correction' | 'public' | 'labels' | 'role' | 'doc_id' >; } >( diff --git a/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx b/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx index 80918e00a768d..aa973bb4db940 100644 --- a/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx +++ b/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx @@ -50,7 +50,6 @@ export function KnowledgeBaseEditManualEntryFlyout({ createEntry({ entry: { id: newEntryId, - doc_id: newEntryId, text: newEntryText, }, }).then(onClose); diff --git a/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_tab.test.tsx b/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_tab.test.tsx index a7abaca3210f6..4a5ad8daf96d5 100644 --- a/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_tab.test.tsx +++ b/src/plugins/ai_assistant_management/observability/public/routes/components/knowledge_base_tab.test.tsx @@ -80,7 +80,7 @@ describe('KnowledgeBaseTab', () => { getByTestId('knowledgeBaseEditManualEntryFlyoutSaveButton').click(); - expect(createMock).toHaveBeenCalledWith({ entry: { id: 'foo', doc_id: 'foo', text: '' } }); + expect(createMock).toHaveBeenCalledWith({ entry: { id: 'foo', text: '' } }); }); }); diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap index 17eb7b358bb47..afd6ce21ad36f 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap @@ -6,7 +6,514 @@ exports[`GaugeComponent renders the chart 1`] = ` > diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx index ea8342462f05e..6565673cea0da 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx +++ b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx @@ -261,8 +261,6 @@ export const GaugeComponent: FC = memo( return null; } - const chartTheme = chartsThemeService.useChartsTheme(); - const metricColumn = table.columns.find((col) => col.id === accessors.metric); const chartData = table.rows.filter( @@ -366,7 +364,7 @@ export const GaugeComponent: FC = memo( } debugState={window._echDebugStateFlag ?? false} - theme={[{ background: { color: 'transparent' } }, chartTheme]} + theme={[{ background: { color: 'transparent' } }]} baseTheme={chartBaseTheme} ariaLabel={args.ariaLabel} ariaUseDefaultSummary={!args.ariaLabel} diff --git a/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.tsx b/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.tsx index e541918801b59..d36f8f54b9365 100644 --- a/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.tsx +++ b/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.tsx @@ -155,7 +155,6 @@ export const HeatmapComponent: FC = memo( overrides, }) => { const chartRef = useRef(null); - const chartTheme = chartsThemeService.useChartsTheme(); const isDarkTheme = chartsThemeService.useDarkMode(); // legacy heatmap legend is handled by the uiState const [showLegend, setShowLegend] = useState(() => { @@ -541,13 +540,8 @@ export const HeatmapComponent: FC = memo( grid: { stroke: { width: - args.gridConfig.strokeWidth ?? - chartTheme.axes?.gridLine?.horizontal?.strokeWidth ?? - 1, - color: - args.gridConfig.strokeColor ?? - chartTheme.axes?.gridLine?.horizontal?.stroke ?? - '#D3DAE6', + args.gridConfig.strokeWidth ?? chartBaseTheme.axes.gridLine.horizontal.strokeWidth, + color: args.gridConfig.strokeColor ?? chartBaseTheme.axes.gridLine.horizontal.stroke, }, }, cell: { @@ -566,13 +560,13 @@ export const HeatmapComponent: FC = memo( yAxisLabel: { visible: !!yAxisColumn && args.gridConfig.isYAxisLabelVisible, // eui color subdued - textColor: chartTheme.axes?.tickLabel?.fill ?? '#6a717d', + textColor: chartBaseTheme.axes.tickLabel.fill, padding: yAxisColumn?.name ? 8 : 0, }, xAxisLabel: { visible: Boolean(args.gridConfig.isXAxisLabelVisible && xAxisColumn), // eui color subdued - textColor: chartTheme.axes?.tickLabel?.fill ?? `#6a717d`, + textColor: chartBaseTheme.axes.tickLabel.fill, padding: xAxisColumn?.name ? 8 : 0, }, brushMask: { @@ -713,7 +707,6 @@ export const HeatmapComponent: FC = memo( debugState={window._echDebugStateFlag ?? false} theme={[ themeOverrides, - chartTheme, ...(Array.isArray(settingsThemeOverrides) ? settingsThemeOverrides : [settingsThemeOverrides]), diff --git a/src/plugins/chart_expressions/expression_metric/public/__mocks__/theme_service.ts b/src/plugins/chart_expressions/expression_metric/public/__mocks__/theme_service.ts index b00ec8a6ee569..c3c23e41c01db 100644 --- a/src/plugins/chart_expressions/expression_metric/public/__mocks__/theme_service.ts +++ b/src/plugins/chart_expressions/expression_metric/public/__mocks__/theme_service.ts @@ -8,7 +8,6 @@ export const getThemeService = () => { return { - useChartsTheme: () => ({}), useChartsBaseTheme: () => ({ metric: { minHeight: 64 } }), }; }; diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx index a0d02562d7623..ba3ef124d7ed2 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx @@ -154,7 +154,6 @@ export const MetricVis = ({ filterable, overrides, }: MetricVisComponentProps) => { - const chartTheme = getThemeService().useChartsTheme(); const onRenderChange = useCallback( (isRendered) => { if (isRendered) { @@ -167,8 +166,7 @@ export const MetricVis = ({ const [scrollChildHeight, setScrollChildHeight] = useState('100%'); const scrollContainerRef = useRef(null); const scrollDimensions = useResizeObserver(scrollContainerRef.current); - - const baseTheme = getThemeService().useChartsBaseTheme(); + const chartBaseTheme = getThemeService().useChartsBaseTheme(); const primaryMetricColumn = getColumnByAccessor(config.dimensions.metric, data.columns)!; const formatPrimaryMetric = getMetricFormatter(config.dimensions.metric, data.columns); @@ -275,7 +273,7 @@ export const MetricVis = ({ } = config; const numRows = metricConfigs.length / maxCols; - const minHeight = chartTheme.metric?.minHeight ?? baseTheme.metric.minHeight; + const minHeight = chartBaseTheme.metric.minHeight; useEffect(() => { const minimumRequiredVerticalSpace = minHeight * numRows; @@ -327,18 +325,18 @@ export const MetricVis = ({ locale={i18n.getLocale()} theme={[ { - background: { color: 'transparent' }, + background: { color: defaultColor }, metric: { - background: defaultColor, barBackground: euiThemeVars.euiColorLightShade, + emptyBackground: euiThemeVars.euiColorEmptyShade, + blendingBackground: euiThemeVars.euiColorEmptyShade, }, - ...chartTheme, }, ...(Array.isArray(settingsThemeOverrides) ? settingsThemeOverrides : [settingsThemeOverrides]), ]} - baseTheme={baseTheme} + baseTheme={chartBaseTheme} onRenderChange={onRenderChange} onElementClick={ filterable diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap index 451f25f93f9e2..241e2ac6f4faf 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap @@ -236,7 +236,514 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` /> - } - onElementClick={[Function]} - onRenderChange={[Function]} - showLegend={true} - theme={ - Array [ - Object { - "background": Object { - "color": "transparent", + baseTheme={ + Object { + "arcSeriesStyle": Object { + "arc": Object { + "opacity": 1, + "stroke": "black", + "strokeWidth": 1, + "visible": true, }, }, - Object { - "chartMargins": Object { - "bottom": 0, - "left": 0, - "right": 0, - "top": 0, + "areaSeriesStyle": Object { + "area": Object { + "opacity": 0.3, + "visible": true, }, - "partition": Object { - "circlePadding": 4, - "emptySizeRatio": 0, - "fontFamily": undefined, - "linkLabel": Object { - "fontSize": 11, - "maxCount": 5, - "maxTextLength": 100, - "textColor": undefined, + "fit": Object { + "area": Object { + "fill": "__use__series__color__", + "opacity": 0.15, + "visible": true, + }, + "line": Object { + "dash": Array [ + 5, + 5, + ], + "opacity": 1, + "stroke": "__use__series__color__", + "visible": true, }, - "maxFontSize": 16, - "minFontSize": 10, - "outerSizeRatio": undefined, - "sectorLineStroke": undefined, - "sectorLineWidth": 1.5, + }, + "isolatedPoint": Object { + "fill": "white", + "opacity": 1, + "radius": 2, + "stroke": "__use__series__color__", + "strokeWidth": 1, + "visible": true, + }, + "line": Object { + "opacity": 1, + "strokeWidth": 2, + "visible": true, + }, + "point": Object { + "fill": "#FFF", + "opacity": 1, + "radius": 3, + "stroke": "__use__series__color__", + "strokeWidth": 2, + "visible": false, }, }, - Object {}, - Object { - "legend": Object { - "labelOptions": Object { - "maxLines": 1, + "axes": Object { + "axisLine": Object { + "stroke": "#eaedf3", + "strokeWidth": 1, + "visible": true, + }, + "axisPanelTitle": Object { + "fill": "#333", + "fontFamily": "sans-serif", + "fontSize": 10, + "padding": Object { + "inner": 8, + "outer": 0, + }, + "visible": true, + }, + "axisTitle": Object { + "fill": "#343741", + "fontFamily": "Inter, BlinkMacSystemFont, Helvetica, Arial, sans-serif", + "fontSize": 12, + "padding": Object { + "inner": 10, + "outer": 0, + }, + "visible": true, + }, + "gridLine": Object { + "horizontal": Object { + "dash": Array [ + 0, + 0, + ], + "opacity": 1, + "stroke": "#eaedf3", + "strokeWidth": 1, + "visible": true, + }, + "lumaSteps": Array [ + 224, + 184, + 128, + 96, + 64, + 32, + 16, + 8, + 4, + 2, + 1, + 0, + 0, + 0, + 0, + 0, + ], + "vertical": Object { + "dash": Array [ + 4, + 4, + ], + "opacity": 1, + "stroke": "#eaedf3", + "strokeWidth": 1, + "visible": true, + }, + }, + "tickLabel": Object { + "alignment": Object { + "horizontal": "near", + "vertical": "near", }, + "fill": "#646a77", + "fontFamily": "Inter, BlinkMacSystemFont, Helvetica, Arial, sans-serif", + "fontSize": 10, + "fontStyle": "normal", + "offset": Object { + "reference": "local", + "x": 0, + "y": 0, + }, + "padding": Object { + "inner": 10, + "outer": 8, + }, + "rotation": 0, + "visible": true, + }, + "tickLine": Object { + "padding": 10, + "size": 10, + "stroke": "#eaedf3", + "strokeWidth": 1, + "visible": false, }, }, - Object {}, - ] - } - /> - + } + onElementClick={[Function]} + onRenderChange={[Function]} + showLegend={true} + theme={ + Array [ + Object { + "background": Object { + "color": "transparent", + }, + }, + Object { + "chartMargins": Object { + "bottom": 0, + "left": 0, + "right": 0, + "top": 0, + }, + "partition": Object { + "circlePadding": 4, + "emptySizeRatio": 0, + "fontFamily": "Inter, BlinkMacSystemFont, Helvetica, Arial, sans-serif", + "linkLabel": Object { + "fontSize": 11, + "maxCount": 5, + "maxTextLength": 100, + "textColor": "#343741", + }, + "maxFontSize": 16, + "minFontSize": 10, + "outerSizeRatio": undefined, + "sectorLineStroke": "#FFF", + "sectorLineWidth": 1.5, + }, + }, + Object { + "legend": Object { + "labelOptions": Object { + "maxLines": 1, + }, + }, + }, + Object {}, + ] + } + /> + { hasOpenedOnAggBasedEditor, } = props; const visParams = useMemo(() => filterOutConfig(visType, preVisParams), [preVisParams, visType]); - const chartTheme = props.chartsThemeService.useChartsTheme(); const chartBaseTheme = props.chartsThemeService.useChartsBaseTheme(); const { @@ -377,12 +376,19 @@ const PartitionVisComponent = (props: PartitionVisComponentProps) => { getPartitionTheme( visType, visParams, - chartTheme, + chartBaseTheme, containerDimensions, rescaleFactor, hasOpenedOnAggBasedEditor ), - [visType, visParams, chartTheme, containerDimensions, rescaleFactor, hasOpenedOnAggBasedEditor] + [ + visType, + visParams, + chartBaseTheme, + containerDimensions, + rescaleFactor, + hasOpenedOnAggBasedEditor, + ] ); const fixedViewPort = document.getElementById('app-fixed-viewport'); @@ -574,7 +580,6 @@ const PartitionVisComponent = (props: PartitionVisComponentProps) => { // Chart background should be transparent for the usage at Canvas. { background: { color: 'transparent' } }, themeOverrides, - chartTheme, { legend: { labelOptions: { diff --git a/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx b/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx index a00bbb93e4a58..0c7f855c66390 100644 --- a/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx +++ b/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx @@ -12,7 +12,13 @@ import { i18n } from '@kbn/i18n'; import { throttle } from 'lodash'; import { EuiIconTip, EuiResizeObserver } from '@elastic/eui'; import { IconChartTagcloud } from '@kbn/chart-icons'; -import { Chart, Settings, Wordcloud, RenderChangeListener } from '@elastic/charts'; +import { + Chart, + Settings, + Wordcloud, + RenderChangeListener, + LEGACY_LIGHT_THEME, +} from '@elastic/charts'; import { EmptyPlaceholder } from '@kbn/charts-plugin/public'; import { PaletteRegistry, @@ -234,6 +240,8 @@ export const TagCloudChart = ({
(null); - const chartTheme = chartsThemeService.useChartsTheme(); const chartBaseTheme = chartsThemeService.useChartsBaseTheme(); const darkMode = chartsThemeService.useDarkMode(); const filteredLayers = getFilteredLayers(layers); @@ -796,9 +796,7 @@ export function XYChart({ legendSize={LegendSizeToPixels[legend.legendSize ?? DEFAULT_LEGEND_SIZE]} theme={[ { - ...chartTheme, barSeriesStyle: { - ...chartTheme.barSeriesStyle, ...valueLabelsStyling, }, background: { @@ -809,7 +807,8 @@ export function XYChart({ }, // if not title or labels are shown for axes, add some padding if required by reference line markers chartMargins: { - ...chartTheme.chartPaddings, + // Temporary margin defaults + ...LEGACY_LIGHT_THEME.chartMargins, ...computeChartMargins( linesPaddings, { ...tickLabelsVisibilitySettings, x: xAxisConfig?.showLabels }, @@ -993,9 +992,9 @@ export function XYChart({ rangeAnnotations.length && shouldHideDetails ? OUTSIDE_RECT_ANNOTATION_WIDTH_SUGGESTION : shouldUseNewTimeAxis - ? Number(MULTILAYER_TIME_AXIS_STYLE.tickLine?.padding || 0) + - Number(chartTheme.axes?.tickLabel?.fontSize || 0) - : Number(chartTheme.axes?.tickLine?.size) || OUTSIDE_RECT_ANNOTATION_WIDTH + ? Number(MULTILAYER_TIME_AXIS_STYLE.tickLine?.padding ?? 0) + + chartBaseTheme.axes.tickLabel.fontSize + : Math.max(chartBaseTheme.axes.tickLine.size, OUTSIDE_RECT_ANNOTATION_WIDTH) } /> ) : null} diff --git a/src/plugins/charts/common/static/styles/multilayer_timeaxis.ts b/src/plugins/charts/common/static/styles/multilayer_timeaxis.ts index 478cc7b52a73a..4b22feaa92751 100644 --- a/src/plugins/charts/common/static/styles/multilayer_timeaxis.ts +++ b/src/plugins/charts/common/static/styles/multilayer_timeaxis.ts @@ -20,7 +20,7 @@ export const MULTILAYER_TIME_AXIS_STYLE: RecursivePartial = { }, tickLine: { visible: true, - size: 0.0001, + size: 0, padding: 4, }, }; diff --git a/src/plugins/charts/public/services/theme/README.md b/src/plugins/charts/public/services/theme/README.md index fb4f941f79344..eca74a14019aa 100644 --- a/src/plugins/charts/public/services/theme/README.md +++ b/src/plugins/charts/public/services/theme/README.md @@ -8,11 +8,7 @@ The `theme` service offers utilities to interact with the kibana theme. EUI prov Default `baseTheme` from `@elastic/charts` (i.e. light). -## `chartsDefaultTheme` - -Default `theme` from `@elastic/eui` (i.e. light). - -## `useChartsTheme` and `useChartsBaseTheme` +## `useChartsBaseTheme` A **React hook** for simple fetching of the correct EUI `theme` and `baseTheme`. @@ -23,7 +19,7 @@ import { Chart, Settings } from '@elastic/charts'; export const YourComponent = () => ( {/* ... */} @@ -31,20 +27,18 @@ export const YourComponent = () => ( ); ``` -## `chartsTheme$` and `chartsBaseTheme$` +## `chartsBaseTheme$` An **`Observable`** of the current charts `theme` and `baseTheme`. Use this implementation for more flexible updates to the chart theme without full page refreshes. ```tsx import { npStart } from 'ui/new_platform'; -import { EuiChartThemeType } from '@elastic/eui/src/themes/charts/themes'; import { Subscription, combineLatest } from 'rxjs'; import { Chart, Settings, Theme } from '@elastic/charts'; interface YourComponentProps {}; interface YourComponentState { - chartsTheme: EuiChartThemeType['theme']; chartsBaseTheme: Theme; } @@ -52,16 +46,14 @@ export class YourComponent extends Component - this.setState({ chartsTheme, chartsBaseTheme }) + ).subscribe(([chartsBaseTheme]) => + this.setState({ chartsBaseTheme }) ); } @@ -72,21 +64,14 @@ export class YourComponent extends Component - + {/* ... */} ); } } ``` - -## Why have `theme` and `baseTheme`? - -The `theme` prop is a recursive partial `Theme` that overrides properties from the `baseTheme`. This allows changes to the `Theme` TS type in `@elastic/charts` without having to update the `@elastic/eui` themes for every ``. diff --git a/src/plugins/charts/public/services/theme/mock.ts b/src/plugins/charts/public/services/theme/mock.ts index ec5d00508c510..d41f9f20dd382 100644 --- a/src/plugins/charts/public/services/theme/mock.ts +++ b/src/plugins/charts/public/services/theme/mock.ts @@ -6,14 +6,11 @@ * Side Public License, v 1. */ -import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; +import { LIGHT_THEME } from '@elastic/charts'; import { ThemeService } from './theme'; export const themeServiceMock: ThemeService = { - chartsDefaultTheme: EUI_CHARTS_THEME_LIGHT.theme, - chartsTheme$: jest.fn(() => ({ - subscribe: jest.fn(), - })), + chartsDefaultBaseTheme: LIGHT_THEME, chartsBaseTheme$: jest.fn(() => ({ subscribe: jest.fn(), })), @@ -21,6 +18,5 @@ export const themeServiceMock: ThemeService = { subscribe: jest.fn(), })), useDarkMode: jest.fn().mockReturnValue(false), - useChartsTheme: jest.fn().mockReturnValue({}), - useChartsBaseTheme: jest.fn().mockReturnValue({}), + useChartsBaseTheme: jest.fn().mockReturnValue(LIGHT_THEME), } as any; diff --git a/src/plugins/charts/public/services/theme/theme.test.tsx b/src/plugins/charts/public/services/theme/theme.test.tsx index d13050d0a506f..d71d2beda6bb0 100644 --- a/src/plugins/charts/public/services/theme/theme.test.tsx +++ b/src/plugins/charts/public/services/theme/theme.test.tsx @@ -13,7 +13,6 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { render, act as renderAct } from '@testing-library/react'; import { LIGHT_THEME, DARK_THEME } from '@elastic/charts'; -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { ThemeService } from './theme'; import { coreMock } from '@kbn/core/public/mocks'; @@ -51,31 +50,6 @@ describe('ThemeService', () => { }); }); - describe('chartsTheme$', () => { - it('returns the light theme when not in dark mode', async () => { - setUpMockTheme.theme$ = createTheme$Mock(false); - const themeService = new ThemeService(); - themeService.init(setUpMockTheme); - - expect(await themeService.chartsTheme$.pipe(take(1)).toPromise()).toEqual( - EUI_CHARTS_THEME_LIGHT.theme - ); - }); - - describe('in dark mode', () => { - it(`returns the dark theme`, async () => { - // Fake dark theme turned returning true - setUpMockTheme.theme$ = createTheme$Mock(true); - const themeService = new ThemeService(); - themeService.init(setUpMockTheme); - - expect(await themeService.chartsTheme$.pipe(take(1)).toPromise()).toEqual( - EUI_CHARTS_THEME_DARK.theme - ); - }); - }); - }); - describe('chartsBaseTheme$', () => { it('returns the light theme when not in dark mode', async () => { setUpMockTheme.theme$ = createTheme$Mock(false); @@ -98,60 +72,6 @@ describe('ThemeService', () => { }); }); - describe('useChartsTheme', () => { - it('updates when the user profile settings change', () => { - setUpMockTheme.theme$ = createTheme$Mock(false); - const themeService = new ThemeService(); - themeService.init(setUpMockTheme); - const { useChartsTheme } = themeService; - - const { result } = renderHook(() => useChartsTheme()); - expect(result.current).toBe(EUI_CHARTS_THEME_LIGHT.theme); - - act(() => { - setUpMockTheme.theme$ = createTheme$Mock(true); - themeService.init(setUpMockTheme); - }); - expect(result.current).toBe(EUI_CHARTS_THEME_DARK.theme); - act(() => { - setUpMockTheme.theme$ = createTheme$Mock(false); - themeService.init(setUpMockTheme); - }); - expect(result.current).toBe(EUI_CHARTS_THEME_LIGHT.theme); - }); - - it('should not rerender when emitting the same value', () => { - setUpMockTheme.theme$ = createTheme$Mock(false); - const themeService = new ThemeService(); - themeService.init(setUpMockTheme); - const { useChartsTheme } = themeService; - - const renderCounter = jest.fn(); - const Wrapper = () => { - useChartsTheme(); - renderCounter(); - return null; - }; - - render(); - expect(renderCounter).toHaveBeenCalledTimes(1); - renderAct(() => { - setUpMockTheme.theme$ = createTheme$Mock(true); - themeService.init(setUpMockTheme); - }); - expect(renderCounter).toHaveBeenCalledTimes(2); - renderAct(() => { - setUpMockTheme.theme$ = createTheme$Mock(true); - themeService.init(setUpMockTheme); - }); - renderAct(() => { - setUpMockTheme.theme$ = createTheme$Mock(true); - themeService.init(setUpMockTheme); - }); - expect(renderCounter).toHaveBeenCalledTimes(2); - }); - }); - describe('useBaseChartTheme', () => { it('updates when the theme setting change', () => { setUpMockTheme.theme$ = createTheme$Mock(false); diff --git a/src/plugins/charts/public/services/theme/theme.ts b/src/plugins/charts/public/services/theme/theme.ts index dff300a02aa8a..b8ee2301dbb82 100644 --- a/src/plugins/charts/public/services/theme/theme.ts +++ b/src/plugins/charts/public/services/theme/theme.ts @@ -11,20 +11,14 @@ import { Observable, BehaviorSubject } from 'rxjs'; import { CoreSetup, CoreTheme } from '@kbn/core/public'; import { DARK_THEME, LIGHT_THEME, PartialTheme, Theme } from '@elastic/charts'; -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; export class ThemeService { /** Returns default charts theme */ - public readonly chartsDefaultTheme = EUI_CHARTS_THEME_LIGHT.theme; public readonly chartsDefaultBaseTheme = LIGHT_THEME; private theme$?: Observable; - private _chartsTheme$ = new BehaviorSubject(this.chartsDefaultTheme); private _chartsBaseTheme$ = new BehaviorSubject(this.chartsDefaultBaseTheme); - /** An observable of the current charts theme */ - public chartsTheme$ = this._chartsTheme$.asObservable(); - /** An observable of the current charts base theme */ public chartsBaseTheme$ = this._chartsBaseTheme$.asObservable(); @@ -51,22 +45,11 @@ export class ThemeService { return value; }; - /** A React hook for consuming the charts theme */ + /** + * @deprecated No longer need to use theme on top of baseTheme, see https://github.com/elastic/kibana/pull/170914#issuecomment-1823014121 + */ public useChartsTheme = (): PartialTheme => { - const [value, update] = useState(this._chartsTheme$.getValue()); - const ref = useRef(value); - - useEffect(() => { - const s = this.chartsTheme$.subscribe((val) => { - if (val !== ref.current) { - ref.current = val; - update(val); - } - }); - return () => s.unsubscribe(); - }, []); - - return value; + return {}; }; /** A React hook for consuming the charts theme */ @@ -91,8 +74,6 @@ export class ThemeService { public init(theme: CoreSetup['theme']) { this.theme$ = theme.theme$; this.theme$.subscribe(({ darkMode }) => { - const selectedTheme = darkMode ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme; - this._chartsTheme$.next(selectedTheme); this._chartsBaseTheme$.next(darkMode ? DARK_THEME : LIGHT_THEME); }); } diff --git a/src/plugins/files_management/public/components/diagnostics_flyout.tsx b/src/plugins/files_management/public/components/diagnostics_flyout.tsx index 0eef44d26188f..8a9528db4472c 100644 --- a/src/plugins/files_management/public/components/diagnostics_flyout.tsx +++ b/src/plugins/files_management/public/components/diagnostics_flyout.tsx @@ -21,7 +21,15 @@ import { EuiSpacer, EuiFlexItem, } from '@elastic/eui'; -import { Chart, Axis, Position, HistogramBarSeries, ScaleType } from '@elastic/charts'; +import { + Chart, + Axis, + Position, + HistogramBarSeries, + ScaleType, + Settings, + LEGACY_LIGHT_THEME, +} from '@elastic/charts'; import numeral from '@elastic/numeral'; import type { FunctionComponent } from 'react'; import React from 'react'; @@ -90,6 +98,10 @@ export const DiagnosticsFlyout: FunctionComponent = ({ onClose }) => {

{i18nTexts.diagnosticsBreakdownsStatus}

+ (null); const chart = seriesList.list; const chartsService = getCharts(); - - const chartTheme = chartsService.theme.useChartsTheme(); const chartBaseTheme = chartsService.theme.useChartsBaseTheme(); const handleCursorUpdate = useActiveCursor(chartsService.activeCursor, chartRef, { @@ -216,7 +214,6 @@ export const TimelionVisComponent = ({ externalPointerEvents={{ tooltip: { visible: syncTooltips, placement: Placement.Right }, }} - theme={chartTheme} baseTheme={chartBaseTheme} ariaLabel={ariaLabel} ariaUseDefaultSummary={!ariaLabel} diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_types/timeseries/vis.test.js b/src/plugins/vis_types/timeseries/public/application/components/vis_types/timeseries/vis.test.js index fe6f73ce66f79..d2c343d676ed9 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_types/timeseries/vis.test.js +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_types/timeseries/vis.test.js @@ -38,15 +38,6 @@ describe('TimeseriesVisualization', () => { setCharts({ theme: { - useChartsTheme: () => ({ - axes: { - tickLabel: { - padding: { - inner: 0, - }, - }, - }, - }), useChartsBaseTheme: () => ({ axes: { tickLabel: { diff --git a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js index 9f88adf53ca45..0874ef8593258 100644 --- a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js +++ b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js @@ -89,7 +89,7 @@ export const TimeSeries = ({ const { theme: themeService, activeCursor: activeCursorService } = getCharts(); const chartRef = useRef(); - const chartTheme = themeService.useChartsTheme(); + const chartBaseTheme = getBaseTheme(themeService.useChartsBaseTheme(), backgroundColor); const handleCursorUpdate = useActiveCursor(activeCursorService, chartRef, { isDateHistogram: true, @@ -127,8 +127,6 @@ export const TimeSeries = ({ // apply legend style change if bgColor is configured const classes = classNames(getChartClasses(backgroundColor)); - const baseTheme = getBaseTheme(themeService.useChartsBaseTheme(), backgroundColor); - const onBrushEndListener = ({ x }) => { if (!x) { return; @@ -196,15 +194,12 @@ export const TimeSeries = ({ pointerUpdateDebounce={0} theme={[ { - crosshair: { - ...chartTheme.crosshair, - }, axes: { tickLabel: { padding: { inner: hasVisibleAnnotations ? TICK_LABEL_WITH_ANNOTATIONS_PADDING - : chartTheme.axes.tickLabel.padding.inner, + : chartBaseTheme.axes.tickLabel.padding.inner, }, }, }, @@ -226,9 +221,8 @@ export const TimeSeries = ({ labelOptions: { maxLines: truncateLegend ? maxLegendLines ?? 1 : 0 }, }, }, - chartTheme, ]} - baseTheme={baseTheme} + baseTheme={chartBaseTheme} externalPointerEvents={{ tooltip: { visible: syncTooltips, placement: Placement.Right }, }} diff --git a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.test.ts b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.test.ts index 0e7dbb81233e2..8983d76eca15b 100644 --- a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.test.ts +++ b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.test.ts @@ -7,27 +7,29 @@ */ import { getBaseTheme } from './theme'; -import { LIGHT_THEME, DARK_THEME } from '@elastic/charts'; +import { LEGACY_LIGHT_THEME, LEGACY_DARK_THEME } from '@elastic/charts'; describe('TSVB theme', () => { it('should return the basic themes if no bg color is specified', () => { // use original dark/light theme - expect(getBaseTheme(LIGHT_THEME)).toEqual(LIGHT_THEME); - expect(getBaseTheme(DARK_THEME)).toEqual(DARK_THEME); + expect(getBaseTheme(LEGACY_LIGHT_THEME)).toEqual(LEGACY_LIGHT_THEME); + expect(getBaseTheme(LEGACY_DARK_THEME)).toEqual(LEGACY_DARK_THEME); // discard any wrong/missing bg color - expect(getBaseTheme(DARK_THEME, null)).toEqual(DARK_THEME); - expect(getBaseTheme(DARK_THEME, '')).toEqual(DARK_THEME); - expect(getBaseTheme(DARK_THEME, undefined)).toEqual(DARK_THEME); + expect(getBaseTheme(LEGACY_DARK_THEME, null)).toEqual(LEGACY_DARK_THEME); + expect(getBaseTheme(LEGACY_DARK_THEME, '')).toEqual(LEGACY_DARK_THEME); + expect(getBaseTheme(LEGACY_DARK_THEME, undefined)).toEqual(LEGACY_DARK_THEME); }); it('should return a highcontrast color theme for a different background', () => { // red use a near full-black color - expect(getBaseTheme(LIGHT_THEME, 'red').axes.axisTitle.fill).toEqual('rgb(23,23,23)'); + expect(getBaseTheme(LEGACY_LIGHT_THEME, 'red').axes.axisTitle.fill).toEqual('rgb(23,23,23)'); // violet increased the text color to full white for higer contrast - expect(getBaseTheme(LIGHT_THEME, '#ba26ff').axes.axisTitle.fill).toEqual('rgb(255,255,255)'); + expect(getBaseTheme(LEGACY_LIGHT_THEME, '#ba26ff').axes.axisTitle.fill).toEqual( + 'rgb(255,255,255)' + ); - // light yellow, prefer the LIGHT_THEME fill color because already with a good contrast - expect(getBaseTheme(LIGHT_THEME, '#fff49f').axes.axisTitle.fill).toEqual('#333'); + // light yellow, prefer the LEGACY_LIGHT_THEME fill color because already with a good contrast + expect(getBaseTheme(LEGACY_LIGHT_THEME, '#fff49f').axes.axisTitle.fill).toEqual('#333'); }); }); diff --git a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.ts b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.ts index 82567f8e8223e..6c1142d8b7e0f 100644 --- a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.ts +++ b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/utils/theme.ts @@ -8,7 +8,7 @@ // @ts-ignore import colorJS from 'color'; -import { Theme, LIGHT_THEME, DARK_THEME } from '@elastic/charts'; +import { Theme, LEGACY_LIGHT_THEME, LEGACY_DARK_THEME } from '@elastic/charts'; function computeRelativeLuminosity(rgb: string) { return colorJS(rgb).luminosity(); @@ -96,11 +96,11 @@ export function getBaseTheme(baseTheme: Theme, bgColor?: string | null): Theme { } const bgLuminosity = computeRelativeLuminosity(bgColor); - const mainTheme = bgLuminosity <= 0.179 ? DARK_THEME : LIGHT_THEME; + const mainTheme = bgLuminosity <= 0.179 ? LEGACY_DARK_THEME : LEGACY_LIGHT_THEME; const color = findBestContrastColor( bgColor, - LIGHT_THEME.axes.axisTitle.fill, - DARK_THEME.axes.axisTitle.fill + LEGACY_LIGHT_THEME.axes.axisTitle.fill, + LEGACY_DARK_THEME.axes.axisTitle.fill ); return { ...mainTheme, diff --git a/test/server_integration/http/platform/status.ts b/test/server_integration/http/platform/status.ts index 8ce193c670849..df472ec36d818 100644 --- a/test/server_integration/http/platform/status.ts +++ b/test/server_integration/http/platform/status.ts @@ -35,13 +35,13 @@ export default function ({ getService }: FtrProviderContext) { // This test must come first because the timeout only applies to the initial emission it("returns a timeout for status check that doesn't emit after 30s", async () => { let aStatus = await getStatus('statusPluginA'); - expect(aStatus.level).to.eql('unavailable'); + expect(aStatus === undefined || aStatus.level === 'unavailable').to.eql(true); // Status will remain in unavailable until the custom status check times out // Keep polling until that condition ends, up to a timeout await retry.waitForWithTimeout(`Status check to timeout`, 40_000, async () => { aStatus = await getStatus('statusPluginA'); - return aStatus.summary === 'Status check timed out after 30s'; + return aStatus?.summary === 'Status check timed out after 30s'; }); expect(aStatus.level).to.eql('unavailable'); @@ -53,7 +53,7 @@ export default function ({ getService }: FtrProviderContext) { await retry.waitForWithTimeout( `statusPluginA status to update`, 5_000, - async () => (await getStatus('statusPluginA')).level === 'degraded' + async () => (await getStatus('statusPluginA'))?.level === 'degraded' ); await statusPropagation(); expect((await getStatus('statusPluginA')).level).to.eql('degraded'); diff --git a/versions.json b/versions.json index 26fee0ef485b3..ce91f8f76bb7e 100644 --- a/versions.json +++ b/versions.json @@ -14,7 +14,7 @@ "previousMinor": true }, { - "version": "7.17.16", + "version": "7.17.17", "branch": "7.17", "previousMajor": true } diff --git a/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx b/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx index 2e0bf6504d289..f23470bbbe7a7 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx @@ -109,6 +109,18 @@ const AlertsSettingsComponent = ({ knowledgeBase, setUpdatedKnowledgeBaseSetting {i18n.LATEST_AND_RISKIEST_OPEN_ALERTS} + + + + {i18n.YOUR_ANONYMIZATION_SETTINGS} + + + + + + {i18n.SELECT_FEWER_ALERTS} + + ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts index 3c7cdda10f924..03e989ab6a055 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts @@ -23,9 +23,23 @@ export const ASK_QUESTIONS_ABOUT = i18n.translate( export const LATEST_AND_RISKIEST_OPEN_ALERTS = i18n.translate( 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettings.latestAndRiskiestOpenAlertsLabel', + { + defaultMessage: 'latest and riskiest open and acknowledged alerts in your environment.', + } +); + +export const YOUR_ANONYMIZATION_SETTINGS = i18n.translate( + 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettings.yourAnonymizationSettingsLabel', + { + defaultMessage: 'Your Anonymization settings will be applied to the alerts.', + } +); + +export const SELECT_FEWER_ALERTS = i18n.translate( + 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettings.selectFewerAlertsLabel', { defaultMessage: - 'latest and riskiest open alerts in your environment. Your Anonymization settings will be applied to the alerts', + "Select fewer alerts if the model's maximum context length is frequently exceeded.", } ); diff --git a/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx b/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx index e6c4e7b573335..615816852a13b 100644 --- a/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx +++ b/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx @@ -190,7 +190,6 @@ export const DocumentCountChart: FC = (props) => { const { data, uiSettings, fieldFormats, charts } = dependencies; - const chartTheme = charts.theme.useChartsTheme(); const chartBaseTheme = charts.theme.useChartsBaseTheme(); const xAxisFormatter = fieldFormats.deserialize({ id: 'date' }); @@ -474,7 +473,6 @@ export const DocumentCountChart: FC = (props) => { setMlBrushMarginLeft(projection.left); setMlBrushWidth(projection.width); }} - theme={chartTheme} baseTheme={chartBaseTheme} debugState={window._echDebugStateFlag ?? false} showLegend={false} @@ -499,6 +497,7 @@ export const DocumentCountChart: FC = (props) => { yScaleType={ScaleType.Linear} xAccessor="time" yAccessors={['value']} + stackAccessors={['true']} data={adjustedChartPoints} timeZone={timeZone} color={barColor} @@ -514,6 +513,7 @@ export const DocumentCountChart: FC = (props) => { yScaleType={ScaleType.Linear} xAccessor="time" yAccessors={['value']} + stackAccessors={['true']} data={adjustedChartPointsSplit} timeZone={timeZone} color={barHighlightColor} diff --git a/x-pack/packages/ml/data_grid/components/column_chart.tsx b/x-pack/packages/ml/data_grid/components/column_chart.tsx index 9d71c16224b0c..9f8b866bea930 100644 --- a/x-pack/packages/ml/data_grid/components/column_chart.tsx +++ b/x-pack/packages/ml/data_grid/components/column_chart.tsx @@ -8,7 +8,7 @@ import React, { type FC } from 'react'; import { css } from '@emotion/react'; -import { BarSeries, Chart, Settings, ScaleType } from '@elastic/charts'; +import { BarSeries, Chart, Settings, ScaleType, LEGACY_LIGHT_THEME } from '@elastic/charts'; import { euiTextTruncate, type EuiDataGridColumn } from '@elastic/eui'; import { euiThemeVars } from '@kbn/ui-theme'; @@ -81,8 +81,9 @@ export const ColumnChart: FC = ({
= ({ const { charts } = useAiopsAppContext(); const euiTheme = useEuiTheme(); - const defaultChartTheme = charts.theme.useChartsTheme(); + const chartBaseTheme = charts.theme.useChartsBaseTheme(); const miniHistogramChartTheme: PartialTheme = { chartMargins: { @@ -107,7 +107,8 @@ export const MiniHistogram: FC = ({ diff --git a/x-pack/plugins/apm/public/components/app/error_group_details/distribution/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/distribution/index.tsx index 2c4c9eec27e26..b79f30505e5db 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_details/distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/distribution/index.tsx @@ -14,12 +14,10 @@ import { ScaleType, Settings, Tooltip, + LIGHT_THEME, + DARK_THEME, } from '@elastic/charts'; import { EuiTitle } from '@elastic/eui'; -import { - EUI_CHARTS_THEME_DARK, - EUI_CHARTS_THEME_LIGHT, -} from '@elastic/eui/dist/eui_charts_theme'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; @@ -101,11 +99,7 @@ export function ErrorDistribution({ distribution, title, fetchStatus }: Props) { showLegend showLegendExtra legendPosition={Position.Bottom} - theme={ - theme.darkMode - ? EUI_CHARTS_THEME_DARK.theme - : EUI_CHARTS_THEME_LIGHT.theme - } + theme={theme.darkMode ? DARK_THEME : LIGHT_THEME} locale={i18n.getLocale()} /> diff --git a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx index 88e94ef82a61c..82bbd07ba8588 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx @@ -31,6 +31,12 @@ describe('Embedded Map', () => { }), })); + const mockSpaces = { + getActiveSpace: jest + .fn() + .mockImplementation(() => ({ id: 'mockSpaceId' })), + }; + const { findByTestId } = render( { ]} > - + { const setLayerList = async () => { - if (embeddable && !isErrorEmbeddable(embeddable)) { + if (embeddable && !isErrorEmbeddable(embeddable) && dataViewId) { const layerList = await getLayerList({ selectedMap, maps, dataViewId }); await Promise.all([ embeddable.setLayerList(layerList), diff --git a/x-pack/plugins/apm/public/components/app/storage_explorer/services_table/storage_details_per_service.tsx b/x-pack/plugins/apm/public/components/app/storage_explorer/services_table/storage_details_per_service.tsx index 96c28caa3134d..62a4aa6a1f38c 100644 --- a/x-pack/plugins/apm/public/components/app/storage_explorer/services_table/storage_details_per_service.tsx +++ b/x-pack/plugins/apm/public/components/app/storage_explorer/services_table/storage_details_per_service.tsx @@ -17,7 +17,7 @@ import { EuiFlexGrid, EuiSpacer, } from '@elastic/eui'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { Chart, Partition, @@ -80,7 +80,7 @@ export function StorageDetailsPerService({ indexLifecyclePhase, }: Props) { const { core } = useApmPluginContext(); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const router = useApmRouter(); const { euiTheme } = useEuiTheme(); @@ -202,8 +202,9 @@ export function StorageDetailsPerService({ emptySizeRatio: 0.3, }, }, - ...chartTheme, + ...chartThemes.theme, ]} + baseTheme={chartThemes.baseTheme} locale={i18n.getLocale()} showLegend /> diff --git a/x-pack/plugins/apm/public/components/app/storage_explorer/storage_chart.tsx b/x-pack/plugins/apm/public/components/app/storage_explorer/storage_chart.tsx index e0a3eec1eb228..98f130c71d461 100644 --- a/x-pack/plugins/apm/public/components/app/storage_explorer/storage_chart.tsx +++ b/x-pack/plugins/apm/public/components/app/storage_explorer/storage_chart.tsx @@ -15,7 +15,7 @@ import { ScaleType, Settings, } from '@elastic/charts'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { i18n } from '@kbn/i18n'; import { useProgressiveFetcher } from '../../../hooks/use_progressive_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; @@ -29,7 +29,7 @@ import { asDynamicBytes } from '../../../../common/utils/formatters'; export function StorageChart() { const { core } = useApmPluginContext(); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const euiPaletteColorBlindRotations = 3; const groupedPalette = euiPaletteColorBlind({ @@ -99,8 +99,9 @@ export function StorageChart() { area: { opacity: 1 }, }, }, - ...chartTheme, + ...chartThemes.theme, ]} + baseTheme={chartThemes.baseTheme} showLegend legendPosition={Position.Right} locale={i18n.getLocale()} diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx index abd6aee61f407..aa2ea7388ffd6 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx @@ -17,7 +17,7 @@ import { WaterfallLegendType, } from './waterfall/waterfall_helpers/waterfall_helpers'; import { WaterfallLegends } from './waterfall_legends'; -import { MissingTransactionWarning } from './waterfall/missing_transaction_warning'; +import { OrphanTraceItemsWarning } from './waterfall/orphan_trace_items_warning'; interface Props { waterfallItemId?: string; @@ -39,7 +39,7 @@ export function WaterfallContainer({ if (!waterfall) { return null; } - const { legends, items, hasOrphanTraceItems } = waterfall; + const { legends, items, orphanTraceItemsCount } = waterfall; // Service colors are needed to color the dot in the error popover const serviceLegends = legends.filter( @@ -116,9 +116,11 @@ export function WaterfallContainer({ type={colorBy} /> - {hasOrphanTraceItems ? ( + {orphanTraceItemsCount > 0 ? ( - + ) : null} diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/missing_transaction_warning.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/orphan_trace_items_warning.tsx similarity index 71% rename from x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/missing_transaction_warning.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/orphan_trace_items_warning.tsx index 62d1d05bca6c2..c3554e2c84c40 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/missing_transaction_warning.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/orphan_trace_items_warning.tsx @@ -9,7 +9,11 @@ import React from 'react'; import { EuiBadge, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -export function MissingTransactionWarning() { +export function OrphanTraceItemsWarning({ + orphanTraceItemsCount, +}: { + orphanTraceItemsCount: number; +}) { return ( { }); }); - describe('getHasOrphanTraceItems', () => { + describe('getOrphanTraceItemsCount', () => { const myTransactionItem = { processor: { event: 'transaction' }, trace: { id: 'myTrace' }, @@ -728,7 +728,7 @@ describe('waterfall_helpers', () => { }, } as WaterfallTransaction; - it('should return false if there are no orphan items', () => { + it('should return missing items count: 0 if there are no orphan items', () => { const traceItems: Array = [ myTransactionItem, { @@ -741,10 +741,10 @@ describe('waterfall_helpers', () => { }, } as WaterfallSpan, ]; - expect(getHasOrphanTraceItems(traceItems)).toBe(false); + expect(getOrphanTraceItemsCount(traceItems)).toBe(0); }); - it('should return true if there are orphan items', () => { + it('should return missing items count if there are orphan items', () => { const traceItems: Array = [ myTransactionItem, { @@ -757,7 +757,7 @@ describe('waterfall_helpers', () => { }, } as WaterfallSpan, ]; - expect(getHasOrphanTraceItems(traceItems)).toBe(true); + expect(getOrphanTraceItemsCount(traceItems)).toBe(1); }); }); }); diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts index b197859ff1083..7152cecc3f805 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts @@ -48,7 +48,7 @@ export interface IWaterfall { totalErrorsCount: number; traceDocsTotal: number; maxTraceItems: number; - hasOrphanTraceItems: boolean; + orphanTraceItemsCount: number; } interface IWaterfallItemBase { @@ -416,7 +416,7 @@ function getErrorCountByParentId( }, {}); } -export const getHasOrphanTraceItems = ( +export const getOrphanTraceItemsCount = ( traceDocs: Array ) => { const waterfallItemsIds = new Set( @@ -427,9 +427,13 @@ export const getHasOrphanTraceItems = ( ) ); - return traceDocs.some( - (item) => item.parent?.id && !waterfallItemsIds.has(item.parent.id) - ); + let missingTraceItemsCounter = 0; + traceDocs.some((item) => { + if (item.parent?.id && !waterfallItemsIds.has(item.parent.id)) { + missingTraceItemsCounter++; + } + }); + return missingTraceItemsCounter; }; export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { @@ -446,7 +450,7 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { totalErrorsCount: 0, traceDocsTotal: 0, maxTraceItems: 0, - hasOrphanTraceItems: false, + orphanTraceItemsCount: 0, }; } @@ -482,7 +486,7 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { const duration = getWaterfallDuration(items); const legends = getLegends(items); - const hasOrphanTraceItems = getHasOrphanTraceItems(traceItems.traceDocs); + const orphanTraceItemsCount = getOrphanTraceItemsCount(traceItems.traceDocs); return { entryWaterfallTransaction, @@ -498,6 +502,6 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { totalErrorsCount: traceItems.errorDocs.length, traceDocsTotal: traceItems.traceDocsTotal, maxTraceItems: traceItems.maxTraceItems, - hasOrphanTraceItems, + orphanTraceItemsCount, }; } diff --git a/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx index c215c50c9e327..89e409aacd2f9 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx @@ -25,7 +25,7 @@ import { i18n } from '@kbn/i18n'; import moment from 'moment'; import React from 'react'; import { useHistory } from 'react-router-dom'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { Annotation } from '../../../../../common/annotations'; import { asAbsoluteDateTime, @@ -70,7 +70,7 @@ export function BreakdownChart({ id, }: Props) { const history = useHistory(); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const { core } = useApmPluginContext(); const { chartRef, updatePointerEvent } = useChartPointerEventContext(); const { @@ -115,7 +115,8 @@ export function BreakdownChart({ showLegend showLegendExtra legendPosition={Position.Bottom} - theme={chartTheme} + theme={chartThemes.theme} + baseTheme={chartThemes.baseTheme} xDomain={{ min, max }} flatLegend onPointerUpdate={updatePointerEvent} diff --git a/x-pack/plugins/apm/public/components/shared/charts/duration_distribution_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/duration_distribution_chart/index.tsx index ac1b4251e83f8..9d34e2b8b3280 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/duration_distribution_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/duration_distribution_chart/index.tsx @@ -29,7 +29,7 @@ import { euiPaletteColorBlind } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { getDurationFormatter } from '../../../../../common/utils/formatters'; @@ -111,7 +111,7 @@ export function DurationDistributionChart({ status, eventType, }: DurationDistributionChartProps) { - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const euiTheme = useTheme(); const markerPercentile = DEFAULT_PERCENTILE_THRESHOLD; @@ -202,8 +202,9 @@ export function DurationDistributionChart({ }, }, }, - ...chartTheme, + ...chartThemes.theme, ]} + baseTheme={chartThemes.baseTheme} showLegend={true} legendPosition={Position.Bottom} onBrushEnd={onChartSelection} diff --git a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx index 02ab62585643a..c7f5ab023713c 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx @@ -23,7 +23,7 @@ import { EuiPanel, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { useHistory } from 'react-router-dom'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { usePreviousPeriodLabel } from '../../../../hooks/use_previous_period_text'; import { SERVICE_NODE_NAME } from '../../../../../common/es_fields/apm'; import { @@ -58,7 +58,7 @@ export function InstancesLatencyDistributionChart({ const hasData = items.length > 0; const theme = useTheme(); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const maxLatency = Math.max(...items.map((item) => item.latency ?? 0)); const latencyFormatter = getDurationFormatter(maxLatency); @@ -129,7 +129,8 @@ export function InstancesLatencyDistributionChart({ legendPosition={Position.Bottom} onElementClick={handleElementClick} showLegend - theme={chartTheme} + theme={chartThemes.theme} + baseTheme={chartThemes.baseTheme} xDomain={xDomain} locale={i18n.getLocale()} /> diff --git a/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx index 3375a8186e3f1..f7baf95c488ad 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx @@ -23,7 +23,7 @@ import { EuiLoadingChart, } from '@elastic/eui'; import React from 'react'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { i18n } from '@kbn/i18n'; import { Coordinate } from '../../../../../typings/timeseries'; import { useTheme } from '../../../../hooks/use_theme'; @@ -103,7 +103,7 @@ function SparkPlotItem({ comparisonSeriesColor?: string; }) { const theme = useTheme(); - const defaultChartTheme = useChartTheme(); + const defaultChartThemes = useChartThemes(); const comparisonChartTheme = getComparisonChartTheme(); const hasComparisonSeries = !!comparisonSeries?.length; @@ -142,7 +142,8 @@ function SparkPlotItem({ return ( diff --git a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx index 1fd876d61b3d3..cc8f85f347ddd 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx @@ -28,7 +28,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { ReactElement } from 'react'; import { useHistory } from 'react-router-dom'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { isExpectedBoundsComparison } from '../time_comparison/get_comparison_options'; import { useChartPointerEventContext } from '../../../context/chart_pointer_event/use_chart_pointer_event_context'; @@ -74,7 +74,7 @@ export function TimeseriesChart({ const history = useHistory(); const { chartRef, updatePointerEvent } = useChartPointerEventContext(); const theme = useTheme(); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const anomalyChartTimeseries = getChartAnomalyTimeseries({ anomalyTimeseries, theme, @@ -189,8 +189,9 @@ export function TimeseriesChart({ line: { visible: false }, }, }, - ...chartTheme, + ...chartThemes.theme, ]} + baseTheme={chartThemes.baseTheme} onPointerUpdate={updatePointerEvent} externalPointerEvents={{ tooltip: { visible: true }, diff --git a/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/index.tsx b/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/index.tsx index 6a505efee23b2..2e694070ceaed 100644 --- a/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/index.tsx @@ -12,7 +12,7 @@ import { euiPaletteColorBlind, } from '@elastic/eui'; import { css } from '@emotion/css'; -import { useChartTheme } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes } from '@kbn/observability-shared-plugin/public'; import { uniqueId } from 'lodash'; import React, { useMemo, useRef } from 'react'; import { i18n } from '@kbn/i18n'; @@ -73,7 +73,7 @@ export function CriticalPathFlamegraph( [timerange, traceIds, serviceName, transactionName] ); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const isLoading = isPending(traceIdsFetchStatus) || isPending(criticalPathFetchStatus); @@ -143,8 +143,9 @@ export function CriticalPathFlamegraph( chartMargins: themeOverrides.chartMargins, chartPaddings: themeOverrides.chartPaddings, }, - ...chartTheme, + ...chartThemes.theme, ]} + baseTheme={chartThemes.baseTheme} onElementClick={(elements) => {}} locale={i18n.getLocale()} /> diff --git a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx index 1f066d1322eb6..987fe5b23de52 100644 --- a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx +++ b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx @@ -66,6 +66,10 @@ export function DiscoverLink({ query = {}, ...rest }: Props) { const location = useLocation(); const dataViewId = useDataViewId(); + if (!dataViewId) { + return null; + } + const href = getDiscoverHref({ basePath: core.http.basePath, query, diff --git a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx index f4d95a87df5dc..4d79e5e8f2796 100644 --- a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx @@ -35,7 +35,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'processor.event:\\"transaction\\" AND transaction.id:\\"8b60bd32ecc6e150\\" AND trace.id:\\"8b60bd32ecc6e1506735a8b6cfcf175c\\"'))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_mockSpaceId,interval:auto,query:(language:kuery,query:'processor.event:\\"transaction\\" AND transaction.id:\\"8b60bd32ecc6e150\\" AND trace.id:\\"8b60bd32ecc6e1506735a8b6cfcf175c\\"'))"` ); }); @@ -55,7 +55,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'span.id:\\"test-span-id\\"'))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_mockSpaceId,interval:auto,query:(language:kuery,query:'span.id:\\"test-span-id\\"'))"` ); }); @@ -77,7 +77,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\"'),sort:('@timestamp':desc))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_mockSpaceId,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\"'),sort:('@timestamp':desc))"` ); }); @@ -100,7 +100,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\" AND some:kuery-string'),sort:('@timestamp':desc))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_mockSpaceId,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\" AND some:kuery-string'),sort:('@timestamp':desc))"` ); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts index b50bbd5239ccb..a21e79353e675 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts @@ -69,9 +69,9 @@ export const getSections = ({ allDatasetsLocator: LocatorPublic; logsLocator: LocatorPublic; nodeLogsLocator: LocatorPublic; - dataViewId: string; + dataViewId?: string; }) => { - if (!transaction) return []; + if (!transaction || !dataViewId) return []; const hostName = transaction.host?.hostname; const podId = transaction.kubernetes?.pod?.uid; diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx index 28fc0657ee831..20e3d2ad0c948 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx @@ -30,6 +30,7 @@ import { } from '../../../utils/test_helpers'; import { TransactionActionMenu } from './transaction_action_menu'; import * as Transactions from './__fixtures__/mock_data'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; const apmContextMock = { ...mockApmPluginContextValue, @@ -60,10 +61,16 @@ history.replace( ); function Wrapper({ children }: { children?: React.ReactNode }) { + const mockSpaces = { + getActiveSpace: jest.fn().mockImplementation(() => ({ id: 'mockSpaceId' })), + }; + return ( - {children} + + {children} + ); diff --git a/x-pack/plugins/apm/public/hooks/use_data_view_id.tsx b/x-pack/plugins/apm/public/hooks/use_data_view_id.tsx index 3390471ff60e7..14e1a1fb92721 100644 --- a/x-pack/plugins/apm/public/hooks/use_data_view_id.tsx +++ b/x-pack/plugins/apm/public/hooks/use_data_view_id.tsx @@ -11,15 +11,15 @@ import { getDataViewId } from '../../common/data_view_constants'; import { ApmPluginStartDeps } from '../plugin'; export function useDataViewId() { - const [dataViewId, setDataViewId] = useState( - getDataViewId('default') - ); + const [dataViewId, setDataViewId] = useState(); const { spaces } = useKibana().services; useEffect(() => { const fetchSpaceId = async () => { const space = await spaces?.getActiveSpace(); - setDataViewId(getDataViewId(space?.id ?? 'default')); + if (space?.id) { + setDataViewId(getDataViewId(space?.id)); + } }; fetchSpaceId(); diff --git a/x-pack/plugins/apm/public/utils/test_helpers.tsx b/x-pack/plugins/apm/public/utils/test_helpers.tsx index bb81f73ef7705..360ac9a95298b 100644 --- a/x-pack/plugins/apm/public/utils/test_helpers.tsx +++ b/x-pack/plugins/apm/public/utils/test_helpers.tsx @@ -19,6 +19,7 @@ import { Moment } from 'moment-timezone'; import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { MockApmPluginContextWrapper } from '../context/apm_plugin/mock_apm_plugin_context'; import { UrlParamsProvider } from '../context/url_params_context/url_params_context'; @@ -61,20 +62,27 @@ export function mockMoment() { // Useful for getting the rendered href from any kind of link component export async function getRenderedHref(Component: React.FC, location: Location) { + const mockSpaces = { + getActiveSpace: jest.fn().mockImplementation(() => ({ id: 'mockSpaceId' })), + }; + const el = render( - - - + + + + + ); - const a = el.container.querySelector('a'); - await waitFor(() => {}, { container: a! }); + await waitFor(() => el.container.querySelector('a') !== null, { + container: el.container, + }); - return a ? a.getAttribute('href') : ''; + return el.container.querySelector('a')?.getAttribute('href'); } export function mockNow(date: string | number | Date) { diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/plugins/cloud_security_posture/common/constants.ts index 770f4ef5d06e3..5e56b1131f10f 100644 --- a/x-pack/plugins/cloud_security_posture/common/constants.ts +++ b/x-pack/plugins/cloud_security_posture/common/constants.ts @@ -78,6 +78,8 @@ export const RULE_FAILED = `failed`; export const POSTURE_TYPE_ALL = 'all'; +export const CSPM_FINDINGS_STATS_INTERVAL = 5; + // A mapping of in-development features to their status. These features should be hidden from users but can be easily // activated via a simple code change in a single location. export const INTERNAL_FEATURE_FLAGS = { diff --git a/x-pack/plugins/cloud_security_posture/common/schemas/benchmark.ts b/x-pack/plugins/cloud_security_posture/common/types/benchmarks/v1.ts similarity index 68% rename from x-pack/plugins/cloud_security_posture/common/schemas/benchmark.ts rename to x-pack/plugins/cloud_security_posture/common/types/benchmarks/v1.ts index 0d30ae992dd11..48c9c1446b0f6 100644 --- a/x-pack/plugins/cloud_security_posture/common/schemas/benchmark.ts +++ b/x-pack/plugins/cloud_security_posture/common/types/benchmarks/v1.ts @@ -4,7 +4,28 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { type TypeOf, schema } from '@kbn/config-schema'; + +import { schema, TypeOf } from '@kbn/config-schema'; +import type { PackagePolicy } from '@kbn/fleet-plugin/common'; +import type { AgentPolicy } from '@kbn/fleet-plugin/common'; + +export type AgentPolicyStatus = Pick & { agents: number }; + +export const benchmarkScoreSchema = schema.object({ + postureScore: schema.number({ defaultValue: 0, min: 0 }), + resourcesEvaluated: schema.number({ defaultValue: 0, min: 0 }), + totalFailed: schema.number({ defaultValue: 0, min: 0 }), + totalFindings: schema.number({ defaultValue: 0, min: 0 }), + totalPassed: schema.number({ defaultValue: 0, min: 0 }), +}); + +export type BenchmarkScore = TypeOf; + +export interface Benchmark { + package_policy: PackagePolicy; + agent_policy: AgentPolicyStatus; + rules_count: number; +} export const DEFAULT_BENCHMARKS_PER_PAGE = 20; export const BENCHMARK_PACKAGE_POLICY_PREFIX = 'package_policy.'; @@ -60,3 +81,10 @@ export const benchmarksQueryParamsSchema = schema.object({ }); export type BenchmarksQueryParams = TypeOf; + +export interface GetBenchmarkResponse { + items: Benchmark[]; + total: number; + page: number; + perPage: number; +} diff --git a/x-pack/plugins/cloud_security_posture/common/types/benchmarks/v2.ts b/x-pack/plugins/cloud_security_posture/common/types/benchmarks/v2.ts new file mode 100644 index 0000000000000..f5052d08f9914 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/types/benchmarks/v2.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// Optionally, re-export the entire set of types. Interfaces and types declared after this will override v1 declarations. +import { schema } from '@kbn/config-schema'; +import type { BenchmarkScore } from './v1'; + +export type { BenchmarkScore } from './v1'; + +export type BenchmarksCisId = 'cis_k8s' | 'cis_azure' | 'cis_aws' | 'cis_eks' | 'cis_gcp'; + +export interface Benchmark { + id: BenchmarksCisId; + name: string; + version: string; + score: BenchmarkScore; + evaluation: number; +} + +export interface GetBenchmarkResponse { + items: Benchmark[]; +} + +export const benchmarkResponseSchema = schema.object({ + items: schema.arrayOf( + schema.object({ + id: schema.oneOf([ + schema.literal('cis_k8s'), + schema.literal('cis_azure'), + schema.literal('cis_aws'), + schema.literal('cis_eks'), + schema.literal('cis_gcp'), + ]), + name: schema.string(), + version: schema.string(), + score: schema.object({ + postureScore: schema.number({ defaultValue: 0, min: 0 }), + resourcesEvaluated: schema.number({ defaultValue: 0, min: 0 }), + totalFailed: schema.number({ defaultValue: 0, min: 0 }), + totalFindings: schema.number({ defaultValue: 0, min: 0 }), + totalPassed: schema.number({ defaultValue: 0, min: 0 }), + }), + evaluation: schema.number({ defaultValue: 0, min: 0 }), + }) + ), +}); diff --git a/x-pack/plugins/cloud_security_posture/common/types/index.ts b/x-pack/plugins/cloud_security_posture/common/types/index.ts index a2aaa3b2ef14e..d6e804c33f017 100644 --- a/x-pack/plugins/cloud_security_posture/common/types/index.ts +++ b/x-pack/plugins/cloud_security_posture/common/types/index.ts @@ -9,6 +9,9 @@ export * as rulesV1 from './rules/v1'; export * as rulesV2 from './rules/v2'; export * as rulesV3 from './rules/v3'; +export * as benchmarkV1 from './benchmarks/v1'; +export * as benchmarkV2 from './benchmarks/v2'; + // Explicit export of everything from latest export type { cspBenchmarkRuleMetadataSchema, @@ -16,4 +19,7 @@ export type { CspBenchmarkRule, FindCspBenchmarkRuleRequest, FindCspBenchmarkRuleResponse, + BenchmarkScore, + Benchmark, + GetBenchmarkResponse, } from './latest'; diff --git a/x-pack/plugins/cloud_security_posture/common/types/latest.ts b/x-pack/plugins/cloud_security_posture/common/types/latest.ts index 8b55674005249..9951c7a418ecc 100644 --- a/x-pack/plugins/cloud_security_posture/common/types/latest.ts +++ b/x-pack/plugins/cloud_security_posture/common/types/latest.ts @@ -6,3 +6,4 @@ */ export * from './rules/v3'; +export * from './benchmarks/v2'; diff --git a/x-pack/plugins/cloud_security_posture/common/types_old.ts b/x-pack/plugins/cloud_security_posture/common/types_old.ts index abfd590b55ae0..d3706c51469f8 100644 --- a/x-pack/plugins/cloud_security_posture/common/types_old.ts +++ b/x-pack/plugins/cloud_security_posture/common/types_old.ts @@ -5,7 +5,6 @@ * 2.0. */ import { type TypeOf } from '@kbn/config-schema'; -import type { PackagePolicy, AgentPolicy } from '@kbn/fleet-plugin/common'; import { CspFinding } from './schemas/csp_finding'; import { SUPPORTED_CLOUDBEAT_INPUTS, SUPPORTED_POLICY_TEMPLATES } from './constants'; @@ -142,14 +141,6 @@ export interface BaseCspSetupStatus { export type CspSetupStatus = BaseCspSetupStatus; -export type AgentPolicyStatus = Pick & { agents: number }; - -export interface Benchmark { - package_policy: PackagePolicy; - agent_policy: AgentPolicyStatus; - rules_count: number; -} - export type BenchmarkId = CspBenchmarkRuleMetadata['benchmark']['id']; export type BenchmarkName = CspBenchmarkRuleMetadata['benchmark']['name']; export type RuleSection = CspBenchmarkRuleMetadata['section']; @@ -159,13 +150,6 @@ export type PostureInput = typeof SUPPORTED_CLOUDBEAT_INPUTS[number]; export type CloudSecurityPolicyTemplate = typeof SUPPORTED_POLICY_TEMPLATES[number]; export type PosturePolicyTemplate = Extract; -export interface GetBenchmarkResponse { - items: Benchmark[]; - total: number; - page: number; - perPage: number; -} - export type GetComplianceDashboardRequest = TypeOf; // CNVM DASHBOARD diff --git a/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts b/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts index fd04733bb17c9..2f7706705da45 100644 --- a/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts +++ b/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts @@ -31,6 +31,7 @@ import type { AzureCredentialsType, RuleSection, } from '../types_old'; +import type { BenchmarksCisId } from '../types/latest'; /** * @example @@ -172,3 +173,35 @@ export const cleanupCredentials = (packagePolicy: NewPackagePolicy | UpdatePacka // nothing to do, return unmutated policy return packagePolicy; }; + +export const getBenchmarkCisName = (benchmarkId: BenchmarksCisId) => { + switch (benchmarkId) { + case 'cis_k8s': + return 'CIS Kubernetes'; + case 'cis_azure': + return 'CIS Azure'; + case 'cis_aws': + return 'CIS AWS'; + case 'cis_eks': + return 'CIS EKS'; + case 'cis_gcp': + return 'CIS GCP'; + } + return null; +}; + +export const getBenchmarkApplicableTo = (benchmarkId: BenchmarksCisId) => { + switch (benchmarkId) { + case 'cis_k8s': + return 'Kubernetes'; + case 'cis_azure': + return 'Microsoft Azure'; + case 'cis_aws': + return 'Amazon Web Services'; + case 'cis_eks': + return 'Amazon Elastic Kubernetes Service'; + case 'cis_gcp': + return 'Google Cloud Provider'; + } + return null; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts index e89d7d610bc9c..6182a0b47f54e 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts @@ -27,7 +27,7 @@ const NAV_ITEMS_NAMES = { defaultMessage: 'Findings', }), BENCHMARKS: i18n.translate('xpack.csp.navigation.myBenchmarksNavItemLabel', { - defaultMessage: 'Benchmark rules', + defaultMessage: 'Benchmarks', }), RULES: i18n.translate('xpack.csp.navigation.rulesNavItemLabel', { defaultMessage: 'Rules', diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts index f5c7a6e5cc5e4..85e4796743cf3 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts @@ -8,7 +8,7 @@ import { pagePathGetters, pkgKeyFromPackageInfo } from '@kbn/fleet-plugin/public'; import { useCisKubernetesIntegration } from '../api/use_cis_kubernetes_integration'; import { useKibana } from '../hooks/use_kibana'; -import { useCspBenchmarkIntegrations } from '../../pages/benchmarks/use_csp_benchmark_integrations'; +import { useCspBenchmarkIntegrationsV1 } from '../../pages/benchmarks/use_csp_benchmark_integrations'; import { PostureTypes } from '../../../common/types_old'; export const useCISIntegrationPoliciesLink = ({ @@ -19,7 +19,7 @@ export const useCISIntegrationPoliciesLink = ({ const { http } = useKibana().services; const cisIntegration = useCisKubernetesIntegration(); // using an existing hook to get agent id and package policy id - const cspBenchmarkIntegrations = useCspBenchmarkIntegrations({ + const cspBenchmarkIntegrations = useCspBenchmarkIntegrationsV1({ name: '', page: 1, perPage: 100, @@ -29,6 +29,7 @@ export const useCISIntegrationPoliciesLink = ({ if (!cisIntegration.isSuccess) return; const intergrations = cspBenchmarkIntegrations.data?.items; + const matchedIntegration = intergrations?.find( (integration) => integration?.package_policy?.inputs?.find((input) => input?.enabled)?.policy_template === diff --git a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx b/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx index ef7e2750b34fd..a9b118be899ab 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx @@ -85,7 +85,7 @@ export const AccountsEvaluatedWidget = ({ transition: ${euiTheme.animation.normal} ease-in; border-bottom: ${euiTheme.border.thick}; border-color: transparent; - + text-wrap: nowrap; :hover { cursor: pointer; border-color: ${euiTheme.colors.darkestShade}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx index 947e48f434554..3f717a9f4cb22 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx @@ -4,18 +4,16 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import { - EuiFieldText, - EuiFieldPassword, + EuiCallOut, EuiFormRow, + EuiHorizontalRule, EuiLink, + EuiSelect, EuiSpacer, EuiText, EuiTitle, - EuiSelect, - EuiCallOut, - EuiHorizontalRule, } from '@elastic/eui'; import type { NewPackagePolicy } from '@kbn/fleet-plugin/public'; import { NewPackagePolicyInput, PackageInfo } from '@kbn/fleet-plugin/common'; @@ -23,25 +21,24 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { + AwsCredentialsTypeOptions, getAwsCredentialsFormManualOptions, - AwsOptions, - DEFAULT_MANUAL_AWS_CREDENTIALS_TYPE, } from './get_aws_credentials_form_options'; -import { RadioGroup } from '../csp_boxed_radio_group'; -import { - getCspmCloudFormationDefaultValue, - getPosturePolicy, - NewPackagePolicyPostureInput, -} from '../utils'; +import { CspRadioOption, RadioGroup } from '../csp_boxed_radio_group'; +import { getPosturePolicy, NewPackagePolicyPostureInput } from '../utils'; import { SetupFormat, useAwsCredentialsForm } from './hooks'; import { AWS_ORGANIZATION_ACCOUNT } from '../policy_template_form'; import { AwsCredentialsType } from '../../../../common/types_old'; +import { AwsInputVarFields } from './aws_input_var_fields'; +import { + AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ, + AWS_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ, +} from '../../test_subjects'; interface AWSSetupInfoContentProps { - integrationLink: string; + info: ReactNode; } - -const AWSSetupInfoContent = ({ integrationLink }: AWSSetupInfoContentProps) => { +export const AWSSetupInfoContent = ({ info }: AWSSetupInfoContentProps) => { return ( <> @@ -55,48 +52,28 @@ const AWSSetupInfoContent = ({ integrationLink }: AWSSetupInfoContentProps) => { - - - - ), - }} - /> + {info} ); }; -const getSetupFormatOptions = (): Array<{ id: SetupFormat; label: string }> => [ +const getSetupFormatOptions = (): CspRadioOption[] => [ { id: 'cloud_formation', label: 'CloudFormation', + testId: AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ.CLOUDFORMATION, }, { id: 'manual', label: i18n.translate('xpack.csp.awsIntegration.setupFormatOptions.manual', { defaultMessage: 'Manual', }), + testId: AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ.MANUAL, }, ]; -export const getDefaultAwsVarsGroup = (packageInfo: PackageInfo): AwsCredentialsType => { - const hasCloudFormationTemplate = !!getCspmCloudFormationDefaultValue(packageInfo); - if (hasCloudFormationTemplate) { - return 'cloud_formation'; - } - - return DEFAULT_MANUAL_AWS_CREDENTIALS_TYPE; -}; - -interface Props { +export interface AwsFormProps { newPolicy: NewPackagePolicy; input: Extract; updatePolicy(updatedPolicy: NewPackagePolicy): void; @@ -217,7 +194,7 @@ export const AwsCredentialsForm = ({ onChange, setIsValid, disabled, -}: Props) => { +}: AwsFormProps) => { const { awsCredentialsType, setupFormat, @@ -237,7 +214,24 @@ export const AwsCredentialsForm = ({ return ( <> - + + + + ), + }} + /> + } + /> { updatePolicy( @@ -281,60 +279,26 @@ export const AwsCredentialsForm = ({ ); }; -const AwsCredentialTypeSelector = ({ +export const AwsCredentialTypeSelector = ({ type, onChange, + label, + options, }: { onChange(type: AwsCredentialsType): void; type: AwsCredentialsType; + label: string; + options: AwsCredentialsTypeOptions; }) => ( - + { onChange(optionElem.target.value as AwsCredentialsType); }} + data-test-subj={AWS_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ} /> ); - -const AwsInputVarFields = ({ - fields, - onChange, -}: { - fields: Array; - onChange: (key: string, value: string) => void; -}) => ( -
- {fields.map((field) => ( - - <> - {field.type === 'password' && ( - onChange(field.id, event.target.value)} - /> - )} - {field.type === 'text' && ( - onChange(field.id, event.target.value)} - /> - )} - - - ))} -
-); diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx new file mode 100644 index 0000000000000..b0ab98db98cda --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiLink, EuiSpacer } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { cspIntegrationDocsNavigation } from '../../../common/navigation/constants'; +import { + DEFAULT_AGENTLESS_AWS_CREDENTIALS_TYPE, + getAwsCredentialsFormAgentlessOptions, + getAwsCredentialsFormOptions, + getInputVarsFields, +} from './get_aws_credentials_form_options'; +import { getAwsCredentialsType, getPosturePolicy } from '../utils'; +import { AwsInputVarFields } from './aws_input_var_fields'; +import { + AwsFormProps, + ReadDocumentation, + AWSSetupInfoContent, + AwsCredentialTypeSelector, +} from './aws_credentials_form'; + +export const AwsCredentialsFormAgentless = ({ input, newPolicy, updatePolicy }: AwsFormProps) => { + const awsCredentialsType = getAwsCredentialsType(input) || DEFAULT_AGENTLESS_AWS_CREDENTIALS_TYPE; + const options = getAwsCredentialsFormOptions(); + const group = options[awsCredentialsType]; + const fields = getInputVarsFields(input, group.fields); + const integrationLink = cspIntegrationDocsNavigation.cspm.getStartedPath; + + return ( + <> + + + + ), + }} + /> + } + /> + + { + updatePolicy( + getPosturePolicy(newPolicy, input.type, { + 'aws.credentials.type': { value: optionId }, + }) + ); + }} + /> + + {group.info} + + + + { + updatePolicy(getPosturePolicy(newPolicy, input.type, { [key]: { value } })); + }} + /> + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx new file mode 100644 index 0000000000000..5ac54872a583b --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiFieldPassword, EuiFieldText, EuiFormRow } from '@elastic/eui'; +import { AwsOptions } from './get_aws_credentials_form_options'; + +export const AwsInputVarFields = ({ + fields, + onChange, +}: { + fields: Array; + onChange: (key: string, value: string) => void; +}) => ( +
+ {fields.map((field) => ( + + <> + {field.type === 'password' && ( + onChange(field.id, event.target.value)} + /> + )} + {field.type === 'text' && ( + onChange(field.id, event.target.value)} + /> + )} + + + ))} +
+); diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx index c4b19f87636b6..f9d6fe06e5a8b 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx @@ -92,20 +92,33 @@ export const getInputVarsFields = (input: NewPackagePolicyInput, fields: AwsCred }); export type AwsOptions = Record; - -export const getAwsCredentialsFormManualOptions = (): Array<{ +export type AwsCredentialsTypeOptions = Array<{ value: AwsCredentialsType; text: string; -}> => { +}>; + +const getAwsCredentialsTypeSelectorOptions = ( + filterFn: ({ value }: { value: AwsCredentialsType }) => boolean +): AwsCredentialsTypeOptions => { return Object.entries(getAwsCredentialsFormOptions()) .map(([key, value]) => ({ value: key as AwsCredentialsType, text: value.label, })) - .filter(({ value }) => value !== 'cloud_formation'); + .filter(filterFn); }; +export const getAwsCredentialsFormManualOptions = (): AwsCredentialsTypeOptions => + getAwsCredentialsTypeSelectorOptions(({ value }) => value !== 'cloud_formation'); + +export const getAwsCredentialsFormAgentlessOptions = (): AwsCredentialsTypeOptions => + getAwsCredentialsTypeSelectorOptions( + ({ value }) => value === 'direct_access_keys' || value === 'temporary_keys' + ); + +export const DEFAULT_AWS_CREDENTIALS_TYPE = 'cloud_formation'; export const DEFAULT_MANUAL_AWS_CREDENTIALS_TYPE = 'assume_role'; +export const DEFAULT_AGENTLESS_AWS_CREDENTIALS_TYPE = 'direct_access_keys'; export const getAwsCredentialsFormOptions = (): AwsOptions => ({ assume_role: { diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts index d4824f5bc04b6..3735a585268e1 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts @@ -12,6 +12,7 @@ import { getCspmCloudFormationDefaultValue, getPosturePolicy, NewPackagePolicyPostureInput, + getAwsCredentialsType, } from '../utils'; import { DEFAULT_MANUAL_AWS_CREDENTIALS_TYPE, @@ -43,10 +44,6 @@ const getSetupFormatFromInput = ( return 'cloud_formation'; }; -const getAwsCredentialsType = ( - input: Extract -): AwsCredentialsType | undefined => input.streams[0].vars?.['aws.credentials.type'].value; - export const useAwsCredentialsForm = ({ newPolicy, input, diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx index 41f4b857e13f8..fda6ae2f631fa 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx @@ -5,22 +5,14 @@ * 2.0. */ import React from 'react'; -import { - EuiFieldText, - EuiFieldPassword, - EuiFormRow, - EuiLink, - EuiSpacer, - EuiText, - EuiTitle, - EuiHorizontalRule, -} from '@elastic/eui'; +import { EuiLink, EuiSpacer, EuiText, EuiTitle, EuiHorizontalRule } from '@elastic/eui'; import type { NewPackagePolicy } from '@kbn/fleet-plugin/public'; import { NewPackagePolicyInput } from '@kbn/fleet-plugin/common'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { RadioGroup } from './csp_boxed_radio_group'; import { getPosturePolicy, NewPackagePolicyPostureInput } from './utils'; +import { AwsInputVarFields } from './aws_credentials_form/aws_input_var_fields'; const AWSSetupInfoContent = () => ( <> @@ -279,37 +271,3 @@ const AwsCredentialTypeSelector = ({ onChange={(id) => onChange(id as AwsCredentialsType)} /> ); - -const AwsInputVarFields = ({ - fields, - onChange, -}: { - fields: Array; - onChange: (key: string, value: string) => void; -}) => ( -
- {fields.map((field) => ( - - <> - {field.type === 'password' && ( - onChange(field.id, event.target.value)} - /> - )} - {field.type === 'text' && ( - onChange(field.id, event.target.value)} - /> - )} - - - ))} -
-); diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credential_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credential_form.tsx index 45a3f8a6639a5..4039d458548bb 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credential_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credential_form.tsx @@ -31,7 +31,7 @@ import { SETUP_ACCESS_CLOUD_SHELL, SETUP_ACCESS_MANUAL, } from '../../../common/constants'; -import { RadioGroup } from './csp_boxed_radio_group'; +import { CspRadioOption, RadioGroup } from './csp_boxed_radio_group'; import { getCspmCloudShellDefaultValue, getPosturePolicy, @@ -231,12 +231,7 @@ export const gcpField: GcpInputFields = { }, }; -const getSetupFormatOptions = (): Array<{ - id: SetupFormatGCP; - label: string; - disabled: boolean; - testId: string; -}> => [ +const getSetupFormatOptions = (): CspRadioOption[] => [ { id: SETUP_ACCESS_CLOUD_SHELL, label: i18n.translate('xpack.csp.gcpIntegration.setupFormatOptions.googleCloudShell', { diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts index ae933a0f941a8..f893545024d78 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts @@ -6,7 +6,7 @@ */ import type { NewPackagePolicy } from '@kbn/fleet-plugin/public'; import type { PackageInfo } from '@kbn/fleet-plugin/common'; -import { createNewPackagePolicyMock } from '@kbn/fleet-plugin/common/mocks'; +import { createNewPackagePolicyMock, createAgentPolicyMock } from '@kbn/fleet-plugin/common/mocks'; import { CLOUDBEAT_GCP, CLOUDBEAT_AZURE, @@ -24,6 +24,9 @@ export const getMockPolicyK8s = () => getPolicyMock(CLOUDBEAT_VANILLA, 'kspm', ' export const getMockPolicyEKS = () => getPolicyMock(CLOUDBEAT_EKS, 'kspm', 'eks'); export const getMockPolicyVulnMgmtAWS = () => getPolicyMock(CLOUDBEAT_VULN_MGMT_AWS, 'vuln_mgmt', 'aws'); +export const getMockAgentlessAgentPolicy = () => { + return createAgentPolicyMock({ id: 'agentless' }); +}; export const getMockPackageInfoVulnMgmtAWS = () => { return { diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx index 5764b5af44357..3b549dcc9d9ed 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx @@ -5,7 +5,8 @@ * 2.0. */ import React from 'react'; -import { render } from '@testing-library/react'; +import { render, waitFor, within } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { CspPolicyTemplateForm, AWS_ORGANIZATION_ACCOUNT, @@ -15,6 +16,7 @@ import { } from './policy_template_form'; import { TestProvider } from '../../test/test_provider'; import { + getMockAgentlessAgentPolicy, getMockPackageInfoCspmAWS, getMockPackageInfoCspmAzure, getMockPackageInfoCspmGCP, @@ -32,7 +34,6 @@ import type { PackageInfo, PackagePolicy, } from '@kbn/fleet-plugin/common'; -import userEvent from '@testing-library/user-event'; import { getPosturePolicy } from './utils'; import { CLOUDBEAT_AWS, @@ -45,6 +46,13 @@ import { createReactQueryResponse } from '../../test/fixtures/react_query'; import { useCspSetupStatusApi } from '../../common/api/use_setup_status_api'; import { usePackagePolicyList } from '../../common/api/use_package_policy_list'; import { CIS_GCP_INPUT_FIELDS_TEST_SUBJECTS } from './gcp_credential_form'; +import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; +import { + AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ, + AWS_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ, + SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ, + SETUP_TECHNOLOGY_SELECTOR_TEST_SUBJ, +} from '../test_subjects'; // mock useParams jest.mock('react-router-dom', () => ({ @@ -94,12 +102,14 @@ describe('', () => { edit = false, agentPolicy, packageInfo = {} as PackageInfo, + agentlessPolicy, }: { edit?: boolean; newPolicy: NewPackagePolicy; agentPolicy?: AgentPolicy; packageInfo?: PackageInfo; onChange?: jest.Mock; + agentlessPolicy?: AgentPolicy; }) => ( {edit && ( @@ -110,6 +120,7 @@ describe('', () => { packageInfo={packageInfo} isEditPage={true} agentPolicy={agentPolicy} + agentlessPolicy={agentlessPolicy} /> )} {!edit && ( @@ -119,6 +130,7 @@ describe('', () => { packageInfo={packageInfo} isEditPage={false} agentPolicy={agentPolicy} + agentlessPolicy={agentlessPolicy} /> )} @@ -141,7 +153,7 @@ describe('', () => { }); }); - it('renders and updates name field', () => { + it('renders and updates name field', async () => { const policy = getMockPolicyK8s(); const { getByLabelText } = render(); const name = getByLabelText('Name'); @@ -149,15 +161,15 @@ describe('', () => { userEvent.type(name, '1'); - // Listen to the 2nd triggered by the test. - // The 1st is done on mount to ensure initial state is valid. - expect(onChange).toHaveBeenNthCalledWith(2, { - isValid: true, - updatedPolicy: { ...policy, name: `${policy.name}1` }, + await waitFor(() => { + expect(onChange).toHaveBeenCalledWith({ + isValid: true, + updatedPolicy: { ...policy, name: `${policy.name}1` }, + }); }); }); - it('renders and updates description field', () => { + it('renders and updates description field', async () => { const policy = getMockPolicyK8s(); const { getByLabelText } = render(); const description = getByLabelText('Description'); @@ -165,11 +177,11 @@ describe('', () => { userEvent.type(description, '1'); - // Listen to the 2nd triggered by the test. - // The 1st is done on mount to ensure initial state is valid. - expect(onChange).toHaveBeenNthCalledWith(2, { - isValid: true, - updatedPolicy: { ...policy, description: `${policy.description}1` }, + await waitFor(() => { + expect(onChange).toHaveBeenCalledWith({ + isValid: true, + updatedPolicy: { ...policy, description: `${policy.description}1` }, + }); }); }); @@ -186,7 +198,7 @@ describe('', () => { expect(option1).toBeChecked(); }); - it('updates selected KSPM input', () => { + it('updates selected KSPM input', async () => { const k8sPolicy = getMockPolicyK8s(); const eksPolicy = getMockPolicyEKS(); @@ -194,11 +206,11 @@ describe('', () => { const option = getByLabelText('EKS'); userEvent.click(option); - // Listen to the 2nd triggered by the test. - // The 1st is done on mount to ensure initial state is valid. - expect(onChange).toHaveBeenNthCalledWith(2, { - isValid: true, - updatedPolicy: eksPolicy, + await waitFor(() => { + expect(onChange).toHaveBeenCalledWith({ + isValid: true, + updatedPolicy: eksPolicy, + }); }); }); @@ -1436,6 +1448,119 @@ describe('', () => { }); }); + describe('Agentless', () => { + it('should render setup technology selector for AWS and allow to select agent-based', async () => { + const agentlessPolicy = getMockAgentlessAgentPolicy(); + const newPackagePolicy = getMockPolicyAWS(); + + const { getByTestId, getByRole } = render( + + ); + + const setupTechnologySelectorAccordion = getByTestId( + SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ + ); + const setupTechnologySelector = getByTestId(SETUP_TECHNOLOGY_SELECTOR_TEST_SUBJ); + const awsCredentialsTypeSelector = getByTestId(AWS_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ); + const options: HTMLOptionElement[] = within(awsCredentialsTypeSelector).getAllByRole( + 'option' + ); + const optionValues = options.map((option) => option.value); + + // default state + expect(setupTechnologySelectorAccordion).toBeInTheDocument(); + expect(setupTechnologySelector).toBeInTheDocument(); + expect(setupTechnologySelector).toHaveTextContent(/agentless/i); + expect(options).toHaveLength(2); + expect(optionValues).toEqual( + expect.arrayContaining(['direct_access_keys', 'temporary_keys']) + ); + + // select agent-based and check for cloudformation option + userEvent.click(setupTechnologySelector); + const agentBasedOption = getByRole('option', { name: /agent-based/i }); + await waitForEuiPopoverOpen(); + userEvent.click(agentBasedOption); + await waitFor(() => { + expect( + getByTestId(AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ.CLOUDFORMATION) + ).toBeInTheDocument(); + expect(getByTestId(AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ.MANUAL)).toBeInTheDocument(); + }); + }); + + it('should not render setup technology selector for KSPM', () => { + const agentlessPolicy = getMockAgentlessAgentPolicy(); + const newPackagePolicy = getMockPolicyEKS(); + + const { queryByTestId } = render( + + ); + + const setupTechnologySelectorAccordion = queryByTestId( + SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ + ); + + expect(setupTechnologySelectorAccordion).not.toBeInTheDocument(); + }); + + it('should not render setup technology selector for CNVM', () => { + const agentlessPolicy = getMockAgentlessAgentPolicy(); + const newPackagePolicy = getMockPolicyVulnMgmtAWS(); + + const { queryByTestId } = render( + + ); + + const setupTechnologySelectorAccordion = queryByTestId( + SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ + ); + + expect(setupTechnologySelectorAccordion).not.toBeInTheDocument(); + }); + + it('should not render setup technology selector for CSPM GCP', () => { + const agentlessPolicy = getMockAgentlessAgentPolicy(); + const newPackagePolicy = getMockPolicyGCP(); + + const { queryByTestId } = render( + + ); + + const setupTechnologySelectorAccordion = queryByTestId( + SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ + ); + + expect(setupTechnologySelectorAccordion).not.toBeInTheDocument(); + }); + + it('should not render setup technology selector for CSPM Azure', () => { + const agentlessPolicy = getMockAgentlessAgentPolicy(); + let newPackagePolicy = getMockPolicyAzure(); + newPackagePolicy = getPosturePolicy(newPackagePolicy, CLOUDBEAT_AZURE, { + 'azure.credentials.type': { value: 'service_principal_with_client_certificate' }, + }); + + const { queryByTestId } = render( + + ); + + const setupTechnologySelectorAccordion = queryByTestId( + SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ + ); + + expect(setupTechnologySelectorAccordion).not.toBeInTheDocument(); + }); + }); + it(`renders Service principal with Client Certificate fields`, () => { let policy = getMockPolicyAzure(); policy = getPosturePolicy(policy, CLOUDBEAT_AZURE, { diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx index 17474fd9cd233..303df35545db8 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx @@ -21,6 +21,7 @@ import { EuiTitle, } from '@elastic/eui'; import type { NewPackagePolicy } from '@kbn/fleet-plugin/public'; +import { SetupTechnology } from '@kbn/fleet-plugin/public'; import { FormattedMessage } from '@kbn/i18n-react'; import type { NewPackagePolicyInput, @@ -544,7 +545,11 @@ export const CspPolicyTemplateForm = memo { @@ -558,11 +563,11 @@ export const CspPolicyTemplateForm = memo { - const inputVars = getPostureInputHiddenVars(inputType, packageInfo); + const inputVars = getPostureInputHiddenVars(inputType, packageInfo, setupTechnology); const policy = getPosturePolicy(newPolicy, inputType, inputVars); updatePolicy(policy); }, - [newPolicy, updatePolicy, packageInfo] + [setupTechnology, packageInfo, newPolicy, updatePolicy] ); // search for non null fields of the validation?.vars object @@ -601,6 +606,15 @@ export const CspPolicyTemplateForm = memo { + if (isEditPage) { + return; + } + + setEnabledPolicyInput(input.type); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [setupTechnology]); + useEnsureDefaultNamespace({ newPolicy, input, updatePolicy }); useCloudFormationTemplate({ @@ -739,8 +753,9 @@ export const CspPolicyTemplateForm = memo updatePolicy({ ...newPolicy, [field]: value })} /> - {isAgentlessAvailable && ( + {shouldRenderAgentlessSelector && ( @@ -755,6 +770,7 @@ export const CspPolicyTemplateForm = memo diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx index aa1e2b7942575..7a045e7f82c0c 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { EuiCallOut, EuiSpacer, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import type { NewPackagePolicy, PackageInfo } from '@kbn/fleet-plugin/common'; +import { SetupTechnology } from '@kbn/fleet-plugin/public'; import { PackagePolicyReplaceDefineStepExtensionComponentProps } from '@kbn/fleet-plugin/public/types'; import { CSPM_POLICY_TEMPLATE, @@ -20,6 +21,7 @@ import { getPolicyTemplateInputOptions, type NewPackagePolicyPostureInput } from import { RadioGroup } from './csp_boxed_radio_group'; import { AzureCredentialsForm } from './azure_credentials_form/azure_credentials_form'; import { AwsCredentialsForm } from './aws_credentials_form/aws_credentials_form'; +import { AwsCredentialsFormAgentless } from './aws_credentials_form/aws_credentials_form_agentless'; import { EksCredentialsForm } from './eks_credentials_form'; import { GcpCredentialsForm } from './gcp_credential_form'; @@ -74,11 +76,20 @@ interface PolicyTemplateVarsFormProps { onChange: PackagePolicyReplaceDefineStepExtensionComponentProps['onChange']; setIsValid: (isValid: boolean) => void; disabled: boolean; + setupTechnology: SetupTechnology; } -export const PolicyTemplateVarsForm = ({ input, ...props }: PolicyTemplateVarsFormProps) => { +export const PolicyTemplateVarsForm = ({ + input, + setupTechnology, + ...props +}: PolicyTemplateVarsFormProps) => { switch (input.type) { case 'cloudbeat/cis_aws': + if (setupTechnology === SetupTechnology.AGENTLESS) { + return ; + } + return ; case 'cloudbeat/cis_eks': return ; diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx index c3b6572281da3..03ca7ab21150e 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx @@ -18,11 +18,17 @@ import { EuiText, useGeneratedHtmlId, } from '@elastic/eui'; +import { + SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ, + SETUP_TECHNOLOGY_SELECTOR_TEST_SUBJ, +} from '../../test_subjects'; export const SetupTechnologySelector = ({ + disabled, setupTechnology, onSetupTechnologyChange, }: { + disabled: boolean; setupTechnology: SetupTechnology; onSetupTechnologyChange: (value: SetupTechnology) => void; }) => { @@ -87,15 +93,18 @@ export const SetupTechnologySelector = ({ <> + } + data-test-subj={SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ} > diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts index a5aa5e2df9734..744a87a009f98 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts @@ -14,46 +14,122 @@ import { CLOUDBEAT_AWS } from '../../../../common/constants'; import { useSetupTechnology } from './use_setup_technology'; describe('useSetupTechnology', () => { - it('initializes with AGENT_BASED technology', () => { - const { result } = renderHook(() => - useSetupTechnology({ - input: { type: 'cloudbeat/no-agentless-support' } as NewPackagePolicyInput, - }) - ); - expect(result.current.setupTechnology).toBe(SetupTechnology.AGENT_BASED); - }); + describe('create page flow', () => { + const isEditPage = false; - it('sets to AGENTLESS when agentless is available', () => { - const agentlessPolicy = { id: 'agentlessPolicyId' } as AgentPolicy; - const input = { type: CLOUDBEAT_AWS } as NewPackagePolicyInput; - const { result } = renderHook(() => useSetupTechnology({ input, agentlessPolicy })); - expect(result.current.isAgentlessAvailable).toBeTruthy(); - expect(result.current.setupTechnology).toBe(SetupTechnology.AGENTLESS); - }); + it('initializes with AGENT_BASED technology', () => { + const { result } = renderHook(() => + useSetupTechnology({ + input: { type: 'cloudbeat/no-agentless-support' } as NewPackagePolicyInput, + isEditPage, + }) + ); + expect(result.current.setupTechnology).toBe(SetupTechnology.AGENT_BASED); + }); + + it('sets to AGENTLESS when agentless is available', () => { + const agentlessPolicy = { id: 'agentlessPolicyId' } as AgentPolicy; + const input = { type: CLOUDBEAT_AWS } as NewPackagePolicyInput; + const { result } = renderHook(() => + useSetupTechnology({ input, agentlessPolicy, isEditPage }) + ); + expect(result.current.isAgentlessAvailable).toBeTruthy(); + expect(result.current.setupTechnology).toBe(SetupTechnology.AGENTLESS); + }); - it('sets to AGENT_BASED when agentPolicyId differs from agentlessPolicyId', () => { - const input = { type: CLOUDBEAT_AWS } as NewPackagePolicyInput; - const agentPolicy = { id: 'agentPolicyId' } as AgentPolicy; - const agentlessPolicy = { id: 'agentlessPolicyId' } as AgentPolicy; - const { result } = renderHook(() => - useSetupTechnology({ input, agentPolicy, agentlessPolicy }) - ); - expect(result.current.setupTechnology).toBe(SetupTechnology.AGENT_BASED); + it('sets to AGENT_BASED when agentPolicyId differs from agentlessPolicyId', () => { + const input = { type: CLOUDBEAT_AWS } as NewPackagePolicyInput; + const agentPolicy = { id: 'agentPolicyId' } as AgentPolicy; + const agentlessPolicy = { id: 'agentlessPolicyId' } as AgentPolicy; + const { result } = renderHook(() => + useSetupTechnology({ input, agentPolicy, agentlessPolicy, isEditPage }) + ); + expect(result.current.setupTechnology).toBe(SetupTechnology.AGENT_BASED); + }); + + it('calls handleSetupTechnologyChange when setupTechnology changes', () => { + const handleSetupTechnologyChangeMock = jest.fn(); + const { result } = renderHook(() => + useSetupTechnology({ + input: { type: 'someType' } as NewPackagePolicyInput, + handleSetupTechnologyChange: handleSetupTechnologyChangeMock, + isEditPage, + }) + ); + + act(() => { + result.current.setSetupTechnology(SetupTechnology.AGENTLESS); + }); + + expect(handleSetupTechnologyChangeMock).toHaveBeenCalledWith(SetupTechnology.AGENTLESS); + }); }); - it('calls handleSetupTechnologyChange when setupTechnology changes', () => { - const handleSetupTechnologyChangeMock = jest.fn(); - const { result } = renderHook(() => - useSetupTechnology({ - input: { type: 'someType' } as NewPackagePolicyInput, - handleSetupTechnologyChange: handleSetupTechnologyChangeMock, - }) - ); + describe('edit page flow', () => { + const isEditPage = true; - act(() => { - result.current.setSetupTechnology(SetupTechnology.AGENTLESS); + it('initializes with AGENT_BASED technology', () => { + const { result } = renderHook(() => + useSetupTechnology({ + input: { type: 'cloudbeat/no-agentless-support' } as NewPackagePolicyInput, + isEditPage, + }) + ); + expect(result.current.setupTechnology).toBe(SetupTechnology.AGENT_BASED); }); - expect(handleSetupTechnologyChangeMock).toHaveBeenCalledWith(SetupTechnology.AGENTLESS); + it('initializes with AGENTLESS technology if the agent policy id is "agentless"', () => { + const input = { type: CLOUDBEAT_AWS } as NewPackagePolicyInput; + const agentPolicy = { id: 'agentless' } as AgentPolicy; + const { result } = renderHook(() => + useSetupTechnology({ + input, + agentPolicy, + isEditPage, + }) + ); + expect(result.current.setupTechnology).toBe(SetupTechnology.AGENTLESS); + }); + + it('should not call handleSetupTechnologyChange when setupTechnology changes', () => { + const handleSetupTechnologyChangeMock = jest.fn(); + const input = { type: CLOUDBEAT_AWS } as NewPackagePolicyInput; + const { result } = renderHook(() => + useSetupTechnology({ + input, + handleSetupTechnologyChange: handleSetupTechnologyChangeMock, + isEditPage, + }) + ); + + act(() => { + result.current.setSetupTechnology(SetupTechnology.AGENTLESS); + }); + + expect(handleSetupTechnologyChangeMock).not.toHaveBeenCalled(); + }); + + it('should not update setupTechnology when agentlessPolicyId becomes available', () => { + const input = { type: CLOUDBEAT_AWS } as NewPackagePolicyInput; + const agentlessPolicy = { id: 'agentlessPolicyId' } as AgentPolicy; + const { result, rerender } = renderHook(() => + useSetupTechnology({ + input, + isEditPage, + }) + ); + + expect(result.current.setupTechnology).toBe(SetupTechnology.AGENT_BASED); + + act(() => { + rerender({ + input, + agentlessPolicy, + isEditPage, + }); + }); + + expect(result.current.setupTechnology).toBe(SetupTechnology.AGENT_BASED); + }); }); }); diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts index 898017d6daef5..4201ffde1b2a8 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useState } from 'react'; import { AgentPolicy, NewPackagePolicyInput } from '@kbn/fleet-plugin/common'; import { SetupTechnology } from '@kbn/fleet-plugin/public'; @@ -15,24 +15,31 @@ export const useSetupTechnology = ({ agentPolicy, agentlessPolicy, handleSetupTechnologyChange, + isEditPage, }: { input: NewPackagePolicyInput; agentPolicy?: AgentPolicy; agentlessPolicy?: AgentPolicy; handleSetupTechnologyChange?: (value: SetupTechnology) => void; + isEditPage: boolean; }) => { - const [setupTechnology, setSetupTechnology] = useState( - SetupTechnology.AGENT_BASED - ); const isCspmAws = input.type === CLOUDBEAT_AWS; - const isAgentlessAvailable = useMemo( - () => Boolean(isCspmAws && agentlessPolicy), - [isCspmAws, agentlessPolicy] - ); - const agentPolicyId = useMemo(() => agentPolicy?.id, [agentPolicy]); - const agentlessPolicyId = useMemo(() => agentlessPolicy?.id, [agentlessPolicy]); + const isAgentlessAvailable = Boolean(isCspmAws && agentlessPolicy); + const agentPolicyId = agentPolicy?.id; + const agentlessPolicyId = agentlessPolicy?.id; + const [setupTechnology, setSetupTechnology] = useState(() => { + if (isEditPage && agentPolicyId === SetupTechnology.AGENTLESS) { + return SetupTechnology.AGENTLESS; + } + + return SetupTechnology.AGENT_BASED; + }); useEffect(() => { + if (isEditPage) { + return; + } + if (agentPolicyId && agentPolicyId !== agentlessPolicyId) { /* handle case when agent policy is coming from outside, @@ -41,20 +48,24 @@ export const useSetupTechnology = ({ setSetupTechnology(SetupTechnology.AGENT_BASED); } else if (isAgentlessAvailable) { /* - preselecting agenteless when available + preselecting agentless when available and resetting to agent-based when switching to another integration type, which doesn't support agentless */ setSetupTechnology(SetupTechnology.AGENTLESS); } else { setSetupTechnology(SetupTechnology.AGENT_BASED); } - }, [agentPolicyId, agentlessPolicyId, isAgentlessAvailable]); + }, [agentPolicyId, agentlessPolicyId, isAgentlessAvailable, isEditPage]); useEffect(() => { + if (isEditPage) { + return; + } + if (handleSetupTechnologyChange) { handleSetupTechnologyChange(setupTechnology); } - }, [handleSetupTechnologyChange, setupTechnology]); + }, [handleSetupTechnologyChange, isEditPage, setupTechnology]); return { isAgentlessAvailable, diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts index 266cd98ab0450..b05c7fe096516 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts @@ -4,6 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import type { PackageInfo } from '@kbn/fleet-plugin/common'; +import { SetupTechnology } from '@kbn/fleet-plugin/public'; import { getMaxPackageName, @@ -11,9 +13,9 @@ import { getPosturePolicy, getCspmCloudShellDefaultValue, isBelowMinVersion, + getDefaultAwsCredentialsType, } from './utils'; import { getMockPolicyAWS, getMockPolicyK8s, getMockPolicyEKS } from './mocks'; -import type { PackageInfo } from '@kbn/fleet-plugin/common'; describe('getPosturePolicy', () => { for (const [name, getPolicy, expectedVars] of [ @@ -22,7 +24,11 @@ describe('getPosturePolicy', () => { ['cloudbeat/cis_k8s', getMockPolicyK8s, null], ] as const) { it(`updates package policy with hidden vars for ${name}`, () => { - const inputVars = getPostureInputHiddenVars(name, {} as any); + const inputVars = getPostureInputHiddenVars( + name, + {} as PackageInfo, + SetupTechnology.AGENT_BASED + ); const policy = getPosturePolicy(getPolicy(), name, inputVars); const enabledInputs = policy.inputs.filter( @@ -280,3 +286,67 @@ describe('isBelowMinVersion', () => { } }); }); + +describe('getDefaultAwsCredentialsType', () => { + let packageInfo: PackageInfo; + + beforeEach(() => { + packageInfo = { + policy_templates: [ + { + name: 'cspm', + inputs: [ + { + vars: [ + { + name: 'cloud_formation_template', + default: 'http://example.com/cloud_formation_template', + }, + ], + }, + ], + }, + ], + } as PackageInfo; + }); + + it('should return "direct_access_key" for agentless', () => { + const setupTechnology = SetupTechnology.AGENTLESS; + const result = getDefaultAwsCredentialsType(packageInfo, setupTechnology); + + expect(result).toBe('direct_access_keys'); + }); + + it('should return "assume_role" for agent-based, when cloudformation is not available', () => { + const setupTechnology = SetupTechnology.AGENT_BASED; + packageInfo = { + policy_templates: [ + { + name: 'cspm', + inputs: [ + { + vars: [ + { + name: 'cloud_shell', + default: 'http://example.com/cloud_shell', + }, + ], + }, + ], + }, + ], + } as PackageInfo; + + const result = getDefaultAwsCredentialsType({} as PackageInfo, setupTechnology); + + expect(result).toBe('assume_role'); + }); + + it('should return "cloud_formation" for agent-based, when cloudformation is available', () => { + const setupTechnology = SetupTechnology.AGENT_BASED; + + const result = getDefaultAwsCredentialsType(packageInfo, setupTechnology); + + expect(result).toBe('cloud_formation'); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts index 1f005ccb950f4..e3b8055497e22 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts @@ -12,27 +12,36 @@ import type { RegistryPolicyTemplate, RegistryVarsEntry, } from '@kbn/fleet-plugin/common'; +import { SetupTechnology } from '@kbn/fleet-plugin/public'; import merge from 'lodash/merge'; import semverValid from 'semver/functions/valid'; import semverCoerce from 'semver/functions/coerce'; import semverLt from 'semver/functions/lt'; import { CLOUDBEAT_AWS, + CLOUDBEAT_AZURE, CLOUDBEAT_EKS, - CLOUDBEAT_VANILLA, CLOUDBEAT_GCP, - CLOUDBEAT_AZURE, + CLOUDBEAT_VANILLA, CLOUDBEAT_VULN_MGMT_AWS, - SUPPORTED_POLICY_TEMPLATES, - SUPPORTED_CLOUDBEAT_INPUTS, CSPM_POLICY_TEMPLATE, KSPM_POLICY_TEMPLATE, + SUPPORTED_CLOUDBEAT_INPUTS, + SUPPORTED_POLICY_TEMPLATES, VULN_MGMT_POLICY_TEMPLATE, } from '../../../common/constants'; -import { getDefaultAwsVarsGroup } from './aws_credentials_form/aws_credentials_form'; -import type { PostureInput, CloudSecurityPolicyTemplate } from '../../../common/types_old'; +import type { + AwsCredentialsType, + PostureInput, + CloudSecurityPolicyTemplate, +} from '../../../common/types_old'; import { cloudPostureIntegrations } from '../../common/constants'; import { DEFAULT_EKS_VARS_GROUP } from './eks_credentials_form'; +import { + DEFAULT_AGENTLESS_AWS_CREDENTIALS_TYPE, + DEFAULT_AWS_CREDENTIALS_TYPE, + DEFAULT_MANUAL_AWS_CREDENTIALS_TYPE, +} from './aws_credentials_form/get_aws_credentials_form_options'; // Posture policies only support the default namespace export const POSTURE_NAMESPACE = 'default'; @@ -203,14 +212,36 @@ export const getArmTemplateUrlFromCspmPackage = (packageInfo: PackageInfo): stri return armTemplateUrl; }; +export const getDefaultAwsCredentialsType = ( + packageInfo: PackageInfo, + setupTechnology?: SetupTechnology +): AwsCredentialsType => { + if (setupTechnology && setupTechnology === SetupTechnology.AGENTLESS) { + return DEFAULT_AGENTLESS_AWS_CREDENTIALS_TYPE; + } + + const hasCloudFormationTemplate = !!getCspmCloudFormationDefaultValue(packageInfo); + if (hasCloudFormationTemplate) { + return DEFAULT_AWS_CREDENTIALS_TYPE; + } + + return DEFAULT_MANUAL_AWS_CREDENTIALS_TYPE; +}; /** * Input vars that are hidden from the user */ -export const getPostureInputHiddenVars = (inputType: PostureInput, packageInfo: PackageInfo) => { +export const getPostureInputHiddenVars = ( + inputType: PostureInput, + packageInfo: PackageInfo, + setupTechnology: SetupTechnology +) => { switch (inputType) { case 'cloudbeat/cis_aws': return { - 'aws.credentials.type': { value: getDefaultAwsVarsGroup(packageInfo), type: 'text' }, + 'aws.credentials.type': { + value: getDefaultAwsCredentialsType(packageInfo, setupTechnology), + type: 'text', + }, }; case 'cloudbeat/cis_eks': return { 'aws.credentials.type': { value: DEFAULT_EKS_VARS_GROUP, type: 'text' } }; @@ -267,6 +298,10 @@ export const getCspmCloudShellDefaultValue = (packageInfo: PackageInfo): string return cloudShellUrl; }; +export const getAwsCredentialsType = ( + input: Extract +): AwsCredentialsType | undefined => input.streams[0].vars?.['aws.credentials.type'].value; + export const isBelowMinVersion = (version: string, minVersion: string) => { const semanticVersion = semverValid(version); const versionNumberOnly = semverCoerce(semanticVersion) || ''; diff --git a/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts b/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts index 1f603a67ae1fc..c51d562fec44a 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts @@ -43,3 +43,12 @@ export const CREATE_RULE_ACTION_SUBJ = 'csp:create_rule'; export const CSP_GROUPING = 'cloudSecurityGrouping'; export const CSP_GROUPING_LOADING = 'cloudSecurityGroupingLoading'; export const CSP_FINDINGS_COMPLIANCE_SCORE = 'cloudSecurityFindingsComplianceScore'; + +export const AWS_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ = 'aws-credentials-type-selector'; +export const AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ = { + CLOUDFORMATION: 'aws-cloudformation-setup-option', + MANUAL: 'aws-manual-setup-option', +}; + +export const SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ = 'setup-technology-selector-accordion'; +export const SETUP_TECHNOLOGY_SELECTOR_TEST_SUBJ = 'setup-technology-selector'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx index a1ed381e6df77..e5fed03fc9676 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx @@ -13,7 +13,7 @@ import { createReactQueryResponse } from '../../test/fixtures/react_query'; import { TestProvider } from '../../test/test_provider'; import { Benchmarks } from './benchmarks'; import * as TEST_SUBJ from './test_subjects'; -import { useCspBenchmarkIntegrations } from './use_csp_benchmark_integrations'; +import { useCspBenchmarkIntegrationsV2 } from './use_csp_benchmark_integrations'; import { useCspSetupStatusApi } from '../../common/api/use_setup_status_api'; import { useSubscriptionStatus } from '../../common/hooks/use_subscription_status'; import { useCspIntegrationLink } from '../../common/navigation/use_csp_integration_link'; @@ -65,7 +65,7 @@ describe('', () => { const renderBenchmarks = ( queryResponse: Partial = createReactQueryResponse() ) => { - (useCspBenchmarkIntegrations as jest.Mock).mockImplementation(() => queryResponse); + (useCspBenchmarkIntegrationsV2 as jest.Mock).mockImplementation(() => queryResponse); return render( diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx index b39bf81a5d31a..2f848868c54d3 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx @@ -26,10 +26,10 @@ import { CloudPosturePageTitle } from '../../components/cloud_posture_page_title import { CloudPosturePage } from '../../components/cloud_posture_page'; import { BenchmarksTable } from './benchmarks_table'; import { - useCspBenchmarkIntegrations, + useCspBenchmarkIntegrationsV2, UseCspBenchmarkIntegrationsProps, } from './use_csp_benchmark_integrations'; -import { extractErrorMessage } from '../../../common/utils/helpers'; +import { extractErrorMessage, getBenchmarkCisName } from '../../../common/utils/helpers'; import * as TEST_SUBJ from './test_subjects'; import { LOCAL_STORAGE_PAGE_SIZE_BENCHMARK_KEY } from '../../common/constants'; import { usePageSize } from '../../common/hooks/use_page_size'; @@ -102,7 +102,7 @@ const TotalIntegrationsCount = ({ @@ -126,7 +126,7 @@ const BenchmarkSearchField = ({ isLoading={isLoading} placeholder={i18n.translate( 'xpack.csp.benchmarks.benchmarkSearchField.searchPlaceholder', - { defaultMessage: 'Search by Integration Name' } + { defaultMessage: 'Search by benchmark Name' } )} incremental /> @@ -145,8 +145,11 @@ export const Benchmarks = () => { sortOrder: 'asc', }); - const queryResult = useCspBenchmarkIntegrations(query); - const totalItemCount = queryResult.data?.total || 0; + const queryResult = useCspBenchmarkIntegrationsV2(); + const benchmarkResult = + queryResult.data?.items.filter((obj) => getBenchmarkCisName(obj.id)?.includes(query.name)) || + []; + const totalItemCount = queryResult.data?.items.length || 0; return ( @@ -154,8 +157,8 @@ export const Benchmarks = () => { data-test-subj={TEST_SUBJ.BENCHMARKS_PAGE_HEADER} pageTitle={ } @@ -174,7 +177,7 @@ export const Benchmarks = () => { /> { })); }} noItemsMessage={ - queryResult.isSuccess && !queryResult.data.total ? ( - - ) : undefined + queryResult.isSuccess ? : undefined } /> diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx index dc980df0d67ae..9463c65bc63eb 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx @@ -5,16 +5,13 @@ * 2.0. */ import React from 'react'; -import Chance from 'chance'; import { render, screen } from '@testing-library/react'; -import moment from 'moment'; import { createCspBenchmarkIntegrationFixture } from '../../test/fixtures/csp_benchmark_integration'; import { BenchmarksTable } from './benchmarks_table'; import { TestProvider } from '../../test/test_provider'; +import { getBenchmarkCisName, getBenchmarkApplicableTo } from '../../../common/utils/helpers'; describe('', () => { - const chance = new Chance(); - const tableProps = { pageIndex: 1, pageSize: 10, @@ -23,9 +20,10 @@ describe('', () => { setQuery: jest.fn(), }; - it('renders integration name', () => { + it('renders cis integration name', () => { const item = createCspBenchmarkIntegrationFixture(); const benchmarks = [item]; + const benchmarkCisIntegrationName = getBenchmarkCisName(item.id) || ''; render( @@ -39,17 +37,12 @@ describe('', () => { ); - expect(screen.getByText(item.package_policy.name)).toBeInTheDocument(); + expect(screen.getByText(benchmarkCisIntegrationName)).toBeInTheDocument(); }); - it('renders agent policy name', () => { - const agentPolicy = { - id: chance.guid(), - name: chance.sentence(), - agents: chance.integer({ min: 1 }), - }; - - const benchmarks = [createCspBenchmarkIntegrationFixture({ agent_policy: agentPolicy })]; + it('renders benchmark version', () => { + const item = createCspBenchmarkIntegrationFixture(); + const benchmarks = [item]; render( @@ -63,13 +56,13 @@ describe('', () => { ); - expect(screen.getByText(agentPolicy.name)).toBeInTheDocument(); + expect(screen.getByText(item.version)).toBeInTheDocument(); }); - it('renders number of agents', () => { + it('renders applicable to', () => { const item = createCspBenchmarkIntegrationFixture(); const benchmarks = [item]; - + const benchmarkApplicableTo = getBenchmarkApplicableTo(item.id) || ''; render( ', () => { ); - // TODO too loose - expect(screen.getByText(item.agent_policy.agents as number)).toBeInTheDocument(); + expect(screen.getByText(benchmarkApplicableTo)).toBeInTheDocument(); }); - it('renders created by', () => { + it('renders evaluated', () => { const item = createCspBenchmarkIntegrationFixture(); const benchmarks = [item]; @@ -101,11 +93,10 @@ describe('', () => { /> ); - - expect(screen.getByText(item.package_policy.created_by)).toBeInTheDocument(); + expect(screen.getByText(benchmarks[0].evaluation + ' accounts')).toBeInTheDocument(); }); - it('renders created at', () => { + it('renders compliance', () => { const item = createCspBenchmarkIntegrationFixture(); const benchmarks = [item]; @@ -121,6 +112,6 @@ describe('', () => { ); - expect(screen.getByText(moment(item.package_policy.created_at).fromNow())).toBeInTheDocument(); + expect(screen.getByText(item.score.postureScore + '%')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx index d2b6495667372..be04bcd48bce3 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx @@ -11,25 +11,20 @@ import { type EuiBasicTableProps, type Pagination, type CriteriaWithPagination, - EuiLink, - EuiToolTip, - EuiAvatar, EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, } from '@elastic/eui'; import React from 'react'; -import { generatePath } from 'react-router-dom'; -import { pagePathGetters } from '@kbn/fleet-plugin/public'; import { i18n } from '@kbn/i18n'; -import type { PackagePolicy } from '@kbn/fleet-plugin/common'; import { FormattedMessage } from '@kbn/i18n-react'; -import { TimestampTableCell } from '../../components/timestamp_table_cell'; -import type { Benchmark } from '../../../common/types_old'; -import { useKibana } from '../../common/hooks/use_kibana'; -import { benchmarksNavigation } from '../../common/navigation/constants'; +import type { BenchmarkScore, Benchmark, BenchmarksCisId } from '../../../common/types/latest'; import * as TEST_SUBJ from './test_subjects'; -import { getEnabledCspIntegrationDetails } from '../../common/utils/get_enabled_csp_integration_details'; import { isCommonError } from '../../components/cloud_posture_page'; import { FullSizeCenteredPage } from '../../components/full_size_centered_page'; +import { ComplianceScoreBar } from '../../components/compliance_score_bar'; +import { getBenchmarkCisName, getBenchmarkApplicableTo } from '../../../common/utils/helpers'; +import { CISBenchmarkIcon } from '../../components/cis_benchmark_icon'; export const ERROR_STATE_TEST_SUBJECT = 'benchmark_page_error'; @@ -41,36 +36,49 @@ interface BenchmarksTableProps 'data-test-subj'?: string; } -const AgentPolicyButtonLink = ({ name, id: policyId }: { name: string; id: string }) => { - const { http } = useKibana().services; - const [fleetBase, path] = pagePathGetters.policy_details({ policyId }); - - return {name}; -}; - -const IntegrationButtonLink = ({ - packageName, - policyId, - packagePolicyId, -}: { - packageName: string; - packagePolicyId: string; - policyId: string; -}) => { - const { application } = useKibana().services; - - return ( - - {packageName} - - ); +export const getBenchmarkPlurals = (benchmarkId: string, accountEvaluation: number) => { + switch (benchmarkId) { + case 'cis_k8s': + return ( + + ); + case 'cis_azure': + return ( + + ); + case 'cis_aws': + return ( + + ); + case 'cis_eks': + return ( + + ); + case 'cis_gcp': + return ( + + ); + } }; const ErrorMessageComponent = (error: { error: unknown }) => ( @@ -108,106 +116,84 @@ const ErrorMessageComponent = (error: { error: unknown }) => ( const BENCHMARKS_TABLE_COLUMNS: Array> = [ { - field: 'package_policy.name', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.integrationNameColumnTitle', { - defaultMessage: 'Integration Name', + field: 'id', + name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.integrationBenchmarkCisName', { + defaultMessage: 'Benchmark', }), - render: (packageName, benchmark) => ( - - ), truncateText: true, + width: '17.5%', sortable: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.INTEGRATION_NAME, + render: (benchmarkId: BenchmarksCisId) => { + return getBenchmarkCisName(benchmarkId); + }, + 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.CIS_NAME, }, { - field: 'rules_count', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.rulesColumnTitle', { - defaultMessage: 'Rules', + field: 'version', + name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.integrationBenchmarkVersion', { + defaultMessage: 'Version', }), truncateText: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.RULES, + sortable: true, + width: '17.5%', + 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.VERSION, }, { - field: 'package_policy', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.integrationColumnTitle', { - defaultMessage: 'Integration', + field: 'id', + name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.applicableTo', { + defaultMessage: 'Applicable To', }), - dataType: 'string', truncateText: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.INTEGRATION, - render: (field: PackagePolicy) => { - const enabledIntegration = getEnabledCspIntegrationDetails(field); - return enabledIntegration?.integration?.shortName || ' '; + width: '30%', + 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.APPLICABLE_TO, + render: (benchmarkId: BenchmarksCisId) => { + return ( + <> + + + + + {getBenchmarkApplicableTo(benchmarkId)} + + + ); }, }, { - field: 'package_policy', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.monitoringColumnTitle', { - defaultMessage: 'Monitoring', + field: 'evaluation', + name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.evaluated', { + defaultMessage: 'Evaluated', }), dataType: 'string', truncateText: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.MONITORING, - render: (field: PackagePolicy) => { - const enabledIntegration = getEnabledCspIntegrationDetails(field); - return enabledIntegration?.enabledIntegrationOption?.name || ' '; + width: '17.5%', + 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.EVALUATED, + render: (complianceScore: Benchmark['evaluation'], data) => { + return getBenchmarkPlurals(data.id, data.evaluation); }, }, { - field: 'agent_policy.name', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.agentPolicyColumnTitle', { - defaultMessage: 'Agent Policy', - }), - render: (name, benchmark) => ( - - ), - truncateText: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.AGENT_POLICY, - }, - { - field: 'agent_policy.agents', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.numberOfAgentsColumnTitle', { - defaultMessage: 'Number of Agents', - }), - truncateText: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.NUMBER_OF_AGENTS, - }, - { - field: 'package_policy.created_by', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.createdByColumnTitle', { - defaultMessage: 'Created by', + field: 'score', + name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.score', { + defaultMessage: 'Compliance', }), dataType: 'string', truncateText: true, - sortable: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.CREATED_BY, - render: (createdBy: Benchmark['package_policy']['created_by']) => { + width: '7.5%', + 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.COMPLIANCE, + render: (data: BenchmarkScore) => { + if (data.totalFindings > 0) + return ( + + ); return ( - - - {createdBy} - - + ); }, }, - { - field: 'package_policy.created_at', - name: i18n.translate('xpack.csp.benchmarks.benchmarksTable.createdAtColumnTitle', { - defaultMessage: 'Created', - }), - dataType: 'date', - truncateText: true, - render: (timestamp: Benchmark['package_policy']['created_at']) => ( - - ), - sortable: true, - 'data-test-subj': TEST_SUBJ.BENCHMARKS_TABLE_COLUMNS.CREATED_AT, - }, ]; export const BenchmarksTable = ({ @@ -228,8 +214,8 @@ export const BenchmarksTable = ({ totalItemCount, }; - const onChange = ({ page, sort }: CriteriaWithPagination) => { - setQuery({ page: { ...page, index: page.index + 1 }, sort }); + const onChange = ({ page }: CriteriaWithPagination) => { + setQuery({ page: { ...page, index: page.index + 1 } }); }; if (error) { @@ -241,14 +227,15 @@ export const BenchmarksTable = ({ data-test-subj={rest['data-test-subj']} items={benchmarks} columns={BENCHMARKS_TABLE_COLUMNS} - itemId={(item) => [item.agent_policy.id, item.package_policy.id].join('/')} + itemId={(item) => [item.id, item.version].join('/')} pagination={pagination} onChange={onChange} tableLayout="fixed" loading={loading} noItemsMessage={noItemsMessage} error={error} - sorting={sorting} + /* Disabled Sorting until we have the final Benchmark table */ + // sorting={sorting} /> ); }; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts index 3e75715abf32f..fb8c5e3733d88 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts @@ -9,12 +9,9 @@ export const BENCHMARKS_PAGE_HEADER = 'benchmarks-page-header'; export const BENCHMARKS_TABLE_DATA_TEST_SUBJ = 'csp_benchmarks_table'; export const ADD_INTEGRATION_TEST_SUBJ = 'csp_add_integration'; export const BENCHMARKS_TABLE_COLUMNS = { - INTEGRATION_NAME: 'benchmarks-table-column-integration-name', - MONITORING: 'benchmarks-table-column-monitoring', - RULES: 'benchmarks-table-column-rules', - INTEGRATION: 'benchmarks-table-column-integration', - AGENT_POLICY: 'benchmarks-table-column-agent-policy', - NUMBER_OF_AGENTS: 'benchmarks-table-column-number-of-agents', - CREATED_BY: 'benchmarks-table-column-created-by', - CREATED_AT: 'benchmarks-table-column-created-at', + CIS_NAME: 'benchmark-table-column-cis-name', + VERSION: 'benchmark-table-column-version', + APPLICABLE_TO: 'benchmark-table-column-applicable-to', + EVALUATED: 'benchmark-table-column-evaluated', + COMPLIANCE: 'benchmark-table-column-compliance', }; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts index 8704846407fc7..1683c3e63d2bd 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts @@ -6,13 +6,14 @@ */ import { useQuery } from '@tanstack/react-query'; -import type { ListResult } from '@kbn/fleet-plugin/common'; -import { BENCHMARKS_API_CURRENT_VERSION, BENCHMARKS_ROUTE_PATH } from '../../../common/constants'; -import type { BenchmarksQueryParams } from '../../../common/schemas/benchmark'; +import { BENCHMARKS_ROUTE_PATH } from '../../../common/constants'; +import type { BenchmarksQueryParams } from '../../../common/types/benchmarks/v1'; import { useKibana } from '../../common/hooks/use_kibana'; -import type { Benchmark } from '../../../common/types_old'; +import type { GetBenchmarkResponse } from '../../../common/types/latest'; +import type { GetBenchmarkResponse as GetBenchmarkResponseV1 } from '../../../common/types/benchmarks/v1'; -const QUERY_KEY = 'csp_benchmark_integrations'; +const QUERY_KEY_V1 = 'csp_benchmark_integrations_v1'; +const QUERY_KEY_V2 = 'csp_benchmark_integrations_v2'; export interface UseCspBenchmarkIntegrationsProps { name: string; @@ -22,7 +23,7 @@ export interface UseCspBenchmarkIntegrationsProps { sortOrder: BenchmarksQueryParams['sort_order']; } -export const useCspBenchmarkIntegrations = ({ +export const useCspBenchmarkIntegrationsV1 = ({ name, perPage, page, @@ -39,11 +40,24 @@ export const useCspBenchmarkIntegrations = ({ }; return useQuery( - [QUERY_KEY, query], + [QUERY_KEY_V1, query], () => - http.get>(BENCHMARKS_ROUTE_PATH, { + http.get(BENCHMARKS_ROUTE_PATH, { query, - version: BENCHMARKS_API_CURRENT_VERSION, + version: '1', + }), + { keepPreviousData: true } + ); +}; + +export const useCspBenchmarkIntegrationsV2 = () => { + const { http } = useKibana().services; + + return useQuery( + [QUERY_KEY_V2], + () => + http.get(BENCHMARKS_ROUTE_PATH, { + version: '2', }), { keepPreviousData: true } ); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx index 01821e04403ff..d986d5a97c2f6 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx @@ -132,7 +132,7 @@ const CompactPercentageLabels = ({ ); -const NonCompactPercentageLabels = ({ +const PercentageLabels = ({ onEvalCounterClick, stats, }: { @@ -209,7 +209,6 @@ const ComplianceTrendChart = ({ trend }: { trend: PostureTrend[] }) => { )} /> ) : ( - diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx index d3a6cf3ab12d7..c9c7ca2dad07c 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx @@ -150,7 +150,7 @@ export const BenchmarksSection = ({ {benchmarks.map((benchmark) => ( { >
- + ; -export const createCspBenchmarkIntegrationFixture = ({ - chance = new Chance(), - package_policy = { - revision: chance?.integer(), - enabled: true, - id: chance.guid(), - name: chance.string(), - policy_id: chance.guid(), - namespace: chance.string(), - updated_at: chance.date().toISOString(), - updated_by: chance.word(), - created_at: chance.date().toISOString(), - created_by: chance.word(), - inputs: [ - { - type: 'cloudbeat/cis_k8s', - policy_template: 'kspm', - enabled: true, - streams: [ - { - id: chance?.guid(), - enabled: true, - data_stream: { - type: 'logs', - dataset: 'cloud_security_posture.findings', - }, - }, - ], - }, - ], - package: { - name: chance.string(), - title: chance.string(), - version: chance.string(), +export const createCspBenchmarkIntegrationFixture = + ({}: CreateCspBenchmarkIntegrationFixtureInput = {}): Benchmark => ({ + id: 'cis_aws', + version: '1.0.1', + evaluation: 2, + score: { + postureScore: 85, + resourcesEvaluated: 183, + totalFailed: 66, + totalFindings: 440, + totalPassed: 374, }, - }, - agent_policy = { - id: chance.guid(), - name: chance.sentence(), - agents: chance.integer({ min: 0 }), - }, - rules_count = chance.integer({ min: 0, max: 10 }), -}: CreateCspBenchmarkIntegrationFixtureInput = {}): Benchmark => ({ - package_policy, - agent_policy, - rules_count, -}); + name: 'CIS Amazon Web Services Foundations', + }); diff --git a/x-pack/plugins/cloud_security_posture/server/lib/fleet_util.ts b/x-pack/plugins/cloud_security_posture/server/lib/fleet_util.ts index 109d1b46986c9..fd388967ee9b6 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/fleet_util.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/fleet_util.ts @@ -31,7 +31,7 @@ import { BENCHMARK_PACKAGE_POLICY_PREFIX, BenchmarksQueryParams, DEFAULT_BENCHMARKS_PER_PAGE, -} from '../../common/schemas/benchmark'; +} from '../../common/types/benchmarks/v1'; export const PACKAGE_POLICY_SAVED_OBJECT_TYPE = 'ingest-package-policies'; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts index 42209b205e177..52a112aae5a53 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts @@ -8,10 +8,10 @@ import { httpServerMock, httpServiceMock, savedObjectsClientMock } from '@kbn/co import { benchmarksQueryParamsSchema, DEFAULT_BENCHMARKS_PER_PAGE, -} from '../../../common/schemas/benchmark'; +} from '../../../common/types/benchmarks/v1'; import { getCspAgentPolicies } from '../../lib/fleet_util'; -import { defineGetBenchmarksRoute, getRulesCountForPolicy } from './benchmarks'; - +import { defineGetBenchmarksRoute } from './benchmarks'; +import { getRulesCountForPolicy } from './utilities'; import { SavedObjectsClientContract, SavedObjectsFindResponse } from '@kbn/core/server'; import { createMockAgentPolicyService } from '@kbn/fleet-plugin/server/mocks'; import { createPackagePolicyMock } from '@kbn/fleet-plugin/common/mocks'; @@ -57,7 +57,6 @@ describe('benchmarks API', () => { defineGetBenchmarksRoute(router); const versionedRouter = router.versioned.get.mock.results[0].value; - const handler = versionedRouter.addVersion.mock.calls[0][1]; const mockContext = createCspRequestHandlerContextMock(); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts index 0c920754fb77b..8ba6d0449be6a 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts @@ -4,86 +4,17 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type { SavedObjectsClientContract } from '@kbn/core/server'; + import { transformError } from '@kbn/securitysolution-es-utils'; -import type { AgentPolicy, ListResult, PackagePolicy } from '@kbn/fleet-plugin/common'; -import { CspBenchmarkRule } from '../../../common/types/latest'; -import { CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE } from '../../../common/constants'; -import { - BENCHMARKS_ROUTE_PATH, - CLOUD_SECURITY_POSTURE_PACKAGE_NAME, - POSTURE_TYPE_ALL, -} from '../../../common/constants'; -import { benchmarksQueryParamsSchema } from '../../../common/schemas/benchmark'; -import type { Benchmark } from '../../../common/types_old'; -import { - getBenchmarkFromPackagePolicy, - getBenchmarkFilter, - isNonNullable, -} from '../../../common/utils/helpers'; +import { BENCHMARKS_ROUTE_PATH } from '../../../common/constants'; +import { benchmarksQueryParamsSchema } from '../../../common/types/benchmarks/v1'; import { CspRouter } from '../../types'; -import { - getAgentStatusesByAgentPolicies, - type AgentStatusByAgentPolicyMap, - getCspAgentPolicies, - getCspPackagePolicies, -} from '../../lib/fleet_util'; -import { BenchmarkId } from '../../../common/types_old'; +import { getBenchmarks as getBenchmarksV1 } from './v1'; +import { getBenchmarks as getBenchmarksV2 } from './v2'; +import { benchmarkResponseSchema } from '../../../common/types/latest'; export const PACKAGE_POLICY_SAVED_OBJECT_TYPE = 'ingest-package-policies'; -export const getRulesCountForPolicy = async ( - soClient: SavedObjectsClientContract, - benchmarkId: BenchmarkId -): Promise => { - const rules = await soClient.find({ - type: CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, - filter: getBenchmarkFilter(benchmarkId), - perPage: 0, - }); - - return rules.total; -}; - -const createBenchmarks = ( - soClient: SavedObjectsClientContract, - agentPolicies: AgentPolicy[], - agentStatusByAgentPolicyId: AgentStatusByAgentPolicyMap, - cspPackagePolicies: PackagePolicy[] -): Promise => { - const cspPackagePoliciesMap = new Map( - cspPackagePolicies.map((packagePolicy) => [packagePolicy.id, packagePolicy]) - ); - - return Promise.all( - agentPolicies.flatMap((agentPolicy) => { - const cspPackagesOnAgent = - agentPolicy.package_policies - ?.map(({ id: pckPolicyId }) => { - return cspPackagePoliciesMap.get(pckPolicyId); - }) - .filter(isNonNullable) ?? []; - - const benchmarks = cspPackagesOnAgent.map(async (cspPackage) => { - const benchmarkId = getBenchmarkFromPackagePolicy(cspPackage.inputs); - const rulesCount = await getRulesCountForPolicy(soClient, benchmarkId); - const agentPolicyStatus = { - id: agentPolicy.id, - name: agentPolicy.name, - agents: agentStatusByAgentPolicyId[agentPolicy.id]?.total, - }; - return { - package_policy: cspPackage, - agent_policy: agentPolicyStatus, - rules_count: rulesCount, - }; - }); - - return benchmarks; - }) - ); -}; - export const defineGetBenchmarksRoute = (router: CspRouter) => router.versioned .get({ @@ -106,45 +37,54 @@ export const defineGetBenchmarksRoute = (router: CspRouter) => if (!(await context.fleet).authz.fleet.all) { return response.forbidden(); } - const cspContext = await context.csp; - const excludeVulnMgmtPackages = true; try { - const packagePolicies: ListResult = await getCspPackagePolicies( + const cspBenchmarks = await getBenchmarksV1( cspContext.soClient, cspContext.packagePolicyService, - CLOUD_SECURITY_POSTURE_PACKAGE_NAME, request.query, - POSTURE_TYPE_ALL, - excludeVulnMgmtPackages - ); - - const agentPolicies = await getCspAgentPolicies( - cspContext.soClient, - packagePolicies.items, - cspContext.agentPolicyService - ); - - const agentStatusesByAgentPolicyId = await getAgentStatusesByAgentPolicies( + cspContext.agentPolicyService, cspContext.agentService, - agentPolicies, cspContext.logger ); - - const benchmarks = await createBenchmarks( + return response.ok({ + body: cspBenchmarks, + }); + } catch (err) { + const error = transformError(err); + cspContext.logger.error(`Failed to fetch benchmarks ${err}`); + return response.customError({ + body: { message: error.message }, + statusCode: error.statusCode, + }); + } + } + ) + .addVersion( + { + version: '2', + validate: { + response: { + 200: { + body: benchmarkResponseSchema, + }, + }, + }, + }, + async (context, request, response) => { + if (!(await context.fleet).authz.fleet.all) { + return response.forbidden(); + } + const cspContext = await context.csp; + const esClient = cspContext.esClient.asCurrentUser; + try { + const cspBenchmarks = await getBenchmarksV2( + esClient, cspContext.soClient, - agentPolicies, - agentStatusesByAgentPolicyId, - packagePolicies.items + cspContext.logger ); - - const getBenchmarkResponse = { - ...packagePolicies, - items: benchmarks, - }; - return response.ok({ - body: getBenchmarkResponse, + body: cspBenchmarks, }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts new file mode 100644 index 0000000000000..d7ce82da9d98c --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; + +import { CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE } from '../../../common/constants'; + +import { CspBenchmarkRule } from '../../../common/types/latest'; +import { BenchmarkId } from '../../../common/types_old'; +import { getBenchmarkFilter } from '../../../common/utils/helpers'; + +export const getRulesCountForPolicy = async ( + soClient: SavedObjectsClientContract, + benchmarkId: BenchmarkId +): Promise => { + const rules = await soClient.find({ + type: CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, + filter: getBenchmarkFilter(benchmarkId), + perPage: 0, + }); + + return rules.total; +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts new file mode 100644 index 0000000000000..611a58436e995 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts @@ -0,0 +1,109 @@ +/* + * Copyright 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 { ListResult, PackagePolicy, AgentPolicy } from '@kbn/fleet-plugin/common'; +import type { Logger } from '@kbn/core/server'; +import { + PackagePolicyClient, + AgentPolicyServiceInterface, + AgentService, +} from '@kbn/fleet-plugin/server'; +import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import { CLOUD_SECURITY_POSTURE_PACKAGE_NAME, POSTURE_TYPE_ALL } from '../../../common/constants'; +import { isNonNullable, getBenchmarkFromPackagePolicy } from '../../../common/utils/helpers'; +import { AgentStatusByAgentPolicyMap } from '../../lib/fleet_util'; +import { + getCspPackagePolicies, + getCspAgentPolicies, + getAgentStatusesByAgentPolicies, +} from '../../lib/fleet_util'; +import { getRulesCountForPolicy } from './utilities'; +import { Benchmark } from '../../../common/types/benchmarks/v1'; + +export const getBenchmarksData = ( + soClient: SavedObjectsClientContract, + agentPolicies: AgentPolicy[], + agentStatusByAgentPolicyId: AgentStatusByAgentPolicyMap, + cspPackagePolicies: PackagePolicy[] +): Promise => { + const cspPackagePoliciesMap = new Map( + cspPackagePolicies.map((packagePolicy) => [packagePolicy.id, packagePolicy]) + ); + + return Promise.all( + agentPolicies.flatMap((agentPolicy) => { + const cspPackagesOnAgent = + agentPolicy.package_policies + ?.map(({ id: pckPolicyId }) => { + return cspPackagePoliciesMap.get(pckPolicyId); + }) + .filter(isNonNullable) ?? []; + + const benchmarks = cspPackagesOnAgent.map(async (cspPackage) => { + const benchmarkId = getBenchmarkFromPackagePolicy(cspPackage.inputs); + const rulesCount = await getRulesCountForPolicy(soClient, benchmarkId); + const agentPolicyStatus = { + id: agentPolicy.id, + name: agentPolicy.name, + agents: agentStatusByAgentPolicyId[agentPolicy.id]?.total, + }; + return { + package_policy: cspPackage, + agent_policy: agentPolicyStatus, + rules_count: rulesCount, + }; + }); + + return benchmarks; + }) + ); +}; + +export const getBenchmarks = async ( + soClient: SavedObjectsClientContract, + packagePolicyService: PackagePolicyClient, + query: any, + agentPolicyService: AgentPolicyServiceInterface, + agentService: AgentService, + logger: Logger +) => { + const excludeVulnMgmtPackages = true; + + const packagePolicies: ListResult = await getCspPackagePolicies( + soClient, + packagePolicyService, + CLOUD_SECURITY_POSTURE_PACKAGE_NAME, + query, + POSTURE_TYPE_ALL, + excludeVulnMgmtPackages + ); + + const agentPolicies = await getCspAgentPolicies( + soClient, + packagePolicies.items, + agentPolicyService + ); + + const agentStatusesByAgentPolicyId = await getAgentStatusesByAgentPolicies( + agentService, + agentPolicies, + logger + ); + + const benchmarks = await getBenchmarksData( + soClient, + agentPolicies, + agentStatusesByAgentPolicyId, + packagePolicies.items + ); + + const getBenchmarkResponse = { + ...packagePolicies, + items: benchmarks, + }; + + return getBenchmarkResponse; +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts new file mode 100644 index 0000000000000..5e0a4c5014365 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts @@ -0,0 +1,118 @@ +/* + * Copyright 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 { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; +import { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { Logger } from '@kbn/core/server'; +import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import { + CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, + LATEST_FINDINGS_INDEX_DEFAULT_NS, +} from '../../../common/constants'; + +import { CspBenchmarkRule, Benchmark } from '../../../common/types/latest'; +import { getClusters } from '../compliance_dashboard/get_clusters'; +import { getStats } from '../compliance_dashboard/get_stats'; +import { getSafePostureTypeRuntimeMapping } from '../../../common/runtime_mappings/get_safe_posture_type_runtime_mapping'; + +export const getBenchmarksData = async ( + soClient: SavedObjectsClientContract, + esClient: any, + logger: Logger +): Promise => { + // Returns a list of benchmark based on their Version and Benchmark ID + + const benchmarksResponse = await soClient.find({ + type: CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, + aggs: { + benchmark_id: { + terms: { + field: `${CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE}.attributes.metadata.benchmark.id`, + }, + aggs: { + name: { + terms: { + field: `${CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE}.attributes.metadata.benchmark.name`, + }, + aggs: { + version: { + terms: { + field: `${CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE}.attributes.metadata.benchmark.version`, + }, + }, + }, + }, + }, + }, + }, + perPage: 0, + }); + + const benchmarkAgg: any = benchmarksResponse.aggregations; + + const { id: pitId } = await esClient.openPointInTime({ + index: LATEST_FINDINGS_INDEX_DEFAULT_NS, + keep_alive: '30s', + }); + // Transform response to a benchmark row: {id, name, version} + // For each Benchmark entry : Calculate Score, Get amount of enrolled agents + const result = await Promise.all( + benchmarkAgg.benchmark_id.buckets.flatMap(async (benchmark: any) => { + const benchmarkId = benchmark.key; + const benchmarkName = benchmark.name.buckets[0].key; + + const benchmarksTableObjects = await Promise.all( + benchmark?.name?.buckets[0]?.version?.buckets.flatMap(async (benchmarkObj: any) => { + const benchmarkVersion = benchmarkObj.key; + const postureType = + benchmarkId === 'cis_eks' || benchmarkId === 'cis_k8s' ? 'kspm' : 'cspm'; + const runtimeMappings: MappingRuntimeFields = getSafePostureTypeRuntimeMapping(); + const query: QueryDslQueryContainer = { + bool: { + filter: [ + { term: { 'rule.benchmark.id': benchmarkId } }, + { term: { 'rule.benchmark.version': benchmarkVersion } }, + { term: { safe_posture_type: postureType } }, + ], + }, + }; + const benchmarkScore = await getStats(esClient, query, pitId, runtimeMappings, logger); + const benchmarkEvaluation = await getClusters( + esClient, + query, + pitId, + runtimeMappings, + logger + ); + + return { + id: benchmarkId, + name: benchmarkName, + version: benchmarkVersion.replace('v', ''), + score: benchmarkScore, + evaluation: benchmarkEvaluation.length, + }; + }) + ); + + return benchmarksTableObjects; + }) + ); + return result.flat(); +}; + +export const getBenchmarks = async ( + esClient: any, + soClient: SavedObjectsClientContract, + logger: Logger +) => { + const benchmarks = await getBenchmarksData(soClient, esClient, logger); + const getBenchmarkResponse = { + items: benchmarks, + }; + return getBenchmarkResponse; +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts index 150c531f4a1fa..f0369dd3a562a 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts @@ -7,10 +7,12 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { calculatePostureScore } from '../../../common/utils/helpers'; -import { BENCHMARK_SCORE_INDEX_DEFAULT_NS } from '../../../common/constants'; +import { + BENCHMARK_SCORE_INDEX_DEFAULT_NS, + CSPM_FINDINGS_STATS_INTERVAL, +} from '../../../common/constants'; import type { PosturePolicyTemplate, Stats } from '../../../common/types_old'; import { toBenchmarkDocFieldKey } from '../../lib/mapping_field_util'; -import { CSPM_FINDINGS_STATS_INTERVAL } from '../../tasks/findings_stats_task'; interface FindingsDetails { total_findings: number; diff --git a/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts b/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts index c157e8081546a..93886c8f8acca 100644 --- a/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts +++ b/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts @@ -19,6 +19,7 @@ import { getIdentifierRuntimeMapping } from '../../common/runtime_mappings/get_i import { FindingsStatsTaskResult, ScoreByPolicyTemplateBucket, VulnSeverityAggs } from './types'; import { BENCHMARK_SCORE_INDEX_DEFAULT_NS, + CSPM_FINDINGS_STATS_INTERVAL, LATEST_FINDINGS_INDEX_DEFAULT_NS, LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, VULNERABILITIES_SEVERITY, @@ -36,7 +37,6 @@ import { toBenchmarkMappingFieldKey } from '../lib/mapping_field_util'; const CSPM_FINDINGS_STATS_TASK_ID = 'cloud_security_posture-findings_stats'; const CSPM_FINDINGS_STATS_TASK_TYPE = 'cloud_security_posture-stats_task'; -export const CSPM_FINDINGS_STATS_INTERVAL = 5; export async function scheduleFindingsStatsTask( taskManager: TaskManagerStartContract, diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx index cff3c98688b31..bc79f7ec908ab 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx @@ -58,7 +58,6 @@ export const DocumentCountChart: FC = ({ services: { data, uiSettings, fieldFormats, charts }, } = useDataVisualizerKibana(); - const chartTheme = charts.theme.useChartsTheme(); const chartBaseTheme = charts.theme.useChartsBaseTheme(); const xAxisFormatter = fieldFormats.deserialize({ id: 'date' }); @@ -136,7 +135,6 @@ export const DocumentCountChart: FC = ({ diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/boolean_content.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/boolean_content.tsx index 32bf2d29a8a6c..51af8c47cc684 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/boolean_content.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/boolean_content.tsx @@ -7,7 +7,7 @@ import React, { FC, useMemo } from 'react'; import { EuiSpacer } from '@elastic/eui'; -import { Axis, BarSeries, Chart, Settings, ScaleType } from '@elastic/charts'; +import { Axis, BarSeries, Chart, Settings, ScaleType, LEGACY_LIGHT_THEME } from '@elastic/charts'; import { FormattedMessage } from '@kbn/i18n-react'; import { roundToDecimalPlace } from '@kbn/ml-number-utils'; @@ -74,7 +74,13 @@ export const BooleanContent: FC = ({ config, onAddFilter }) = tickFormat={(d: any) => getFormattedValue(d, count)} /> - + = ({ {!isUnsupportedChartData(chartData) && data.length > 0 && ( i)} theme={{ chartMargins: zeroSize, diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/metric_distribution_chart/metric_distribution_chart.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/metric_distribution_chart/metric_distribution_chart.tsx index 179968580653b..0ea2bff99ae0f 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/metric_distribution_chart/metric_distribution_chart.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/metric_distribution_chart/metric_distribution_chart.tsx @@ -19,6 +19,7 @@ import { Settings, TooltipHeaderFormatter, Tooltip, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import { MetricDistributionChartTooltipHeader } from './metric_distribution_chart_tooltip_header'; @@ -84,7 +85,12 @@ export const MetricDistributionChart: FC = ({ > - + - + - + - + { clusterClient: core.elasticsearch.client, elasticAssistant: { actions: actionsClientMock.create(), + getRegisteredTools: jest.fn(), logger: loggingSystemMock.createLogger(), }, savedObjectsClient: core.savedObjects.client, @@ -72,6 +73,7 @@ const createElasticAssistantRequestContextMock = ( ): jest.Mocked => { return { actions: clients.elasticAssistant.actions as unknown as ActionsPluginStart, + getRegisteredTools: jest.fn(), logger: clients.elasticAssistant.logger, }; }; diff --git a/x-pack/plugins/elastic_assistant/server/index.ts b/x-pack/plugins/elastic_assistant/server/index.ts index 0cccc1ba27a7a..1775fc60528e8 100755 --- a/x-pack/plugins/elastic_assistant/server/index.ts +++ b/x-pack/plugins/elastic_assistant/server/index.ts @@ -13,6 +13,10 @@ export async function plugin(initializerContext: PluginInitializerContext) { } export type { - ElasticAssistantPluginSetup as EcsDataQualityDashboardPluginSetup, - ElasticAssistantPluginStart as EcsDataQualityDashboardPluginStart, + ElasticAssistantPluginSetup, + ElasticAssistantPluginStart, + ElasticAssistantPluginSetupDependencies, + ElasticAssistantPluginStartDependencies, + AssistantTool, + AssistantToolParams, } from './types'; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts index 52a066e54de1e..d6868925cc667 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts @@ -16,7 +16,7 @@ import { KNOWLEDGE_BASE_INDEX_PATTERN } from '../../../routes/knowledge_base/con import type { AgentExecutorParams, AgentExecutorResponse } from '../executors/types'; import { withAssistantSpan } from '../tracers/with_assistant_span'; import { APMTracer } from '../tracers/apm_tracer'; -import { getApplicableTools } from '../tools'; +import { AssistantToolParams } from '../../../types'; export const DEFAULT_AGENT_EXECUTOR_ID = 'Elastic AI Assistant Agent Executor'; @@ -31,6 +31,7 @@ export const callAgentExecutor = async ({ allow, allowReplacement, assistantLangChain, + assistantTools = [], connectorId, elserId, esClient, @@ -71,7 +72,8 @@ export const callAgentExecutor = async ({ // Create a chain that uses the ELSER backed ElasticsearchStore, override k=10 for esql query generation for now const chain = RetrievalQAChain.fromLLM(llm, esStore.asRetriever(10)); - const tools: Tool[] = getApplicableTools({ + // Fetch any applicable tools that the source plugin may have registered + const assistantToolParams: AssistantToolParams = { allow, allowReplacement, alertsIndexPattern, @@ -83,7 +85,8 @@ export const callAgentExecutor = async ({ replacements, request, size, - }); + }; + const tools: Tool[] = assistantTools.flatMap((tool) => tool.getTool(assistantToolParams) ?? []); logger.debug(`applicable tools: ${JSON.stringify(tools.map((t) => t.name).join(', '), null, 2)}`); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts index bd6a38da5cdc4..e7824e2822f8a 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts @@ -12,6 +12,7 @@ import { Logger } from '@kbn/logging'; import { KibanaRequest } from '@kbn/core-http-server'; import type { LangChainTracer } from 'langchain/callbacks'; import { RequestBody, ResponseBody } from '../types'; +import type { AssistantTool } from '../../../types'; export interface AgentExecutorParams { alertsIndexPattern?: string; @@ -19,6 +20,7 @@ export interface AgentExecutorParams { allow?: string[]; allowReplacement?: string[]; assistantLangChain: boolean; + assistantTools?: AssistantTool[]; connectorId: string; esClient: ElasticsearchClient; kbResource: string | undefined; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_tool.test.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_tool.test.ts deleted file mode 100644 index cffe31cbcfd39..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_tool.test.ts +++ /dev/null @@ -1,105 +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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import type { KibanaRequest } from '@kbn/core-http-server'; -import { DynamicTool } from 'langchain/tools'; -import { omit } from 'lodash/fp'; - -import { getAlertCountsTool } from './get_alert_counts_tool'; -import type { RequestBody } from '../../types'; - -describe('getAlertCountsTool', () => { - const alertsIndexPattern = 'alerts-index'; - const esClient = { - search: jest.fn().mockResolvedValue({}), - } as unknown as ElasticsearchClient; - const replacements = { key: 'value' }; - const request = { - body: { - assistantLangChain: false, - alertsIndexPattern: '.alerts-security.alerts-default', - allow: ['@timestamp', 'cloud.availability_zone', 'user.name'], - allowReplacement: ['user.name'], - replacements, - size: 20, - }, - } as unknown as KibanaRequest; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('returns a `DynamicTool` with a `func` that calls `esClient.search()` with the expected query', async () => { - const tool: DynamicTool = getAlertCountsTool({ - alertsIndexPattern, - esClient, - replacements, - request, - }) as DynamicTool; - - await tool.func(''); - - expect(esClient.search).toHaveBeenCalledWith({ - aggs: { statusBySeverity: { terms: { field: 'kibana.alert.severity' } } }, - index: ['alerts-index'], - query: { - bool: { - filter: [ - { - bool: { - filter: [{ match_phrase: { 'kibana.alert.workflow_status': 'open' } }], - must_not: [{ exists: { field: 'kibana.alert.building_block_type' } }], - }, - }, - { range: { '@timestamp': { gte: 'now/d', lte: 'now/d' } } }, - ], - }, - }, - size: 0, - }); - }); - - it('returns null when the request is missing required anonymization parameters', () => { - const requestWithMissingParams = omit('body.allow', request) as unknown as KibanaRequest< - unknown, - unknown, - RequestBody - >; - - const tool = getAlertCountsTool({ - alertsIndexPattern, - esClient, - replacements, - request: requestWithMissingParams, - }); - - expect(tool).toBeNull(); - }); - - it('returns null when the alertsIndexPattern is undefined', () => { - const tool = getAlertCountsTool({ - // alertsIndexPattern is undefined - esClient, - replacements, - request, - }); - - expect(tool).toBeNull(); - }); - - it('returns a tool instance with the expected tags', () => { - const tool = getAlertCountsTool({ - alertsIndexPattern, - esClient, - replacements, - request, - }) as DynamicTool; - - expect(tool.tags).toEqual(['alerts', 'alerts-count']); - }); -}); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_tool.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_tool.ts deleted file mode 100644 index 9c5ec2555d2e5..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_tool.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; -import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { KibanaRequest } from '@kbn/core-http-server'; -import { DynamicTool, Tool } from 'langchain/tools'; - -import { getAlertsCountQuery } from './get_alert_counts_query'; -import { requestHasRequiredAnonymizationParams } from '../../helpers'; -import type { RequestBody } from '../../types'; - -export const ALERT_COUNTS_TOOL_DESCRIPTION = - 'Call this for the counts of last 24 hours of open alerts in the environment, grouped by their severity'; - -export const getAlertCountsTool = ({ - alertsIndexPattern, - esClient, - replacements, - request, -}: { - alertsIndexPattern?: string; - esClient: ElasticsearchClient; - replacements?: Record; - request: KibanaRequest; -}): Tool | null => { - if (!requestHasRequiredAnonymizationParams(request) || alertsIndexPattern == null) { - return null; - } - - return new DynamicTool({ - name: 'alert-counts', - description: ALERT_COUNTS_TOOL_DESCRIPTION, - func: async () => { - const query = getAlertsCountQuery(alertsIndexPattern); - - const result = await esClient.search(query); - - return JSON.stringify(result); - }, - tags: ['alerts', 'alerts-count'], - }); -}; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/esql_language_knowledge_base/get_esql_language_knowledge_base_tool.test.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/esql_language_knowledge_base/get_esql_language_knowledge_base_tool.test.ts deleted file mode 100644 index ccd97b7deb088..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/esql_language_knowledge_base/get_esql_language_knowledge_base_tool.test.ts +++ /dev/null @@ -1,55 +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 { RetrievalQAChain } from 'langchain/chains'; -import { DynamicTool } from 'langchain/tools'; - -import { getEsqlLanguageKnowledgeBaseTool } from './get_esql_language_knowledge_base_tool'; - -const chain = {} as RetrievalQAChain; - -describe('getEsqlLanguageKnowledgeBaseTool', () => { - it('returns null if assistantLangChain is false', () => { - const tool = getEsqlLanguageKnowledgeBaseTool({ - assistantLangChain: false, - chain, - modelExists: true, - }); - - expect(tool).toBeNull(); - }); - - it('returns null if modelExists is false (the ELSER model is not installed)', () => { - const tool = getEsqlLanguageKnowledgeBaseTool({ - assistantLangChain: true, - chain, - modelExists: false, // <-- ELSER model is not installed - }); - - expect(tool).toBeNull(); - }); - - it('should return a Tool instance if assistantLangChain and modelExists are true', () => { - const tool = getEsqlLanguageKnowledgeBaseTool({ - assistantLangChain: true, - modelExists: true, - chain, - }); - - expect(tool?.name).toEqual('ESQLKnowledgeBaseTool'); - }); - - it('should return a tool with the expected tags', () => { - const tool = getEsqlLanguageKnowledgeBaseTool({ - assistantLangChain: true, - chain, - modelExists: true, - }) as DynamicTool; - - expect(tool.tags).toEqual(['esql', 'query-generation', 'knowledge-base']); - }); -}); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/esql_language_knowledge_base/get_esql_language_knowledge_base_tool.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/esql_language_knowledge_base/get_esql_language_knowledge_base_tool.ts deleted file mode 100644 index f49551261a79d..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/esql_language_knowledge_base/get_esql_language_knowledge_base_tool.ts +++ /dev/null @@ -1,29 +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 { RetrievalQAChain } from 'langchain/chains'; -import { ChainTool, Tool } from 'langchain/tools'; - -export const getEsqlLanguageKnowledgeBaseTool = ({ - assistantLangChain, - modelExists, - chain, -}: { - assistantLangChain: boolean; - chain: RetrievalQAChain; - /** true when the ELSER model is installed */ - modelExists: boolean; -}): Tool | null => - assistantLangChain && modelExists - ? new ChainTool({ - name: 'ESQLKnowledgeBaseTool', - description: - 'Call this for knowledge on how to build an ESQL query, or answer questions about the ES|QL query language.', - chain, - tags: ['esql', 'query-generation', 'knowledge-base'], - }) - : null; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/index.test.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/index.test.ts deleted file mode 100644 index cb0e79c0558d4..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/index.test.ts +++ /dev/null @@ -1,58 +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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { KibanaRequest } from '@kbn/core-http-server'; -import { RetrievalQAChain } from 'langchain/chains'; - -import { RequestBody } from '../types'; -import { getApplicableTools } from '.'; - -describe('getApplicableTools', () => { - const alertsIndexPattern = 'alerts-index'; - const esClient = { - search: jest.fn().mockResolvedValue({}), - } as unknown as ElasticsearchClient; - const modelExists = true; // the ELSER model is installed - const onNewReplacements = jest.fn(); - const replacements = { key: 'value' }; - const request = { - body: { - assistantLangChain: true, - alertsIndexPattern: '.alerts-security.alerts-default', - allow: ['@timestamp', 'cloud.availability_zone', 'user.name'], - allowReplacement: ['user.name'], - replacements, - size: 20, - }, - } as unknown as KibanaRequest; - const chain = {} as unknown as RetrievalQAChain; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should return an array of applicable tools', () => { - const tools = getApplicableTools({ - alertsIndexPattern, - allow: request.body.allow, - allowReplacement: request.body.allowReplacement, - assistantLangChain: request.body.assistantLangChain, - chain, - esClient, - modelExists, - onNewReplacements, - replacements, - request, - size: request.body.size, - }); - - const minExpectedTools = 3; // 3 tools are currently implemented - - expect(tools.length).toBeGreaterThanOrEqual(minExpectedTools); - }); -}); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/index.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/index.ts deleted file mode 100644 index edc9c264b636a..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/index.ts +++ /dev/null @@ -1,63 +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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { KibanaRequest } from '@kbn/core-http-server'; -import { RetrievalQAChain } from 'langchain/chains'; -import { Tool } from 'langchain/tools'; - -import { getAlertCountsTool } from './alert_counts/get_alert_counts_tool'; -import { getEsqlLanguageKnowledgeBaseTool } from './esql_language_knowledge_base/get_esql_language_knowledge_base_tool'; -import { getOpenAlertsTool } from './open_alerts/get_open_alerts_tool'; -import type { RequestBody } from '../types'; - -export interface GetApplicableTools { - alertsIndexPattern?: string; - allow?: string[]; - allowReplacement?: string[]; - assistantLangChain: boolean; - chain: RetrievalQAChain; - esClient: ElasticsearchClient; - modelExists: boolean; - onNewReplacements?: (newReplacements: Record) => void; - replacements?: Record; - request: KibanaRequest; - size?: number; -} - -export const getApplicableTools = ({ - alertsIndexPattern, - allow, - allowReplacement, - assistantLangChain, - chain, - esClient, - modelExists, - onNewReplacements, - replacements, - request, - size, -}: GetApplicableTools): Tool[] => - [ - getEsqlLanguageKnowledgeBaseTool({ assistantLangChain, chain, modelExists }) ?? [], - getAlertCountsTool({ - alertsIndexPattern, - esClient, - replacements, - request, - }) ?? [], - getOpenAlertsTool({ - alertsIndexPattern, - allow, - allowReplacement, - esClient, - onNewReplacements, - replacements, - request, - size, - }) ?? [], - ].flat(); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_tool.test.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_tool.test.ts deleted file mode 100644 index 8c996db2d63b4..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_tool.test.ts +++ /dev/null @@ -1,206 +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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import type { KibanaRequest } from '@kbn/core-http-server'; -import { DynamicTool } from 'langchain/tools'; -import { omit } from 'lodash/fp'; - -import { getOpenAlertsTool } from './get_open_alerts_tool'; -import { mockAlertsFieldsApi } from '../../../../__mocks__/alerts'; -import type { RequestBody } from '../../types'; -import { MAX_SIZE } from './helpers'; - -describe('getOpenAlertsTool', () => { - const alertsIndexPattern = 'alerts-index'; - const esClient = { - search: jest.fn().mockResolvedValue(mockAlertsFieldsApi), - } as unknown as ElasticsearchClient; - const replacements = { key: 'value' }; - const request = { - body: { - assistantLangChain: false, - alertsIndexPattern: '.alerts-security.alerts-default', - allow: ['@timestamp', 'cloud.availability_zone', 'user.name'], - allowReplacement: ['user.name'], - replacements, - size: 20, - }, - } as unknown as KibanaRequest; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('returns a `DynamicTool` with a `func` that calls `esClient.search()` with the expected query', async () => { - const tool: DynamicTool = getOpenAlertsTool({ - alertsIndexPattern, - allow: request.body.allow, - allowReplacement: request.body.allowReplacement, - esClient, - onNewReplacements: jest.fn(), - replacements, - request, - size: request.body.size, - }) as DynamicTool; - - await tool.func(''); - - expect(esClient.search).toHaveBeenCalledWith({ - allow_no_indices: true, - body: { - _source: false, - fields: [ - { - field: '@timestamp', - include_unmapped: true, - }, - { - field: 'cloud.availability_zone', - include_unmapped: true, - }, - { - field: 'user.name', - include_unmapped: true, - }, - ], - query: { - bool: { - filter: [ - { - bool: { - filter: [ - { - match_phrase: { - 'kibana.alert.workflow_status': 'open', - }, - }, - { - range: { - '@timestamp': { - format: 'strict_date_optional_time', - gte: 'now-1d/d', - lte: 'now/d', - }, - }, - }, - ], - must: [], - must_not: [ - { - exists: { - field: 'kibana.alert.building_block_type', - }, - }, - ], - should: [], - }, - }, - ], - }, - }, - runtime_mappings: {}, - size: 20, - sort: [ - { - 'kibana.alert.risk_score': { - order: 'desc', - }, - }, - { - '@timestamp': { - order: 'desc', - }, - }, - ], - }, - ignore_unavailable: true, - index: ['alerts-index'], - }); - }); - - it('returns null when the request is missing required anonymization parameters', () => { - const requestWithMissingParams = omit('body.allow', request) as unknown as KibanaRequest< - unknown, - unknown, - RequestBody - >; - - const tool = getOpenAlertsTool({ - alertsIndexPattern, - allow: requestWithMissingParams.body.allow, - allowReplacement: requestWithMissingParams.body.allowReplacement, - esClient, - onNewReplacements: jest.fn(), - replacements, - request: requestWithMissingParams, - size: requestWithMissingParams.body.size, - }); - - expect(tool).toBeNull(); - }); - - it('returns null when alertsIndexPattern is undefined', () => { - const tool = getOpenAlertsTool({ - // alertsIndexPattern is undefined - allow: request.body.allow, - allowReplacement: request.body.allowReplacement, - esClient, - onNewReplacements: jest.fn(), - replacements, - request, - size: request.body.size, - }); - - expect(tool).toBeNull(); - }); - - it('returns null when size is undefined', () => { - const tool = getOpenAlertsTool({ - alertsIndexPattern, - allow: request.body.allow, - allowReplacement: request.body.allowReplacement, - esClient, - onNewReplacements: jest.fn(), - replacements, - request, - // size is undefined - }); - - expect(tool).toBeNull(); - }); - - it('returns null when size out of range', () => { - const tool = getOpenAlertsTool({ - alertsIndexPattern, - allow: request.body.allow, - allowReplacement: request.body.allowReplacement, - esClient, - onNewReplacements: jest.fn(), - replacements, - request, - size: MAX_SIZE + 1, // <-- size is out of range - }); - - expect(tool).toBeNull(); - }); - - it('returns a tool instance with the expected tags', () => { - const tool = getOpenAlertsTool({ - alertsIndexPattern, - allow: request.body.allow, - allowReplacement: request.body.allowReplacement, - esClient, - onNewReplacements: jest.fn(), - replacements, - request, - size: request.body.size, - }) as DynamicTool; - - expect(tool.tags).toEqual(['alerts', 'open-alerts']); - }); -}); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_tool.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_tool.ts deleted file mode 100644 index 755bfa7f9dc3a..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_tool.ts +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; -import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { KibanaRequest } from '@kbn/core-http-server'; -import { getAnonymizedValue, transformRawData } from '@kbn/elastic-assistant-common'; -import { DynamicTool, Tool } from 'langchain/tools'; -import { requestHasRequiredAnonymizationParams } from '../../helpers'; -import { RequestBody } from '../../types'; - -import { getOpenAlertsQuery } from './get_open_alerts_query'; -import { getRawDataOrDefault, sizeIsOutOfRange } from './helpers'; - -export const OPEN_ALERTS_TOOL_DESCRIPTION = - 'Call this for knowledge about the latest n open alerts (sorted by `kibana.alert.risk_score`) in the environment, or when answering questions about open alerts'; - -/** - * Returns a tool for querying open alerts, or null if the request - * doesn't have all the required parameters. - */ -export const getOpenAlertsTool = ({ - alertsIndexPattern, - allow, - allowReplacement, - esClient, - onNewReplacements, - replacements, - request, - size, -}: { - alertsIndexPattern?: string; - allow?: string[]; - allowReplacement?: string[]; - esClient: ElasticsearchClient; - onNewReplacements?: (newReplacements: Record) => void; - replacements?: Record; - request: KibanaRequest; - size?: number; -}): Tool | null => { - if ( - !requestHasRequiredAnonymizationParams(request) || - alertsIndexPattern == null || - size == null || - sizeIsOutOfRange(size) - ) { - return null; - } - - return new DynamicTool({ - name: 'open-alerts', - description: OPEN_ALERTS_TOOL_DESCRIPTION, - func: async () => { - const query = getOpenAlertsQuery({ - alertsIndexPattern, - allow: allow ?? [], - size, - }); - - const result = await esClient.search(query); - - // Accumulate replacements locally so we can, for example use the same - // replacement for a hostname when we see it in multiple alerts: - let localReplacements = { ...replacements }; - const localOnNewReplacements = (newReplacements: Record) => { - localReplacements = { ...localReplacements, ...newReplacements }; // update the local state - - onNewReplacements?.(localReplacements); // invoke the callback with the latest replacements - }; - - return JSON.stringify( - result.hits?.hits?.map((x) => - transformRawData({ - allow: allow ?? [], - allowReplacement: allowReplacement ?? [], - currentReplacements: localReplacements, // <-- the latest local replacements - getAnonymizedValue, - onNewReplacements: localOnNewReplacements, // <-- the local callback - rawData: getRawDataOrDefault(x.fields), - }) - ) - ); - }, - tags: ['alerts', 'open-alerts'], - }); -}; diff --git a/x-pack/plugins/elastic_assistant/server/plugin.ts b/x-pack/plugins/elastic_assistant/server/plugin.ts index a0df339695885..bd06165e57284 100755 --- a/x-pack/plugins/elastic_assistant/server/plugin.ts +++ b/x-pack/plugins/elastic_assistant/server/plugin.ts @@ -18,12 +18,14 @@ import { import { once } from 'lodash'; import { + AssistantTool, ElasticAssistantPluginSetup, ElasticAssistantPluginSetupDependencies, ElasticAssistantPluginStart, ElasticAssistantPluginStartDependencies, ElasticAssistantRequestHandlerContext, GetElser, + PLUGIN_ID, } from './types'; import { deleteKnowledgeBaseRoute, @@ -32,6 +34,13 @@ import { postEvaluateRoute, postKnowledgeBaseRoute, } from './routes'; +import { appContextService, GetRegisteredTools } from './services/app_context'; + +interface CreateRouteHandlerContextParams { + core: CoreSetup; + logger: Logger; + getRegisteredTools: GetRegisteredTools; +} export class ElasticAssistantPlugin implements @@ -48,15 +57,20 @@ export class ElasticAssistantPlugin this.logger = initializerContext.logger.get(); } - private createRouteHandlerContext = ( - core: CoreSetup, - logger: Logger - ): IContextProvider => { + private createRouteHandlerContext = ({ + core, + logger, + getRegisteredTools, + }: CreateRouteHandlerContextParams): IContextProvider< + ElasticAssistantRequestHandlerContext, + typeof PLUGIN_ID + > => { return async function elasticAssistantRouteHandlerContext(context, request) { const [_, pluginsStart] = await core.getStartServices(); return { actions: pluginsStart.actions, + getRegisteredTools, logger, }; }; @@ -65,16 +79,15 @@ export class ElasticAssistantPlugin public setup(core: CoreSetup, plugins: ElasticAssistantPluginSetupDependencies) { this.logger.debug('elasticAssistant: Setup'); const router = core.http.createRouter(); - - core.http.registerRouteHandlerContext< - ElasticAssistantRequestHandlerContext, - 'elasticAssistant' - >( - 'elasticAssistant', - this.createRouteHandlerContext( - core as CoreSetup, - this.logger - ) + core.http.registerRouteHandlerContext( + PLUGIN_ID, + this.createRouteHandlerContext({ + core: core as CoreSetup, + logger: this.logger, + getRegisteredTools: (pluginName: string) => { + return appContextService.getRegisteredTools(pluginName); + }, + }) ); const getElserId: GetElser = once( @@ -94,16 +107,45 @@ export class ElasticAssistantPlugin postEvaluateRoute(router, getElserId); return { actions: plugins.actions, + getRegisteredTools: (pluginName: string) => { + return appContextService.getRegisteredTools(pluginName); + }, }; } public start(core: CoreStart, plugins: ElasticAssistantPluginStartDependencies) { this.logger.debug('elasticAssistant: Started'); + appContextService.start({ logger: this.logger }); return { + /** + * Actions plugin start contract + */ actions: plugins.actions, + + /** + * Get the registered tools for a given plugin name. + * @param pluginName + */ + getRegisteredTools: (pluginName: string) => { + return appContextService.getRegisteredTools(pluginName); + }, + + /** + * Register tools to be used by the Elastic Assistant for a given plugin. Use the plugin name that + * corresponds to your application as defined in the `x-kbn-context` header of requests made from your + * application. + * + * @param pluginName + * @param tools + */ + registerTools: (pluginName: string, tools: AssistantTool[]) => { + return appContextService.registerTools(pluginName, tools); + }, }; } - public stop() {} + public stop() { + appContextService.stop(); + } } diff --git a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts index 39e3233f63744..f5ec4c4555a76 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts @@ -100,6 +100,11 @@ export const postEvaluateRoute = ( throwIfSystemAction: false, }); + // Fetch any tools registered by the request's originating plugin + const assistantTools = (await context.elasticAssistant).getRegisteredTools( + 'securitySolution' + ); + // Get a scoped esClient for passing to the agents for retrieval, and // writing results to the output index const esClient = (await context.core).elasticsearch.client.asCurrentUser; @@ -142,6 +147,7 @@ export const postEvaluateRoute = ( AGENT_EXECUTOR_MAP[agentName]({ actions, assistantLangChain: true, + assistantTools, connectorId, esClient, elserId, diff --git a/x-pack/plugins/elastic_assistant/server/routes/helpers.test.ts b/x-pack/plugins/elastic_assistant/server/routes/helpers.test.ts new file mode 100644 index 0000000000000..384e1f8865736 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/routes/helpers.test.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { RequestBody } from '../lib/langchain/types'; + +import { DEFAULT_PLUGIN_NAME, getPluginNameFromRequest } from './helpers'; + +describe('getPluginNameFromRequest', () => { + const contextRequestHeaderEncoded = encodeURIComponent( + JSON.stringify({ + type: 'application', + name: 'superSolution', + url: '/kbn/app/super/rules/id/163fa5a4-d72a-45fa-8142-8edc298ecd17/alerts', + page: 'app', + id: 'new', + }) + ); + + const request = { + headers: { + 'x-kbn-context': contextRequestHeaderEncoded, + }, + } as unknown as KibanaRequest; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('extracts plugin name from "x-kbn-context" request header', async () => { + const pluginName = getPluginNameFromRequest({ + request, + defaultPluginName: DEFAULT_PLUGIN_NAME, + }); + expect(pluginName).toEqual('superSolution'); + }); + + it('fails to extract plugin name from undefined "x-kbn-context" request header, falls back to default provided', async () => { + const invalidRequest = { + headers: { + 'x-kbn-context': undefined, + }, + } as unknown as KibanaRequest; + const pluginName = getPluginNameFromRequest({ + request: invalidRequest, + defaultPluginName: DEFAULT_PLUGIN_NAME, + }); + expect(pluginName).toEqual(DEFAULT_PLUGIN_NAME); + }); + + it('fails to extract plugin name from malformed "x-kbn-context" invalidRequest header, falls back to default provided', async () => { + const invalidRequest = { + headers: { + 'x-kbn-context': 'asdfku', + }, + } as unknown as KibanaRequest; + const pluginName = getPluginNameFromRequest({ + request: invalidRequest, + defaultPluginName: DEFAULT_PLUGIN_NAME, + }); + expect(pluginName).toEqual(DEFAULT_PLUGIN_NAME); + }); +}); diff --git a/x-pack/plugins/elastic_assistant/server/routes/helpers.ts b/x-pack/plugins/elastic_assistant/server/routes/helpers.ts new file mode 100644 index 0000000000000..99d4493c16cca --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/routes/helpers.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { KibanaRequest } from '@kbn/core-http-server'; +import { Logger } from '@kbn/core/server'; +import { RequestBody } from '../lib/langchain/types'; + +interface GetPluginNameFromRequestParams { + request: KibanaRequest; + defaultPluginName: string; + logger?: Logger; +} + +export const DEFAULT_PLUGIN_NAME = 'securitySolutionUI'; + +/** + * Attempts to extract the plugin name the request originated from using the request headers. + * + * Note from Kibana Core: This is not a 100% fit solution, though, because plugins can run in the background, + * or even use other plugins’ helpers (ie, APM can use the infra helpers to call a third plugin) + * + * Should suffice for our purposes here with where the Elastic Assistant is currently used, but if needing a + * dedicated solution, the core folks said to reach out. + * + * @param logger optional logger to log any errors + * @param defaultPluginName default plugin name to use if unable to determine from request + * @param request Kibana Request + * + * @returns plugin name + */ +export const getPluginNameFromRequest = ({ + logger, + defaultPluginName, + request, +}: GetPluginNameFromRequestParams): string => { + try { + const contextHeader = request.headers['x-kbn-context']; + if (contextHeader != null) { + return JSON.parse( + decodeURIComponent(Array.isArray(contextHeader) ? contextHeader[0] : contextHeader) + )?.name; + } + } catch (err) { + logger?.error( + `Error determining source plugin for selecting tools, using ${defaultPluginName}.` + ); + } + return defaultPluginName; +}; diff --git a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts index 537ead452c8ea..0f7d964eea480 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts @@ -56,6 +56,7 @@ jest.mock('../lib/langchain/execute_custom_llm_chain', () => ({ const mockContext = { elasticAssistant: { actions: jest.fn(), + getRegisteredTools: jest.fn(() => []), logger: loggingSystemMock.createLogger(), }, core: { diff --git a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts index ed68f3526a112..9c1d8601da532 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts @@ -23,6 +23,7 @@ import { import { ElasticAssistantRequestHandlerContext, GetElser } from '../types'; import { ESQL_RESOURCE } from './knowledge_base/constants'; import { callAgentExecutor } from '../lib/langchain/execute_custom_llm_chain'; +import { DEFAULT_PLUGIN_NAME, getPluginNameFromRequest } from './helpers'; export const postActionsConnectorExecuteRoute = ( router: IRouter, @@ -58,6 +59,14 @@ export const postActionsConnectorExecuteRoute = ( // TODO: Add `traceId` to actions request when calling via langchain logger.debug('Executing via langchain, assistantLangChain: true'); + // Fetch any tools registered by the request's originating plugin + const pluginName = getPluginNameFromRequest({ + request, + defaultPluginName: DEFAULT_PLUGIN_NAME, + logger, + }); + const assistantTools = (await context.elasticAssistant).getRegisteredTools(pluginName); + // get a scoped esClient for assistant memory const esClient = (await context.core).elasticsearch.client.asCurrentUser; @@ -79,6 +88,7 @@ export const postActionsConnectorExecuteRoute = ( allowReplacement: request.body.allowReplacement, actions, assistantLangChain: request.body.assistantLangChain, + assistantTools, connectorId, elserId, esClient, diff --git a/x-pack/plugins/elastic_assistant/server/services/app_context.test.ts b/x-pack/plugins/elastic_assistant/server/services/app_context.test.ts new file mode 100644 index 0000000000000..621995d3452be --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/services/app_context.test.ts @@ -0,0 +1,87 @@ +/* + * Copyright 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 { appContextService, ElasticAssistantAppContext } from './app_context'; +import { loggerMock } from '@kbn/logging-mocks'; +import { AssistantTool } from '../types'; + +// Mock Logger +const mockLogger = loggerMock.create(); + +// Mock ElasticAssistantAppContext +const mockAppContext: ElasticAssistantAppContext = { + logger: mockLogger, +}; + +describe('AppContextService', () => { + const toolOne: AssistantTool = { + id: 'tool-one', + name: 'ToolOne', + description: 'Description 1', + sourceRegister: 'Source1', + isSupported: jest.fn(), + getTool: jest.fn(), + }; + const toolTwo: AssistantTool = { + id: 'tool-two', + name: 'ToolTwo', + description: 'Description 2', + sourceRegister: 'Source2', + isSupported: jest.fn(), + getTool: jest.fn(), + }; + + beforeEach(() => { + appContextService.stop(); + jest.clearAllMocks(); + }); + + describe('starting and stopping', () => { + it('should clear registered tools when stopped ', () => { + appContextService.start(mockAppContext); + appContextService.registerTools('super', [toolOne]); + appContextService.stop(); + + expect(appContextService.getRegisteredTools('super').length).toBe(0); + }); + }); + + describe('registering tools', () => { + it('should register and get tools for a single plugin', () => { + const pluginName = 'pluginName'; + + appContextService.start(mockAppContext); + appContextService.registerTools(pluginName, [toolOne, toolTwo]); + + // Check if getRegisteredTools returns the correct tools + const retrievedTools = appContextService.getRegisteredTools(pluginName); + expect(retrievedTools).toEqual([toolOne, toolTwo]); + }); + + it('should register and get tools for multiple plugins', () => { + const pluginOne = 'plugin1'; + const pluginTwo = 'plugin2'; + + appContextService.start(mockAppContext); + appContextService.registerTools(pluginOne, [toolOne]); + appContextService.registerTools(pluginTwo, [toolTwo]); + + expect(appContextService.getRegisteredTools(pluginOne)).toEqual([toolOne]); + expect(appContextService.getRegisteredTools(pluginTwo)).toEqual([toolTwo]); + }); + + it('should not add the same tool twice', () => { + const pluginName = 'pluginName'; + + appContextService.start(mockAppContext); + appContextService.registerTools(pluginName, [toolOne]); + appContextService.registerTools(pluginName, [toolOne]); + + expect(appContextService.getRegisteredTools(pluginName).length).toEqual(1); + }); + }); +}); diff --git a/x-pack/plugins/elastic_assistant/server/services/app_context.ts b/x-pack/plugins/elastic_assistant/server/services/app_context.ts new file mode 100644 index 0000000000000..bd7a7c0cc3203 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/services/app_context.ts @@ -0,0 +1,69 @@ +/* + * Copyright 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 { Logger } from '@kbn/core/server'; +import type { AssistantTool } from '../types'; + +export type PluginName = string; +export type RegisteredToolsStorage = Map>; +export type GetRegisteredTools = (pluginName: string) => AssistantTool[]; +export interface ElasticAssistantAppContext { + logger: Logger; +} + +/** + * Service for managing context specific to the Elastic Assistant + * + * Inspired by `AppContextService` impl from fleet plugin: x-pack/plugins/fleet/server/services/app_context.ts + */ +class AppContextService { + private logger: Logger | undefined; + private registeredTools: RegisteredToolsStorage = new Map>(); + + public start(appContext: ElasticAssistantAppContext) { + this.logger = appContext.logger; + } + + public stop() { + this.registeredTools.clear(); + } + + /** + * Register tools to be used by the Elastic Assistant + * + * @param pluginName + * @param tools + */ + public registerTools(pluginName: string, tools: AssistantTool[]) { + this.logger?.debug('AppContextService:registerTools'); + this.logger?.debug(`pluginName: ${pluginName}`); + this.logger?.debug(`tools: ${tools.map((tool) => tool.name).join(', ')}`); + + if (!this.registeredTools.has(pluginName)) { + this.logger?.debug('plugin has no tools, making new set'); + this.registeredTools.set(pluginName, new Set()); + } + tools.forEach((tool) => this.registeredTools.get(pluginName)?.add(tool)); + } + + /** + * Get the registered tools + * + * @param pluginName + */ + public getRegisteredTools(pluginName: string): AssistantTool[] { + const tools = Array.from(this.registeredTools?.get(pluginName) ?? new Set()); + + this.logger?.debug('AppContextService:getRegisteredTools'); + this.logger?.debug(`pluginName: ${pluginName}`); + this.logger?.debug(`tools: ${tools.map((tool) => tool.name).join(', ')}`); + + return tools; + } +} + +export const appContextService = new AppContextService(); diff --git a/x-pack/plugins/elastic_assistant/server/types.ts b/x-pack/plugins/elastic_assistant/server/types.ts index ed9081c084420..5be8a35a275b9 100755 --- a/x-pack/plugins/elastic_assistant/server/types.ts +++ b/x-pack/plugins/elastic_assistant/server/types.ts @@ -16,6 +16,13 @@ import type { SavedObjectsClientContract, } from '@kbn/core/server'; import { type MlPluginSetup } from '@kbn/ml-plugin/server'; +import { Tool } from 'langchain/dist/tools/base'; +import { RetrievalQAChain } from 'langchain/chains'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { RequestBody } from './lib/langchain/types'; +import type { GetRegisteredTools } from './services/app_context'; + +export const PLUGIN_ID = 'elasticAssistant' as const; /** The plugin setup interface */ export interface ElasticAssistantPluginSetup { @@ -25,6 +32,17 @@ export interface ElasticAssistantPluginSetup { /** The plugin start interface */ export interface ElasticAssistantPluginStart { actions: ActionsPluginStart; + /** + * Register tools to be used by the elastic assistant + * @param pluginName Name of the plugin the tool should be registered to + * @param tools AssistantTools to be registered with for the given plugin + */ + registerTools: (pluginName: string, tools: AssistantTool[]) => void; + /** + * Get the registered tools + * @param pluginName Name of the plugin to get the tools for + */ + getRegisteredTools: GetRegisteredTools; } export interface ElasticAssistantPluginSetupDependencies { @@ -37,6 +55,7 @@ export interface ElasticAssistantPluginStartDependencies { export interface ElasticAssistantApiRequestHandlerContext { actions: ActionsPluginStart; + getRegisteredTools: GetRegisteredTools; logger: Logger; } @@ -51,3 +70,30 @@ export type GetElser = ( request: KibanaRequest, savedObjectsClient: SavedObjectsClientContract ) => Promise | never; + +/** + * Interfaces for registering tools to be used by the elastic assistant + */ + +export interface AssistantTool { + id: string; + name: string; + description: string; + sourceRegister: string; + isSupported: (params: AssistantToolParams) => boolean; + getTool: (params: AssistantToolParams) => Tool | null; +} + +export interface AssistantToolParams { + alertsIndexPattern?: string; + allow?: string[]; + allowReplacement?: string[]; + assistantLangChain: boolean; + chain: RetrievalQAChain; + esClient: ElasticsearchClient; + modelExists: boolean; + onNewReplacements?: (newReplacements: Record) => void; + replacements?: Record; + request: KibanaRequest; + size?: number; +} diff --git a/x-pack/plugins/elastic_assistant/tsconfig.json b/x-pack/plugins/elastic_assistant/tsconfig.json index 5cad4d4b52141..53616fc2dc2b0 100644 --- a/x-pack/plugins/elastic_assistant/tsconfig.json +++ b/x-pack/plugins/elastic_assistant/tsconfig.json @@ -21,7 +21,6 @@ "@kbn/securitysolution-io-ts-utils", "@kbn/actions-plugin", "@kbn/elastic-assistant", - "@kbn/elastic-assistant-common", "@kbn/logging-mocks", "@kbn/core-elasticsearch-server-mocks", "@kbn/core-logging-server-mocks", diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_chart.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_chart.tsx index 3cda9a274cd69..231af9e9afd96 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_chart.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_chart.tsx @@ -62,7 +62,6 @@ export const AnalyticsCollectionChart: React.FC< const { uiSettings, charts: chartSettings } = useValues(KibanaLogic); const fromDateParsed = DateMath.parse(timeRange.from); const toDataParsed = DateMath.parse(timeRange.to); - const chartTheme = chartSettings.theme.useChartsTheme(); const baseChartTheme = chartSettings.theme.useChartsBaseTheme(); const charts = useMemo( () => [ @@ -127,7 +126,6 @@ export const AnalyticsCollectionChart: React.FC< ) : ( { diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_overview/analytics_collection_card/analytics_collection_card.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_overview/analytics_collection_card/analytics_collection_card.tsx index f67cccd4ddcdd..587024e87581e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_overview/analytics_collection_card/analytics_collection_card.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_overview/analytics_collection_card/analytics_collection_card.tsx @@ -10,7 +10,15 @@ import React, { MouseEvent } from 'react'; import { parsePath } from 'history'; import { useValues } from 'kea'; -import { AreaSeries, Chart, CurveType, ScaleType, Settings, Tooltip } from '@elastic/charts'; +import { + AreaSeries, + Chart, + CurveType, + ScaleType, + Settings, + Tooltip, + LEGACY_LIGHT_THEME, +} from '@elastic/charts'; import { EuiBadge, EuiCard, @@ -175,6 +183,8 @@ export const AnalyticsCollectionCard: React.FC< {!isLoading && data?.some(([, y]) => y && y !== 0) && ( { expect(wrapper.find(Chart).prop('size')).toEqual({ height: 300 }); expect(wrapper.find(Axis)).toHaveLength(2); - expect(mockKibanaValues.charts.theme.useChartsTheme).toHaveBeenCalled(); expect(mockKibanaValues.charts.theme.useChartsBaseTheme).toHaveBeenCalled(); expect(wrapper.find(LineSeries)).toHaveLength(1); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_chart.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_chart.tsx index c53d22fbcee05..3267e88e07af7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_chart.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_chart.tsx @@ -39,11 +39,7 @@ export const AnalyticsChart: React.FC = ({ height = 300, lines }) => { return ( moment(tooltip.value).format(TOOLTIP_DATE_FORMAT)} /> - + {lines.map(({ id, data, isDashed }) => ( { }, [curationId]); if (dataLoading) { - return ; + return ; } return isAutomated ? : ; }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/kibana_header_actions.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/kibana_header_actions.tsx index e23c8ff8f0f0c..e2756bdda05f2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/kibana_header_actions.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/kibana_header_actions.tsx @@ -9,8 +9,7 @@ import React from 'react'; import { useValues } from 'kea'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; - +import { EndpointsHeaderAction } from '../../../shared/layout/endpoints_header_action'; import { EngineLogic } from '../engine'; import { QueryTesterButton } from '../query_tester'; @@ -18,12 +17,6 @@ export const KibanaHeaderActions: React.FC = () => { const { engineName } = useValues(EngineLogic); return ( - - {engineName && ( - - - - )} - + {Boolean(engineName) && } ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx index efef9bf1bb398..1c661f1f6d03b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx @@ -16,6 +16,7 @@ import { isVersionMismatch } from '../../../common/is_version_mismatch'; import { InitialAppData } from '../../../common/types'; import { HttpLogic } from '../shared/http'; import { KibanaLogic } from '../shared/kibana'; +import { EndpointsHeaderAction } from '../shared/layout/endpoints_header_action'; import { VersionMismatchPage } from '../shared/version_mismatch'; import { AppLogic } from './app_logic'; @@ -77,13 +78,18 @@ export const AppSearch: React.FC = (props) => { ); }; -export const AppSearchUnconfigured: React.FC = () => ( - - - - - -); +export const AppSearchUnconfigured: React.FC = () => { + const { renderHeaderActions } = useValues(KibanaLogic); + renderHeaderActions(EndpointsHeaderAction); + + return ( + + + + + + ); +}; export const AppSearchConfigured: React.FC> = (props) => { const { diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx index 54b3450161014..550acf7fa9359 100644 --- a/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx @@ -5,13 +5,17 @@ * 2.0. */ -import React from 'react'; +import React, { useLayoutEffect } from 'react'; + +import { useValues } from 'kea'; import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../common/constants'; +import { KibanaLogic } from '../../../shared/kibana'; import { SetEnterpriseSearchApplicationsChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { useEnterpriseSearchApplicationNav } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; +import { SearchApplicationHeaderDocsAction } from '../search_application/header_docs_action'; export type EnterpriseSearchApplicationsPageTemplateProps = Omit< PageTemplateProps, @@ -36,6 +40,14 @@ export const EnterpriseSearchApplicationsPageTemplate: React.FC< pageTemplateProps.isEmptyState, hasSchemaConflicts ); + const { renderHeaderActions } = useValues(KibanaLogic); + useLayoutEffect(() => { + renderHeaderActions(SearchApplicationHeaderDocsAction); + + return () => { + renderHeaderActions(); + }; + }, []); return ( ( - - - - {i18n.translate( - 'xpack.enterpriseSearch.searchApplications.searchApplication.header.searchApplicationsDoc', - { - defaultMessage: 'Search Applications Doc', - } - )} - - - + + + {i18n.translate( + 'xpack.enterpriseSearch.searchApplications.searchApplication.header.searchApplicationsDoc', + { + defaultMessage: 'Search Applications Doc', + } + )} + + ); diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/components/search_application/search_application_view.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/search_application/search_application_view.tsx index 92a99b45be6d5..fef6f95c3b435 100644 --- a/x-pack/plugins/enterprise_search/public/applications/applications/components/search_application/search_application_view.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/search_application/search_application_view.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect, useLayoutEffect } from 'react'; +import React, { useEffect } from 'react'; import { useParams, Redirect } from 'react-router-dom'; import { useValues, useActions } from 'kea'; @@ -13,8 +13,6 @@ import { useValues, useActions } from 'kea'; import { Routes, Route } from '@kbn/shared-ux-router'; import { Status } from '../../../../../common/types/api'; - -import { KibanaLogic } from '../../../shared/kibana'; import { SEARCH_APPLICATION_PATH, SEARCH_APPLICATION_CONTENT_PATH, @@ -29,7 +27,6 @@ import { DeleteSearchApplicationModal } from '../search_applications/delete_sear import { SearchApplicationConnect } from './connect/search_application_connect'; import { SearchApplicationDocsExplorer } from './docs_explorer/docs_explorer'; -import { SearchApplicationHeaderDocsAction } from './header_docs_action'; import { SearchApplicationContent } from './search_application_content'; import { SearchApplicationError } from './search_application_error'; import { SearchApplicationViewLogic } from './search_application_view_logic'; @@ -48,15 +45,6 @@ export const SearchApplicationView: React.FC = () => { const { tabId = SearchApplicationViewTabs.DOCS_EXPLORER } = useParams<{ tabId?: string; }>(); - const { renderHeaderActions } = useValues(KibanaLogic); - - useLayoutEffect(() => { - renderHeaderActions(SearchApplicationHeaderDocsAction); - - return () => { - renderHeaderActions(); - }; - }, []); useEffect(() => { fetchSearchApplication({ name: searchApplicationName }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx index 6a5f9a17e5e3d..93566c21fe999 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx @@ -319,7 +319,7 @@ export const ConnectorConfiguration: React.FC = () => { title: i18n.translate( 'xpack.enterpriseSearch.content.indices.configurationConnector.steps.schedule.title', { - defaultMessage: 'Advanced configuration', + defaultMessage: 'Sync your data', } ), titleSize: 'xs', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts index b60699a263603..1da16c533a337 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts @@ -21,6 +21,7 @@ export const CONNECTORS_DICT: Record = { externalAuthDocsUrl: 'https://learn.microsoft.com/azure/storage/common/authorize-data-access', externalDocsUrl: 'https://learn.microsoft.com/azure/storage/blobs/', icon: CONNECTOR_ICONS.azure_blob_storage, + platinumOnly: true, }, box: { docsUrl: docLinks.connectorsBox, @@ -68,6 +69,7 @@ export const CONNECTORS_DICT: Record = { externalAuthDocsUrl: 'https://cloud.google.com/storage/docs/authentication', externalDocsUrl: 'https://cloud.google.com/storage/docs', icon: CONNECTOR_ICONS.google_cloud_storage, + platinumOnly: true, }, google_drive: { docsUrl: docLinks.connectorsGoogleDrive, @@ -88,6 +90,7 @@ export const CONNECTORS_DICT: Record = { externalAuthDocsUrl: 'https://www.mongodb.com/docs/atlas/app-services/authentication/', externalDocsUrl: 'https://www.mongodb.com/docs/', icon: CONNECTOR_ICONS.mongodb, + platinumOnly: true, }, mssql: { docsUrl: docLinks.connectorsMicrosoftSQL, @@ -95,11 +98,13 @@ export const CONNECTORS_DICT: Record = { 'https://learn.microsoft.com/sql/relational-databases/security/authentication-access/getting-started-with-database-engine-permissions', externalDocsUrl: 'https://learn.microsoft.com/sql/', icon: CONNECTOR_ICONS.microsoft_sql, + platinumOnly: true, }, mysql: { docsUrl: docLinks.connectorsMySQL, externalDocsUrl: 'https://dev.mysql.com/doc/', icon: CONNECTOR_ICONS.mysql, + platinumOnly: true, }, network_drive: { docsUrl: docLinks.connectorsNetworkDrive, @@ -140,6 +145,7 @@ export const CONNECTORS_DICT: Record = { externalAuthDocsUrl: 'https://docs.aws.amazon.com/s3/index.html', externalDocsUrl: '', icon: CONNECTOR_ICONS.amazon_s3, + platinumOnly: true, }, salesforce: { docsUrl: docLinks.connectorsSalesforce, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration.tsx index df4155cb28d65..252a135f44a55 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration.tsx @@ -174,7 +174,7 @@ export const NativeConnectorConfiguration: React.FC = () => { title: i18n.translate( 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.advancedConfigurationTitle', { - defaultMessage: 'Advanced configuration', + defaultMessage: 'Sync your data', } ), titleSize: 'xs', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/icons/connector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/icons/connector.tsx new file mode 100644 index 0000000000000..612a759b46c17 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/icons/connector.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +export const ConnectorIcon = () => { + return ( + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/icons/crawler.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/icons/crawler.tsx new file mode 100644 index 0000000000000..73b38816e8a54 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/icons/crawler.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +export const CrawlerIcon = () => { + return ( + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/ingestion_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/ingestion_selector.tsx index 49a5d068b437c..d2f2173a2d9a3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/ingestion_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/ingestion_selector.tsx @@ -31,8 +31,6 @@ import { } from '../../../../../common/constants'; import apiLogo from '../../../../assets/images/api_cloud.svg'; -import connectorIcon from '../../../../assets/images/connector.svg'; -import crawlerIcon from '../../../../assets/images/crawler.svg'; import fileUploadLogo from '../../../../assets/images/file_upload_logo.svg'; import sampleDataLogo from '../../../../assets/images/sample_data_logo.svg'; import connectorLogo from '../../../../assets/images/search_connector.svg'; @@ -48,6 +46,9 @@ import { HttpLogic } from '../../../shared/http/http_logic'; import { KibanaLogic } from '../../../shared/kibana'; import { EuiLinkTo } from '../../../shared/react_router_helpers'; +import { ConnectorIcon } from './icons/connector'; +import { CrawlerIcon } from './icons/crawler'; + export const IngestionSelector: React.FC = () => { const { application: { navigateToApp }, @@ -91,7 +92,7 @@ export const IngestionSelector: React.FC = () => { defaultMessage: 'Crawl URL', } )} - buttonIcon={crawlerIcon} + buttonIcon={CrawlerIcon} description={i18n.translate( 'xpack.enterpriseSearch.ingestSelector.method.crawler.description', { @@ -119,7 +120,7 @@ export const IngestionSelector: React.FC = () => { defaultMessage: 'Create a connector', } )} - buttonIcon={connectorIcon} + buttonIcon={ConnectorIcon} description={i18n.translate( 'xpack.enterpriseSearch.ingestSelector.method.connectors.description', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/welcome_banner.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/welcome_banner.tsx index cca519fa6f194..1f7b5f8652a33 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/welcome_banner.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/welcome_banner.tsx @@ -37,7 +37,7 @@ export const WelcomeBanner: React.FC = ({ user, image }) => {i18n.translate('xpack.enterpriseSearch.welcomeBanner.header.titleDescription', { defaultMessage: - "There's endless ways to ingest and explore data with Elasticsearch, but here's a few of the most popular", + 'There are endless ways to ingest and explore data with Elasticsearch, connect to your Elasticsearch instance and start indexing data', })} diff --git a/x-pack/plugins/enterprise_search/public/applications/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/index.test.tsx index bb5e1a35f18a0..d4a21f4cd6c36 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.test.tsx @@ -10,10 +10,14 @@ import React from 'react'; import { act } from '@testing-library/react'; import { getContext } from 'kea'; +import { Observable } from 'rxjs'; + import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { coreMock } from '@kbn/core/public/mocks'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { guidedOnboardingMock } from '@kbn/guided-onboarding-plugin/public/mocks'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; import { lensPluginMock } from '@kbn/lens-plugin/public/mocks'; import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; import { mlPluginMock } from '@kbn/ml-plugin/public/mocks'; @@ -53,7 +57,13 @@ describe('renderApp', () => { }); const mockContainer = kibanaDeps.params.element; - const MockApp = () =>
Hello world!
; + const MockApp = () => ( +
+ {i18n.translate('xpack.enterpriseSearch.mockApp.div.helloWorldLabel', { + defaultMessage: 'Hello world', + })} +
+ ); it('mounts and unmounts UI', () => { const unmount = renderApp(MockApp, kibanaDeps, pluginData); @@ -102,12 +112,24 @@ describe('renderApp', () => { describe('renderHeaderActions', () => { const mockHeaderEl = document.createElement('header'); - const MockHeaderActions = () => ; + const MockHeaderActions = () => ( + + ); it('mounts and unmounts any HeaderActions component', () => { const store = getContext().store; - const unmountHeader = renderHeaderActions(MockHeaderActions, store, mockHeaderEl); + const unmountHeader = renderHeaderActions( + MockHeaderActions, + store, + { theme$: new Observable() } as any, + mockHeaderEl + ); expect(mockHeaderEl.querySelector('.hello-world')).not.toBeNull(); unmountHeader(); diff --git a/x-pack/plugins/enterprise_search/public/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/index.tsx index 3421da8967ff5..55362dbfa8430 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.tsx @@ -15,7 +15,8 @@ import { Store } from 'redux'; import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { I18nProvider } from '@kbn/i18n-react'; -import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import { AuthenticatedUser } from '@kbn/security-plugin/public'; import { Router } from '@kbn/shared-ux-router'; @@ -116,7 +117,7 @@ export const renderApp = ( productFeatures, renderHeaderActions: (HeaderActions) => params.setHeaderActionMenu( - HeaderActions ? renderHeaderActions.bind(null, HeaderActions, store) : undefined + HeaderActions ? renderHeaderActions.bind(null, HeaderActions, store, params) : undefined ), security, setBreadcrumbs: chrome.setBreadcrumbs, @@ -139,7 +140,7 @@ export const renderApp = ( ReactDOM.render( - + @@ -184,12 +185,17 @@ export const renderApp = ( export const renderHeaderActions = ( HeaderActions: React.FC, store: Store, + params: AppMountParameters, kibanaHeaderEl: HTMLElement ) => { ReactDOM.render( - - - , + + + + + + + , kibanaHeaderEl ); return () => ReactDOM.unmountComponentAtNode(kibanaHeaderEl); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/api_key/api_key_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/api_key/api_key_panel.tsx index ba2c4a86fcb86..c69976f178495 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/api_key/api_key_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/api_key/api_key_panel.tsx @@ -7,6 +7,7 @@ import React, { useEffect, useState } from 'react'; +import { css } from '@emotion/react'; import { useActions, useValues } from 'kea'; import { @@ -80,7 +81,13 @@ export const ApiKeyPanel: React.FC = ({ user }) => { - {elasticsearchEndpoint} + + {elasticsearchEndpoint} + @@ -99,35 +106,45 @@ export const ApiKeyPanel: React.FC = ({ user }) => { - - - {i18n.translate('xpack.enterpriseSearch.apiKey.cloudId', { - defaultMessage: 'Cloud ID:', - })} - - + {Boolean(cloudId) && ( + <> + + + {i18n.translate('xpack.enterpriseSearch.apiKey.cloudId', { + defaultMessage: 'Cloud ID:', + })} + + - - - {cloudId} - - - - {(copy) => ( - + + + {cloudId} + + + + + {(copy) => ( + )} - /> - )} - - - + + + + + )} )} diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/endpoint_icon.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/endpoint_icon.tsx new file mode 100644 index 0000000000000..157fbfd363fa3 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/endpoint_icon.tsx @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +// Remove this file once `endpoint` is available in Kibana +// Coming in EUI 91.1.0 + +export const EndpointIcon = () => { + return ( + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/endpoints_header_action.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/endpoints_header_action.tsx index 87ffe6d91df25..e46445384ae39 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/endpoints_header_action.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/endpoints_header_action.tsx @@ -26,21 +26,23 @@ import { EuiBadge, EuiHorizontalRule, EuiButton, + EuiHeaderLinks, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, I18nProvider } from '@kbn/i18n-react'; +import { FormattedMessage } from '@kbn/i18n-react'; import { ELASTICSEARCH_URL_PLACEHOLDER } from '@kbn/search-api-panels/constants'; import { Status } from '../../../../common/types/api'; -import endpointIcon from '../../../assets/images/endpoint_icon.svg'; import { CreateApiKeyAPILogic } from '../../enterprise_search_overview/api/create_elasticsearch_api_key_logic'; import { FetchApiKeysAPILogic } from '../../enterprise_search_overview/api/fetch_api_keys_logic'; import { CreateApiKeyFlyout } from '../api_key/create_api_key_flyout'; import { KibanaLogic } from '../kibana'; -export const EndpointsHeaderAction: React.FC = () => { +import { EndpointIcon } from './endpoint_icon'; + +export const EndpointsHeaderAction: React.FC = ({ children }) => { const [isPopoverOpen, setPopoverOpen] = useState(false); const { cloud, navigateToUrl } = useValues(KibanaLogic); const { makeRequest } = useActions(FetchApiKeysAPILogic); @@ -61,166 +63,166 @@ export const EndpointsHeaderAction: React.FC = () => { const elasticsearchEndpoint = cloud?.elasticsearchUrl || ELASTICSEARCH_URL_PLACEHOLDER; const button = ( - setPopoverOpen(!isPopoverOpen)} - > + setPopoverOpen(!isPopoverOpen)}> {i18n.translate('xpack.enterpriseSearch.pageTemplate.endpointsButtonLabel', { - defaultMessage: 'Endpoints', + defaultMessage: 'Endpoints & API keys', })} ); return ( - - {isFlyoutOpen && ( - setIsFlyoutOpen(false)} - setApiKey={saveApiKey} - username={user?.full_name || user?.username || ''} - /> - )} - setPopoverOpen(false)} - panelPaddingSize="none" - anchorPosition="downLeft" - > - - - {i18n.translate( - 'xpack.enterpriseSearch.pageTemplate.apiKey.elasticsearchEndpoint', - { - defaultMessage: 'Elasticsearch endpoint:', - } - )} - - - - - - {elasticsearchEndpoint} - - - - {(copy) => ( + + + {Boolean(children) && {children}} + + {isFlyoutOpen && ( + setIsFlyoutOpen(false)} + setApiKey={saveApiKey} + username={user?.full_name || user?.username || ''} + /> + )} + setPopoverOpen(false)} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + {i18n.translate( + 'xpack.enterpriseSearch.pageTemplate.apiKey.elasticsearchEndpoint', + { + defaultMessage: 'Elasticsearch endpoint:', + } + )} + + + + + + {elasticsearchEndpoint} + + + + {(copy) => ( + + )} + + + + , + ...(Boolean(cloudId) + ? [ + + + {i18n.translate('xpack.enterpriseSearch.apiKey.cloudId', { + defaultMessage: 'Cloud ID:', + })} + + + + + + {cloudId} + + + + {(copy) => ( + + )} + + + + , + ] + : []), + + + + + 0 ? 'success' : 'warning'} + data-test-subj="api-keys-count-badge" + > + {apiKeys.length} + + ), + }} + /> + + + + navigateToUrl('/app/management/security/api_keys', { + shouldNotCreateHref: true, + }) + } /> - )} - - - - , - ...(Boolean(cloudId) - ? [ - + + + , + , + + { + setIsFlyoutOpen(true); + setPopoverOpen(false); + }} + data-test-subj="new-api-key-button" + fullWidth + > - {i18n.translate('xpack.enterpriseSearch.apiKey.cloudId', { - defaultMessage: 'Cloud ID:', + {i18n.translate('xpack.enterpriseSearch.pageTemplate.apiKey.newButtonLabel', { + defaultMessage: 'New API key', })} - - - - - {cloudId} - - - - {(copy) => ( - - )} - - - - , - ] - : []), - - - - - 0 ? 'success' : 'warning'} - data-test-subj="api-keys-count-badge" - > - {apiKeys.length} - - ), - }} - /> - - - - - navigateToUrl('/app/management/security/api_keys', { - shouldNotCreateHref: true, - }) - } - /> - - - , - , - - { - setIsFlyoutOpen(true); - setPopoverOpen(false); - }} - data-test-subj="new-api-key-button" - fullWidth - > - - {i18n.translate('xpack.enterpriseSearch.pageTemplate.apiKey.newButtonLabel', { - defaultMessage: 'New API key', - })} - - - , - ]} - /> - - + + , + ]} + /> + + + + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx index 260b95316b001..2553a12dc17c5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React, { useLayoutEffect } from 'react'; import classNames from 'classnames'; import { useValues } from 'kea'; @@ -71,10 +71,13 @@ export const EnterpriseSearchPageTemplateWrapper: React.FC = const navIcon = solutionNavIcon ?? 'logoEnterpriseSearch'; - useEffect(() => { + useLayoutEffect(() => { if (useEndpointHeaderActions) { renderHeaderActions(EndpointsHeaderAction); } + return () => { + renderHeaderActions(); + }; }, []); return ( { const { http } = useValues(HttpLogic); const backgroundImagePath = http.basePath.prepend( '/plugins/enterpriseSearch/assets/images/search_labs_banner_background.svg' ); return ( - - @@ -96,6 +96,6 @@ export const SearchLabsBanner: React.FC = () => { - + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/search_labs_banner/search_labs_logo.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/search_labs_banner/search_labs_logo.tsx new file mode 100644 index 0000000000000..f72c89c7ee5f1 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/search_labs_banner/search_labs_logo.tsx @@ -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 React from 'react'; + +export const SearchLabsLogo: React.FC = () => { + return ( + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/kibana_header_actions.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/kibana_header_actions.tsx index c508e4d9e4224..d1eb78b184223 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/kibana_header_actions.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/kibana_header_actions.tsx @@ -7,9 +7,10 @@ import React from 'react'; -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiHeaderLinks } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { externalUrl, getWorkplaceSearchUrl } from '../../../shared/enterprise_search_url'; +import { EndpointsHeaderAction } from '../../../shared/layout/endpoints_header_action'; import { EuiButtonEmptyTo } from '../../../shared/react_router_helpers'; import { NAV } from '../../constants'; import { PRIVATE_SOURCES_PATH } from '../../routes'; @@ -18,7 +19,7 @@ export const WorkplaceSearchHeaderActions: React.FC = () => { if (!externalUrl.enterpriseSearchUrl) return null; return ( - + { - + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx index c4a4634695c56..2e3939675ac69 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx @@ -23,9 +23,7 @@ import { SendWorkplaceSearchTelemetry } from '../../../shared/telemetry'; import { WorkplaceSearchGate } from './gated_form'; -export const WorkplaceSearchGatePage: React.FC< - Omit -> = ({ isLoading }) => { +export const WorkplaceSearchGatePage: React.FC = ({ isLoading }) => { return ( diff --git a/x-pack/plugins/enterprise_search/public/assets/images/search_labs_logo.svg b/x-pack/plugins/enterprise_search/public/assets/images/search_labs_logo.svg deleted file mode 100644 index 63204cae3cf0a..0000000000000 --- a/x-pack/plugins/enterprise_search/public/assets/images/search_labs_logo.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index 758b8d92997f5..7b91d019e6a49 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -65,5 +65,6 @@ "@kbn/core-http-browser-mocks", "@kbn/core-application-browser", "@kbn/core-capabilities-common", + "@kbn/react-kibana-context-theme", ] } diff --git a/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap b/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap index 7247c1d23cb0c..11b6f64b0ef5a 100644 --- a/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap +++ b/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap @@ -582,6 +582,7 @@ Array [ "visualization", "canvas-workpad", "lens", + "links", "map", "tag", ], @@ -614,6 +615,7 @@ Array [ "visualization", "canvas-workpad", "lens", + "links", "map", "dashboard", "query", @@ -1196,6 +1198,7 @@ Array [ "visualization", "canvas-workpad", "lens", + "links", "map", "tag", ], @@ -1228,6 +1231,7 @@ Array [ "visualization", "canvas-workpad", "lens", + "links", "map", "dashboard", "query", diff --git a/x-pack/plugins/features/server/oss_features.ts b/x-pack/plugins/features/server/oss_features.ts index 1fee088a25184..21eb4a2556074 100644 --- a/x-pack/plugins/features/server/oss_features.ts +++ b/x-pack/plugins/features/server/oss_features.ts @@ -203,6 +203,7 @@ export const buildOSSFeatures = ({ 'visualization', 'canvas-workpad', 'lens', + 'links', 'map', 'tag', ], @@ -220,6 +221,7 @@ export const buildOSSFeatures = ({ 'visualization', 'canvas-workpad', 'lens', + 'links', 'map', 'dashboard', 'query', diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx index 11dcd1a34bb2a..7850ae3a3128d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx @@ -11,7 +11,7 @@ import { act, fireEvent, waitFor } from '@testing-library/react'; import { createFleetTestRendererMock } from '../../../../../../mock'; -import { sendPostBulkAgentUpgrade } from '../../../../hooks'; +import { sendGetAgentsAvailableVersions, sendPostBulkAgentUpgrade } from '../../../../hooks'; import { AgentUpgradeAgentModal } from '.'; import type { AgentUpgradeAgentModalProps } from '.'; @@ -34,6 +34,8 @@ jest.mock('../../../../hooks', () => { const mockSendPostBulkAgentUpgrade = sendPostBulkAgentUpgrade as jest.Mock; +const mockSendGetAgentsAvailableVersions = sendGetAgentsAvailableVersions as jest.Mock; + function renderAgentUpgradeAgentModal(props: Partial) { const renderer = createFleetTestRendererMock(); @@ -45,126 +47,155 @@ function renderAgentUpgradeAgentModal(props: Partial { - it('should set the default to Immediately if there is less than 10 agents using kuery', async () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: '*', - agentCount: 3, + describe('maintenance window', () => { + it('should set the default to Immediately if there is less than 10 agents using kuery', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: '*', + agentCount: 3, + }); + + const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox'); + expect(el?.textContent).toBe('Immediately'); }); - const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox'); - expect(el?.textContent).toBe('Immediately'); - }); + it('should set the default to Immediately if there is less than 10 agents using selected agents', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: [{ id: 'agent1' }, { id: 'agent2' }] as any, + agentCount: 3, + }); - it('should set the default to Immediately if there is less than 10 agents using selected agents', async () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: [{ id: 'agent1' }, { id: 'agent2' }] as any, - agentCount: 3, + const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox'); + expect(el?.textContent).toBe('Immediately'); }); - const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox'); - expect(el?.textContent).toBe('Immediately'); - }); + it('should set the default to 1 hour if there is more than 10 agents', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: '*', + agentCount: 13, + }); - it('should set the default to 1 hour if there is more than 10 agents', async () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: '*', - agentCount: 13, + const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox'); + expect(el?.textContent).toBe('1 hour'); }); - - const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox'); - expect(el?.textContent).toBe('1 hour'); }); - it('should enable the version combo if agents is a query', async () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: '*', - agentCount: 30, + describe('version combo', () => { + it('should enable the version combo if agents is a query', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: '*', + agentCount: 30, + }); + + const el = utils.getByTestId('agentUpgradeModal.VersionCombobox'); + await waitFor(() => { + expect(el.classList.contains('euiComboBox-isDisabled')).toBe(false); + }); }); - const el = utils.getByTestId('agentUpgradeModal.VersionCombobox'); - await waitFor(() => { - expect(el.classList.contains('euiComboBox-isDisabled')).toBe(false); - }); - }); + it('should default the version combo to latest agent version', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: [{ id: 'agent1', local_metadata: { host: 'abc' } }] as any, + agentCount: 1, + }); - it('should default the version combo to latest agent version', async () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: [{ id: 'agent1', local_metadata: { host: 'abc' } }] as any, - agentCount: 1, + const el = utils.getByTestId('agentUpgradeModal.VersionCombobox'); + await waitFor(() => { + expect(el.textContent).toEqual('8.10.2'); + }); }); - const el = utils.getByTestId('agentUpgradeModal.VersionCombobox'); - await waitFor(() => { - expect(el.textContent).toEqual('8.10.2'); + it('should display available version options', async () => { + mockSendGetAgentsAvailableVersions.mockClear(); + mockSendGetAgentsAvailableVersions.mockResolvedValue({ + data: { + items: ['8.10.4', '8.10.2+build123456789', '8.10.2', '8.7.0'], + }, + }); + const { utils } = renderAgentUpgradeAgentModal({ + agents: [ + { + id: 'agent1', + local_metadata: { host: 'abc', elastic: { agent: { version: '8.10.2' } } }, + }, + ] as any, + agentCount: 1, + }); + fireEvent.click(await utils.findByTestId('comboBoxToggleListButton')); + const optionList = await utils.findByTestId( + 'comboBoxOptionsList agentUpgradeModal.VersionCombobox-optionsList' + ); + expect(optionList.textContent).toEqual(['8.10.4', '8.10.2+build123456789'].join('')); }); }); - it('should restart uprade on updating agents if some agents in updating', async () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: [ - { status: 'updating', upgrade_started_at: '2022-11-21T12:27:24Z', id: 'agent1' }, - { id: 'agent2' }, - ] as any, - agentCount: 2, - isUpdating: true, + describe('restart upgrade', () => { + it('should restart uprade on updating agents if some agents in updating', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: [ + { status: 'updating', upgrade_started_at: '2022-11-21T12:27:24Z', id: 'agent1' }, + { id: 'agent2' }, + ] as any, + agentCount: 2, + isUpdating: true, + }); + + const el = utils.getByTestId('confirmModalTitleText'); + expect(el.textContent).toEqual('Restart upgrade on 1 out of 2 agents stuck in updating'); + + const btn = utils.getByTestId('confirmModalConfirmButton'); + await waitFor(() => { + expect(btn).toBeEnabled(); + }); + + act(() => { + fireEvent.click(btn); + }); + + expect(mockSendPostBulkAgentUpgrade.mock.calls.at(-1)[0]).toEqual( + expect.objectContaining({ agents: ['agent1'], force: true }) + ); }); - const el = utils.getByTestId('confirmModalTitleText'); - expect(el.textContent).toEqual('Restart upgrade on 1 out of 2 agents stuck in updating'); - - const btn = utils.getByTestId('confirmModalConfirmButton'); - await waitFor(() => { - expect(btn).toBeEnabled(); - }); - - act(() => { - fireEvent.click(btn); + it('should restart upgrade on updating agents if kuery', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: '*', + agentCount: 3, + isUpdating: true, + }); + + const el = await utils.findByTestId('confirmModalTitleText'); + expect(el.textContent).toEqual('Restart upgrade on 2 out of 3 agents stuck in updating'); + + const btn = utils.getByTestId('confirmModalConfirmButton'); + await waitFor(() => { + expect(btn).toBeEnabled(); + }); + + act(() => { + fireEvent.click(btn); + }); + + expect(mockSendPostBulkAgentUpgrade.mock.calls.at(-1)[0]).toEqual( + expect.objectContaining({ + agents: + '(*) AND status:updating AND upgrade_started_at:* AND NOT upgraded_at:* AND upgrade_started_at < now-2h', + force: true, + }) + ); }); - expect(mockSendPostBulkAgentUpgrade.mock.calls.at(-1)[0]).toEqual( - expect.objectContaining({ agents: ['agent1'], force: true }) - ); - }); - - it('should restart upgrade on updating agents if kuery', async () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: '*', - agentCount: 3, - isUpdating: true, + it('should disable submit button if no agents stuck updating', () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: [ + { status: 'offline', upgrade_started_at: '2022-11-21T12:27:24Z', id: 'agent1' }, + { id: 'agent2' }, + ] as any, + agentCount: 2, + isUpdating: true, + }); + + const el = utils.getByTestId('confirmModalConfirmButton'); + expect(el).toBeDisabled(); }); - - const el = await utils.findByTestId('confirmModalTitleText'); - expect(el.textContent).toEqual('Restart upgrade on 2 out of 3 agents stuck in updating'); - - const btn = utils.getByTestId('confirmModalConfirmButton'); - await waitFor(() => { - expect(btn).toBeEnabled(); - }); - - act(() => { - fireEvent.click(btn); - }); - - expect(mockSendPostBulkAgentUpgrade.mock.calls.at(-1)[0]).toEqual( - expect.objectContaining({ - agents: - '(*) AND status:updating AND upgrade_started_at:* AND NOT upgraded_at:* AND upgrade_started_at < now-2h', - force: true, - }) - ); - }); - - it('should disable submit button if no agents stuck updating', () => { - const { utils } = renderAgentUpgradeAgentModal({ - agents: [ - { status: 'offline', upgrade_started_at: '2022-11-21T12:27:24Z', id: 'agent1' }, - { id: 'agent2' }, - ] as any, - agentCount: 2, - isUpdating: true, - }); - - const el = utils.getByTestId('confirmModalConfirmButton'); - expect(el).toBeDisabled(); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx index d361349b3f327..0acb4296befdc 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx @@ -44,6 +44,7 @@ import { useConfig, sendGetAgentStatus, useAgentVersion, + differsOnlyInPatch, } from '../../../../hooks'; import { sendGetAgentsAvailableVersions } from '../../../../hooks'; @@ -164,7 +165,9 @@ export const AgentUpgradeAgentModal: React.FunctionComponent> = useMemo(() => { const displayVersions = minVersion - ? availableVersions.filter((v) => semverGt(v, minVersion)) + ? availableVersions.filter( + (v) => semverGt(v, minVersion) || differsOnlyInPatch(v, minVersion, false) + ) : availableVersions; const options = displayVersions.map((option) => ({ diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx index 3023cf1397faa..511af850cab46 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx @@ -570,38 +570,57 @@ export const EditOutputFlyout: React.FunctionComponent = <> } - > - <> - inputs.presetInput.setValue(e.target.value)} - disabled={ - inputs.presetInput.props.disabled || - outputYmlIncludesReservedPerformanceKey( - inputs.additionalYamlConfigInput.value, - safeLoad - ) - } - options={[ - { value: 'balanced', text: 'Balanced' }, - { value: 'custom', text: 'Custom' }, - { value: 'throughput', text: 'Throughput' }, - { value: 'scale', text: 'Scale' }, - { value: 'latency', text: 'Latency' }, - ]} + helpText={ + Custom, + link: ( + + + + ), + }} /> - + } + > + inputs.presetInput.setValue(e.target.value)} + disabled={ + inputs.presetInput.props.disabled || + outputYmlIncludesReservedPerformanceKey( + inputs.additionalYamlConfigInput.value, + safeLoad + ) + } + options={[ + { value: 'balanced', text: 'Balanced' }, + { value: 'custom', text: 'Custom' }, + { value: 'throughput', text: 'Throughput' }, + { value: 'scale', text: 'Scale' }, + { value: 'latency', text: 'Latency' }, + ]} + /> )} - {supportsPresets && outputYmlIncludesReservedPerformanceKey( inputs.additionalYamlConfigInput.value, diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.stories.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.stories.tsx index ebc18d84487db..b0655a78fd1e1 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.stories.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.stories.tsx @@ -36,7 +36,7 @@ export const IntegrationPreference = () => { {}} + prereleaseIntegrationsEnabled={false} /> ); }; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx index 71f0370d13832..9f1d716f6f396 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useEffect } from 'react'; +import React, { useCallback } from 'react'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; @@ -23,7 +23,7 @@ import { EuiSwitch, } from '@elastic/eui'; -import { sendPutSettings, useGetSettings, useStartServices } from '../../../hooks'; +import { usePutSettingsMutation, useStartServices } from '../../../hooks'; export type IntegrationPreferenceType = 'recommended' | 'beats' | 'agent'; @@ -35,7 +35,7 @@ interface Option { export interface Props { initialType: IntegrationPreferenceType; onChange: (type: IntegrationPreferenceType) => void; - onPrereleaseEnabledChange: (prerelease: boolean) => void; + prereleaseIntegrationsEnabled: boolean; } const recommendedTooltip = ( @@ -86,42 +86,39 @@ const options: Option[] = [ export const IntegrationPreference = ({ initialType, onChange, - onPrereleaseEnabledChange, + prereleaseIntegrationsEnabled, }: Props) => { const [idSelected, setIdSelected] = React.useState(initialType); - - const { docLinks } = useStartServices(); - - const [prereleaseIntegrationsEnabled, setPrereleaseIntegrationsEnabled] = React.useState< + const [prereleaseIntegrationsChecked, setPrereleaseIntegrationsChecked] = React.useState< boolean | undefined >(undefined); - const { data: settings, error: settingsError } = useGetSettings(); - - useEffect(() => { - const isEnabled = Boolean(settings?.item.prerelease_integrations_enabled); - if (settings?.item) { - setPrereleaseIntegrationsEnabled(isEnabled); - } else if (settingsError) { - setPrereleaseIntegrationsEnabled(false); - } - }, [settings?.item, settingsError]); - - useEffect(() => { - if (prereleaseIntegrationsEnabled !== undefined) { - onPrereleaseEnabledChange(prereleaseIntegrationsEnabled); - } - }, [onPrereleaseEnabledChange, prereleaseIntegrationsEnabled]); - - const updateSettings = useCallback(async (prerelease: boolean) => { - const res = await sendPutSettings({ - prerelease_integrations_enabled: prerelease, - }); - - if (res.error) { - throw res.error; - } - }, []); + const { docLinks, notifications } = useStartServices(); + + const { mutateAsync: mutateSettingsAsync } = usePutSettingsMutation(); + + const updateSettings = useCallback( + async (prerelease: boolean) => { + try { + setPrereleaseIntegrationsChecked(prerelease); + const res = await mutateSettingsAsync({ + prerelease_integrations_enabled: prerelease, + }); + + if (res.error) { + throw res.error; + } + } catch (error) { + setPrereleaseIntegrationsChecked(!prerelease); + notifications.toasts.addError(error, { + title: i18n.translate('xpack.fleet.errorUpdatingSettings', { + defaultMessage: 'Error updating settings', + }), + }); + } + }, + [mutateSettingsAsync, notifications.toasts] + ); const link = ( @@ -153,16 +150,18 @@ export const IntegrationPreference = ({ EventTarget & { checked: boolean } > ) => { - const isChecked = event.target.checked; - setPrereleaseIntegrationsEnabled(isChecked); - updateSettings(isChecked); + updateSettings(event.target.checked); }; return ( diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx index 47ee17dcc601c..8a3abb9fc962c 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx @@ -97,9 +97,9 @@ function OnPremLink() { ); } -export const AvailablePackages: React.FC<{ - setPrereleaseEnabled: (isEnabled: boolean) => void; -}> = ({ setPrereleaseEnabled }) => { +export const AvailablePackages: React.FC<{ prereleaseIntegrationsEnabled: boolean }> = ({ + prereleaseIntegrationsEnabled, +}) => { useBreadcrumbs('integrations_all'); const { @@ -121,11 +121,10 @@ export const AvailablePackages: React.FC<{ setUrlandPushHistory, setUrlandReplaceHistory, filteredCards, - setPrereleaseIntegrationsEnabled, availableSubCategories, selectedSubCategory, setSelectedSubCategory, - } = useAvailablePackages(); + } = useAvailablePackages({ prereleaseIntegrationsEnabled }); const onCategoryChange = useCallback( ({ id }: { id: string }) => { @@ -137,14 +136,6 @@ export const AvailablePackages: React.FC<{ [setCategory, setSearchTerm, setSelectedSubCategory, setUrlandPushHistory] ); - const onPrereleaseEnabledChange = useCallback( - (isEnabled: boolean) => { - setPrereleaseIntegrationsEnabled(isEnabled); - setPrereleaseEnabled(isEnabled); - }, - [setPrereleaseIntegrationsEnabled, setPrereleaseEnabled] - ); - if (!isLoading && !categoryExists(initialSelectedCategory, allCategories)) { setUrlandReplaceHistory({ searchString: searchTerm, categoryId: '', subCategoryId: '' }); return null; @@ -155,8 +146,8 @@ export const AvailablePackages: React.FC<{ , ]; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.test.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.test.tsx index 327d550df5780..77cfdb3a9102e 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.test.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.test.tsx @@ -9,8 +9,9 @@ import React from 'react'; import { createIntegrationsTestRendererMock } from '../../../../../../mock'; import type { PackageListItem } from '../../../../types'; +import { ExperimentalFeaturesService } from '../../../../services'; -import { getIntegrationLabels } from './card_utils'; +import { getIntegrationLabels, mapToCard } from './card_utils'; function renderIntegrationLabels(item: Partial) { const renderer = createIntegrationsTestRendererMock(); @@ -18,7 +19,73 @@ function renderIntegrationLabels(item: Partial) { return renderer.render(<>{getIntegrationLabels(item as any)}); } +const addBasePath = (s: string) => s; +const getHref = (k: string) => k; + describe('Card utils', () => { + describe('mapToCard', () => { + beforeEach(() => { + ExperimentalFeaturesService.init({}); + }); + + it('should use the installed version if available, without prelease', () => { + const cardItem = mapToCard({ + item: { + id: 'test', + version: '2.0.0-preview-1', + installationInfo: { + version: '1.0.0', + }, + }, + addBasePath, + getHref, + } as any); + + expect(cardItem).toMatchObject({ + release: 'ga', + version: '1.0.0', + isUpdateAvailable: true, + extraLabelsBadges: undefined, + }); + }); + + it('should use the installed version if available, with prelease ', () => { + const cardItem = mapToCard({ + item: { + id: 'test', + version: '2.0.0', + installationInfo: { + version: '1.0.0-preview-1', + }, + }, + addBasePath, + getHref, + } as any); + + expect(cardItem).toMatchObject({ + release: 'preview', + version: '1.0.0-preview-1', + isUpdateAvailable: true, + }); + }); + + it('should use the registry version if no installation is available ', () => { + const cardItem = mapToCard({ + item: { + id: 'test', + version: '2.0.0-preview-1', + }, + addBasePath, + getHref, + } as any); + + expect(cardItem).toMatchObject({ + release: 'preview', + version: '2.0.0-preview-1', + isUpdateAvailable: false, + }); + }); + }); describe('getIntegrationLabels', () => { it('should return an empty list for an integration without errors', () => { const res = renderIntegrationLabels({ diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.tsx index 910b872bf5ceb..1caea49e2096e 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/card_utils.tsx @@ -75,7 +75,7 @@ export const mapToCard = ({ let isUnverified = false; - const version = 'version' in item ? item.version || '' : ''; + let version = 'version' in item ? item.version || '' : ''; let isUpdateAvailable = false; let isReauthorizationRequired = false; @@ -84,9 +84,8 @@ export const mapToCard = ({ ? addBasePath(item.uiInternalPath) : item.uiExternalLink || getAbsolutePath(item.uiInternalPath); } else { - let urlVersion = item.version; if (item?.installationInfo?.version) { - urlVersion = item.installationInfo.version || item.version; + version = item.installationInfo.version || item.version; isUnverified = isPackageUnverified(item, packageVerificationKeyId); isUpdateAvailable = isPackageUpdatable(item); @@ -94,7 +93,7 @@ export const mapToCard = ({ } const url = getHref('integration_details_overview', { - pkgkey: `${item.name}-${urlVersion}`, + pkgkey: `${item.name}-${version}`, ...(item.integration ? { integration: item.integration } : {}), }); diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/hooks/use_available_packages.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/hooks/use_available_packages.tsx index ca66f0c2020d0..9aa242f8575b3 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/hooks/use_available_packages.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/hooks/use_available_packages.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useState, useMemo } from 'react'; +import { useState, useMemo } from 'react'; import { uniq } from 'lodash'; @@ -103,11 +103,13 @@ const packageListToIntegrationsList = (packages: PackageList): PackageList => { }, []); }; -export const useAvailablePackages = () => { +export const useAvailablePackages = ({ + prereleaseIntegrationsEnabled, +}: { + prereleaseIntegrationsEnabled: boolean; +}) => { const [preference, setPreference] = useState('recommended'); - const [prereleaseIntegrationsEnabled, setPrereleaseIntegrationsEnabled] = React.useState< - boolean | undefined - >(undefined); + const { showIntegrationsSubcategories } = ExperimentalFeaturesService.get(); const { @@ -245,6 +247,5 @@ export const useAvailablePackages = () => { eprPackageLoadingError, eprCategoryLoadingError, filteredCards, - setPrereleaseIntegrationsEnabled, }; }; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/index.tsx index 81dec69d0d911..72e2d57412d41 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/index.tsx @@ -5,8 +5,9 @@ * 2.0. */ -import React, { useState, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { Routes, Route } from '@kbn/shared-ux-router'; +import { EuiLoadingSpinner } from '@elastic/eui'; import { installationStatuses } from '../../../../../../../common/constants'; @@ -14,7 +15,7 @@ import { INTEGRATIONS_ROUTING_PATHS, INTEGRATIONS_SEARCH_QUERYPARAM } from '../. import { DefaultLayout } from '../../../../layouts'; import { isPackageUpdatable } from '../../../../services'; -import { useGetPackagesQuery } from '../../../../hooks'; +import { useAuthz, useGetPackagesQuery, useGetSettingsQuery } from '../../../../hooks'; import type { CategoryFacet, ExtendedIntegrationCategory } from './category_facets'; @@ -41,12 +42,23 @@ export const categoryExists = (category: string, categories: CategoryFacet[]) => }; export const EPMHomePage: React.FC = () => { - const [prereleaseEnabled, setPrereleaseEnabled] = useState(false); + const authz = useAuthz(); + const isAuthorizedToFetchSettings = authz.fleet.all; + const { data: settings, isFetchedAfterMount: isSettingsFetched } = useGetSettingsQuery({ + enabled: isAuthorizedToFetchSettings, + }); + const prereleaseIntegrationsEnabled = settings?.item.prerelease_integrations_enabled ?? false; + const shouldFetchPackages = !isAuthorizedToFetchSettings || isSettingsFetched; // loading packages to find installed ones - const { data: allPackages, isLoading } = useGetPackagesQuery({ - prerelease: prereleaseEnabled, - }); + const { data: allPackages, isLoading } = useGetPackagesQuery( + { + prerelease: prereleaseIntegrationsEnabled, + }, + { + enabled: shouldFetchPackages, + } + ); const installedPackages = useMemo( () => @@ -76,6 +88,11 @@ export const EPMHomePage: React.FC = () => { const notificationsBySection = { manage: unverifiedPackageCount + upgradeablePackageCount, }; + + if (!shouldFetchPackages) { + return ; + } + return ( @@ -85,7 +102,7 @@ export const EPMHomePage: React.FC = () => { - + diff --git a/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts b/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts index 6cb1c8ee42248..34a7afe33baaa 100644 --- a/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts +++ b/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts @@ -37,6 +37,24 @@ describe('useAgentVersion', () => { expect(result.current).toEqual(mockKibanaVersion); }); + it('should return agent version with newer patch than kibana', async () => { + const mockKibanaVersion = '8.8.1'; + const mockAvailableVersions = ['8.9.0', '8.8.2', '8.8.0', '8.7.0']; + + (useKibanaVersion as jest.Mock).mockReturnValue(mockKibanaVersion); + (sendGetAgentsAvailableVersions as jest.Mock).mockResolvedValue({ + data: { items: mockAvailableVersions }, + }); + + const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + + expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); + + await waitForNextUpdate(); + + expect(result.current).toEqual('8.8.2'); + }); + it('should return the latest availeble agent version if a version that matches Kibana version is not released', async () => { const mockKibanaVersion = '8.11.0'; const mockAvailableVersions = ['8.8.0', '8.7.0', '8.9.2', '7.16.0']; @@ -122,4 +140,29 @@ describe('useAgentVersion', () => { expect(result.current).toEqual(mockKibanaVersion); }); + + it('should return the latest availeble agent version if has build suffix', async () => { + const mockKibanaVersion = '8.11.0'; + const mockAvailableVersions = [ + '8.12.0', + '8.11.1+build123456789', + '8.8.0', + '8.7.0', + '8.9.2', + '7.16.0', + ]; + + (useKibanaVersion as jest.Mock).mockReturnValue(mockKibanaVersion); + (sendGetAgentsAvailableVersions as jest.Mock).mockResolvedValue({ + data: { items: mockAvailableVersions }, + }); + + const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + + expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); + + await waitForNextUpdate(); + + expect(result.current).toEqual('8.11.1+build123456789'); + }); }); diff --git a/x-pack/plugins/fleet/public/hooks/use_agent_version.ts b/x-pack/plugins/fleet/public/hooks/use_agent_version.ts index 8c198dbc7773e..85409759cd88a 100644 --- a/x-pack/plugins/fleet/public/hooks/use_agent_version.ts +++ b/x-pack/plugins/fleet/public/hooks/use_agent_version.ts @@ -25,15 +25,15 @@ export const useAgentVersion = (): string | undefined => { const availableVersions = res?.data?.items; let agentVersionToUse; + availableVersions?.sort(semverRcompare); if ( availableVersions && availableVersions.length > 0 && - availableVersions.indexOf(kibanaVersion) === -1 + availableVersions.indexOf(kibanaVersion) !== 0 ) { - availableVersions.sort(semverRcompare); agentVersionToUse = availableVersions.find((version) => { - return semverLt(version, kibanaVersion); + return semverLt(version, kibanaVersion) || differsOnlyInPatch(version, kibanaVersion); }) || availableVersions[0]; } else { agentVersionToUse = kibanaVersion; @@ -50,3 +50,16 @@ export const useAgentVersion = (): string | undefined => { return agentVersion; }; + +export const differsOnlyInPatch = ( + versionA: string, + versionB: string, + allowEqualPatch: boolean = true +): boolean => { + const [majorA, minorA, patchA] = versionA.split('.'); + const [majorB, minorB, patchB] = versionB.split('.'); + + return ( + majorA === majorB && minorA === minorB && (allowEqualPatch ? patchA >= patchB : patchA > patchB) + ); +}; 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 a09e975d57e16..03bf36da75763 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/epm.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/epm.ts @@ -82,15 +82,21 @@ export const useGetPackages = (query: GetPackagesRequest['query'] = {}) => { }); }; -export const useGetPackagesQuery = (query: GetPackagesRequest['query']) => { - return useQuery(['get-packages', query], () => - sendRequestForRq({ - path: epmRouteService.getListPath(), - method: 'get', - version: API_VERSIONS.public.v1, - query, - }) - ); +export const useGetPackagesQuery = ( + query: GetPackagesRequest['query'], + options?: { enabled?: boolean } +) => { + return useQuery({ + queryKey: ['get-packages', query], + queryFn: () => + sendRequestForRq({ + path: epmRouteService.getListPath(), + method: 'get', + version: API_VERSIONS.public.v1, + query, + }), + enabled: options?.enabled, + }); }; export const sendGetPackages = (query: GetPackagesRequest['query'] = {}) => { 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 d074644a9d26a..7cb6415df1923 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/settings.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/settings.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { useQuery } from '@tanstack/react-query'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { settingsRoutesService } from '../../services'; import type { PutSettingsResponse, PutSettingsRequest, GetSettingsResponse } from '../../types'; @@ -15,14 +15,17 @@ import { API_VERSIONS } from '../../../common/constants'; import type { RequestError } from './use_request'; import { sendRequest, sendRequestForRq, useRequest } from './use_request'; -export function useGetSettingsQuery() { - return useQuery(['settings'], () => - sendRequestForRq({ - method: 'get', - path: settingsRoutesService.getInfoPath(), - version: API_VERSIONS.public.v1, - }) - ); +export function useGetSettingsQuery(options?: { enabled?: boolean }) { + return useQuery({ + queryKey: ['settings'], + enabled: options?.enabled, + queryFn: () => + sendRequestForRq({ + method: 'get', + path: settingsRoutesService.getInfoPath(), + version: API_VERSIONS.public.v1, + }), + }); } export function useGetSettings() { @@ -41,6 +44,17 @@ export function sendGetSettings() { }); } +export function usePutSettingsMutation() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: sendPutSettings, + onSuccess: () => { + queryClient.invalidateQueries(['settings']); + }, + }); +} + export function sendPutSettings(body: PutSettingsRequest['body']) { return sendRequest({ method: 'put', diff --git a/x-pack/plugins/fleet/server/services/epm/archive/index.ts b/x-pack/plugins/fleet/server/services/epm/archive/index.ts index bf96318d8d410..ec19fbba55a19 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/index.ts @@ -45,10 +45,10 @@ export async function unpackBufferToCache({ contentType: string; archiveBuffer: Buffer; }): Promise { + const entries = await unpackBufferEntries(archiveBuffer, contentType); // Make sure any buffers from previous installations from registry or upload are deleted first clearPackageFileCache({ name, version }); - const entries = await unpackBufferEntries(archiveBuffer, contentType); const paths: string[] = []; entries.forEach((entry) => { const { path, buffer } = entry; diff --git a/x-pack/plugins/infra/public/alerting/common/components/threshold.stories.tsx b/x-pack/plugins/infra/public/alerting/common/components/threshold.stories.tsx index f933c5129a691..73361902799c6 100644 --- a/x-pack/plugins/infra/public/alerting/common/components/threshold.stories.tsx +++ b/x-pack/plugins/infra/public/alerting/common/components/threshold.stories.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { ComponentMeta } from '@storybook/react'; import { LIGHT_THEME } from '@elastic/charts'; -import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { Comparator } from '../../../../common/alerting/metrics'; import { Props, Threshold as Component } from './threshold'; @@ -30,7 +29,7 @@ export default { } as ComponentMeta; const defaultProps: Props = { - chartProps: { theme: EUI_CHARTS_THEME_LIGHT.theme, baseTheme: LIGHT_THEME }, + chartProps: { baseTheme: LIGHT_THEME }, comparator: Comparator.GT, id: 'componentId', threshold: 90, diff --git a/x-pack/plugins/infra/public/alerting/common/components/threshold.test.tsx b/x-pack/plugins/infra/public/alerting/common/components/threshold.test.tsx index fd50c54b65f61..b78216b78f60c 100644 --- a/x-pack/plugins/infra/public/alerting/common/components/threshold.test.tsx +++ b/x-pack/plugins/infra/public/alerting/common/components/threshold.test.tsx @@ -6,7 +6,6 @@ */ import { LIGHT_THEME } from '@elastic/charts'; -import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { Comparator } from '../../../../common/alerting/metrics'; import { render } from '@testing-library/react'; import { Props, Threshold } from './threshold'; @@ -15,7 +14,7 @@ import React from 'react'; describe('Threshold', () => { const renderComponent = (props: Partial = {}) => { const defaultProps: Props = { - chartProps: { theme: EUI_CHARTS_THEME_LIGHT.theme, baseTheme: LIGHT_THEME }, + chartProps: { baseTheme: LIGHT_THEME }, comparator: Comparator.GT, id: 'componentId', threshold: 90, diff --git a/x-pack/plugins/infra/public/alerting/common/components/threshold.tsx b/x-pack/plugins/infra/public/alerting/common/components/threshold.tsx index 79e065ae7b1f3..d9ca396f9aa33 100644 --- a/x-pack/plugins/infra/public/alerting/common/components/threshold.tsx +++ b/x-pack/plugins/infra/public/alerting/common/components/threshold.tsx @@ -13,7 +13,7 @@ import { i18n } from '@kbn/i18n'; import { Comparator } from '../../../../common/alerting/metrics'; export interface ChartProps { - theme: PartialTheme; + theme?: PartialTheme; baseTheme: Theme; } diff --git a/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx index 05b8c53f9ded9..e730767ee0d76 100644 --- a/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx @@ -6,7 +6,7 @@ */ import React, { useEffect } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import { LIGHT_THEME } from '@elastic/charts'; +import { LEGACY_LIGHT_THEME } from '@elastic/charts'; import { EuiPanel } from '@elastic/eui'; import { ALERT_CONTEXT, @@ -129,7 +129,7 @@ const AlertDetailsAppSection = ({ ({ activeCursor: jest.fn(), theme: { useChartsBaseTheme: jest.fn(() => ({})), - useChartsTheme: jest.fn(() => ({})), }, }, }, diff --git a/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx b/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx index e55a70978a748..a0f2a34df8f36 100644 --- a/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx @@ -104,7 +104,6 @@ export const DecorateWithKibanaContext: DecoratorFn = (story) => { }, charts: { theme: { - useChartsTheme: () => ({} as Theme), useChartsBaseTheme: () => ({} as Theme), }, }, diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/alerts.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/alerts.tsx index 9b964a0974a23..4d22688debc8c 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/alerts.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/alerts.tsx @@ -97,7 +97,6 @@ const MemoAlertSummaryWidget = React.memo( const { getAlertSummaryWidget: AlertSummaryWidget } = triggersActionsUi; const chartProps = { - theme: charts.theme.useChartsTheme(), baseTheme: charts.theme.useChartsBaseTheme(), }; diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx index a0fbeb25ca3d1..a00b9373c2f02 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx @@ -8,6 +8,8 @@ import React, { useMemo } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { EmbeddableFlamegraph } from '@kbn/observability-shared-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana'; import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props'; import { useDatePickerContext } from '../../hooks/use_date_picker'; import { useProfilingFlamegraphData } from '../../hooks/use_profiling_flamegraph_data'; @@ -17,11 +19,17 @@ import { ErrorPrompt } from './error_prompt'; import { ProfilingLinks } from './profiling_links'; export function Flamegraph() { + const { services } = useKibanaContextForPlugin(); const { asset } = useAssetDetailsRenderPropsContext(); const { activeTabId } = useTabSwitcherContext(); - const { getDateRangeInTimestamp } = useDatePickerContext(); + const { dateRange, getDateRangeInTimestamp } = useDatePickerContext(); const { from, to } = getDateRangeInTimestamp(); + const profilingLinkLocator = services.observabilityShared.locators.profiling.flamegraphLocator; + const profilingLinkLabel = i18n.translate('xpack.infra.flamegraph.profilingAppFlamegraphLink', { + defaultMessage: 'Go to Universal Profiling Flamegraph', + }); + const params = useMemo( () => ({ hostname: asset.name, @@ -41,7 +49,13 @@ export function Flamegraph() { return ( <> - + diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx index b6089df1bc67c..1b9a58ff561b3 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx @@ -8,6 +8,8 @@ import React, { useMemo } from 'react'; import { EmbeddableFunctions } from '@kbn/observability-shared-plugin/public'; import { EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana'; import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props'; import { useDatePickerContext } from '../../hooks/use_date_picker'; import { useProfilingFunctionsData } from '../../hooks/use_profiling_functions_data'; @@ -17,11 +19,17 @@ import { ErrorPrompt } from './error_prompt'; import { ProfilingLinks } from './profiling_links'; export function Functions() { + const { services } = useKibanaContextForPlugin(); const { asset } = useAssetDetailsRenderPropsContext(); const { activeTabId } = useTabSwitcherContext(); - const { getDateRangeInTimestamp } = useDatePickerContext(); + const { dateRange, getDateRangeInTimestamp } = useDatePickerContext(); const { from, to } = getDateRangeInTimestamp(); + const profilingLinkLocator = services.observabilityShared.locators.profiling.topNFunctionsLocator; + const profilingLinkLabel = i18n.translate('xpack.infra.flamegraph.profilingAppTopFunctionsLink', { + defaultMessage: 'Go to Universal Profiling Functions', + }); + const params = useMemo( () => ({ hostname: asset.name, @@ -44,7 +52,13 @@ export function Functions() { return ( <> - + diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/single_metric_sparkline.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/single_metric_sparkline.tsx index 566b601991c7b..d51b1ff370fe3 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/single_metric_sparkline.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/single_metric_sparkline.tsx @@ -6,12 +6,17 @@ */ import React, { useMemo } from 'react'; -import { Chart, Settings, AreaSeries, ScaleType, TooltipType, Tooltip } from '@elastic/charts'; import { - EUI_CHARTS_THEME_LIGHT, - EUI_SPARKLINE_THEME_PARTIAL, - EUI_CHARTS_THEME_DARK, -} from '@elastic/eui/dist/eui_charts_theme'; + Chart, + Settings, + AreaSeries, + ScaleType, + TooltipType, + Tooltip, + LIGHT_THEME, + DARK_THEME, +} from '@elastic/charts'; +import { EUI_SPARKLINE_THEME_PARTIAL } from '@elastic/eui/dist/eui_charts_theme'; import { i18n } from '@kbn/i18n'; import { useIsDarkMode } from '../../../../../hooks/use_is_dark_mode'; import { useKibanaTimeZoneSetting } from '../../../../../hooks/use_kibana_time_zone_setting'; @@ -35,15 +40,7 @@ export const SingleMetricSparkline: React.FunctionComponent<{ }> = ({ metric, timeRange }) => { const isDarkMode = useIsDarkMode(); const timeZone = useKibanaTimeZoneSetting(); - - const theme = useMemo( - () => [ - // localThemeOverride, - EUI_SPARKLINE_THEME_PARTIAL, - isDarkMode ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme, - ], - [isDarkMode] - ); + const baseTheme = useMemo(() => (isDarkMode ? DARK_THEME : LIGHT_THEME), [isDarkMode]); const xDomain = useMemo( () => ({ @@ -56,7 +53,13 @@ export const SingleMetricSparkline: React.FunctionComponent<{ return ( - + + diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/alerts/alerts_tab_content.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/alerts/alerts_tab_content.tsx index 245a7ee752a64..5a64a4040b288 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/alerts/alerts_tab_content.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/alerts/alerts_tab_content.tsx @@ -91,7 +91,6 @@ const MemoAlertSummaryWidget = React.memo( }; const chartProps = { - theme: charts.theme.useChartsTheme(), baseTheme: charts.theme.useChartsBaseTheme(), onBrushEnd, }; diff --git a/x-pack/plugins/infra/public/utils/use_timeline_chart_theme.ts b/x-pack/plugins/infra/public/utils/use_timeline_chart_theme.ts index 7c562c90ab434..47aac1cc26bfa 100644 --- a/x-pack/plugins/infra/public/utils/use_timeline_chart_theme.ts +++ b/x-pack/plugins/infra/public/utils/use_timeline_chart_theme.ts @@ -16,19 +16,15 @@ export function useTimelineChartTheme(): Pick handleColorChange(color)} color={currentColor} aria-label={colorLabel} - showAlpha={false} + showAlpha swatches={euiPaletteColorBlind()} /> diff --git a/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx index 8d3368bfd8e33..7e039497a9bd2 100644 --- a/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx +++ b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx @@ -8,9 +8,12 @@ import { EuiFlexGroup, EuiFlexItem, EuiText, EuiTextTruncate } from '@elastic/eui'; import React, { ReactNode } from 'react'; import { ValuesType } from 'utility-types'; +import { dynamic } from '../../../utils/dynamic'; import { HoverActionPopover } from './hover_popover_action'; import { LogDocument } from '../types'; +const HighlightFieldDescription = dynamic(() => import('./highlight_field_description')); + interface HighlightFieldProps { field: string; formattedValue: string; @@ -32,9 +35,16 @@ export function HighlightField({ return formattedValue ? ( - - {label} - + + + + {label} + + + + + + diff --git a/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field_description.tsx b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field_description.tsx new file mode 100644 index 0000000000000..915758cbcca5f --- /dev/null +++ b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field_description.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiIconTip } from '@elastic/eui'; +import { EcsFlat } from '@kbn/ecs'; +import { FieldIcon } from '@kbn/react-field'; +import React from 'react'; + +export function HighlightFieldDescription({ fieldName }: { fieldName: string }) { + const { short, type } = EcsFlat[fieldName as keyof typeof EcsFlat] ?? {}; + + if (!short) return null; + + const title = ( + + {type && ( + + + + )} + {fieldName} + + ); + + return ; +} + +// eslint-disable-next-line import/no-default-export +export default HighlightFieldDescription; diff --git a/x-pack/plugins/log_explorer/tsconfig.json b/x-pack/plugins/log_explorer/tsconfig.json index b236e7f03ced3..b93676d3b1951 100644 --- a/x-pack/plugins/log_explorer/tsconfig.json +++ b/x-pack/plugins/log_explorer/tsconfig.json @@ -37,7 +37,9 @@ "@kbn/unified-data-table", "@kbn/unified-field-list", "@kbn/unified-search-plugin", - "@kbn/xstate-utils" + "@kbn/xstate-utils", + "@kbn/ecs", + "@kbn/react-field" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts index 355f66f2bf9fd..ab19e7c19b93e 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts @@ -10,20 +10,11 @@ import { fieldFormatsServiceMock } from '@kbn/field-formats-plugin/public/mocks' import { BehaviorSubject } from 'rxjs'; import { mlApiServicesMock } from '../../../services/__mocks__/ml_api_services'; import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; +import { LIGHT_THEME } from '@elastic/charts'; export const chartsServiceMock = { theme: { - useChartsTheme: jest.fn(() => { - return { - crosshair: { - line: { - stroke: 'black', - strokeWidth: 1, - dash: [4, 4], - }, - }, - }; - }), + useChartsBaseTheme: jest.fn(() => LIGHT_THEME), }, activeCursor: { activeCursor$: new BehaviorSubject({ diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/decision_path_chart.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/decision_path_chart.tsx index 1eb4fc62b472d..7d6a2755348ae 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/decision_path_chart.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/decision_path_chart.tsx @@ -19,6 +19,7 @@ import { RecursivePartial, ScaleType, Settings, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import { EuiIcon } from '@elastic/eui'; @@ -127,8 +128,9 @@ export const DecisionPathChart = ({ size={{ height: DECISION_PATH_MARGIN + decisionPathData.length * DECISION_PATH_ROW_HEIGHT }} > diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx index 00e52934b0627..a3e55a0e09064 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx @@ -19,6 +19,7 @@ import { AxisStyle, PartialTheme, BarSeriesProps, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -295,8 +296,9 @@ export const FeatureImportanceSummaryPanel: FC diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js index 169f739de41cd..175b58a72c0a5 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js @@ -326,9 +326,9 @@ export class ExplorerChartDistribution extends React.Component { return `M${xPosition},${chartHeight} ${xPosition},0`; }) // Use elastic chart's cursor line style if possible - .style('stroke', `${chartTheme.crosshair.line.stroke ?? 'black'}`) - .style('stroke-width', `${chartTheme.crosshair.line.strokeWidth ?? '1'}px`) - .style('stroke-dasharray', chartTheme.crosshair.line.dash ?? '4,4'); + .style('stroke', chartTheme.crosshair.line.stroke) + .style('stroke-width', `${chartTheme.crosshair.line.strokeWidth}px`) + .style('stroke-dasharray', chartTheme.crosshair.line.dash?.join(',') ?? '4,4'); cursorMouseLine.exit().remove(); } diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js index d77b66b960625..5a146c51b61c1 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.test.js @@ -22,7 +22,7 @@ import { kibanaContextMock } from '../../contexts/kibana/__mocks__/kibana_contex const utilityProps = { timeBuckets: timeBucketsMock, - chartTheme: kibanaContextMock.services.charts.theme.useChartsTheme(), + chartTheme: kibanaContextMock.services.charts.theme.useChartsBaseTheme(), onPointerUpdate: jest.fn(), cursor: { x: 10432423, diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js index b93555e8c2ff9..95933451d6f47 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js @@ -257,9 +257,9 @@ export class ExplorerChartSingleMetric extends React.Component { return `M${xPosition},${chartHeight} ${xPosition},0`; }) // Use elastic chart's cursor line style if possible - .style('stroke', `${chartTheme.crosshair.line.stroke ?? 'black'}`) - .style('stroke-width', `${chartTheme.crosshair.line.strokeWidth ?? '1'}px`) - .style('stroke-dasharray', chartTheme.crosshair.line.dash ?? '4,4'); + .style('stroke', chartTheme.crosshair.line.stroke) + .style('stroke-width', `${chartTheme.crosshair.line.strokeWidth}px`) + .style('stroke-dasharray', chartTheme.crosshair.line.dash?.join(',') ?? '4,4'); cursorMouseLine.exit().remove(); } diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js index abe8c0c991cc4..3bc38c5754e88 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.test.js @@ -22,7 +22,7 @@ import { kibanaContextMock } from '../../contexts/kibana/__mocks__/kibana_contex const utilityProps = { timeBuckets: timeBucketsMock, - chartTheme: kibanaContextMock.services.charts.theme.useChartsTheme(), + chartTheme: kibanaContextMock.services.charts.theme.useChartsBaseTheme(), onPointerUpdate: jest.fn(), cursor: { x: 10432423, diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js index fb340977dfae8..9e84a1f546b04 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js @@ -43,7 +43,7 @@ import { ExplorerChartsErrorCallOuts } from './explorer_charts_error_callouts'; import { addItemToRecentlyAccessed } from '../../util/recently_accessed'; import { EmbeddedMapComponentWrapper } from './explorer_chart_embedded_map'; import { useActiveCursor } from '@kbn/charts-plugin/public'; -import { BarSeries, Chart, Settings } from '@elastic/charts'; +import { BarSeries, Chart, Settings, LEGACY_LIGHT_THEME } from '@elastic/charts'; import useObservable from 'react-use/lib/useObservable'; import { escapeKueryForFieldValuePair } from '../../util/string_utils'; @@ -188,7 +188,7 @@ function ExplorerChartContainer({ const chartRef = useRef(null); const { euiTheme } = useEuiTheme(); - const chartTheme = chartsService.theme.useChartsTheme(); + const chartTheme = chartsService.theme.useChartsBaseTheme(); const handleCursorUpdate = useActiveCursor(chartsService.activeCursor, chartRef, { isDateHistogram: true, @@ -238,7 +238,14 @@ function ExplorerChartContainer({ {/* so that we can use chart's ref which controls the activeCursor api */}
- } width={0} height={0} locale={i18n.getLocale()} /> + } + width={0} + height={0} + locale={i18n.getLocale()} + /> {/* Just need an empty chart to access cursor service */} diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index 65ec5c9350269..7051060b6a255 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -31,6 +31,7 @@ import { TooltipProps, TooltipValue, Tooltip, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; @@ -449,8 +450,9 @@ export const SwimlaneContainer: FC = ({ = ({ annotations.lines[0].datum.modelSnapshot ); }} - // TODO use the EUI charts theme see src/plugins/charts/public/services/theme/README.md theme={{ lineSeriesStyle: { point: { @@ -427,6 +427,8 @@ export const DatafeedChartFlyout: FC = ({ }, }, }} + // TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md + baseTheme={LEGACY_LIGHT_THEME} locale={i18n.getLocale()} /> = ({ diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/event_rate_chart.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/event_rate_chart.tsx index 0afee34e406d7..04553dda99255 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/event_rate_chart.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/event_rate_chart.tsx @@ -15,6 +15,7 @@ import { BrushEndListener, PartialTheme, Tooltip, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; @@ -77,8 +78,9 @@ export const EventRateChart: FC = ({ diff --git a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx index 0cf65ec6d0949..ebbae3fff924f 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx @@ -11,10 +11,9 @@ import { Settings, Partition, PartitionLayout, - LIGHT_THEME, DARK_THEME, + LIGHT_THEME, } from '@elastic/charts'; -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; import { EuiComboBox, EuiComboBoxOptionOption, EuiEmptyPrompt, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -65,13 +64,7 @@ export const JobMemoryTreeMap: FC = ({ node, type, height }) => { } = useMlKibana(); const isDarkTheme = useIsDarkTheme(themeService); - const { theme, baseTheme } = useMemo( - () => - isDarkTheme - ? { theme: EUI_CHARTS_THEME_DARK, baseTheme: DARK_THEME } - : { theme: EUI_CHARTS_THEME_LIGHT, baseTheme: LIGHT_THEME }, - [isDarkTheme] - ); + const baseTheme = useMemo(() => (isDarkTheme ? DARK_THEME : LIGHT_THEME), [isDarkTheme]); const { isADEnabled, isDFAEnabled, isNLPEnabled } = useEnabledFeatures(); @@ -173,7 +166,7 @@ export const JobMemoryTreeMap: FC = ({ node, type, height }) => { {data.length ? ( - + id="memoryUsageTreeMap" data={data} diff --git a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/memory_preview_chart.tsx b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/memory_preview_chart.tsx index dc75907e771b2..269dd2e3fb400 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/memory_preview_chart.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/memory_preview_chart.tsx @@ -18,12 +18,14 @@ import { LineAnnotation, AnnotationDomainType, Tooltip, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import { EuiIcon } from '@elastic/eui'; import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; import { NodeDeploymentStatsResponse } from '../../../../common/types/trained_models'; import { useFieldFormatter } from '../../contexts/kibana/use_field_formatter'; import { getMemoryItemColor } from '../memory_item_colors'; +import { useMlKibana } from '../../contexts/kibana'; interface MemoryPreviewChartProps { memoryOverview: NodeDeploymentStatsResponse['memory_overview']; @@ -31,6 +33,9 @@ interface MemoryPreviewChartProps { export const MemoryPreviewChart: FC = ({ memoryOverview }) => { const bytesFormatter = useFieldFormatter(FIELD_FORMAT_IDS.BYTES); + const { + services: { charts: chartsService }, + } = useMlKibana(); const groups = useMemo( () => ({ @@ -117,7 +122,8 @@ export const MemoryPreviewChart: FC = ({ memoryOverview } /> diff --git a/x-pack/plugins/observability/public/components/alert_status_indicator.tsx b/x-pack/plugins/observability/public/components/alert_status_indicator.tsx index 8090e26d4596f..9dcdbe660e6fe 100644 --- a/x-pack/plugins/observability/public/components/alert_status_indicator.tsx +++ b/x-pack/plugins/observability/public/components/alert_status_indicator.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiHealth, EuiText } from '@elastic/eui'; import { ALERT_STATUS_ACTIVE, AlertStatus } from '@kbn/rule-data-utils'; -import { LIGHT_THEME } from '@elastic/charts'; +import { LEGACY_LIGHT_THEME } from '@elastic/charts'; interface AlertStatusIndicatorProps { alertStatus: AlertStatus; @@ -19,7 +19,7 @@ interface AlertStatusIndicatorProps { export function AlertStatusIndicator({ alertStatus, textSize = 'xs' }: AlertStatusIndicatorProps) { if (alertStatus === ALERT_STATUS_ACTIVE) { return ( - + {i18n.translate('xpack.observability.alertsTGrid.statusActiveDescription', { defaultMessage: 'Active', })} @@ -28,7 +28,7 @@ export function AlertStatusIndicator({ alertStatus, textSize = 'xs' }: AlertStat } return ( - + {i18n.translate('xpack.observability.alertsTGrid.statusRecoveredDescription', { defaultMessage: 'Recovered', diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx index c9b17b4f48c92..ce9a651a7a1e3 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx @@ -63,7 +63,6 @@ export default function AlertDetailsAppSection({ const [, setDataViewError] = useState(); const ruleParams = rule.params as RuleTypeParams & AlertParams; const chartProps = { - theme: charts.theme.useChartsTheme(), baseTheme: charts.theme.useChartsBaseTheme(), }; const timeRange = getPaddedAlertTimeRange(alert.fields[ALERT_START]!, alert.fields[ALERT_END]); diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/alert_flyout.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_flyout.tsx deleted file mode 100644 index 1a90ffc7460c5..0000000000000 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/alert_flyout.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useContext, useMemo } from 'react'; - -import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; -import { TriggerActionsContext } from './triggers_actions_context'; -import { observabilityRuleCreationValidConsumers } from '../../../../common/constants'; - -interface Props { - visible?: boolean; - setVisible: React.Dispatch>; -} - -export function AlertFlyout(props: Props) { - const { visible, setVisible } = props; - const { triggersActionsUI } = useContext(TriggerActionsContext); - const onCloseFlyout = useCallback(() => setVisible(false), [setVisible]); - const AddAlertFlyout = useMemo( - () => - triggersActionsUI && - triggersActionsUI.getAddRuleFlyout({ - consumer: 'logs', - onClose: onCloseFlyout, - canChangeTrigger: false, - ruleTypeId: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, - validConsumers: observabilityRuleCreationValidConsumers, - useRuleProducer: true, - }), - [triggersActionsUI, onCloseFlyout] - ); - - return <>{visible && AddAlertFlyout}; -} - -export function PrefilledThresholdAlertFlyout({ onClose }: { onClose(): void }) { - return ; -} diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/criterion_preview_chart.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/criterion_preview_chart.tsx index 5669f7a190f81..806844e2531f6 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/criterion_preview_chart.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/criterion_preview_chart.tsx @@ -7,7 +7,7 @@ import React, { useMemo } from 'react'; import { niceTimeFormatter } from '@elastic/charts'; -import { Theme, LIGHT_THEME, DARK_THEME } from '@elastic/charts'; +import { Theme, LEGACY_LIGHT_THEME, LEGACY_DARK_THEME } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { EuiLoadingChart, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -81,9 +81,9 @@ export const getDomain = (series: Series, stacked: boolean = false) => { return { yMin: min || 0, yMax: max || 0, xMin: minTimestamp, xMax: maxTimestamp }; }; -// TODO use the EUI charts theme see src/plugins/charts/public/services/theme/README.md +// TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md export const getChartTheme = (isDarkMode: boolean): Theme => { - return isDarkMode ? DARK_THEME : LIGHT_THEME; + return isDarkMode ? LEGACY_DARK_THEME : LEGACY_LIGHT_THEME; }; export const EmptyContainer: React.FC = ({ children }) => ( diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.stories.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.stories.tsx index 9598aabcbf70f..674ce1c579756 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.stories.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.stories.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { ComponentMeta } from '@storybook/react'; import { LIGHT_THEME } from '@elastic/charts'; -import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { Comparator } from '../../../../common/custom_threshold_rule/types'; import { Props, Threshold as Component } from './custom_threshold'; @@ -31,7 +30,7 @@ export default { } as ComponentMeta; const defaultProps: Props = { - chartProps: { theme: EUI_CHARTS_THEME_LIGHT.theme, baseTheme: LIGHT_THEME }, + chartProps: { baseTheme: LIGHT_THEME }, comparator: Comparator.GT, id: 'componentId', threshold: [90], diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.test.tsx index 7731792f7b322..fbb728b4b81aa 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.test.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.test.tsx @@ -6,7 +6,6 @@ */ import { LIGHT_THEME } from '@elastic/charts'; -import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { render } from '@testing-library/react'; import { Props, Threshold } from './custom_threshold'; @@ -16,7 +15,7 @@ import { Comparator } from '../../../../common/custom_threshold_rule/types'; describe('Threshold', () => { const renderComponent = (props: Partial = {}) => { const defaultProps: Props = { - chartProps: { theme: EUI_CHARTS_THEME_LIGHT.theme, baseTheme: LIGHT_THEME }, + chartProps: { baseTheme: LIGHT_THEME }, comparator: Comparator.GT, id: 'componentId', threshold: [90], diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.tsx index 5f28676eb37b6..7e9fbfce9d682 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.tsx @@ -13,7 +13,7 @@ import { i18n } from '@kbn/i18n'; import { Comparator } from '../../../../common/custom_threshold_rule/types'; export interface ChartProps { - theme: PartialTheme; + theme?: PartialTheme; baseTheme: Theme; } diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx index c18b2860df95d..010642acdf551 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx @@ -15,6 +15,7 @@ import { RectAnnotation, Settings, Tooltip, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import { EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -192,6 +193,8 @@ export function ExpressionChart({ tooltip: { visible: true }, }} theme={getChartTheme(isDarkMode)} + // TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md + baseTheme={LEGACY_LIGHT_THEME} locale={i18n.getLocale()} /> diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/metrics_alert_dropdown.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/metrics_alert_dropdown.tsx deleted file mode 100644 index 91b97161f78da..0000000000000 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/metrics_alert_dropdown.tsx +++ /dev/null @@ -1,191 +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 { i18n } from '@kbn/i18n'; -import React, { useState, useCallback, useMemo } from 'react'; -import { - EuiPopover, - EuiHeaderLink, - EuiContextMenu, - EuiContextMenuPanelDescriptor, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { InfraClientStartDeps } from '../types'; -import { PrefilledThresholdAlertFlyout } from './alert_flyout'; - -type VisibleFlyoutType = 'inventory' | 'threshold' | null; - -export function MetricsAlertDropdown() { - const [popoverOpen, setPopoverOpen] = useState(false); - const [visibleFlyoutType, setVisibleFlyoutType] = useState(null); - const uiCapabilities = useKibana().services.application?.capabilities; - const { - services: { observability }, - } = useKibana(); - const canCreateAlerts = useMemo( - () => Boolean(uiCapabilities?.infrastructure?.save), - [uiCapabilities] - ); - - const closeFlyout = useCallback(() => setVisibleFlyoutType(null), [setVisibleFlyoutType]); - - const closePopover = useCallback(() => { - setPopoverOpen(false); - }, [setPopoverOpen]); - - const togglePopover = useCallback(() => { - setPopoverOpen(!popoverOpen); - }, [setPopoverOpen, popoverOpen]); - const infrastructureAlertsPanel = useMemo( - () => ({ - id: 1, - title: i18n.translate( - 'xpack.observability.customThreshold.rule.infrastructureDropdownTitle', - { - defaultMessage: 'Infrastructure rules', - } - ), - items: [ - { - 'data-test-subj': 'inventory-alerts-create-rule', - name: i18n.translate( - 'xpack.observability.customThreshold.rule.createInventoryRuleButton', - { - defaultMessage: 'Create inventory rule', - } - ), - onClick: () => { - closePopover(); - setVisibleFlyoutType('inventory'); - }, - }, - ], - }), - [setVisibleFlyoutType, closePopover] - ); - - const metricsAlertsPanel = useMemo( - () => ({ - id: 2, - title: i18n.translate('xpack.observability.customThreshold.rule.metricsDropdownTitle', { - defaultMessage: 'Metrics rules', - }), - items: [ - { - 'data-test-subj': 'metrics-threshold-alerts-create-rule', - name: i18n.translate( - 'xpack.observability.customThreshold.rule.createThresholdRuleButton', - { - defaultMessage: 'Create threshold rule', - } - ), - onClick: () => { - closePopover(); - setVisibleFlyoutType('threshold'); - }, - }, - ], - }), - [setVisibleFlyoutType, closePopover] - ); - - const manageRulesLinkProps = observability.useRulesLink(); - - const manageAlertsMenuItem = useMemo( - () => ({ - name: i18n.translate('xpack.observability.customThreshold.rule.manageRules', { - defaultMessage: 'Manage rules', - }), - icon: 'tableOfContents', - onClick: manageRulesLinkProps.onClick, - }), - [manageRulesLinkProps] - ); - - const firstPanelMenuItems: EuiContextMenuPanelDescriptor['items'] = useMemo( - () => - canCreateAlerts - ? [ - { - 'data-test-subj': 'inventory-alerts-menu-option', - name: i18n.translate( - 'xpack.observability.customThreshold.rule.infrastructureDropdownMenu', - { - defaultMessage: 'Infrastructure', - } - ), - panel: 1, - }, - { - 'data-test-subj': 'metrics-threshold-alerts-menu-option', - name: i18n.translate('xpack.observability.customThreshold.rule.metricsDropdownMenu', { - defaultMessage: 'Metrics', - }), - panel: 2, - }, - manageAlertsMenuItem, - ] - : [manageAlertsMenuItem], - [canCreateAlerts, manageAlertsMenuItem] - ); - - const panels: EuiContextMenuPanelDescriptor[] = useMemo( - () => - [ - { - id: 0, - title: i18n.translate('xpack.observability.customThreshold.rule.alertDropdownTitle', { - defaultMessage: 'Alerts and rules', - }), - items: firstPanelMenuItems, - }, - ].concat(canCreateAlerts ? [infrastructureAlertsPanel, metricsAlertsPanel] : []), - [infrastructureAlertsPanel, metricsAlertsPanel, firstPanelMenuItems, canCreateAlerts] - ); - return ( - <> - - - - } - isOpen={popoverOpen} - closePopover={closePopover} - > - - - - - ); -} - -interface AlertFlyoutProps { - visibleFlyoutType: VisibleFlyoutType; - onClose(): void; -} - -function AlertFlyout({ visibleFlyoutType, onClose }: AlertFlyoutProps) { - switch (visibleFlyoutType) { - case 'threshold': - return ; - default: - return null; - } -} diff --git a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx index 0f1742469c312..ce1c9527904cc 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx @@ -6,16 +6,16 @@ */ import React from 'react'; -import { act } from 'react-dom/test-utils'; -import { QueryClientProvider } from '@tanstack/react-query'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; import { queryClient } from '@kbn/osquery-plugin/public/query_client'; import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; - +import { QueryClientProvider } from '@tanstack/react-query'; +import { act } from 'react-dom/test-utils'; import { Aggregators, Comparator } from '../../../common/custom_threshold_rule/types'; import { useKibana } from '../../utils/kibana_react'; import { kibanaStartMock } from '../../utils/kibana_react.mock'; import Expressions from './custom_threshold_rule_expression'; +import { CustomThresholdPrefillOptions } from './types'; jest.mock('../../utils/kibana_react'); jest.mock('./components/preview_chart/preview_chart', () => ({ @@ -38,7 +38,10 @@ describe('Expression', () => { mockKibana(); }); - async function setup() { + async function setup( + currentOptions?: CustomThresholdPrefillOptions, + customRuleParams?: Record + ) { const ruleParams = { criteria: [], groupBy: undefined, @@ -50,6 +53,11 @@ describe('Expression', () => { language: 'kuery', }, }, + ...customRuleParams, + }; + const metadata = { + currentOptions, + adHocDataViewList: [], }; const wrapper = mountWithIntl( @@ -61,9 +69,7 @@ describe('Expression', () => { errors={{}} setRuleParams={(key, value) => Reflect.set(ruleParams, key, value)} setRuleProperty={() => {}} - metadata={{ - adHocDataViewList: [], - }} + metadata={metadata} dataViews={dataViewMock} onChangeMetaData={jest.fn()} /> @@ -81,6 +87,59 @@ describe('Expression', () => { return { wrapper, update, ruleParams }; } + const updateUseKibanaMock = (mockedIndex: any) => { + const mockedDataView = { + getIndexPattern: () => 'mockedIndexPattern', + getName: () => 'mockedName', + ...mockedIndex, + }; + const mockedSearchSource = { + id: 'data_source', + shouldOverwriteDataViewType: false, + requestStartHandlers: [], + inheritOptions: {}, + history: [], + fields: { + index: mockedIndex, + }, + getField: jest.fn(() => mockedDataView), + setField: jest.fn(), + getSerializedFields: jest.fn().mockReturnValue({ index: mockedIndex }), + dependencies: { + aggs: { + types: {}, + }, + }, + }; + const kibanaMock = kibanaStartMock.startContract(); + useKibanaMock.mockReturnValue({ + ...kibanaMock, + services: { + ...kibanaMock.services, + data: { + dataViews: { + create: jest.fn(), + getDefaultDataView: jest.fn(), + }, + query: { + timefilter: { + timefilter: jest.fn(), + }, + queryString: { + getDefaultQuery: jest.fn(), + }, + }, + search: { + searchSource: { + create: jest.fn(() => mockedSearchSource), + createEmpty: jest.fn(() => mockedSearchSource), + }, + }, + }, + }, + }); + }; + it('should use default metrics', async () => { const { ruleParams } = await setup(); expect(ruleParams.criteria).toEqual([ @@ -99,6 +158,41 @@ describe('Expression', () => { ]); }); + it('should prefill the rule using the context metadata', async () => { + const index = 'changedMockedIndex'; + const currentOptions: CustomThresholdPrefillOptions = { + groupBy: ['host.hostname'], + filterQuery: 'foo', + searchConfiguration: { index }, + criteria: [ + { + metrics: [ + { name: 'A', aggType: Aggregators.AVERAGE, field: 'system.load.1' }, + { name: 'B', aggType: Aggregators.CARDINALITY, field: 'system.cpu.user.pct' }, + ], + }, + ], + }; + + const { ruleParams } = await setup(currentOptions, { searchConfiguration: undefined }); + + expect(ruleParams.groupBy).toEqual(['host.hostname']); + expect(ruleParams.searchConfiguration.query.query).toBe('foo'); + expect(ruleParams.searchConfiguration.index).toBe(index); + expect(ruleParams.criteria).toEqual([ + { + metrics: [ + { name: 'A', aggType: Aggregators.AVERAGE, field: 'system.load.1' }, + { name: 'B', aggType: Aggregators.CARDINALITY, field: 'system.cpu.user.pct' }, + ], + comparator: Comparator.GT, + threshold: [100], + timeSize: 1, + timeUnit: 'm', + }, + ]); + }); + it('should show an error message when searchSource throws an error', async () => { const errorMessage = 'Error in searchSource create'; const kibanaMock = kibanaStartMock.startContract(); @@ -140,49 +234,7 @@ describe('Expression', () => { // We should not provide timeFieldName here to show thresholdRuleDataViewErrorNoTimestamp error // timeFieldName: '@timestamp', }; - const mockedDataView = { - getIndexPattern: () => 'mockedIndexPattern', - getName: () => 'mockedName', - ...mockedIndex, - }; - const mockedSearchSource = { - id: 'data_source', - shouldOverwriteDataViewType: false, - requestStartHandlers: [], - inheritOptions: {}, - history: [], - fields: { - index: mockedIndex, - }, - getField: jest.fn(() => mockedDataView), - dependencies: { - aggs: { - types: {}, - }, - }, - }; - const kibanaMock = kibanaStartMock.startContract(); - useKibanaMock.mockReturnValue({ - ...kibanaMock, - services: { - ...kibanaMock.services, - data: { - dataViews: { - create: jest.fn(), - }, - query: { - timefilter: { - timefilter: jest.fn(), - }, - }, - search: { - searchSource: { - create: jest.fn(() => mockedSearchSource), - }, - }, - }, - }, - }); + updateUseKibanaMock(mockedIndex); const { wrapper } = await setup(); expect( wrapper.find(`[data-test-subj="thresholdRuleDataViewErrorNoTimestamp"]`).first().text() @@ -190,4 +242,19 @@ describe('Expression', () => { 'The selected data view does not have a timestamp field, please select another data view.' ); }); + + it('should use output of getSerializedFields() as searchConfiguration', async () => { + const mockedIndex = { + id: 'c34a7c79-a88b-4b4a-ad19-72f6d24104e4', + title: 'metrics-fake_hosts', + fieldFormatMap: {}, + typeMeta: {}, + timeFieldName: '@timestamp', + }; + updateUseKibanaMock(mockedIndex); + const { ruleParams } = await setup(undefined, { searchConfiguration: undefined }); + expect(ruleParams.searchConfiguration).toEqual({ + index: mockedIndex, + }); + }); }); diff --git a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx index 539f8fbf4f58d..0df72511ce559 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx @@ -96,14 +96,24 @@ export default function Expressions(props: Props) { let initialSearchConfiguration = ruleParams.searchConfiguration; if (!ruleParams.searchConfiguration || !ruleParams.searchConfiguration.index) { - const newSearchSource = data.search.searchSource.createEmpty(); - newSearchSource.setField('query', data.query.queryString.getDefaultQuery()); - const defaultDataView = await data.dataViews.getDefaultDataView(); - if (defaultDataView) { - newSearchSource.setField('index', defaultDataView); - setDataView(defaultDataView); + if (metadata?.currentOptions?.searchConfiguration) { + initialSearchConfiguration = { + ...metadata.currentOptions.searchConfiguration, + query: { + query: ruleParams.searchConfiguration?.query ?? '', + language: 'kuery', + }, + }; + } else { + const newSearchSource = data.search.searchSource.createEmpty(); + newSearchSource.setField('query', data.query.queryString.getDefaultQuery()); + const defaultDataView = await data.dataViews.getDefaultDataView(); + if (defaultDataView) { + newSearchSource.setField('index', defaultDataView); + setDataView(defaultDataView); + } + initialSearchConfiguration = newSearchSource.getSerializedFields(); } - initialSearchConfiguration = newSearchSource.getSerializedFields(); } try { @@ -151,7 +161,15 @@ export default function Expressions(props: Props) { setTimeSize(ruleParams.criteria[0].timeSize); setTimeUnit(ruleParams.criteria[0].timeUnit); } else { - setRuleParams('criteria', [defaultExpression]); + preFillCriteria(); + } + + if (!ruleParams.filterQuery) { + preFillFilterQuery(); + } + + if (!ruleParams.groupBy) { + preFillGroupBy(); } if (typeof ruleParams.alertOnNoData === 'undefined') { @@ -259,6 +277,42 @@ export default function Expressions(props: Props) { [ruleParams.criteria, setRuleParams] ); + const preFillFilterQuery = useCallback(() => { + const md = metadata; + + if (md && md.currentOptions?.filterQuery) { + setRuleParams('searchConfiguration', { + ...ruleParams.searchConfiguration, + query: { + query: md.currentOptions.filterQuery, + language: 'kuery', + }, + }); + } + }, [metadata, setRuleParams, ruleParams.searchConfiguration]); + + const preFillCriteria = useCallback(() => { + const md = metadata; + if (md?.currentOptions?.criteria?.length) { + setRuleParams( + 'criteria', + md.currentOptions.criteria.map((criterion) => ({ + ...defaultExpression, + ...criterion, + })) + ); + } else { + setRuleParams('criteria', [defaultExpression]); + } + }, [metadata, setRuleParams]); + + const preFillGroupBy = useCallback(() => { + const md = metadata; + if (md && md.currentOptions?.groupBy) { + setRuleParams('groupBy', md.currentOptions.groupBy); + } + }, [metadata, setRuleParams]); + const hasGroupBy = useMemo( () => ruleParams.groupBy && ruleParams.groupBy.length > 0, [ruleParams.groupBy] diff --git a/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_expression_data.test.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.test.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_expression_data.test.tsx diff --git a/x-pack/plugins/observability/public/components/custom_threshold/types.ts b/x-pack/plugins/observability/public/components/custom_threshold/types.ts index dc0ad4eb71627..9753cabbc118f 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/types.ts +++ b/x-pack/plugins/observability/public/components/custom_threshold/types.ts @@ -15,6 +15,7 @@ import { EmbeddableStart } from '@kbn/embeddable-plugin/public'; import { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import { LensPublicStart } from '@kbn/lens-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; +import { OsqueryPluginStart } from '@kbn/osquery-plugin/public'; import { SharePluginStart } from '@kbn/share-plugin/public'; import { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import { @@ -28,11 +29,18 @@ import { CustomMetricExpressionParams, BaseMetricExpressionParams, aggType, + ThresholdParams, + MetricExpressionParams, } from '../../../common/custom_threshold_rule/types'; import { ObservabilityPublicStart } from '../../plugin'; +export type CustomThresholdPrefillOptions = Partial< + Omit & { criteria: Array> } +>; + export interface AlertContextMeta { adHocDataViewList: DataView[]; + currentOptions?: CustomThresholdPrefillOptions; } export type MetricExpression = Omit & { @@ -66,7 +74,7 @@ export interface InfraClientStartDeps { lens: LensPublicStart; observability: ObservabilityPublicStart; observabilityShared: ObservabilitySharedPluginStart; - osquery?: unknown; // OsqueryPluginStart; + osquery?: OsqueryPluginStart; share: SharePluginStart; spaces: SpacesPluginStart; storage: IStorageWrapper; diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts.tsx index c1b1493daa3d9..daf02e9f6fd09 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts.tsx @@ -80,7 +80,6 @@ function InternalAlertsPage() { } }; const chartProps = { - theme: charts.theme.useChartsTheme(), baseTheme: charts.theme.useChartsBaseTheme(), onBrushEnd, }; diff --git a/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.tsx index cfbe160590401..ed6f55006c5e7 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.tsx @@ -22,7 +22,7 @@ import moment from 'moment'; import React, { useContext } from 'react'; import { useHistory } from 'react-router-dom'; import { ThemeContext } from 'styled-components'; -import { useChartTheme, FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes, FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; import { useDatePickerContext } from '../../../../../hooks/use_date_picker_context'; import { SectionContainer } from '../section_container'; import { getDataHandler } from '../../../../../context/has_data_context/data_handler'; @@ -55,7 +55,7 @@ function formatTpmStat(value?: number) { export function APMSection({ bucketSize }: Props) { const theme = useContext(ThemeContext); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const history = useHistory(); const { forceUpdate, hasDataMap } = useHasData(); const { relativeStart, relativeEnd, absoluteStart, absoluteEnd, lastUpdated } = @@ -147,7 +147,7 @@ export function APMSection({ bucketSize }: Props) { onBrushEnd({ x: (event as XYBrushEvent).x, history })} - theme={chartTheme} + {...chartThemes} showLegend={false} xDomain={{ min, max }} locale={i18n.getLocale()} diff --git a/x-pack/plugins/observability/public/pages/overview/components/sections/logs/logs_section.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/logs/logs_section.tsx index 4097fbcb5bb87..63087aad6dd30 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/sections/logs/logs_section.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/logs/logs_section.tsx @@ -22,7 +22,7 @@ import { isEmpty } from 'lodash'; import moment from 'moment'; import React, { Fragment } from 'react'; import { useHistory } from 'react-router-dom'; -import { useChartTheme, FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; +import { useChartThemes, FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; import { SectionContainer } from '../section_container'; import { getDataHandler } from '../../../../../context/has_data_context/data_handler'; import { useHasData } from '../../../../../hooks/use_has_data'; @@ -55,7 +55,7 @@ function getColorPerItem(series?: LogsFetchDataResponse['series']) { export function LogsSection({ bucketSize }: Props) { const history = useHistory(); - const chartTheme = useChartTheme(); + const chartThemes = useChartThemes(); const { forceUpdate, hasDataMap } = useHasData(); const { relativeStart, relativeEnd, absoluteStart, absoluteEnd, lastUpdated } = useDatePickerContext(); @@ -138,7 +138,7 @@ export function LogsSection({ bucketSize }: Props) { onBrushEnd({ x: (event as XYBrushEvent).x, history })} - theme={chartTheme} + {...chartThemes} showLegend legendPosition={Position.Right} xDomain={{ min, max }} diff --git a/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx index bbd3b9acd224c..3e4b0476b5075 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx @@ -5,15 +5,19 @@ * 2.0. */ -import { Chart, Settings, AreaSeries, TooltipType, Tooltip } from '@elastic/charts'; +import { + Chart, + Settings, + AreaSeries, + TooltipType, + Tooltip, + LIGHT_THEME, + DARK_THEME, +} from '@elastic/charts'; import { EuiFlexItem, EuiFlexGroup, EuiIcon, EuiTextColor } from '@elastic/eui'; import React, { useContext } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { - EUI_CHARTS_THEME_DARK, - EUI_CHARTS_THEME_LIGHT, - EUI_SPARKLINE_THEME_PARTIAL, -} from '@elastic/eui/dist/eui_charts_theme'; +import { EUI_SPARKLINE_THEME_PARTIAL } from '@elastic/eui/dist/eui_charts_theme'; import { ThemeContext } from 'styled-components'; import { i18n } from '@kbn/i18n'; @@ -29,10 +33,8 @@ interface Props { export function MetricWithSparkline({ id, formatter, value, timeseries, color }: Props) { const themeCTX = useContext(ThemeContext); const isDarkTheme = (themeCTX && themeCTX.darkMode) || false; - const theme = [ - EUI_SPARKLINE_THEME_PARTIAL, - isDarkTheme ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme, - ]; + const theme = [EUI_SPARKLINE_THEME_PARTIAL]; + const baseTheme = isDarkTheme ? DARK_THEME : LIGHT_THEME; const colors = theme[1].colors?.vizColors ?? []; @@ -53,7 +55,12 @@ export function MetricWithSparkline({ id, formatter, value, timeseries, color }: - + onBrushEnd({ x: (event as XYBrushEvent).x, history })} - theme={chartTheme} + {...chartThemes} showLegend={false} legendPosition={Position.Right} xDomain={{ min, max }} diff --git a/x-pack/plugins/observability/public/pages/overview/overview.tsx b/x-pack/plugins/observability/public/pages/overview/overview.tsx index 6b623e1636dab..17121be51c668 100644 --- a/x-pack/plugins/observability/public/pages/overview/overview.tsx +++ b/x-pack/plugins/observability/public/pages/overview/overview.tsx @@ -102,7 +102,6 @@ export function OverviewPage() { ); const chartProps = { - theme: charts.theme.useChartsTheme(), baseTheme: charts.theme.useChartsBaseTheme(), }; diff --git a/x-pack/plugins/observability/public/pages/rule_details/rule_details.tsx b/x-pack/plugins/observability/public/pages/rule_details/rule_details.tsx index b3b9ea17d5cac..6a9c38b1b1e80 100644 --- a/x-pack/plugins/observability/public/pages/rule_details/rule_details.tsx +++ b/x-pack/plugins/observability/public/pages/rule_details/rule_details.tsx @@ -50,7 +50,7 @@ export function RuleDetailsPage() { const { application: { capabilities, navigateToUrl }, charts: { - theme: { useChartsBaseTheme, useChartsTheme }, + theme: { useChartsBaseTheme }, }, http: { basePath }, share: { @@ -70,7 +70,6 @@ export function RuleDetailsPage() { const { ruleId } = useParams(); const { search } = useLocation(); - const theme = useChartsTheme(); const baseTheme = useChartsBaseTheme(); const { rule, isLoading, isError, refetch } = useFetchRule({ ruleId }); @@ -234,7 +233,7 @@ export function RuleDetailsPage() { } diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/wide_chart.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/wide_chart.tsx index e6ebd1197c5c2..ee3a475e13110 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/components/wide_chart.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/components/wide_chart.tsx @@ -40,7 +40,6 @@ export interface Props { export function WideChart({ chart, data, id, isLoading, state }: Props) { const { charts, uiSettings } = useKibana().services; - const theme = charts.theme.useChartsTheme(); const baseTheme = charts.theme.useChartsBaseTheme(); const { euiTheme } = useEuiTheme(); const dateFormat = uiSettings.get('dateFormat'); @@ -64,7 +63,6 @@ export function WideChart({ chart, data, id, isLoading, state }: Props) { } onPointerUpdate={handleCursorUpdate} externalPointerEvents={{ diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx index dfa52e6e572a0..81556c2feb0f7 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx @@ -77,7 +77,6 @@ export function DataPreviewChart({ isError, } = useDebouncedGetPreviewData(isIndicatorSectionValid, watch('indicator'), range); - const theme = charts.theme.useChartsTheme(); const baseTheme = charts.theme.useChartsBaseTheme(); const dateFormat = uiSettings.get('dateFormat'); const numberFormat = @@ -196,7 +195,6 @@ export function DataPreviewChart({ showLegend={false} theme={[ { - ...theme, lineSeriesStyle: { point: { visible: false }, }, @@ -231,7 +229,7 @@ export function DataPreviewChart({ timeAxisLayerCount={2} gridLine={{ visible: true }} style={{ - tickLine: { size: 0.0001, padding: 4, visible: true }, + tickLine: { size: 0, padding: 4, visible: true }, tickLabel: { alignment: { horizontal: Position.Left, diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx index cd3459975d011..857cbdc7338a3 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx @@ -74,7 +74,6 @@ const mockKibana = () => { }, charts: { theme: { - useChartsTheme: () => {}, useChartsBaseTheme: () => {}, }, }, diff --git a/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item.tsx b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item.tsx index 8da351e5ba0e3..dad94a1a0c984 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item.tsx @@ -9,8 +9,8 @@ import React, { useState } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { Chart, - DARK_THEME, isMetricElementEvent, + LEGACY_DARK_THEME, Metric, MetricTrendShape, Settings, @@ -153,7 +153,8 @@ export function SloCardChart({ return ( { if (isMetricElementEvent(d)) { navigateToUrl(sloDetailsUrl); diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_sparkline.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_sparkline.tsx index 0beb36f587ff1..0bb96b39d0649 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_sparkline.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_sparkline.tsx @@ -41,7 +41,6 @@ export interface Props { export function SloSparkline({ chart, data, id, isLoading, size, state }: Props) { const charts = useKibana().services.charts; - const theme = charts.theme.useChartsTheme(); const baseTheme = charts.theme.useChartsBaseTheme(); const { euiTheme } = useEuiTheme(); @@ -61,7 +60,7 @@ export function SloSparkline({ chart, data, id, isLoading, size, state }: Props) diff --git a/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx b/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx index 2051da5f43036..3794fa1e269c6 100644 --- a/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx +++ b/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx @@ -66,7 +66,6 @@ export function KibanaReactStorybookDecorator(Story: ComponentType) { charts: { theme: { useChartsBaseTheme: () => {}, - useChartsTheme: () => {}, }, activeCursor: () => {}, }, diff --git a/x-pack/plugins/observability/server/lib/rules/slo_burn_rate/executor.ts b/x-pack/plugins/observability/server/lib/rules/slo_burn_rate/executor.ts index 5c7c7c323a300..ddcd3b244dbb6 100644 --- a/x-pack/plugins/observability/server/lib/rules/slo_burn_rate/executor.ts +++ b/x-pack/plugins/observability/server/lib/rules/slo_burn_rate/executor.ts @@ -95,6 +95,10 @@ export const getRuleExecutor = ({ const results = await evaluate(esClient.asCurrentUser, slo, params, new Date(dateEnd)); if (results.length > 0) { + const alertLimit = alertFactory.alertLimit.getValue(); + let hasReachedLimit = false; + let scheduledActionsCount = 0; + for (const result of results) { const { instanceId, @@ -113,6 +117,11 @@ export const getRuleExecutor = ({ `/app/observability/slos/${slo.id}${urlQuery}` ); if (shouldAlert) { + if (scheduledActionsCount >= alertLimit) { + // need to set this so that warning is displayed in the UI and in the logs + hasReachedLimit = true; + break; // once limit is reached, we break out of the loop and don't schedule any more alerts + } const reason = buildReason( instanceId, windowDef.actionGroup, @@ -160,6 +169,7 @@ export const getRuleExecutor = ({ alert.scheduleActions(windowDef.actionGroup, context); alert.replaceState({ alertState: AlertStates.ALERT }); + scheduledActionsCount++; } } @@ -195,6 +205,7 @@ export const getRuleExecutor = ({ recoveredAlert.setContext(context); } + alertFactory.alertLimit.setLimitReached(hasReachedLimit); } return { state: {} }; diff --git a/x-pack/plugins/observability_ai_assistant/common/utils/concatenate_openai_chunks.ts b/x-pack/plugins/observability_ai_assistant/common/utils/concatenate_openai_chunks.ts index f15a193908a4e..e14b4cce868f1 100644 --- a/x-pack/plugins/observability_ai_assistant/common/utils/concatenate_openai_chunks.ts +++ b/x-pack/plugins/observability_ai_assistant/common/utils/concatenate_openai_chunks.ts @@ -7,10 +7,23 @@ import { cloneDeep } from 'lodash'; import { type Observable, scan } from 'rxjs'; -import { CreateChatCompletionResponseChunk, MessageRole } from '../types'; +import { type CreateChatCompletionResponseChunk, MessageRole } from '../types'; export const concatenateOpenAiChunks = - () => (source: Observable) => + () => + ( + source: Observable + ): Observable<{ + message: { + content: string; + role: MessageRole; + function_call: { + name: string; + arguments: string; + trigger: MessageRole.Assistant | MessageRole.User; + }; + }; + }> => source.pipe( scan( (acc, { choices }) => { diff --git a/x-pack/plugins/observability_ai_assistant/public/analytics/index.ts b/x-pack/plugins/observability_ai_assistant/public/analytics/index.ts new file mode 100644 index 0000000000000..c6b382f84db22 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/analytics/index.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { AnalyticsServiceSetup, AnalyticsServiceStart } from '@kbn/core-analytics-browser'; +import type { Message } from '../../common'; +import { + eventType as chatFeedbackEventType, + chatFeedbackEventSchema, + ChatFeedback, +} from './schemas/chat_feedback'; +import { + eventType as insightFeedbackEventType, + insightFeedbackEventSchema, + InsightFeedback, +} from './schemas/insight_feedback'; +import { + eventType as userSentPromptEventType, + userSentPromptEventSchema, +} from './schemas/user_sent_prompt'; + +const schemas = [chatFeedbackEventSchema, insightFeedbackEventSchema, userSentPromptEventSchema]; + +export const TELEMETRY = { + [chatFeedbackEventType]: chatFeedbackEventType, + [insightFeedbackEventType]: insightFeedbackEventType, + [userSentPromptEventType]: userSentPromptEventType, +} as const; + +export type TelemetryEventTypeWithPayload = + | { type: typeof chatFeedbackEventType; payload: ChatFeedback } + | { type: typeof insightFeedbackEventType; payload: InsightFeedback } + | { type: typeof userSentPromptEventType; payload: Message }; + +export const registerTelemetryEventTypes = (analytics: AnalyticsServiceSetup) => { + schemas.forEach((schema) => { + analytics.registerEventType<{}>(schema); + }); +}; + +export function sendEvent( + analytics: AnalyticsServiceStart, + eventType: TelemetryEventTypeWithPayload +): void { + analytics.reportEvent(eventType.type, eventType.payload); +} diff --git a/x-pack/plugins/observability_ai_assistant/public/analytics/schema.ts b/x-pack/plugins/observability_ai_assistant/public/analytics/schema.ts deleted file mode 100644 index 400225b22baef..0000000000000 --- a/x-pack/plugins/observability_ai_assistant/public/analytics/schema.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { RootSchema } from '@kbn/analytics-client'; -import { Message } from '../../common'; -import type { Feedback } from '../components/feedback_buttons'; - -export const MESSAGE_FEEDBACK = 'observability_ai_assistant_chat_message_feedback' as const; -export const INSIGHT_FEEDBACK = 'observability_ai_assistant_chat_insight_feedback' as const; - -export interface MessageFeedback extends Message { - feedback: Feedback; -} - -export interface TelemetryEvent { - eventType: typeof MESSAGE_FEEDBACK | typeof INSIGHT_FEEDBACK; - schema: RootSchema; -} - -export const MESSAGE_FEEDBACK_SCHEMA: TelemetryEvent = { - eventType: MESSAGE_FEEDBACK, - schema: { - '@timestamp': { - type: 'text', - _meta: { - description: 'The timestamp of the message.', - }, - }, - feedback: { - type: 'text', - _meta: { - description: 'Whether the user has deemed this response useful or not', - }, - }, - message: { - properties: { - content: { - type: 'text', - _meta: { - description: 'The response generated by the LLM.', - optional: true, - }, - }, - name: { - type: 'text', - _meta: { - description: 'The name of the function that was executed.', - optional: true, - }, - }, - role: { - type: 'text', - _meta: { - description: 'The actor that generated the response.', - }, - }, - data: { - type: 'text', - _meta: { - description: '', - optional: true, - }, - }, - function_call: { - properties: { - name: { - type: 'text', - _meta: { - description: 'The name of the function that was executed.', - optional: false, - }, - }, - arguments: { - type: 'text', - _meta: { - description: 'The arguments that were used when executing the function.', - optional: true, - }, - }, - trigger: { - type: 'text', - _meta: { - description: 'The actor which triggered the execution of this function.', - }, - }, - }, - }, - }, - }, - }, -}; diff --git a/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/chat_feedback.ts b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/chat_feedback.ts new file mode 100644 index 0000000000000..cd302ef68e755 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/chat_feedback.ts @@ -0,0 +1,122 @@ +/* + * Copyright 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 { EventTypeOpts } from '@kbn/analytics-client'; +import type { Message, Conversation } from '../../../common'; +import type { Feedback } from '../../components/feedback_buttons'; +import { messageSchema } from './common'; + +export interface ChatFeedback { + messageWithFeedback: { + message: Message; + feedback: Feedback; + }; + conversation: Conversation; +} + +export const eventType = 'observability_ai_assistant_chat_feedback'; + +export const chatFeedbackEventSchema: EventTypeOpts = { + eventType, + schema: { + messageWithFeedback: { + properties: { + message: { + properties: messageSchema, + }, + feedback: { + type: 'text', + _meta: { + description: 'Whether the user has deemed this response useful or not', + }, + }, + }, + }, + conversation: { + properties: { + '@timestamp': { + type: 'text', + _meta: { + description: 'The timestamp of the conversation.', + }, + }, + user: { + properties: { + id: { + type: 'text', + _meta: { + description: 'The id of the user.', + optional: true, + }, + }, + name: { + type: 'text', + _meta: { + description: 'The name of the user.', + }, + }, + }, + }, + conversation: { + properties: { + id: { + type: 'text', + _meta: { + description: 'The id of the conversation.', + }, + }, + title: { + type: 'text', + _meta: { + description: 'The title of the conversation.', + }, + }, + last_updated: { + type: 'text', + _meta: { + description: 'The timestamp of the last message in the conversation.', + }, + }, + }, + }, + messages: { + type: 'array', + items: { + properties: messageSchema, + }, + _meta: { + description: 'The messages in the conversation.', + }, + }, + labels: { + type: 'pass_through', + _meta: { + description: 'The labels of the conversation.', + }, + }, + numeric_labels: { + type: 'pass_through', + _meta: { + description: 'The numeric labels of the conversation.', + }, + }, + namespace: { + type: 'text', + _meta: { + description: 'The namespace of the conversation.', + }, + }, + public: { + type: 'boolean', + _meta: { + description: 'Whether the conversation is public or not.', + }, + }, + }, + }, + }, +}; diff --git a/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/common.ts b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/common.ts new file mode 100644 index 0000000000000..3c4d4ee0c75e0 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/common.ts @@ -0,0 +1,77 @@ +/* + * Copyright 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 { RootSchema } from '@kbn/analytics-client'; +import type { Message } from '../../../common'; + +export const messageSchema: RootSchema = { + '@timestamp': { + type: 'text', + _meta: { + description: 'The timestamp of the message.', + }, + }, + message: { + properties: { + content: { + type: 'text', + _meta: { + description: 'The response generated by the LLM.', + optional: true, + }, + }, + name: { + type: 'text', + _meta: { + description: 'The name of the function that was executed.', + optional: true, + }, + }, + role: { + type: 'text', + _meta: { + description: 'The actor that generated the response.', + }, + }, + data: { + type: 'text', + _meta: { + description: '', + optional: true, + }, + }, + function_call: { + _meta: { + description: 'The function call that was executed.', + optional: true, + }, + properties: { + name: { + type: 'text', + _meta: { + description: 'The name of the function that was executed.', + optional: false, + }, + }, + arguments: { + type: 'text', + _meta: { + description: 'The arguments that were used when executing the function.', + optional: true, + }, + }, + trigger: { + type: 'text', + _meta: { + description: 'The actor which triggered the execution of this function.', + }, + }, + }, + }, + }, + }, +}; diff --git a/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/insight_feedback.ts b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/insight_feedback.ts new file mode 100644 index 0000000000000..5142beaa216a2 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/insight_feedback.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 { EventTypeOpts } from '@kbn/analytics-client'; +import type { Message } from '../../../common'; +import type { Feedback } from '../../components/feedback_buttons'; +import { messageSchema } from './common'; + +export interface InsightFeedback { + feedback: Feedback; + message: Message; +} + +export const eventType = 'observability_ai_assistant_insight_feedback'; + +export const insightFeedbackEventSchema: EventTypeOpts = { + eventType, + schema: { + feedback: { + type: 'text', + _meta: { + description: 'Whether the user has deemed this response useful or not', + }, + }, + message: { + properties: messageSchema, + }, + }, +}; diff --git a/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/user_sent_prompt.ts b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/user_sent_prompt.ts new file mode 100644 index 0000000000000..4d24dd146573d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/analytics/schemas/user_sent_prompt.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EventTypeOpts } from '@kbn/analytics-client'; +import type { Message } from '../../../common'; +import { messageSchema } from './common'; + +export const eventType = 'observability_ai_assistant_user_sent_prompt_in_chat'; +export const userSentPromptEventSchema: EventTypeOpts = { + eventType, + schema: messageSchema, +}; diff --git a/x-pack/plugins/observability_ai_assistant/public/application.tsx b/x-pack/plugins/observability_ai_assistant/public/application.tsx index 9ae03a3d72f6a..15ed0243bd921 100644 --- a/x-pack/plugins/observability_ai_assistant/public/application.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/application.tsx @@ -42,6 +42,7 @@ export function Application({ ) : ( - + )} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/buttons/ask_assistant_button.tsx b/x-pack/plugins/observability_ai_assistant/public/components/buttons/ask_assistant_button.tsx index f3ac2d2a735ad..e13ba34110434 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/buttons/ask_assistant_button.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/buttons/ask_assistant_button.tsx @@ -85,7 +85,7 @@ export function AskAssistantButton({ { + toggleActionsMenu(); + handleNavigateToSettings(); + }, + }, { name: (
@@ -86,15 +95,6 @@ export function ChatActionsMenu({ ), panel: 1, }, - { - name: i18n.translate('xpack.observabilityAiAssistant.chatHeader.actions.settings', { - defaultMessage: 'AI Assistant Settings', - }), - onClick: () => { - toggleActionsMenu(); - handleNavigateToSettings(); - }, - }, { name: i18n.translate( 'xpack.observabilityAiAssistant.chatHeader.actions.knowledgeBase', diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_body.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_body.tsx index cf3b57e3ebed6..60aa56c15dda8 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_body.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_body.tsx @@ -5,44 +5,48 @@ * 2.0. */ +import React, { useEffect, useRef, useState } from 'react'; +import { css, keyframes } from '@emotion/css'; import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, - EuiLoadingSpinner, EuiPanel, EuiSpacer, } from '@elastic/eui'; -import { css } from '@emotion/css'; import type { AuthenticatedUser } from '@kbn/security-plugin/common'; import { euiThemeVars } from '@kbn/ui-theme'; -import React, { useEffect, useRef, useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { Conversation, Message, MessageRole } from '../../../common/types'; import { ChatState } from '../../hooks/use_chat'; import { useConversation } from '../../hooks/use_conversation'; -import type { UseGenAIConnectorsResult } from '../../hooks/use_genai_connectors'; -import type { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; import { useLicense } from '../../hooks/use_license'; import { useObservabilityAIAssistantChatService } from '../../hooks/use_observability_ai_assistant_chat_service'; -import { StartedFrom } from '../../utils/get_timeline_items_from_conversation'; +import type { UseGenAIConnectorsResult } from '../../hooks/use_genai_connectors'; +import type { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; +import { type Conversation, type Message, MessageRole } from '../../../common/types'; import { ChatHeader } from './chat_header'; import { ChatPromptEditor } from './chat_prompt_editor'; import { ChatTimeline } from './chat_timeline'; +import { Feedback } from '../feedback_buttons'; import { IncorrectLicensePanel } from './incorrect_license_panel'; -import { InitialSetupPanel } from './initial_setup_panel'; -import { ChatActionClickType } from './types'; +import { WelcomeMessage } from './welcome_message'; import { EMPTY_CONVERSATION_TITLE } from '../../i18n'; -import { Feedback } from '../feedback_buttons'; -import { MESSAGE_FEEDBACK } from '../../analytics/schema'; +import { ChatActionClickType } from './types'; +import type { StartedFrom } from '../../utils/get_timeline_items_from_conversation'; +import { TELEMETRY, sendEvent } from '../../analytics'; + +const fullHeightClassName = css` + height: 100%; +`; const timelineClassName = css` overflow-y: auto; `; -const loadingSpinnerContainerClassName = css` - align-self: center; +const promptEditorClassname = css` + overflow: hidden; + transition: height ${euiThemeVars.euiAnimSpeedFast} ${euiThemeVars.euiAnimSlightResistance}; `; const incorrectLicenseContainer = css` @@ -54,6 +58,29 @@ const chatBodyContainerClassNameWithError = css` align-self: center; `; +const promptEditorContainerClassName = css` + padding-top: 12px; + padding-bottom: 8px; +`; + +const fadeInAnimation = keyframes` + from { + opacity: 0; + transform: scale(0.9); + } + to { + opacity: 1; + transform: scale(1); + } +`; + +const animClassName = css` + height: 100%; + opacity: 0; + animation: ${fadeInAnimation} ${euiThemeVars.euiAnimSpeedNormal} + ${euiThemeVars.euiAnimSlightBounce} ${euiThemeVars.euiAnimSpeedNormal} forwards; +`; + export function ChatBody({ initialTitle, initialMessages, @@ -113,8 +140,15 @@ export function ChatBody({ parent.scrollTop + parent.clientHeight >= parent.scrollHeight; const handleFeedback = (message: Message, feedback: Feedback) => { - const feedbackEvent = { ...message, feedback }; - chatService.analytics.reportEvent(MESSAGE_FEEDBACK, feedbackEvent); + if (conversation.value?.conversation && 'user' in conversation.value) { + sendEvent(chatService.analytics, { + type: TELEMETRY.observability_ai_assistant_chat_feedback, + payload: { + messageWithFeedback: { message, feedback }, + conversation: conversation.value, + }, + }); + } }; useEffect(() => { @@ -169,92 +203,104 @@ export function ChatBody({ onSubmit={(message) => { next(messages.concat(message)); }} + onSendTelemetry={(eventWithPayload) => + sendEvent(chatService.analytics, eventWithPayload) + } /> ); - } else if ( - connectors.loading || - knowledgeBase.status.loading || - (!conversation.value && conversation.loading) - ) { - footer = ( - - - - ); - } else if (connectors.connectors?.length === 0 && !initialConversationId) { - footer = ( - - ); + } else if (!conversation.value && conversation.loading) { + footer = null; } else { footer = ( <> -
- - { - const indexOf = messages.indexOf(editedMessage); - next(messages.slice(0, indexOf).concat(newMessage)); - }} - onFeedback={handleFeedback} - onRegenerate={(message) => { - const indexOf = messages.indexOf(message); - next(messages.slice(0, indexOf)); - }} - onStopGenerating={() => { - stop(); - }} - onActionClick={(payload) => { - setStickToBottom(true); - switch (payload.type) { - case ChatActionClickType.executeEsqlQuery: - next( - messages.concat({ - '@timestamp': new Date().toISOString(), - message: { - role: MessageRole.Assistant, - content: '', - function_call: { - name: 'execute_query', - arguments: JSON.stringify({ - query: payload.query, - }), - trigger: MessageRole.User, - }, - }, - }) - ); - break; +
+ + {connectors.connectors?.length === 0 || messages.length === 1 ? ( + + ) : ( + { + const indexOf = messages.indexOf(editedMessage); + next(messages.slice(0, indexOf).concat(newMessage)); + }} + onFeedback={handleFeedback} + onRegenerate={(message) => { + const indexOf = messages.indexOf(message); + next(messages.slice(0, indexOf)); + }} + onSendTelemetry={(eventWithPayload) => + sendEvent(chatService.analytics, eventWithPayload) } - }} - /> + onStopGenerating={() => { + stop(); + }} + onActionClick={(payload) => { + setStickToBottom(true); + switch (payload.type) { + case ChatActionClickType.executeEsqlQuery: + next( + messages.concat({ + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.Assistant, + content: '', + function_call: { + name: 'execute_query', + arguments: JSON.stringify({ + query: payload.query, + }), + trigger: MessageRole.User, + }, + }, + }) + ); + break; + } + }} + /> + )}
- + + - - - + + sendEvent(chatService.analytics, eventWithPayload) + } onSubmit={(message) => { setStickToBottom(true); return next(messages.concat(message)); diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_consolidated_items.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_consolidated_items.tsx index 7668c5d0df7ad..82480fe867f2d 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_consolidated_items.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_consolidated_items.tsx @@ -49,18 +49,20 @@ const noPanelStyle = css` export function ChatConsolidatedItems({ consolidatedItem, + onActionClick, + onEditSubmit, onFeedback, onRegenerate, - onEditSubmit, + onSendTelemetry, onStopGenerating, - onActionClick, }: { consolidatedItem: ChatTimelineItem[]; + onActionClick: ChatTimelineProps['onActionClick']; + onEditSubmit: ChatTimelineProps['onEdit']; onFeedback: ChatTimelineProps['onFeedback']; onRegenerate: ChatTimelineProps['onRegenerate']; - onEditSubmit: ChatTimelineProps['onEdit']; + onSendTelemetry: ChatTimelineProps['onSendTelemetry']; onStopGenerating: ChatTimelineProps['onStopGenerating']; - onActionClick: ChatTimelineProps['onActionClick']; }) { const [expanded, setExpanded] = useState(false); @@ -122,15 +124,16 @@ export function ChatConsolidatedItems({ // use index, not id to prevent unmounting of component when message is persisted key={index} {...item} + onActionClick={onActionClick} + onEditSubmit={(message) => onEditSubmit(item.message, message)} onFeedbackClick={(feedback) => { onFeedback(item.message, feedback); }} onRegenerateClick={() => { onRegenerate(item.message); }} - onEditSubmit={(message) => onEditSubmit(item.message, message)} + onSendTelemetry={onSendTelemetry} onStopGeneratingClick={onStopGenerating} - onActionClick={onActionClick} /> )) : null} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx index 6c56ca5ab3ef9..babc7ec0f632c 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_flyout.tsx @@ -39,11 +39,12 @@ export function ChatFlyout({ startedFrom: StartedFrom; onClose: () => void; }) { - const { euiTheme } = useEuiTheme(); const { services: { http }, } = useKibana(); + const { euiTheme } = useEuiTheme(); + const currentUser = useCurrentUser(); const connectors = useGenAIConnectors(); @@ -54,6 +55,12 @@ export function ChatFlyout({ const [conversationId, setConversationId] = useState(undefined); + const conversationsHeaderClassName = css` + padding-top: 12px; + padding-bottom: 12px; + border-bottom: solid 1px ${euiTheme.border.color}; + `; + return isOpen ? ( {conversationId ? ( (null); return ( - + {loading ? : } diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item.tsx index e421537edc781..55e8d8610ee53 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item.tsx @@ -21,17 +21,19 @@ import { ChatItemContentInlinePromptEditor } from './chat_item_content_inline_pr import { ChatItemControls } from './chat_item_controls'; import { ChatTimelineItem } from './chat_timeline'; import { getRoleTranslation } from '../../utils/get_role_translation'; -import type { Feedback } from '../feedback_buttons'; -import { Message } from '../../../common'; import { FailedToLoadResponse } from '../message_panel/failed_to_load_response'; -import { ChatActionClickHandler } from './types'; +import type { Message } from '../../../common'; +import type { Feedback } from '../feedback_buttons'; +import type { ChatActionClickHandler } from './types'; +import type { TelemetryEventTypeWithPayload } from '../../analytics'; export interface ChatItemProps extends ChatTimelineItem { + onActionClick: ChatActionClickHandler; onEditSubmit: (message: Message) => void; onFeedbackClick: (feedback: Feedback) => void; onRegenerateClick: () => void; + onSendTelemetry: (eventWithPayload: TelemetryEventTypeWithPayload) => void; onStopGeneratingClick: () => void; - onActionClick: ChatActionClickHandler; } const normalMessageClassName = css` @@ -66,21 +68,22 @@ const noPanelMessageClassName = css` export function ChatItem({ actions: { canCopy, canEdit, canGiveFeedback, canRegenerate }, - display: { collapsed }, - message: { - message: { function_call: functionCall, role }, - }, content, currentUser, + display: { collapsed }, element, error, loading, + message: { + message: { function_call: functionCall, role }, + }, title, + onActionClick, onEditSubmit, onFeedbackClick, onRegenerateClick, + onSendTelemetry, onStopGeneratingClick, - onActionClick, }: ChatItemProps) { const accordionId = useGeneratedHtmlId({ prefix: 'chat' }); @@ -130,6 +133,7 @@ export function ChatItem({ loading={loading} onSubmit={handleInlineEditSubmit} onActionClick={onActionClick} + onSendTelemetry={onSendTelemetry} /> ) : null; diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_content_inline_prompt_editor.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_content_inline_prompt_editor.tsx index 4f702eed2e16d..cd2693f26a803 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_content_inline_prompt_editor.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_content_inline_prompt_editor.tsx @@ -8,8 +8,9 @@ import React from 'react'; import { MessageText } from '../message_panel/message_text'; import { ChatPromptEditor } from './chat_prompt_editor'; -import { MessageRole, type Message } from '../../../common'; -import { ChatActionClickHandler } from './types'; +import { type Message, MessageRole } from '../../../common'; +import type { ChatActionClickHandler } from './types'; +import type { TelemetryEventTypeWithPayload } from '../../analytics'; interface Props { content: string | undefined; @@ -22,16 +23,18 @@ interface Props { | undefined; loading: boolean; editing: boolean; - onSubmit: (message: Message) => void; onActionClick: ChatActionClickHandler; + onSendTelemetry: (eventWithPayload: TelemetryEventTypeWithPayload) => void; + onSubmit: (message: Message) => void; } export function ChatItemContentInlinePromptEditor({ content, functionCall, editing, loading, - onSubmit, onActionClick, + onSendTelemetry, + onSubmit, }: Props) { return !editing ? ( @@ -44,6 +47,7 @@ export function ChatItemContentInlinePromptEditor({ initialSelectedFunctionName={functionCall?.name} trigger={functionCall?.trigger} onSubmit={onSubmit} + onSendTelemetry={onSendTelemetry} /> ); } diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_controls.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_controls.tsx index 74eeb184cb5c7..d828b0330d69c 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_controls.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_item_controls.tsx @@ -46,14 +46,14 @@ export function ChatItemControls({ controls = ; } else if (displayFeedback || displayRegenerate) { controls = ( - + {displayFeedback ? ( ) : null} {displayRegenerate ? ( - + ) : null} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_prompt_editor.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_prompt_editor.tsx index f34288d5755e6..fc4db6e20378e 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_prompt_editor.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_prompt_editor.tsx @@ -5,6 +5,8 @@ * 2.0. */ +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiButtonIcon, @@ -16,12 +18,11 @@ import { EuiTextArea, keys, } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { CodeEditor } from '@kbn/kibana-react-plugin/public'; -import React, { useCallback, useEffect, useRef, useState } from 'react'; import { MessageRole, type Message } from '../../../common'; -import { useJsonEditorModel } from '../../hooks/use_json_editor_model'; import { FunctionListPopover } from './function_list_popover'; +import { useJsonEditorModel } from '../../hooks/use_json_editor_model'; +import { TelemetryEventTypeWithPayload, TELEMETRY } from '../../analytics'; export interface ChatPromptEditorProps { disabled: boolean; @@ -31,6 +32,7 @@ export interface ChatPromptEditorProps { initialFunctionPayload?: string; trigger?: MessageRole; onSubmit: (message: Message) => void; + onSendTelemetry: (eventWithPayload: TelemetryEventTypeWithPayload) => void; } export function ChatPromptEditor({ @@ -40,6 +42,7 @@ export function ChatPromptEditor({ initialSelectedFunctionName, initialFunctionPayload, onSubmit, + onSendTelemetry, }: ChatPromptEditorProps) { const isFocusTrapEnabled = Boolean(initialPrompt); @@ -112,9 +115,11 @@ export function ChatPromptEditor({ setFunctionPayload(undefined); handleResetTextArea(); + let message: Message; + try { if (selectedFunctionName) { - await onSubmit({ + message = { '@timestamp': new Date().toISOString(), message: { role: MessageRole.Assistant, @@ -125,20 +130,27 @@ export function ChatPromptEditor({ arguments: currentPayload, }, }, - }); + }; + onSubmit(message); setFunctionPayload(undefined); setSelectedFunctionName(undefined); } else { - await onSubmit({ + message = { '@timestamp': new Date().toISOString(), message: { role: MessageRole.User, content: currentPrompt }, - }); + }; + onSubmit(message); } + + onSendTelemetry({ + type: TELEMETRY.observability_ai_assistant_user_sent_prompt_in_chat, + payload: message, + }); } catch (_) { setPrompt(currentPrompt); } - }, [functionPayload, loading, onSubmit, prompt, selectedFunctionName]); + }, [functionPayload, loading, onSendTelemetry, onSubmit, prompt, selectedFunctionName]); useEffect(() => { setFunctionPayload(initialJsonString); diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.stories.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.stories.tsx index 58b787fb15511..cb7e9366ea923 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.stories.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.stories.tsx @@ -119,11 +119,12 @@ const defaultProps: ComponentProps = { }, }), ], + onActionClick: async () => {}, onEdit: async () => {}, onFeedback: () => {}, onRegenerate: () => {}, + onSendTelemetry: () => {}, onStopGenerating: () => {}, - onActionClick: async () => {}, }; export const ChatTimeline = Template.bind({}); diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.tsx index 065208695349d..8b1067064e20c 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_timeline.tsx @@ -9,19 +9,19 @@ import React, { ReactNode, useMemo } from 'react'; import { css } from '@emotion/css'; import { EuiCommentList } from '@elastic/eui'; import type { AuthenticatedUser } from '@kbn/security-plugin/common'; -import { ChatItem } from './chat_item'; -import { ChatWelcomePanel } from './chat_welcome_panel'; -import { ChatConsolidatedItems } from './chat_consolidated_items'; import type { Feedback } from '../feedback_buttons'; -import { type Message } from '../../../common'; +import type { Message } from '../../../common'; import type { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; import type { ChatActionClickHandler } from './types'; +import type { ObservabilityAIAssistantChatService } from '../../types'; +import type { TelemetryEventTypeWithPayload } from '../../analytics'; +import { ChatItem } from './chat_item'; +import { ChatConsolidatedItems } from './chat_consolidated_items'; +import { ChatState } from '../../hooks/use_chat'; import { getTimelineItemsfromConversation, StartedFrom, } from '../../utils/get_timeline_items_from_conversation'; -import { ObservabilityAIAssistantChatService } from '../../types'; -import { ChatState } from '../../hooks/use_chat'; export interface ChatTimelineItem extends Pick { @@ -55,13 +55,13 @@ export interface ChatTimelineProps { onEdit: (message: Message, messageAfterEdit: Message) => void; onFeedback: (message: Message, feedback: Feedback) => void; onRegenerate: (message: Message) => void; + onSendTelemetry: (eventWithPayload: TelemetryEventTypeWithPayload) => void; onStopGenerating: () => void; onActionClick: ChatActionClickHandler; } export function ChatTimeline({ messages, - knowledgeBase, chatService, hasConnector, currentUser, @@ -69,6 +69,7 @@ export function ChatTimeline({ onEdit, onFeedback, onRegenerate, + onSendTelemetry, onStopGenerating, onActionClick, chatState, @@ -107,44 +108,42 @@ export function ChatTimeline({ return ( - {items.length <= 1 ? ( - - ) : ( - items.map((item, index) => { - return Array.isArray(item) ? ( - - ) : ( - { - onFeedback(item.message, feedback); - }} - onRegenerateClick={() => { - onRegenerate(item.message); - }} - onEditSubmit={(message) => { - onEdit(item.message, message); - }} - onStopGeneratingClick={onStopGenerating} - onActionClick={onActionClick} - /> - ); - }) - )} + {items.map((item, index) => { + return Array.isArray(item) ? ( + + ) : ( + { + onFeedback(item.message, feedback); + }} + onRegenerateClick={() => { + onRegenerate(item.message); + }} + onEditSubmit={(message) => { + onEdit(item.message, message); + }} + onSendTelemetry={onSendTelemetry} + onStopGeneratingClick={onStopGenerating} + /> + ); + })} ); } diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_welcome_panel.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_welcome_panel.tsx deleted file mode 100644 index 141551b511cb5..0000000000000 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/chat_welcome_panel.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiButton, EuiFlexGroup, EuiPanel } from '@elastic/eui'; -import { css } from '@emotion/css'; -import { i18n } from '@kbn/i18n'; -import { euiThemeVars } from '@kbn/ui-theme'; -import { Disclaimer } from './disclaimer'; -import type { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; - -const incorrectLicenseContainer = css` - height: 100%; - padding: ${euiThemeVars.euiPanelPaddingModifiers.paddingMedium}; -`; - -export function ChatWelcomePanel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBaseResult }) { - return ( - - - - - {!knowledgeBase.status.value?.ready ? ( - - {i18n.translate( - 'xpack.observabilityAiAssistant.chatWelcomePanel.knowledgeBase.buttonLabel.notInstalledYet', - { - defaultMessage: 'Set up knowledge base', - } - )} - - ) : null} - - - ); -} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/disclaimer.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/disclaimer.tsx index f92ea0d5913cc..e4eb5176469de 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/disclaimer.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/disclaimer.tsx @@ -6,27 +6,21 @@ */ import React from 'react'; -import { EuiImage, EuiText, EuiTitle } from '@elastic/eui'; +import { EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import ctaImage from '../../assets/elastic_ai_assistant.png'; export function Disclaimer() { return ( - <> - - -

- {i18n.translate('xpack.observabilityAiAssistant.disclaimer.title', { - defaultMessage: 'Welcome to the Elastic AI Assistant for Observability', - })} -

-
- - {i18n.translate('xpack.observabilityAiAssistant.disclaimer.thisChatIsPoweredTextLabel', { - defaultMessage: - 'This chat is powered by an integration with your LLM provider. LLMs are known to produce hallucinations. Elastic supports the configuration and connection to the LLM provider and to your Knowledge base, but is not responsible for the LLM responses.', - })} - - + + {i18n.translate('xpack.observabilityAiAssistant.disclaimer.disclaimerLabel', { + defaultMessage: + "This chat is powered by an integration with your LLM provider. LLMs are known to sometimes present incorrect information as if it's correct. Elastic supports configuration and connection to the LLM provider and your knowledge base, but is not responsible for the LLM's responses.", + })} + ); } diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/initial_setup_panel.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/initial_setup_panel.tsx deleted file mode 100644 index 28c33d2b79699..0000000000000 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/initial_setup_panel.tsx +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useState } from 'react'; -import { - EuiBetaBadge, - EuiButton, - EuiCard, - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiPanel, - EuiSpacer, - EuiText, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import type { ActionConnector } from '@kbn/triggers-actions-ui-plugin/public'; -import { ConnectorSelectorBase } from '../connector_selector/connector_selector_base'; -import { Disclaimer } from './disclaimer'; -import { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; -import { StartedFrom } from '../../utils/get_timeline_items_from_conversation'; -import { useKibana } from '../../hooks/use_kibana'; -import type { UseGenAIConnectorsResult } from '../../hooks/use_genai_connectors'; - -export function InitialSetupPanel({ - connectors, - startedFrom, -}: { - connectors: UseGenAIConnectorsResult; - connectorsManagementHref: string; - knowledgeBase: UseKnowledgeBaseResult; - startedFrom?: StartedFrom; -}) { - const [connectorFlyoutOpen, setConnectorFlyoutOpen] = useState(false); - - const { - application: { navigateToApp, capabilities }, - triggersActionsUi: { getAddConnectorFlyout: ConnectorFlyout }, - } = useKibana().services; - - const handleConnectorClick = () => { - if (capabilities.management?.insightsAndAlerting?.triggersActions) { - setConnectorFlyoutOpen(true); - } else { - navigateToApp('management', { - path: '/insightsAndAlerting/triggersActionsConnectors/connectors', - }); - } - }; - - const onConnectorCreated = (createdConnector: ActionConnector) => { - setConnectorFlyoutOpen(false); - - if (createdConnector.actionTypeId === '.gen-ai') { - connectors.reloadConnectors(); - } - }; - - return ( - <> - - - - - - - {i18n.translate('xpack.observabilityAiAssistant.initialSetupPanel.title', { - defaultMessage: 'Start your Al experience with Elastic by completing the steps below.', - })} - - - - - - - } - title={i18n.translate( - 'xpack.observabilityAiAssistant.initialSetupPanel.setupConnector.title', - { - defaultMessage: 'Connector setup', - } - )} - description={ - !connectors.connectors?.length ? ( - <> - - {i18n.translate( - 'xpack.observabilityAiAssistant.initialSetupPanel.setupConnector.description1', - { - defaultMessage: 'Set up an OpenAI connector with your AI provider.', - } - )} - - - - {i18n.translate( - 'xpack.observabilityAiAssistant.initialSetupPanel.setupConnector.description2', - { - defaultMessage: - 'The OpenAI model needs to support function calls. We strongly recommend using GPT4.', - } - )} - - - - ) : connectors.connectors.length && !connectors.selectedConnector ? ( - - {i18n.translate( - 'xpack.observabilityAiAssistant.initialSetupPanel.setupConnector.description', - { - defaultMessage: 'Please select a provider.', - } - )} - - ) : undefined - } - footer={ - !connectors.connectors?.length ? ( - - {i18n.translate( - 'xpack.observabilityAiAssistant.initialSetupPanel.setupConnector.buttonLabel', - { - defaultMessage: 'Set up OpenAI connector', - } - )} - - ) : connectors.connectors.length && !connectors.selectedConnector ? ( - - ) : null - } - /> - - - - - - - {i18n.translate('xpack.observabilityAiAssistant.initialSetupPanel.disclaimer', { - defaultMessage: - 'The AI provider that is configured may collect telemetry when using the Elastic AI Assistant. Contact your AI provider for information on how data is collected.', - })} - - - - {connectorFlyoutOpen ? ( - setConnectorFlyoutOpen(false)} - onConnectorCreated={onConnectorCreated} - /> - ) : null} - - ); -} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message.test.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message.test.tsx new file mode 100644 index 0000000000000..ce18f0fb0878d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message.test.tsx @@ -0,0 +1,355 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { act, fireEvent, render as rtlRender } from '@testing-library/react'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import { waitForEuiPopoverClose, waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; +import { WelcomeMessage } from './welcome_message'; +import { useKibana } from '../../hooks/use_kibana'; +import type { + MlDeploymentAllocationState, + MlDeploymentState, +} from '@elastic/elasticsearch/lib/api/types'; + +jest.mock('../../hooks/use_kibana'); + +const useKibanaMock = useKibana as jest.Mock; +const navigateToApp = jest.fn(); + +const reloadConnectors = jest.fn(); +const selectConnector = jest.fn(); +const install = jest.fn().mockResolvedValue(undefined); +const refresh = jest.fn(); + +const baseKnowledgeBase = { + install, +}; + +const emptyKnowledgeBase = { + ...baseKnowledgeBase, + status: { value: { ready: false }, loading: false, refresh }, + isInstalling: false, + installError: undefined, +}; + +const installingKnowledgeBase = { + ...baseKnowledgeBase, + status: { value: { ready: false }, loading: false, refresh }, + isInstalling: true, + installError: undefined, +}; + +const loadingKnowledgeBase = { + ...baseKnowledgeBase, + status: { value: { ready: false }, loading: true, refresh }, + isInstalling: false, + installError: undefined, +}; + +const installedKnowledgeBase = { + ...baseKnowledgeBase, + status: { + value: { + ready: true, + model_name: 'foo', + deployment_state: 'started' as MlDeploymentState, + allocation_state: 'allocated' as MlDeploymentAllocationState, + }, + loading: false, + refresh, + }, + isInstalling: false, + installError: undefined, +}; + +const baseConnectors = { + reloadConnectors, + selectConnector, + loading: false, +}; + +const emptyConnectors = { + ...baseConnectors, + connectors: [], +}; + +const filledConnectors = { + ...baseConnectors, + connectors: [ + { + id: 'test', + actionTypeId: 'test', + name: 'test', + referencedByCount: 0, + isPreconfigured: false, + isDeprecated: false, + isSystemAction: false, + }, + ], +}; + +const render = (component: React.ReactElement) => { + return rtlRender({component}); +}; + +describe('Welcome Message', () => { + beforeEach(() => { + useKibanaMock.mockReturnValue({ + services: { + application: { navigateToApp, capabilities: {} }, + http: { basePath: { prepend: jest.fn((path: string) => `/${path}`) } }, + triggersActionsUi: { + getAddConnectorFlyout: () => , + }, + }, + }); + }); + + describe('when no connectors are available', () => { + it('should show a disclaimer', () => { + const { getByTestId } = render( + + ); + + expect(getByTestId('observabilityAiAssistantDisclaimer')).toBeInTheDocument(); + }); + + it('should show a set up connector button', () => { + const { getByTestId } = render( + + ); + + expect( + getByTestId('observabilityAiAssistantInitialSetupPanelSetUpGenerativeAiConnectorButton') + ).toBeInTheDocument(); + }); + + describe('when no triggersactionsUi capabilities are available', () => { + it('should navigate to stack management', () => { + const { getByTestId } = render( + + ); + + fireEvent.click( + getByTestId('observabilityAiAssistantInitialSetupPanelSetUpGenerativeAiConnectorButton') + ); + + expect(navigateToApp).toHaveBeenCalledWith('management', { + path: '/insightsAndAlerting/triggersActionsConnectors/connectors', + }); + }); + }); + + describe('when triggersactionsUi capabilities are available', () => { + beforeEach(() => { + useKibanaMock.mockReturnValue({ + services: { + application: { + navigateToApp, + capabilities: { + management: { + insightsAndAlerting: { + triggersActions: true, + }, + }, + }, + }, + triggersActionsUi: { + getAddConnectorFlyout: () => , + }, + }, + }); + }); + + it('should render a connector flyout when clicking the set up connector button', () => { + const { getByTestId } = render( + + ); + + fireEvent.click( + getByTestId('observabilityAiAssistantInitialSetupPanelSetUpGenerativeAiConnectorButton') + ); + + expect(getByTestId('connectorFlyout')).toBeInTheDocument(); + }); + + describe('when creating a new connector', () => { + // it('should call reloadConnectors and install knowledge base', () => { + // const { getByTestId } = render( + // + // ); + // fireEvent.click( + // getByTestId('observabilityAiAssistantInitialSetupPanelSetUpGenerativeAiConnectorButton') + // ); + // fireEvent.click(getByTestId('connectorFlyout')); + // expect(reloadConnectors).toHaveBeenCalled(); + // expect(install).toHaveBeenCalled(); + // }); + // it('should install the knowledge base', () => { + // const { getByTestId } = render( + // + // ); + // fireEvent.click( + // getByTestId('observabilityAiAssistantInitialSetupPanelSetUpGenerativeAiConnectorButton') + // ); + // fireEvent.click(getByTestId('connectorFlyout')); + // expect(install).toHaveBeenCalled(); + // }); + }); + }); + }); + + describe('when connectors are available', () => { + it('should show a disclaimer', () => { + const { getByTestId } = render( + + ); + + expect(getByTestId('observabilityAiAssistantDisclaimer')).toBeInTheDocument(); + }); + + describe('when knowledge base is not installed', () => { + it('should render the retry and inspect errors buttons', () => { + const { getByTestId } = render( + + ); + + expect( + getByTestId('observabilityAiAssistantWelcomeMessageSetUpKnowledgeBaseButton') + ).toBeInTheDocument(); + + expect( + getByTestId('observabilityAiAssistantWelcomeMessageInspectErrorsButton') + ).toBeInTheDocument(); + }); + + it('should call kb install when clicking retry', async () => { + const { getByTestId } = render( + + ); + + await act(async () => { + fireEvent.click( + getByTestId('observabilityAiAssistantWelcomeMessageSetUpKnowledgeBaseButton') + ); + expect(install).toBeCalled(); + }); + }); + + it('should render a popover with installation errors when clicking inspect', async () => { + const { getByTestId } = render( + + ); + + fireEvent.click(getByTestId('observabilityAiAssistantWelcomeMessageInspectErrorsButton')); + + await waitForEuiPopoverOpen(); + + expect( + getByTestId('observabilityAiAssistantWelcomeMessageKnowledgeBaseSetupErrorPanel') + ).toBeInTheDocument(); + + fireEvent.click( + getByTestId( + 'observabilityAiAssistantWelcomeMessageKnowledgeBaseSetupErrorPanelRetryInstallingLink' + ) + ); + + await waitForEuiPopoverClose(); + + expect(install).toBeCalled(); + }); + + it('should navigate to ML when clicking the link in the error popover', async () => { + const { getByTestId } = render( + + ); + + fireEvent.click(getByTestId('observabilityAiAssistantWelcomeMessageInspectErrorsButton')); + + await waitForEuiPopoverOpen(); + + const link = getByTestId('observabilityAiAssistantWelcomeMessageTrainedModelsLink'); + + expect(link).toHaveProperty('href', 'http://app/ml/trained_models'); + }); + }); + }); + + describe('when knowledge base is installing', () => { + it('should not show a failure message', () => { + const { queryByTestId } = render( + + ); + + expect( + queryByTestId('observabilityAiAssistantWelcomeMessageSetUpKnowledgeBaseButton') + ).not.toBeInTheDocument(); + + expect( + queryByTestId('observabilityAiAssistantWelcomeMessageInspectErrorsButton') + ).not.toBeInTheDocument(); + }); + + it('should show a disclaimer', () => { + const { getByTestId } = render( + + ); + + expect(getByTestId('observabilityAiAssistantDisclaimer')).toBeInTheDocument(); + }); + }); + + describe('when knowledge base is loading', () => { + it('should not show a failure message', () => { + const { queryByTestId } = render( + + ); + + expect( + queryByTestId('observabilityAiAssistantWelcomeMessageSetUpKnowledgeBaseButton') + ).not.toBeInTheDocument(); + + expect( + queryByTestId('observabilityAiAssistantWelcomeMessageInspectErrorsButton') + ).not.toBeInTheDocument(); + }); + + it('should show a disclaimer', () => { + const { getByTestId } = render( + + ); + + expect(getByTestId('observabilityAiAssistantDisclaimer')).toBeInTheDocument(); + }); + }); + + describe('when knowledge base is installed', () => { + it('should not show a failure message', () => { + const { queryByTestId } = render( + + ); + + expect( + queryByTestId('observabilityAiAssistantWelcomeMessageSetUpKnowledgeBaseButton') + ).not.toBeInTheDocument(); + + expect( + queryByTestId('observabilityAiAssistantWelcomeMessageInspectErrorsButton') + ).not.toBeInTheDocument(); + }); + + it('should show a disclaimer', () => { + const { getByTestId } = render( + + ); + + expect(getByTestId('observabilityAiAssistantDisclaimer')).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message.tsx new file mode 100644 index 0000000000000..afd9cbdf0e76e --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message.tsx @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { css } from '@emotion/css'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiImage, + EuiSpacer, + EuiTitle, + useCurrentEuiBreakpoint, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import type { ActionConnector } from '@kbn/triggers-actions-ui-plugin/public'; +import type { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; +import type { UseGenAIConnectorsResult } from '../../hooks/use_genai_connectors'; +import ctaImage from '../../assets/elastic_ai_assistant.png'; +import { Disclaimer } from './disclaimer'; +import { WelcomeMessageConnectors } from './welcome_message_connectors'; +import { WelcomeMessageKnowledgeBase } from './welcome_message_knowledge_base'; +import { useKibana } from '../../hooks/use_kibana'; + +const fullHeightClassName = css` + height: 100%; +`; + +const centerMaxWidthClassName = css` + max-width: 600px; + text-align: center; +`; + +export function WelcomeMessage({ + connectors, + knowledgeBase, +}: { + connectors: UseGenAIConnectorsResult; + knowledgeBase: UseKnowledgeBaseResult; +}) { + const breakpoint = useCurrentEuiBreakpoint(); + + const { + application: { navigateToApp, capabilities }, + triggersActionsUi: { getAddConnectorFlyout: ConnectorFlyout }, + } = useKibana().services; + + const [connectorFlyoutOpen, setConnectorFlyoutOpen] = useState(false); + + const handleConnectorClick = () => { + if (capabilities.management?.insightsAndAlerting?.triggersActions) { + setConnectorFlyoutOpen(true); + } else { + navigateToApp('management', { + path: '/insightsAndAlerting/triggersActionsConnectors/connectors', + }); + } + }; + + const onConnectorCreated = (createdConnector: ActionConnector) => { + setConnectorFlyoutOpen(false); + + if (createdConnector.actionTypeId === '.gen-ai') { + connectors.reloadConnectors(); + } + + if (!knowledgeBase.status.value || knowledgeBase.status.value?.ready === false) { + knowledgeBase.install(); + } + }; + + return ( + <> + + + + + + + + + +

+ {i18n.translate('xpack.observabilityAiAssistant.disclaimer.title', { + defaultMessage: 'Welcome to the AI Assistant for Observability', + })} +

+
+ + + + + + +
+ + + + + +
+ + {connectorFlyoutOpen ? ( + setConnectorFlyoutOpen(false)} + /> + ) : null} + + ); +} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_connectors.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_connectors.tsx new file mode 100644 index 0000000000000..314a1f853bb7a --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_connectors.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 { css, keyframes } from '@emotion/css'; +import { EuiBetaBadge, EuiButton, EuiSpacer, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { euiThemeVars } from '@kbn/ui-theme'; +import type { UseGenAIConnectorsResult } from '../../hooks/use_genai_connectors'; + +const fadeInAnimation = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +`; + +const fadeInClassName = css` + animation: ${fadeInAnimation} ${euiThemeVars.euiAnimSpeedNormal} ease-in-out; +`; + +export function WelcomeMessageConnectors({ + connectors, + onSetupConnectorClick, +}: { + connectors: UseGenAIConnectorsResult; + onSetupConnectorClick?: () => void; +}) { + return !connectors.loading && connectors.connectors?.length === 0 && onSetupConnectorClick ? ( +
+ + {i18n.translate( + 'xpack.observabilityAiAssistant.initialSetupPanel.setupConnector.description2', + { + defaultMessage: + 'Start working with the Elastic AI Assistant by setting up a connector for your AI provider. The OpenAI model needs to support function calls. We strongly recommend using GPT4.', + } + )} + + + + + +
+ + {i18n.translate( + 'xpack.observabilityAiAssistant.initialSetupPanel.setupConnector.buttonLabel', + { + defaultMessage: 'Set up GenAI connector', + } + )} + +
+
+ ) : null; +} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base.tsx new file mode 100644 index 0000000000000..849a07b7cabfc --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base.tsx @@ -0,0 +1,193 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect, useState } from 'react'; +import { noop } from 'lodash'; +import { i18n } from '@kbn/i18n'; +import { + EuiButton, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiPopover, + EuiSpacer, + EuiText, +} from '@elastic/eui'; +import usePrevious from 'react-use/lib/usePrevious'; +import useTimeoutFn from 'react-use/lib/useTimeoutFn'; +import useInterval from 'react-use/lib/useInterval'; +import { WelcomeMessageKnowledgeBaseSetupErrorPanel } from './welcome_message_knowledge_base_setup_error_panel'; +import type { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; +import type { UseGenAIConnectorsResult } from '../../hooks/use_genai_connectors'; + +export function WelcomeMessageKnowledgeBase({ + connectors, + knowledgeBase, +}: { + connectors: UseGenAIConnectorsResult; + knowledgeBase: UseKnowledgeBaseResult; +}) { + const previouslyNotInstalled = usePrevious(knowledgeBase.status.value?.ready === false); + const [showHasBeenInstalled, setShowHasBeenInstalled] = useState(false); + const [timeoutTime, setTimeoutTime] = useState(0); + const [, , reset] = useTimeoutFn(() => setShowHasBeenInstalled(false), timeoutTime); + + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const handleClosePopover = () => setIsPopoverOpen(false); + + const [checkForInstallStatus, setCheckForInstallStatus] = useState(false); + + // When the knowledge base is installed, show a success message for 3 seconds + useEffect(() => { + if (previouslyNotInstalled && knowledgeBase.status.value?.ready) { + setTimeoutTime(3000); + reset(); + setShowHasBeenInstalled(true); + } + }, [knowledgeBase.status.value?.ready, previouslyNotInstalled, reset]); + + // When the knowledge base is installed, stop checking for install status + useEffect(() => { + if (!checkForInstallStatus && knowledgeBase.status.value?.ready) { + setCheckForInstallStatus(false); + } + }, [checkForInstallStatus, knowledgeBase.status.value?.ready]); + + // Check for install status every 5 seconds + useInterval( + () => { + knowledgeBase.status.refresh(); + }, + checkForInstallStatus ? 5000 : null + ); + + const handleRetryInstall = async () => { + setCheckForInstallStatus(true); + setIsPopoverOpen(false); + + await knowledgeBase.install().then(() => { + setCheckForInstallStatus(false); + }); + }; + + return knowledgeBase.status.value?.ready !== undefined ? ( + <> + {knowledgeBase.isInstalling ? ( + <> + + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessage.weAreSettingUpTextLabel', + { + defaultMessage: + 'We are setting up your knowledge base. This may take a few minutes. You can continue to use the Assistant while this process is underway.', + } + )} + + + + + + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessage.div.settingUpKnowledgeBaseLabel', + { defaultMessage: 'Setting up Knowledge base' } + )} + + + ) : null} + + {connectors.connectors?.length ? ( + (!knowledgeBase.isInstalling && knowledgeBase.installError) || + (!knowledgeBase.isInstalling && + knowledgeBase.status.loading === false && + knowledgeBase.status.value.ready === false) ? ( + <> + + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessageKnowledgeBase.yourKnowledgeBaseIsNotSetUpCorrectlyLabel', + { defaultMessage: 'Your Knowledge base is not set up correctly' } + )} + + + + + + +
+ + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessage.retryButtonLabel', + { + defaultMessage: 'Retry install', + } + )} + +
+
+ + + setIsPopoverOpen(!isPopoverOpen)} + > + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessage.inspectErrorsButtonEmptyLabel', + { defaultMessage: 'Inspect issues' } + )} + + } + isOpen={isPopoverOpen} + panelPaddingSize="none" + closePopover={handleClosePopover} + > + + + +
+ + + + ) : null + ) : null} + + {showHasBeenInstalled ? ( +
+ + + + + + + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessage.knowledgeBaseSuccessfullyInstalledLabel', + { defaultMessage: 'Knowledge base successfully installed' } + )} + + + +
+ ) : null} + + ) : null; +} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base_setup_error_panel.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base_setup_error_panel.tsx new file mode 100644 index 0000000000000..a9a6fcff85240 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base_setup_error_panel.tsx @@ -0,0 +1,151 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiCode, + EuiDescriptionList, + EuiDescriptionListTitle, + EuiDescriptionListDescription, + EuiLink, + EuiSpacer, + EuiIcon, + EuiText, + EuiHorizontalRule, + EuiPanel, +} from '@elastic/eui'; +import { css } from '@emotion/css'; +import { useKibana } from '../../hooks/use_kibana'; +import type { UseKnowledgeBaseResult } from '../../hooks/use_knowledge_base'; + +const panelContainerClassName = css` + width: 330px; +`; + +export function WelcomeMessageKnowledgeBaseSetupErrorPanel({ + knowledgeBase, + onRetryInstall, +}: { + knowledgeBase: UseKnowledgeBaseResult; + onRetryInstall: () => void; +}) { + const { http } = useKibana().services; + + const modelName = knowledgeBase.status.value?.model_name; + + return ( +
+ + + + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessage.issuesDescriptionListTitleLabel', + { defaultMessage: 'Issues' } + )} + + + + + +
    + {!knowledgeBase.status.value?.deployment_state ? ( +
  • + {' '} + {modelName}, + }} + /> +
  • + ) : null} + + {knowledgeBase.status.value?.deployment_state && + knowledgeBase.status.value.deployment_state !== 'started' ? ( +
  • + {' '} + {modelName}, + deploymentState: ( + {knowledgeBase.status.value?.deployment_state} + ), + }} + /> +
  • + ) : null} + + {knowledgeBase.status.value?.allocation_state && + knowledgeBase.status.value.allocation_state !== 'fully_allocated' ? ( +
  • + {' '} + {modelName}, + allocationState: ( + {knowledgeBase.status.value?.allocation_state} + ), + }} + /> +
  • + ) : null} +
+
+
+
+ + + + + + + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessageKnowledgeBaseSetupErrorPanel.retryInstallingLinkLabel', + { defaultMessage: 'Retry install' } + )} + + ), + trainedModelsLink: ( + + {i18n.translate( + 'xpack.observabilityAiAssistant.welcomeMessage.trainedModelsLinkLabel', + { defaultMessage: 'Trained Models' } + )} + + ), + }} + /> + + +
+ ); +} diff --git a/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx b/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx index 2b55e3d8cac35..2187817e7228e 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx @@ -5,9 +5,10 @@ * 2.0. */ -import React from 'react'; +import React, { useState } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { useKibana } from '../hooks/use_kibana'; export type Feedback = 'positive' | 'negative'; @@ -16,6 +17,22 @@ interface FeedbackButtonsProps { } export function FeedbackButtons({ onClickFeedback }: FeedbackButtonsProps) { + const { notifications } = useKibana().services; + + const [hasBeenClicked, setHasBeenClicked] = useState(false); + + const handleClickPositive = () => { + onClickFeedback('positive'); + setHasBeenClicked(true); + notifications.toasts.addSuccess('Thanks for your feedback!'); + }; + + const handleClickNegative = () => { + onClickFeedback('negative'); + setHasBeenClicked(true); + notifications.toasts.addSuccess('Thanks for your feedback!'); + }; + return ( @@ -34,9 +51,10 @@ export function FeedbackButtons({ onClickFeedback }: FeedbackButtonsProps) { onClickFeedback('positive')} + onClick={handleClickPositive} > {i18n.translate('xpack.observabilityAiAssistant.insight.feedbackButtons.positive', { defaultMessage: 'Yes', @@ -48,9 +66,10 @@ export function FeedbackButtons({ onClickFeedback }: FeedbackButtonsProps) { onClickFeedback('negative')} + onClick={handleClickNegative} > {i18n.translate('xpack.observabilityAiAssistant.insight.feedbackButtons.negative', { defaultMessage: 'No', diff --git a/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx b/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx index ad26d8a51cd3e..4ae3c685a4c97 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx @@ -5,10 +5,10 @@ * 2.0. */ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { last, noop } from 'lodash'; +import { last } from 'lodash'; import React, { useEffect, useRef, useState } from 'react'; import { MessageRole, type Message } from '../../../common/types'; -import { INSIGHT_FEEDBACK } from '../../analytics/schema'; +import { sendEvent, TELEMETRY } from '../../analytics'; import { ObservabilityAIAssistantChatServiceProvider } from '../../context/observability_ai_assistant_chat_service_provider'; import { useAbortableAsync } from '../../hooks/use_abortable_async'; import { ChatState, useChat } from '../../hooks/use_chat'; @@ -79,14 +79,17 @@ function ChatContent({ ) : ( - lastAssistantResponse - ? chatService.analytics.reportEvent(INSIGHT_FEEDBACK, { + onClickFeedback={(feedback) => { + if (lastAssistantResponse) { + sendEvent(chatService.analytics, { + type: TELEMETRY.observability_ai_assistant_insight_feedback, + payload: { feedback, - ...lastAssistantResponse, - }) - : noop - } + message: lastAssistantResponse, + }, + }); + } + }} /> ; isInstalling: boolean; installError?: Error; @@ -50,15 +55,6 @@ export function useKnowledgeBase(): UseKnowledgeBaseResult { }) .then(() => { status.refresh(); - toasts.addSuccess({ - title: i18n.translate('xpack.observabilityAiAssistant.knowledgeBaseReadyTitle', { - defaultMessage: 'Knowledge base is ready', - }), - text: i18n.translate('xpack.observabilityAiAssistant.knowledgeBaseReadyContentReload', { - defaultMessage: 'A page reload is needed to be able to use it.', - }), - toastLifeTimeMs: Number.MAX_VALUE, - }); }) .catch((error) => { if ( diff --git a/x-pack/plugins/observability_ai_assistant/public/plugin.tsx b/x-pack/plugins/observability_ai_assistant/public/plugin.tsx index 3a684bb870e1e..64a1f4ae8d2fa 100644 --- a/x-pack/plugins/observability_ai_assistant/public/plugin.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/plugin.tsx @@ -27,7 +27,7 @@ import type { ObservabilityAIAssistantPluginStartDependencies, ObservabilityAIAssistantService, } from './types'; -import { MessageFeedback, MESSAGE_FEEDBACK_SCHEMA } from './analytics/schema'; +import { registerTelemetryEventTypes } from './analytics'; export class ObservabilityAIAssistantPlugin implements @@ -89,7 +89,7 @@ export class ObservabilityAIAssistantPlugin }, }); - coreSetup.analytics.registerEventType(MESSAGE_FEEDBACK_SCHEMA); + registerTelemetryEventTypes(coreSetup.analytics); return {}; } diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/README.md b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/README.md new file mode 100644 index 0000000000000..c5ff90ed582f2 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/README.md @@ -0,0 +1,37 @@ +# Observability AI Assistant Evaluation Framework + +## Overview + +This tool is developed for our team working on the Elastic Observability platform, specifically focusing on evaluating the Observability AI Assistant. It simplifies scripting and evaluating various scenarios with the Large Language Model (LLM) integration. + +## Setup requirements + +- An Elasticsearch instance +- A Kibana instance +- At least one .gen-ai connector set up + +## Running evaluations + +Run the tool using: + +`$ node x-pack/plugins/observability_ai_assistant/scripts/evaluation/index.js` + +This will evaluate all existing scenarios, and write the evaluation results to the terminal. + +### Configuration + +#### Kibana and Elasticsearch + +By default, the tool will look for a Kibana instance running locally (at `http://localhost:5601`, which is the default address for running Kibana in development mode). It will also attempt to read the Kibana config file for the Elasticsearch address & credentials. If you want to override these settings, use `--kibana` and `--es`. Only basic auth is supported, e.g. `--kibana http://username:password@localhost:5601`. If you want to use a specific space, use `--spaceId` + +#### Connector + +Use `--connectorId` to specify a `.gen-ai` connector to use. If none are given, it will prompt you to select a connector based on the ones that are available. If only a single `.gen-ai` connector is found, it will be used without prompting. + +#### Persisting conversations + +By default, completed conversations are not persisted. If you do want to persist them, for instance for reviewing purposes, set the `--persist` flag to store them. This will also generate a clickable link in the output of the evaluation that takes you to the conversation. + +If you want to clear conversations on startup, use the `--clear` flag. This only works when `--persist` is enabled. If `--spaceId` is set, only conversations for the current space will be cleared. + +When storing conversations, the name of the scenario is used as a title. Set the `--autoTitle` flag to have the LLM generate a title for you. diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/cli.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/cli.ts new file mode 100644 index 0000000000000..fe4fb7ec6e69d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/cli.ts @@ -0,0 +1,78 @@ +/* + * Copyright 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 { format, parse } from 'url'; +import { Argv } from 'yargs'; +import { readKibanaConfig } from './read_kibana_config'; + +export function options(y: Argv) { + const config = readKibanaConfig(); + + return y + .option('files', { + string: true as const, + array: true, + describe: 'A file or list of files containing the scenarios to evaluate. Defaults to all', + }) + .option('grep', { + string: true, + array: false, + describe: 'A string or regex to filter scenarios by', + }) + .option('kibana', { + describe: 'Where Kibana is running', + string: true, + default: process.env.KIBANA_HOST || 'http://localhost:5601', + }) + .option('spaceId', { + describe: + 'The space to use. If space is set, conversations will only be cleared for that spaceId', + string: true, + array: false, + }) + .option('elasticsearch', { + alias: 'es', + describe: 'Where Elasticsearch is running', + string: true, + default: format({ + ...parse(config['elasticsearch.hosts']), + auth: `${config['elasticsearch.username']}:${config['elasticsearch.password']}`, + }), + }) + .option('connectorId', { + describe: 'The ID of the connector', + string: true, + }) + .option('persist', { + describe: + 'Whether the conversations should be stored. Adding this will generate a link at which the conversation can be opened.', + boolean: true, + default: false, + }) + .option('clear', { + describe: 'Clear conversations on startup', + boolean: true, + default: false, + }) + .option('autoTitle', { + describe: 'Whether to generate titles for new conversations', + boolean: true, + default: false, + }) + .option('logLevel', { + describe: 'Log level', + default: 'info', + }) + .check((argv) => { + if (!argv.persist && argv.clear) { + throw new Error('clear cannot be true if persist is false'); + } + if (!argv.persist && argv.autoTitle) { + throw new Error('autoTitle cannot be true if persist is false'); + } + return true; + }); +} diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/evaluation.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/evaluation.ts new file mode 100644 index 0000000000000..5c51653036645 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/evaluation.ts @@ -0,0 +1,202 @@ +/* + * Copyright 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 yargs from 'yargs'; +import { run } from '@kbn/dev-cli-runner'; +import { Client } from '@elastic/elasticsearch'; +import inquirer from 'inquirer'; +import * as fastGlob from 'fast-glob'; +import Path from 'path'; +import chalk from 'chalk'; +import * as table from 'table'; +import { castArray, omit, sortBy } from 'lodash'; +import { TableUserConfig } from 'table'; +import { format, parse } from 'url'; +import { options } from './cli'; +import { getServiceUrls } from './get_service_urls'; +import { KibanaClient } from './kibana_client'; +import { EvaluationFunction } from './types'; +import { MessageRole } from '../../common'; + +function runEvaluations() { + yargs(process.argv.slice(2)) + .command('*', 'Run AI Assistant evaluations', options, (argv) => { + run( + async ({ log }) => { + const serviceUrls = await getServiceUrls({ + log, + elasticsearch: argv.elasticsearch, + kibana: argv.kibana, + }); + + const kibanaClient = new KibanaClient(serviceUrls.kibanaUrl, argv.spaceId); + const esClient = new Client({ + node: serviceUrls.esUrl, + }); + + const connectors = await kibanaClient.getConnectors(); + + if (!connectors.length) { + throw new Error('No connectors found'); + } + + let connector = connectors.find((item) => item.id === argv.connectorId); + + if (!connector && argv.connectorId) { + log.warning(`Could not find connector ${argv.connectorId}`); + } + + if (!connector && connectors.length === 1) { + connector = connectors[0]; + log.debug('Using the only connector found'); + } else { + const connectorChoice = await inquirer.prompt({ + type: 'list', + name: 'connector', + message: 'Select a connector', + choices: connectors.map((item) => item.name), + }); + + connector = connectors.find((item) => item.name === connectorChoice.connector)!; + } + + log.info(`Using connector ${connector.id}`); + + const scenarios = + (argv.files !== undefined && + castArray(argv.files).map((file) => Path.join(process.cwd(), file))) || + fastGlob.sync(Path.join(__dirname, './scenarios/**/*.ts')); + + if (!scenarios.length) { + throw new Error('No scenarios to run'); + } + + if (argv.clear) { + log.info('Clearing conversations'); + await esClient.deleteByQuery({ + index: '.kibana-observability-ai-assistant-conversations', + query: { + ...(argv.spaceId ? { term: { namespace: argv.spaceId } } : { match_all: {} }), + }, + refresh: true, + }); + } + + let evaluationFunctions: Array<{ + name: string; + fileName: string; + fn: EvaluationFunction; + }> = []; + + for (const fileName of scenarios) { + log.info(`Running scenario ${fileName}`); + const mod = await import(fileName); + Object.keys(mod).forEach((key) => { + evaluationFunctions.push({ name: key, fileName, fn: mod[key] }); + }); + } + + if (argv.grep) { + const lc = argv.grep.toLowerCase(); + evaluationFunctions = evaluationFunctions.filter((fn) => + fn.name.toLowerCase().includes(lc) + ); + } + + const header: string[][] = [ + [chalk.bold('Criterion'), chalk.bold('Result'), chalk.bold('Reasoning')], + ]; + + const tableConfig: TableUserConfig = { + singleLine: false, + border: { + topBody: `─`, + topJoin: `┬`, + topLeft: `┌`, + topRight: `┐`, + + bottomBody: `─`, + bottomJoin: `┴`, + bottomLeft: `└`, + bottomRight: `┘`, + + bodyLeft: `│`, + bodyRight: `│`, + bodyJoin: `│`, + + joinBody: `─`, + joinLeft: `├`, + joinRight: `┤`, + joinJoin: `┼`, + }, + spanningCells: [ + { row: 0, col: 0, colSpan: 3 }, + { row: 1, col: 0, colSpan: 3 }, + ], + columns: [ + { wrapWord: true, width: 60 }, + { wrapWord: true }, + { wrapWord: true, width: 60 }, + ], + }; + + const sortedEvaluationFunctions = sortBy(evaluationFunctions, 'fileName', 'name'); + + for (const { name, fn } of sortedEvaluationFunctions) { + log.debug(`Executing ${name}`); + const result = await fn({ + esClient, + kibanaClient, + chatClient: kibanaClient.createChatClient({ + connectorId: connector.id!, + persist: argv.persist, + title: argv.autoTitle ? undefined : name, + }), + }); + log.debug(`Result:`, JSON.stringify(result)); + const output: string[][] = [ + [ + result.messages.find((message) => message.role === MessageRole.User)!.content!, + '', + '', + ], + result.conversationId + ? [ + `${format(omit(parse(serviceUrls.kibanaUrl), 'auth'))}/${ + argv.spaceId ? `s/${argv.spaceId}/` : '' + }app/observabilityAIAssistant/conversations/${result.conversationId}`, + '', + '', + ] + : ['', '', ''], + ...header, + ]; + + result.scores.forEach((score) => { + output.push([ + score.criterion, + score.score === 0 ? chalk.redBright('failed') : chalk.greenBright('passed'), + score.reasoning, + ]); + }); + log.write(table.table(output, tableConfig)); + } + }, + { + log: { + defaultLevel: argv.logLevel as any, + }, + flags: { + allowUnexpected: true, + }, + } + ); + }) + .parse(); +} + +runEvaluations(); diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/get_service_urls.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/get_service_urls.ts new file mode 100644 index 0000000000000..d554e6c70a2fc --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/get_service_urls.ts @@ -0,0 +1,152 @@ +/* + * Copyright 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 { ToolingLog } from '@kbn/tooling-log'; +import { omit } from 'lodash'; +import fetch from 'node-fetch'; +import { format, parse, Url } from 'url'; + +async function discoverAuth(parsedTarget: Url, log: ToolingLog) { + const possibleCredentials = [`admin:changeme`, `elastic:changeme`]; + for (const auth of possibleCredentials) { + const url = format({ + ...parsedTarget, + auth, + }); + let status: number; + try { + log.debug(`Fetching ${url}`); + const response = await fetch(url); + status = response.status; + } catch (err) { + log.debug(`${url} resulted in ${err.message}`); + status = 0; + } + + if (status === 200) { + return auth; + } + } + + throw new Error(`Failed to authenticate user for ${format(parsedTarget)}`); +} + +async function getKibanaUrl({ kibana, log }: { kibana: string; log: ToolingLog }) { + try { + const isCI = process.env.CI?.toLowerCase() === 'true'; + + const parsedKibanaUrl = parse(kibana); + + const kibanaUrlWithoutAuth = format(omit(parsedKibanaUrl, 'auth')); + + log.debug(`Checking Kibana URL ${kibanaUrlWithoutAuth} for a redirect`); + + const unredirectedResponse = await fetch(kibanaUrlWithoutAuth, { + headers: { + ...(parsedKibanaUrl.auth + ? { Authorization: `Basic ${Buffer.from(parsedKibanaUrl.auth).toString('base64')}` } + : {}), + }, + method: 'HEAD', + follow: 1, + redirect: 'manual', + }); + + log.debug('Unredirected response', unredirectedResponse.headers.get('location')); + + const discoveredKibanaUrl = + unredirectedResponse.headers + .get('location') + ?.replace('/spaces/enter', '') + ?.replace('spaces/space_selector', '') || kibanaUrlWithoutAuth; + + log.debug(`Discovered Kibana URL at ${discoveredKibanaUrl}`); + + const parsedTarget = parse(kibana); + + const parsedDiscoveredUrl = parse(discoveredKibanaUrl); + + const discoveredKibanaUrlWithAuth = format({ + ...parsedDiscoveredUrl, + auth: parsedTarget.auth, + }); + + const redirectedResponse = await fetch(discoveredKibanaUrlWithAuth, { + method: 'HEAD', + }); + + if (redirectedResponse.status !== 200) { + throw new Error( + `Expected HTTP 200 from ${discoveredKibanaUrlWithAuth}, got ${redirectedResponse.status}` + ); + } + + const discoveredKibanaUrlWithoutAuth = format({ + ...parsedDiscoveredUrl, + auth: undefined, + }); + + log.info( + `Discovered kibana running at: ${ + isCI ? discoveredKibanaUrlWithoutAuth : discoveredKibanaUrlWithAuth + }` + ); + + return discoveredKibanaUrlWithAuth.replace(/\/$/, ''); + } catch (error) { + throw new Error(`Could not connect to Kibana: ` + error.message); + } +} + +export async function getServiceUrls({ + log, + elasticsearch, + kibana, +}: { + elasticsearch: string; + kibana: string; + log: ToolingLog; +}) { + if (!elasticsearch) { + // assume things are running locally + kibana = kibana || 'http://127.0.0.1:5601'; + elasticsearch = 'http://127.0.0.1:9200'; + } + + if (!elasticsearch) { + throw new Error('Could not determine an Elasticsearch target'); + } + + const parsedTarget = parse(elasticsearch); + + let auth = parsedTarget.auth; + + if (!parsedTarget.auth) { + auth = await discoverAuth(parsedTarget, log); + } + + const formattedEsUrl = format({ + ...parsedTarget, + auth, + }); + + const suspectedKibanaUrl = kibana || elasticsearch.replace('.es', '.kb'); + + const parsedKibanaUrl = parse(suspectedKibanaUrl); + + const kibanaUrlWithAuth = format({ + ...parsedKibanaUrl, + auth, + }); + + const validatedKibanaUrl = await getKibanaUrl({ kibana: kibanaUrlWithAuth, log }); + + return { + kibanaUrl: validatedKibanaUrl, + esUrl: formattedEsUrl, + }; +} diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/index.js b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/index.js new file mode 100644 index 0000000000000..963e1a2ecfbed --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/index.js @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +require('@kbn/babel-register').install(); + +require('./evaluation'); diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/kibana_client.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/kibana_client.ts new file mode 100644 index 0000000000000..7c447931f30de --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/kibana_client.ts @@ -0,0 +1,327 @@ +/* + * Copyright 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 axios, { AxiosInstance, AxiosResponse } from 'axios'; +import { pick } from 'lodash'; +import { filter, lastValueFrom, map, tap, toArray } from 'rxjs'; +import { format, parse, UrlObject } from 'url'; +import { Message, MessageRole } from '../../common'; +import { + ChatCompletionErrorCode, + ConversationCompletionError, + ConversationCreateEvent, + MessageAddEvent, + StreamingChatResponseEvent, + StreamingChatResponseEventType, +} from '../../common/conversation_complete'; +import { FunctionDefinition } from '../../common/types'; +import { concatenateOpenAiChunks } from '../../common/utils/concatenate_openai_chunks'; +import { processOpenAiStream } from '../../common/utils/process_openai_stream'; +import { APIReturnType, ObservabilityAIAssistantAPIClientRequestParamsOf } from '../../public'; +import { getAssistantSetupMessage } from '../../public/service/get_assistant_setup_message'; +import { streamIntoObservable } from '../../server/service/util/stream_into_observable'; +import { EvaluationResult } from './types'; + +type InnerMessage = Message['message']; +type StringOrMessageList = string | InnerMessage[]; + +interface ChatClient { + chat: (message: StringOrMessageList) => Promise; + complete: ( + ...args: [StringOrMessageList] | [string, InnerMessage[]] + ) => Promise<{ conversationId?: string; messages: InnerMessage[] }>; + + evaluate: ( + {}: { conversationId?: string; messages: InnerMessage[] }, + criteria: string[] + ) => Promise; +} + +export class KibanaClient { + axios: AxiosInstance; + constructor(private readonly url: string, private readonly spaceId?: string) { + this.axios = axios.create({ + headers: { + 'kbn-xsrf': 'foo', + }, + }); + } + + private getUrl(props: { query?: UrlObject['query']; pathname: string }) { + const parsed = parse(this.url); + + const baseUrl = parsed.pathname?.replaceAll('/', '') ?? ''; + + const url = format({ + ...parsed, + pathname: `/${[ + baseUrl, + ...(this.spaceId ? ['s', this.spaceId] : []), + props.pathname.startsWith('/') ? props.pathname.substring(1) : props.pathname, + ].join('/')}`, + query: props.query, + }); + + return url; + } + + createChatClient({ + connectorId, + persist, + title, + }: { + connectorId: string; + persist: boolean; + title?: string; + }): ChatClient { + function getMessages(message: string | Array): Array { + if (typeof message === 'string') { + return [ + { + content: message, + role: MessageRole.User, + }, + ]; + } + return message; + } + + const that = this; + + async function getFunctions() { + const { + data: { functionDefinitions, contextDefinitions }, + }: AxiosResponse> = + await that.axios.get( + that.getUrl({ pathname: '/internal/observability_ai_assistant/functions' }) + ); + + return { functionDefinitions, contextDefinitions }; + } + + async function chat({ + messages, + functions, + functionCall, + }: { + messages: Message[]; + functions: FunctionDefinition[]; + functionCall?: string; + }) { + const params: ObservabilityAIAssistantAPIClientRequestParamsOf<'POST /internal/observability_ai_assistant/chat'>['params']['body'] = + { + messages, + connectorId, + functions: functions.map((fn) => pick(fn, 'name', 'description', 'parameters')), + functionCall, + }; + const stream$ = streamIntoObservable( + ( + await that.axios.post( + that.getUrl({ + pathname: '/internal/observability_ai_assistant/chat', + query: { stream: true }, + }), + params, + { responseType: 'stream' } + ) + ).data + ).pipe(processOpenAiStream(), concatenateOpenAiChunks()); + + const receivedMessage = await lastValueFrom(stream$); + + return receivedMessage.message; + } + + return { + chat: async (message) => { + const { functionDefinitions, contextDefinitions } = await getFunctions(); + const messages = [ + getAssistantSetupMessage({ contexts: contextDefinitions }), + ...getMessages(message).map((msg) => ({ + message: msg, + '@timestamp': new Date().toISOString(), + })), + ]; + return chat({ messages, functions: functionDefinitions }); + }, + complete: async (...args) => { + const messagesArg = args.length === 1 ? args[0] : args[1]; + const conversationId = args.length === 1 ? undefined : args[0]; + const { contextDefinitions } = await getFunctions(); + const messages = [ + getAssistantSetupMessage({ contexts: contextDefinitions }), + ...getMessages(messagesArg).map((msg) => ({ + message: msg, + '@timestamp': new Date().toISOString(), + })), + ]; + + const stream$ = streamIntoObservable( + ( + await that.axios.post( + that.getUrl({ + pathname: '/internal/observability_ai_assistant/chat/complete', + }), + { + conversationId, + messages, + connectorId, + persist, + title, + }, + { responseType: 'stream' } + ) + ).data + ).pipe( + map((line) => JSON.parse(line) as StreamingChatResponseEvent), + tap((event) => { + if (event.type === StreamingChatResponseEventType.ConversationCompletionError) { + throw new ConversationCompletionError( + event.error.code ?? ChatCompletionErrorCode.InternalError, + event.error.message + ); + } + }), + filter( + (event): event is MessageAddEvent | ConversationCreateEvent => + event.type === StreamingChatResponseEventType.MessageAdd || + event.type === StreamingChatResponseEventType.ConversationCreate + ), + toArray() + ); + + const events = await lastValueFrom(stream$); + + return { + messages: messages + .map((msg) => msg.message) + .concat( + events + .filter( + (event): event is MessageAddEvent => + event.type === StreamingChatResponseEventType.MessageAdd + ) + .map((event) => event.message.message) + ), + conversationId: + conversationId || + events.find( + (event): event is ConversationCreateEvent => + event.type === StreamingChatResponseEventType.ConversationCreate + )?.conversation.id, + }; + }, + evaluate: async ({ messages, conversationId }, criteria) => { + const message = await chat({ + messages: [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: `You are a critical assistant for evaluating conversations with the Elastic Observability AI Assistant, + which helps our users make sense of their Observability data. + + Your goal is to verify whether a conversation between the user and the assistant matches the given criteria. + + For each criterion, calculate a score. Explain your score, by describing what the assistant did right, and what the + assistant did wrong, where it could improve, and what the root cause was in case of a failure.`, + }, + }, + { + '@timestamp': new Date().toString(), + message: { + role: MessageRole.User, + content: `Evaluate the conversation according to the following criteria: + + ${criteria.map((criterion, index) => { + return `${index}: ${criterion}`; + })} + + This is the conversation: + + ${JSON.stringify(messages)}`, + }, + }, + ], + functions: [ + { + name: 'scores', + parameters: { + type: 'object', + properties: { + criteria: { + type: 'array', + items: { + type: 'object', + properties: { + index: { + type: 'number', + description: 'The number of the criterion', + }, + score: { + type: 'number', + description: + 'A score of either 0 (criterion failed) or 1 (criterion succeeded)', + }, + reasoning: { + type: 'string', + description: + 'Your reasoning for the score. Explain your score by mentioning what you expected to happen and what did happen.', + }, + }, + required: ['index', 'score', 'reasoning'], + }, + }, + }, + required: ['criteria'], + }, + contexts: [], + description: 'Call this function to return scores for the criteria', + }, + ], + functionCall: 'scores', + }); + + return { + conversationId, + messages, + scores: ( + JSON.parse(message.function_call.arguments) as { + criteria: Array<{ index: number; score: number; reasoning: string }>; + } + ).criteria.map(({ index, score, reasoning }) => { + return { + criterion: criteria[index], + score, + reasoning, + }; + }), + }; + }, + }; + } + + async getConnectors() { + const connectors: AxiosResponse< + Array<{ + id: string; + connector_type_id: string; + name: string; + is_preconfigured: boolean; + is_deprecated: boolean; + referenced_by_count: number; + }> + > = await axios.get( + this.getUrl({ + pathname: '/api/actions/connectors', + }) + ); + + return connectors.data.filter((connector) => connector.connector_type_id === '.gen-ai'); + } +} diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/read_kibana_config.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/read_kibana_config.ts new file mode 100644 index 0000000000000..5b64bb2f56189 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/read_kibana_config.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import path from 'path'; +import fs from 'fs'; +import yaml from 'js-yaml'; +import { identity, pickBy } from 'lodash'; + +export type KibanaConfig = ReturnType; + +export const readKibanaConfig = () => { + const kibanaConfigDir = path.join(__filename, '../../../../../../config'); + const kibanaDevConfig = path.join(kibanaConfigDir, 'kibana.dev.yml'); + const kibanaConfig = path.join(kibanaConfigDir, 'kibana.yml'); + + const loadedKibanaConfig = (yaml.safeLoad( + fs.readFileSync(fs.existsSync(kibanaDevConfig) ? kibanaDevConfig : kibanaConfig, 'utf8') + ) || {}) as {}; + + const cliEsCredentials = pickBy( + { + 'elasticsearch.username': process.env.ELASTICSEARCH_USERNAME, + 'elasticsearch.password': process.env.ELASTICSEARCH_PASSWORD, + 'elasticsearch.hosts': process.env.ELASTICSEARCH_HOST, + }, + identity + ) as { + 'elasticsearch.username'?: string; + 'elasticsearch.password'?: string; + 'elasticsearch.hosts'?: string; + }; + + return { + 'elasticsearch.hosts': 'http://localhost:9200', + 'elasticsearch.username': 'elastic', + 'elasticsearch.password': 'changeme', + ...loadedKibanaConfig, + ...cliEsCredentials, + }; +}; diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.ts new file mode 100644 index 0000000000000..1f73f9a9a625d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EvaluationFunction } from '../../types'; + +export const health: EvaluationFunction = async ({ chatClient }) => { + const conversation = await chatClient.complete( + 'Can you tell me what the state of my Elasticsearch cluster is?' + ); + + const evaluation = await chatClient.evaluate(conversation, [ + 'Calls the Elasticsearch function with method: GET and path: _cluster/health', + 'Describes the cluster status based on the response from the Elasticsearch function', + ]); + + return evaluation; +}; diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.ts new file mode 100644 index 0000000000000..c55df6e08849b --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.ts @@ -0,0 +1,173 @@ +/* + * Copyright 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 { last } from 'lodash'; +import { MessageRole } from '../../../../common'; +import { EvaluationFunction } from '../../types'; + +function extractEsqlQuery(response: string) { + return response.match(/```esql([\s\S]*?)```/)?.[1]; +} + +function createEsqlQueryEvaluation({ + question, + expected, + criteria = [], + execute = true, +}: { + question: string; + expected?: string; + criteria?: string[]; + execute?: boolean; +}): EvaluationFunction { + return async ({ chatClient }) => { + let conversation = await chatClient.complete(question); + + const esqlQuery = extractEsqlQuery(last(conversation.messages)?.content || ''); + + if (esqlQuery && execute) { + conversation = await chatClient.complete( + conversation.conversationId!, + conversation.messages.concat({ + content: '', + role: MessageRole.Assistant, + function_call: { + name: 'execute_query', + arguments: JSON.stringify({ + query: esqlQuery, + }), + trigger: MessageRole.User, + }, + }) + ); + } + + const evaluation = await chatClient.evaluate(conversation, [ + ...(expected + ? [ + `Returns a ES|QL query that is functionally equivalent to: + ${expected}`, + ] + : []), + ...(execute && expected ? [`The query successfully executed without an error`] : []), + ...criteria, + ]); + + return evaluation; + }; +} + +export const metricsApmQuery = createEsqlQueryEvaluation({ + question: + 'I want to see a query for metrics-apm*, filtering on metricset.name:transaction and metricset.interval:1m, showing the average duration (via transaction.duration.histogram), in 50 buckets.', + expected: `FROM metrics-apm* + | WHERE metricset.name == "transaction" AND metricset.interval == "1m" + | EVAL bucket = AUTO_BUCKET(@timestamp, 50, , ) + | STATS avg_duration = AVG(transaction.duration.histogram) BY bucket`, +}); + +export const packetbeatUniqueDomainsQuery = createEsqlQueryEvaluation({ + question: + 'For standard Elastic ECS compliant packetbeat data view, create an ES|QL query that shows the top 10 unique domains by doc count', + expected: `FROM packetbeat-* + | STATS doc_count = COUNT(destination.domain) BY destination.domain + | SORT doc_count DESC + | LIMIT 10`, +}); + +export const fiveEarliestEmployeesQuery = createEsqlQueryEvaluation({ + question: + 'From employees, I want to see the 5 earliest employees (hire_date), I want to display only the month and the year that they were hired in and their employee number (emp_no). Format the date as e.g. "September 2019".', + expected: `FROM employees + | EVAL hire_date_formatted = DATE_FORMAT(hire_date, ""MMMM yyyy"") + | SORT hire_date + | KEEP emp_no, hire_date_formatted + | LIMIT 5`, + execute: false, +}); + +export const employeesWithPaginationQuery = createEsqlQueryEvaluation({ + question: + 'From employees, I want to sort the documents by salary, and then return 10 results per page, and then see the second page', + criteria: ['The assistant should mention that pagination is currently not supported in ES|QL'], +}); + +export const logsAvgCpuQuery = createEsqlQueryEvaluation({ + question: + 'My logs data (ECS) is in `logs-*`. Show me a query that gets the average CPU per host, limit it to the top 10 results, in 1m buckets, and only include the last 15m. ', + expected: `FROM logs-* + | WHERE @timestamp >= NOW() - 15 minutes + | EVAL bucket = DATE_TRUNC(1 minute, @timestamp) + | STATS avg_cpu = AVG(system.cpu.total.norm.pct) BY bucket, host.name + | LIMIT 10`, +}); + +export const apmServiceInventoryQuery = createEsqlQueryEvaluation({ + question: + 'I want to show a list of services with APM data. My data is in `traces-apm*`. I want to show the average transaction duration, the success rate (by dividing event.outcome:failure by event.outcome:failure+success), and total amount of requests. As a time range, select the last 24 hours. Use ES|QL.', + expected: `FROM traces-apm* + | WHERE @timestamp >= NOW() - 24 hours + | EVAL successful = CASE(event.outcome == "success", 1, 0), + failed = CASE(event.outcome == "failure", 1, 0) + | STATS success_rate = AVG(successful), + avg_duration = AVG(transaction.duration), + total_requests = COUNT(transaction.id) BY service.name`, +}); + +export const metricbeatCpuQuery = createEsqlQueryEvaluation({ + question: `from \`metricbeat*\`, using ES|QL, I want to see the percentage of CPU time normalized by the number of CPU cores, broken down by hostname. the fields are system.cpu.user.pct, system.cpu.system.pct, and system.cpu.cores`, + expected: `FROM metricbeat* + | EVAL cpu_pct_normalized = (system.cpu.user.pct + system.cpu.system.pct) / system.cpu.cores + | STATS AVG(cpu_pct_normalized) BY host.name`, +}); + +export const postgresDurationQuery = createEsqlQueryEvaluation({ + question: + 'extract the query duration from postgres log messages in postgres-logs*, using ECS fields, and calculate the avg', + expected: `FROM postgres-logs + | DISSECT message "%{} duration: %{query_duration} ms" + | EVAL query_duration_num = TO_DOUBLE(query_duration) + | STATS avg_duration = AVG(query_duration_num)`, +}); + +export const apmExitSpanQuery = createEsqlQueryEvaluation({ + question: `I've got APM data in \`metrics-apm\`. Filter on \`metricset.name:service_destination\` and the last 24 hours. Break down by span.destination.service.resource. Each document contains the count of total events (span.destination.service.response_time.count) for that document's interval and the total amount of latency (span.destination.service.response_time.sum.us). A document either contains an aggregate of failed events (event.outcome:success) or failed events (event.outcome:failure). A single document might represent multiple failures or successes, depending on the value of span.destination.service.response_time.count. For each value of span.destination.service.resource, give me the average throughput, latency per request, and failure rate, as a value between 0 and 1. Just show me the query.`, + expected: `FROM metrics-apm + | WHERE metricset.name == "service_destination" AND @timestamp >= NOW() - 24 hours + | EVAL total_response_time = span.destination.service.response_time.sum.us / span.destination.service.response_time.count, total_failures = CASE(event.outcome == "failure", 1, 0) * span.destination.service.response_time.count + | STATS + avg_throughput = AVG(span.destination.service.response_time.count), + avg_latency = AVG(total_response_time), + failure_rate = AVG(total_failures) + BY span.destination.service.resource`, +}); + +export const highCardinalityLogsErrorQuery = createEsqlQueryEvaluation({ + question: `i have logs in high-cardinality-data-fake_stack.admin-console-* . errors are found when log.level contais the value ERROR. generate a query to obtain the error rate as a percetage of the total logs per day for the last 7 days`, + expected: `FROM high-cardinality-data-fake_stack.admin-console-* + | WHERE @timestamp >= NOW() - 7 days + | EVAL error = CASE(log.level == "ERROR", 1, 0), total = 1 + | EVAL bucket = DATE_TRUNC(1 day, @timestamp) + | STATS total_errors = SUM(error), total_logs = SUM(total) BY bucket + | EVAL error_rate = (total_errors / total_logs) * 100`, +}); + +export const nycTaxisDropoffTimeQuery = createEsqlQueryEvaluation({ + question: + 'From `nyc_taxis`, give me a query that shows the top 10 results where the drop off time was between 6am and 10am.', + expected: `FROM nyc_taxis + | WHERE DATE_EXTRACT(drop_off_time, "hour") >= 6 AND DATE_EXTRACT(drop_off_time, "hour") < 10 + | LIMIT 10`, +}); + +export const apmTraceDurationQuery = createEsqlQueryEvaluation({ + question: + 'My APM data is in `traces-apm*`. What’s the average for `transaction.duration.us` per service over the last hour?', + expected: `FROM traces-apm* + | WHERE @timestamp > NOW() - 1 hour + | STATS AVG(transaction.duration.us) BY service.name`, +}); diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/types.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/types.ts new file mode 100644 index 0000000000000..3ee8c2eaebe99 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/types.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Client } from '@elastic/elasticsearch'; +import { Message } from '../../common'; +import { KibanaClient } from './kibana_client'; + +export interface ScenarioOptions { + esClient: Client; + kibanaClient: KibanaClient; + chatClient: ReturnType; +} + +export interface EvaluationResult { + conversationId?: string; + messages: Array; + scores: Array<{ + criterion: string; + reasoning: string; + score: number; + }>; +} + +export type EvaluationFunction = (options: ScenarioOptions) => Promise; diff --git a/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/extract_sections.ts b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/extract_sections.ts new file mode 100644 index 0000000000000..c4a2da3f355dd --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/extract_sections.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import $, { AnyNode, Cheerio } from 'cheerio'; + +export function extractSections(cheerio: Cheerio) { + const sections: Array<{ + title: string; + content: string; + }> = []; + cheerio.find('.section h3').each((index, element) => { + let untilNextHeader = $(element).nextUntil('h3'); + + if (untilNextHeader.length === 0) { + untilNextHeader = $(element).parents('.titlepage').nextUntil('h3'); + } + + if (untilNextHeader.length === 0) { + untilNextHeader = $(element).parents('.titlepage').nextAll(); + } + + const title = $(element).text().trim().replace('edit', ''); + + untilNextHeader.find('table').remove(); + untilNextHeader.find('svg').remove(); + + const text = untilNextHeader.text(); + + const content = text.replaceAll(/([\n]\s*){2,}/g, '\n'); + + sections.push({ + title: title === 'STATS ... BY' ? 'STATS' : title, + content: `${title}\n\n${content}`, + }); + }); + + return sections; +} diff --git a/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/index.js b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/index.js new file mode 100644 index 0000000000000..b9f96574c6e61 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/index.js @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +require('@kbn/babel-register').install(); + +require('./load_esql_docs'); diff --git a/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/load_esql_docs.ts b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/load_esql_docs.ts new file mode 100644 index 0000000000000..20bb43cd49d11 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/load_esql_docs.ts @@ -0,0 +1,233 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { run } from '@kbn/dev-cli-runner'; +import $, { load } from 'cheerio'; +import { SingleBar } from 'cli-progress'; +import FastGlob from 'fast-glob'; +import Fs from 'fs/promises'; +import { once, partition } from 'lodash'; +import pLimit from 'p-limit'; +import Path from 'path'; +import git, { SimpleGitProgressEvent } from 'simple-git'; +import yargs, { Argv } from 'yargs'; +import { extractSections } from './extract_sections'; + +yargs(process.argv.slice(2)) + .command( + '*', + 'Extract ES|QL documentation for the Observability AI Assistant', + (y: Argv) => + y.option('logLevel', { + describe: 'Log level', + string: true, + default: process.env.LOG_LEVEL || 'info', + choices: ['info', 'debug', 'silent', 'verbose'], + }), + (argv) => { + run( + async ({ log }) => { + const builtDocsDir = Path.join(__dirname, '../../../../../../built-docs'); + + log.debug(`Looking in ${builtDocsDir} for built-docs repository`); + + const dirExists = await Fs.stat(builtDocsDir); + + const getProgressHandler = () => { + let stage: string = ''; + let method: string = ''; + const loader: SingleBar = new SingleBar({ + barsize: 25, + format: `{phase} {bar} {percentage}%`, + }); + + const start = once(() => { + loader.start(100, 0, { phase: 'initializing' }); + }); + + return { + progress: (event: SimpleGitProgressEvent) => { + start(); + if (event.stage !== stage || event.method !== method) { + stage = event.stage; + method = event.method; + } + loader.update(event.progress, { phase: event.method + '/' + event.stage }); + }, + stop: () => loader.stop(), + }; + }; + + if (!dirExists) { + log.info('Cloning built-docs repo. This will take a while.'); + + const { progress, stop } = getProgressHandler(); + await git(Path.join(builtDocsDir, '..'), { + progress, + }).clone(`https://github.com/elastic/built-docs`, builtDocsDir, ['--depth', '1']); + + stop(); + } + + const { progress, stop } = getProgressHandler(); + + const builtDocsGit = git(builtDocsDir, { progress }); + + log.debug('Initializing simple-git'); + await builtDocsGit.init(); + + log.info('Making sure built-docs is up to date'); + await builtDocsGit.pull(); + + const files = FastGlob.sync( + `${builtDocsDir}/html/en/elasticsearch/reference/master/esql*.html` + ); + + if (!files) { + throw new Error('No files found'); + } + + const limiter = pLimit(10); + + stop(); + + log.info(`Processing ${files.length} files`); + + const documents: Array> = await Promise.all( + files.map((file) => + limiter(async () => { + const fileContents = await Fs.readFile(file); + const $element = load(fileContents.toString())('*'); + + function getSimpleText() { + $element.remove('.navfooter'); + $element.remove('#sticky_content'); + $element.find('code').each(function () { + $(this).replaceWith('`' + $(this).text() + '`'); + }); + return $element + .find('.section,section,.part') + .last() + .text() + .replaceAll(/([\n]\s*){2,}/g, '\n'); + } + + switch (Path.basename(file)) { + case 'esql-commands.html': + return extractSections($element); + + case 'esql-limitations.html': + return [ + { + title: 'Limitations', + content: getSimpleText(), + }, + ]; + + case 'esql-syntax.html': + return [ + { + title: 'Syntax', + content: getSimpleText(), + }, + ]; + case 'esql.html': + return [ + { + title: 'Overview', + content: getSimpleText().replace( + /The ES\|QL documentation is organized in these sections(.*)$/, + '' + ), + }, + ]; + + case 'esql-functions-operators.html': + const sections = extractSections($element); + + const searches = [ + 'Binary operators', + 'Equality', + 'Inequality', + 'Less than', + 'Greater than', + 'Add +', + 'Subtract -', + 'Multiply *', + 'Divide /', + 'Modulus %', + 'Unary operators', + 'Logical operators', + 'IS NULL', + ]; + + const matches = [ + 'CIDR_MATCH', + 'ENDS_WITH', + 'IN', + 'IS_FINITE', + 'IS_INFINITE', + 'IS_NAN', + 'LIKE', + 'RLIKE', + 'STARTS_WITH', + ]; + + const [operatorSections, allOtherSections] = partition(sections, (section) => { + return ( + matches.includes(section.title) || + searches.some((search) => + section.title.toLowerCase().startsWith(search.toLowerCase()) + ) + ); + }); + + return allOtherSections.concat({ + title: 'Operators', + content: operatorSections + .map(({ title, content }) => `${title}\n${content}`) + .join('\n'), + }); + + default: + break; + } + return []; + }) + ) + ); + + const flattened = documents.flat().filter((doc) => { + return !doc.title.startsWith('ES|QL'); + }); + + const outDir = Path.join(__dirname, '../../server/functions/esql/docs'); + + log.info(`Writing ${flattened.length} documents to disk to ${outDir}`); + + log.debug(`Clearing ${outDir}`); + + await Fs.rm(outDir, { recursive: true }); + + await Fs.mkdir(outDir); + + await Promise.all( + flattened.map((doc) => + limiter(async () => { + const fileName = Path.join( + outDir, + `esql-${doc.title.replaceAll(' ', '-').toLowerCase()}.txt` + ); + await Fs.writeFile(fileName, doc.content); + }) + ) + ); + }, + { log: { defaultLevel: argv.logLevel as any }, flags: { allowUnexpected: true } } + ); + } + ) + .parse(); diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql.ts b/x-pack/plugins/observability_ai_assistant/server/functions/esql.ts deleted file mode 100644 index 88997452c0ad8..0000000000000 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql.ts +++ /dev/null @@ -1,562 +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 dedent from 'dedent'; -import { Observable } from 'rxjs'; -import type { FunctionRegistrationParameters } from '.'; -import { - type CreateChatCompletionResponseChunk, - FunctionVisibility, - MessageRole, -} from '../../common/types'; -import { processOpenAiStream } from '../../common/utils/process_openai_stream'; -import { streamIntoObservable } from '../service/util/stream_into_observable'; - -export function registerEsqlFunction({ - client, - registerFunction, - resources, -}: FunctionRegistrationParameters) { - registerFunction( - { - name: 'execute_query', - contexts: ['core'], - visibility: FunctionVisibility.User, - description: 'Execute an ES|QL query', - parameters: { - type: 'object', - additionalProperties: false, - properties: { - query: { - type: 'string', - }, - }, - required: ['query'], - } as const, - }, - async ({ arguments: { query } }) => { - const response = await ( - await resources.context.core - ).elasticsearch.client.asCurrentUser.transport.request({ - method: 'POST', - path: '_query', - body: { - query, - }, - }); - - return { content: response }; - } - ); - - registerFunction( - { - name: 'esql', - contexts: ['core'], - description: `This function answers ES|QL related questions including query generation and syntax/command questions.`, - visibility: FunctionVisibility.System, - parameters: { - type: 'object', - additionalProperties: false, - properties: { - switch: { - type: 'boolean', - }, - }, - } as const, - }, - async ({ messages, connectorId }, signal) => { - const systemMessage = dedent(`You are a helpful assistant for Elastic ES|QL. - Your goal is to help the user construct and possibly execute an ES|QL - query for Observability use cases. - - ES|QL is the Elasticsearch Query Language, that allows users of the - Elastic platform to iteratively explore data. An ES|QL query consists - of a series of commands, separated by pipes. Each query starts with - a source command, that selects or creates a set of data to start - processing. This source command is then followed by one or more - processing commands, which can transform the data returned by the - previous command. - - ES|QL is not Elasticsearch SQL, nor is it anything like SQL. SQL - commands are not available in ES|QL. Its close equivalent is SPL - (Search Processing Language). Make sure you reply using only - the context of this conversation. - - # Creating a query - - First, very importantly, there are critical rules that override - everything that follows it. Always repeat these rules, verbatim. - - 1. ES|QL is not Elasticsearch SQL. Do not apply Elasticsearch SQL - commands, functions and concepts. Only use information available - in the context of this conversation. - 2. Use a WHERE clause as early and often as possible, because - it limits the number of documents that need to be evaluated. - 3. Use EVAL to create new columns that require mathemetical - operations or non-aggregation functions like CASE, ROUND or - DATE_EXTRACT. YOU MUST DO THIS before using these operations - in a STATS command. - 4. DO NOT UNDER ANY CIRCUMSTANCES: - - wrap a data source in single or double quotes when using FROM - - use COUNT(*) or COUNT(). A single argument (field name) is - required, like COUNT(my.field.name). - - use the AS keyword. Create a new column by using the = operator. - this is wrong: STATS SUM(field) AS sum_field. - - When constructing a query, break it down into the following steps. - Ask these questions out loud so the user can see your reasoning. - Remember, these rules are for you, not for the user. - - - What are the critical rules I need to think of? - - What data source is the user requesting? What command should I - select for this data source? Don't use any quotes to wrap the - source. - - Does the data set need to be filtered? Use the WHERE clause for - this, as it improves performance. - - Do I need to add columns that use math or other non-aggregation - functions like CASE using the EVAL command before I run the STATS - BY command with aggregation functions? - - If I run a STATS command, what columns are available after the - command? - - What are the steps needed to get the result that the user needs? - Break each operation down into its own step. Reason about what data - is the outcome of each command or function. - - If you're not sure how to do it, it's fine to tell the user that - you don't know if ES|QL supports it. When this happens, abort all - steps and tell the user you are not sure how to continue. - - Format ALL of your responses as follows, including the dashes. - ALWAYS start your message with two dashes and then the rules: - - \`\`\` - -- - Sure, let's remember the critical rules: - - -- - Let's break down the query step-by-step: - - - \`\`\`esql - - \`\`\` - \`\`\` - - Always format a complete query as follows: - \`\`\`esql - ... - \`\`\` - - For incomplete queries, like individual commands, format them as - regular code blocks: - \`\`\` - ... - \`\`\` - - # Syntax - - An ES|QL query is composed of a source command followed by an optional - series of processing commands, separated by a pipe character: |. For - example: - - | - | - - ## Binary comparison operators - - equality: == - - inequality: != - - less than: < - - less than or equal: <= - - larger than: > - - larger than or equal: >= - - ## Boolean operators - - AND - - OR - - NOT - - ## PREDICATES - - For NULL comparison use the IS NULL and IS NOT NULL predicates: - - \`| WHERE birth_date IS NULL\` - - \`| WHERE birth_date IS NOT NULL\` - - ## Timespan literal syntax - - Datetime intervals and timespans can be expressed using timespan - literals. Timespan literals are a combination of a number and a - qualifier. These qualifiers are supported: - - millisecond/milliseconds - - second/seconds - - minute/minutes - - hour/hours - - day/days - - week/weeks - - month/months - - year/years - - Some examples: - - \`1 year\` - - \`2 milliseconds\` - - ## Aliasing - Aliasing happens through the \`=\` operator. Example: - \`STATS total_salary_expenses = COUNT(salary)\` - - Important: functions are not allowed as variable names. - - # Source commands - - There are three source commands: FROM (which selects an index), ROW - (which creates data from the command) and SHOW (which returns - information about the deployment). You do not support SHOW for now. - - ### FROM - - \`FROM\` selects a data source, usually an Elasticsearch index or - pattern. You can also specify multiple indices. DO NOT UNDER ANY - CIRCUMSTANCES wrap an index or pattern in single or double quotes - as such: \`FROM "my_index.pattern-*"\`. - Some examples: - - - \`FROM employees\` - - \`FROM employees.annual_salaries-*\` - - \`FROM employees*,my-alias,my-index.with-a-dot*\` - - # Processing commands - - Note that the following processing commands are available in ES|QL, - but not supported in this context: - - ENRICH,GROK,MV_EXPAND,RENAME - - ### DISSECT - - \`DISSECT\` enables you to extract structured data out of a string. - It matches the string against a delimiter-based pattern, and extracts - the specified keys as columns. It uses the same syntax as the - Elasticsearch Dissect Processor. DO NOT UNDER ANY CIRCUMSTANCES use - single quotes instead of double quotes. Some examples: - - - \`ROW a = "foo bar" | DISSECT a "%{b} %{c}";\` - - \`ROW a = "foo bar baz" | DISSECT a "%{b} %{?c} %{d}";\` - - ### DROP - - \`DROP\` removes columns. Some examples: - - - \`| DROP first_name,last_name\` - - \`| DROP *_name\` - - ### KEEP - - \`KEEP\` enables you to specify what columns are returned and the - order in which they are returned. Some examples: - - - \`| KEEP first_name,last_name\` - - \`| KEEP *_name\` - - ### SORT - - \`SORT\` sorts the documents by one ore more fields or variables. - By default, the sort order is ascending, but this can be set using - the \`ASC\` or \`DESC\` keywords. Some examples: - - - \`| SORT my_field\` - - \`| SORT height DESC\` - - DO NOT UNDER ANY CIRCUMSTANCES use functions or math as part of the - sort statement. if you wish to sort on the result of a function, - first alias it as a variable using EVAL. - This is wrong: \`| SORT AVG(cpu)\`. - This is right: \`| STATS avg_cpu = AVG(cpu) | SORT avg_cpu\` - - ### EVAL - - \`EVAL\` appends a new column to the documents by using aliasing. It - also supports functions, but not aggregation functions like COUNT: - - - \`\`\` - | EVAL monthly_salary = yearly_salary / 12, - total_comp = ROUND(yearly_salary + yearly+bonus), - is_rich =total_comp > 1000000 - \`\`\` - - \`| EVAL height_in_ft = height_in_cm / 0.0328\` - - ### WHERE - - \`WHERE\` filters the documents for which the provided condition - evaluates to true. Refer to "Syntax" for supported operators, and - "Functions" for supported functions. When using WHERE, make sure - that the columns in your statement are still available. Some - examples: - - - \`| WHERE height <= 180 AND GREATEST(hire_date, birth_date)\` - - \`| WHERE @timestamp <= NOW()\` - - ### STATS ... BY - - \`STATS ... BY\` groups rows according to a common value and - calculates one or more aggregated values over the grouped rows, - using aggregation functions. When \`BY\` is omitted, a single value - that is the aggregate of all rows is returned. Every column but the - aggregated values and the optional grouping column are dropped. - Mention the retained columns when explaining the STATS command. - - DO NOT UNDER ANY CIRCUMSTANCES use non-aggregation functions (like - CASE or DATE_EXTRACT) or mathemetical operators in the STATS - command. YOU MUST USE an EVAL command before the STATS command - to append the new calculated column. - - Some examples: - - - \`| STATS count = COUNT(emp_no) BY languages\` - - \`| STATS salary = AVG(salary)\` - - \`| EVAL monthly_salary = salary / 12 | STATS avg_monthly_salary = AVG(monthly_salary) BY emp_country\` - - ### LIMIT - - Limits the rows returned. Only supports a number as input. Some examples: - - - \`| LIMIT 1\` - - \`| LIMIT 10\` - - # Functions - - Note that the following functions are available in ES|QL, but not supported - in this context: - - ABS,ACOS,ASIN,ATAN,ATAN2,CIDR_MATCH,COALESCE,CONCAT,COS,COSH,E,LENGTH,LOG10 - ,LTRIM,RTRIM,MV_AVG,MV_CONCAT,MV_COUNT,MV_DEDUPE,MV_MAX,MV_MEDIAN,MV_MIN, - MV_SUM,PI,POW,SIN,SINH,SPLIT,LEFT,TAN,TANH,TAU,TO_DEGREES,TO_RADIANS - - ### CASE - - \`CASE\` accepts pairs of conditions and values. The function returns - the value that belongs to the first condition that evaluates to true. If - the number of arguments is odd, the last argument is the default value which - is returned when no condition matches. Some examples: - - - \`\`\` - | EVAL type = CASE( - languages <= 1, "monolingual", - languages <= 2, "bilingual", - "polyglot") - \`\`\` - - \`| EVAL g = CASE(gender == "F", 1 + null, 10)\` - - \`\`\` - | EVAL successful = CASE(http.response.status_code == 200, 1, 0), failed = CASE(http.response.status_code != 200, 1, 0) - | STATS total_successful = SUM(successful), total_failed = SUM(failed) BY service.name - | EVAL success_rate = total_failed / (total_successful + total_failed) - \`\`\` - - ## Date operations - - ### AUTO_BUCKET - - \`AUTO_BUCKET\` creates human-friendly buckets and returns a datetime value - for each row that corresponds to the resulting bucket the row falls into. - Combine AUTO_BUCKET with STATS ... BY to create a date histogram. - You provide a target number of buckets, a start date, and an end date, - and it picks an appropriate bucket size to generate the target number of - buckets or fewer. If you don't have a start and end date, provide placeholder - values. Some examples: - - - \`| EVAL bucket=AUTO_BUCKET(@timestamp), 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z")\` - - \`| EVAL bucket=AUTO_BUCKET(my_date_field), 100, , )\` - - \`| EVAL bucket=AUTO_BUCKET(@timestamp), 100, NOW() - 15 minutes, NOW())\` - - ### DATE_EXTRACT - - \`DATE_EXTRACT\` parts of a date, like year, month, day, hour. The supported - field types are those provided by java.time.temporal.ChronoField. - Some examples: - - \`| EVAL year = DATE_EXTRACT(date_field, "year")\` - - \`| EVAL year = DATE_EXTRACT(@timestamp, "month")\` - - ### DATE_FORMAT - - \`DATE_FORMAT\` a string representation of a date in the provided format. - Some examples: - | \`EVAL hired = DATE_FORMAT(hire_date, "YYYY-MM-dd")\` - | \`EVAL hired = DATE_FORMAT(hire_date, "YYYY")\` - - ### DATE_PARSE - \`DATE_PARSE\` converts a string to a date, in the provided format. - - \`| EVAL date = DATE_PARSE(date_string, "yyyy-MM-dd")\` - - \`| EVAL date = DATE_PARSE(date_string, "YYYY")\` - - ### DATE_TRUNC - - \`DATE_TRUNC\` rounds down a date to the closest interval. Intervals - can be expressed using the timespan literal syntax. Use this together - with STATS ... BY to group data into time buckets with a fixed interval. - Some examples: - - - \`| EVAL year_hired = DATE_TRUNC(1 year, hire_date)\` - - \`| EVAL month_logged = DATE_TRUNC(1 month, @timestamp)\` - - \`| EVAL bucket = DATE_TRUNC(1 minute, @timestamp) | STATS avg_salary = AVG(salary) BY bucket\` - - \`| EVAL bucket = DATE_TRUNC(4 hours, @timestamp) | STATS max_salary MAX(salary) BY bucket\` - - ### NOW - - \`NOW\` returns current date and time. Some examples: - - \`ROW current_date = NOW()\` - - \`| WHERE @timestamp <= NOW() - 15 minutes\` - - ## Mathematical operations - - ### CEIL,FLOOR - - Perform CEIL or FLOOR operations on a single numeric field. - Some examples: - - \`| EVAL ceiled = CEIL(my.number)\` - - \`| EVAL floored = FLOOR(my.other.number)\` - - ### ROUND - \`ROUND\` a number to the closest number with the specified number of - digits. Defaults to 0 digits if no number of digits is provided. If the - specified number of digits is negative, rounds to the number of digits - left of the decimal point. Some examples: - - - \`| EVAL height_ft = ROUND(height * 3.281, 1)\` - - \`| EVAL percent = ROUND(0.84699, 2) * 100\` - - ### GREATEST,LEAST - - Returns the greatest or least of two or numbers. Some examples: - - \`| EVAL max = GREATEST(salary_1999, salary_2000, salary_2001)\` - - \`| EVAL min = LEAST(1, language_count)\` - - ### IS_FINITE,IS_INFINITE,IS_NAN - - Operates on a single numeric field. Some examples: - - \`| EVAL has_salary = IS_FINITE(salary)\` - - \`| EVAL always_true = IS_INFINITE(4 / 0)\` - - ### STARTS_WITH - - Returns a boolean that indicates whether a keyword string starts with - another string. Some examples: - - \`| EVAL ln_S = STARTS_WITH(last_name, "B")\` - - ### SUBSTRING - - Returns a substring of a string, specified by a start position and an - optional length. Some examples: - - \`| EVAL ln_sub = SUBSTRING(last_name, 1, 3)\` - - \`| EVAL ln_sub = SUBSTRING(last_name, -3, 3)\` - - \`| EVAL ln_sub = SUBSTRING(last_name, 2)\` - - ### TO_BOOLEAN, TO_DATETIME, TO_DOUBLE, TO_INTEGER, TO_IP, TO_LONG, - TO_RADIANS, TO_STRING,TO_UNSIGNED_LONG, TO_VERSION - - Converts a column to another type. Some examples: - - \`| EVAL version = TO_VERSION("1.2.3")\` - - \`| EVAL as_bool = TO_BOOLEAN(my_boolean_string)\` - - \`| EVAL percent = TO_DOUBLE(part) / TO_DOUBLE(total)\` - - ### TRIM - - Trims leading and trailing whitespace. Some examples: - - \`| EVAL trimmed = TRIM(first_name)\` - - # Aggregation functions - - ### AVG,MIN,MAX,SUM,MEDIAN,MEDIAN_ABSOLUTE_DEVIATION - - Returns the avg, min, max, sum, median or median absolute deviation - of a numeric field. Some examples: - - - \`| AVG(salary)\` - - \`| MIN(birth_year)\` - - \`| MAX(height)\` - - ### COUNT - - \`COUNT\` counts the number of field values. It requires a single - argument, and does not support wildcards. One single argument is - required. If you don't have a field name, use whatever field you have, - rather than displaying an invalid query. - - Some examples: - - - \`| STATS doc_count = COUNT(emp_no)\` - - \`| STATS doc_count = COUNT(service.name) BY service.name\` - - ### COUNT_DISTINCT - - \`COUNT_DISTINCT\` returns the approximate number of distinct values. - Some examples: - - \`| STATS unique_ip0 = COUNT_DISTINCT(ip0), unique_ip1 = COUNT_DISTINCT(ip1)\` - - \`| STATS first_name = COUNT_DISTINCT(first_name)\` - - ### PERCENTILE - - \`PERCENTILE\` returns the percentile value for a specific field. - Some examples: - - \`| STATS p50 = PERCENTILE(salary, 50)\` - - \`| STATS p99 = PERCENTILE(salary, 99)\` - - `); - - const source$ = streamIntoObservable( - await client.chat({ - connectorId, - messages: [ - { - '@timestamp': new Date().toISOString(), - message: { role: MessageRole.System, content: systemMessage }, - }, - ...messages.slice(1), - ], - signal, - stream: true, - }) - ).pipe(processOpenAiStream()); - - return new Observable((subscriber) => { - let cachedContent: string = ''; - - function includesDivider() { - const firstDividerIndex = cachedContent.indexOf('--'); - return firstDividerIndex !== -1 && cachedContent.lastIndexOf('--') !== firstDividerIndex; - } - - source$.subscribe({ - next: (message) => { - if (includesDivider()) { - subscriber.next(message); - } - cachedContent += message.choices[0].delta.content || ''; - }, - complete: () => { - if (!includesDivider()) { - subscriber.next({ - created: 0, - id: '', - model: '', - object: 'chat.completion.chunk', - choices: [ - { - delta: { - content: cachedContent, - }, - }, - ], - }); - } - subscriber.complete(); - }, - error: (error) => { - subscriber.error(error); - }, - }); - }); - } - ); -} diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-abs.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-abs.txt new file mode 100644 index 0000000000000..f27b33d6d1473 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-abs.txt @@ -0,0 +1,8 @@ +ABS + + +Returns the absolute value. +FROM employees +| KEEP first_name, last_name, height +| EVAL abs_height = ABS(0.0 - height) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-acos.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-acos.txt new file mode 100644 index 0000000000000..0274cdfac205a --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-acos.txt @@ -0,0 +1,11 @@ +ACOS + +Syntax +Parameters +n +Numeric expression. If null, the function returns null. +DescriptionReturns the arccosine of n as an +angle, expressed in radians.Supported types +Example +ROW a=.9 +| EVAL acos=ACOS(a) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-asin.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-asin.txt new file mode 100644 index 0000000000000..6e36b7d776cd0 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-asin.txt @@ -0,0 +1,7 @@ +ASIN + + +Inverse sine trigonometric function. +ROW a=.9 +| EVAL asin=ASIN(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-atan.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-atan.txt new file mode 100644 index 0000000000000..78a6c0b4a4f71 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-atan.txt @@ -0,0 +1,7 @@ +ATAN + + +Inverse tangent trigonometric function. +ROW a=12.9 +| EVAL atan=ATAN(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-atan2.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-atan2.txt new file mode 100644 index 0000000000000..c194e8ee9f0a7 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-atan2.txt @@ -0,0 +1,8 @@ +ATAN2 + + +The angle between the positive x-axis and the +ray from the origin to the point (x , y) in the Cartesian plane. +ROW y=12.9, x=.6 +| EVAL atan2=ATAN2(y, x) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-auto_bucket.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-auto_bucket.txt new file mode 100644 index 0000000000000..1263cccd6d519 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-auto_bucket.txt @@ -0,0 +1,27 @@ +AUTO_BUCKET + +Creates human-friendly buckets and returns a datetime value for each row that +corresponds to the resulting bucket the row falls into. Combine AUTO_BUCKET +with STATS ... BY to create a date histogram.You provide a target number of buckets, a start date, and an end date, and it +picks an appropriate bucket size to generate the target number of buckets or +fewer. For example, this asks for at most 20 buckets over a whole year, which +picks monthly buckets: +ROW date=TO_DATETIME("1985-07-09T00:00:00.000Z") +| EVAL bucket=AUTO_BUCKET(date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +The goal isn’t to provide exactly the target number of buckets, it’s to pick a +range that people are comfortable with that provides at most the target number of +buckets.If you ask for more buckets then AUTO_BUCKET can pick a smaller range. For example, +asking for at most 100 buckets in a year will get you week long buckets: +ROW date=TO_DATETIME("1985-07-09T00:00:00.000Z") +| EVAL bucket=AUTO_BUCKET(date, 100, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +AUTO_BUCKET does not filter any rows. It only uses the provided time range to +pick a good bucket size. For rows with a date outside of the range, it returns a +datetime that corresponds to a bucket outside the range. Combine AUTO_BUCKET +with WHERE to filter rows.A more complete example might look like: +FROM employees +| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" +| EVAL bucket = AUTO_BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +| STATS AVG(salary) BY bucket +| SORT bucket +AUTO_BUCKET does not create buckets that don’t match any documents. That’s +why the example above is missing 1985-03-01 and other dates. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-avg.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-avg.txt new file mode 100644 index 0000000000000..40667a199cc1f --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-avg.txt @@ -0,0 +1,6 @@ +AVG + +The average of a numeric field. +FROM employees +| STATS AVG(height) +The result is always a double not matter the input type. \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-case.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-case.txt new file mode 100644 index 0000000000000..35c9278ba2fd5 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-case.txt @@ -0,0 +1,22 @@ +CASE + +Syntax +CASE(condition1, value1[, ..., conditionN, valueN][, default_value]) +Parameters +conditionX +A condition. +valueX +The value that’s returned when the corresponding condition is the first to +evaluate to true. +default_value +The default value that’s is returned when no condition matches. +DescriptionAccepts pairs of conditions and values. The function returns the value that +belongs to the first condition that evaluates to true.If the number of arguments is odd, the last argument is the default value which +is returned when no condition matches. If the number of arguments is even, and +no condition matches, the function returns null.Example +FROM employees +| EVAL type = CASE( + languages <= 1, "monolingual", + languages <= 2, "bilingual", + "polyglot") +| KEEP emp_no, languages, type diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-ceil.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-ceil.txt new file mode 100644 index 0000000000000..685ec6690772d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-ceil.txt @@ -0,0 +1,10 @@ +CEIL + + +Round a number up to the nearest integer. +ROW a=1.8 +| EVAL a=CEIL(a) +This is a noop for long (including unsigned) and integer. + For double this picks the the closest double value to the integer ala + Math.ceil. +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-coalesce.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-coalesce.txt new file mode 100644 index 0000000000000..568f045de8d64 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-coalesce.txt @@ -0,0 +1,5 @@ +COALESCE + +Returns the first non-null value. +ROW a=null, b="b" +| EVAL COALESCE(a, b) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-concat.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-concat.txt new file mode 100644 index 0000000000000..e92c691a7e520 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-concat.txt @@ -0,0 +1,6 @@ +CONCAT + +Concatenates two or more strings. +FROM employees +| KEEP first_name, last_name, height +| EVAL fullname = CONCAT(first_name, " ", last_name) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-cos.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-cos.txt new file mode 100644 index 0000000000000..db7252d5966c4 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-cos.txt @@ -0,0 +1,7 @@ +COS + + +Cosine trigonometric function. Input expected in radians. +ROW a=1.8 +| EVAL cos=COS(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-cosh.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-cosh.txt new file mode 100644 index 0000000000000..22f221bbe18bb --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-cosh.txt @@ -0,0 +1,7 @@ +COSH + + +Cosine hyperbolic function. +ROW a=1.8 +| EVAL cosh=COSH(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-count.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-count.txt new file mode 100644 index 0000000000000..555b80f2d532d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-count.txt @@ -0,0 +1,10 @@ +COUNT + +Counts field values. +FROM employees +| STATS COUNT(height) +Can take any field type as input and the result is always a long not matter +the input type.To count the number of rows, use COUNT(*): +FROM employees +| STATS count = COUNT(*) BY languages +| SORT languages DESC diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-count_distinct.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-count_distinct.txt new file mode 100644 index 0000000000000..dbe422e6703b5 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-count_distinct.txt @@ -0,0 +1,28 @@ +COUNT_DISTINCT + +The approximate number of distinct values. +FROM hosts +| STATS COUNT_DISTINCT(ip0), COUNT_DISTINCT(ip1) +Can take any field type as input and the result is always a long not matter +the input type.Counts are approximateeditComputing exact counts requires loading values into a set and returning its +size. This doesn’t scale when working on high-cardinality sets and/or large +values as the required memory usage and the need to communicate those +per-shard sets between nodes would utilize too many resources of the cluster.This COUNT_DISTINCT function is based on the +HyperLogLog++ +algorithm, which counts based on the hashes of the values with some interesting +properties: +configurable precision, which decides on how to trade memory for accuracy, +excellent accuracy on low-cardinality sets, +fixed memory usage: no matter if there are tens or billions of unique values, +memory usage only depends on the configured precision. +For a precision threshold of c, the implementation that we are using requires +about c * 8 bytes.The following chart shows how the error varies before and after the threshold:For all 3 thresholds, counts have been accurate up to the configured threshold. +Although not guaranteed, this is likely to be the case. Accuracy in practice depends +on the dataset in question. In general, most datasets show consistently good +accuracy. Also note that even with a threshold as low as 100, the error +remains very low (1-6% as seen in the above graph) even when counting millions of items.The HyperLogLog++ algorithm depends on the leading zeros of hashed +values, the exact distributions of hashes in a dataset can affect the +accuracy of the cardinality.Precision is configurableeditThe COUNT_DISTINCT function takes an optional second parameter to configure the +precision discussed previously. +FROM hosts +| STATS COUNT_DISTINCT(ip0, 80000), COUNT_DISTINCT(ip1, 5) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_extract.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_extract.txt new file mode 100644 index 0000000000000..442c9e6c9d719 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_extract.txt @@ -0,0 +1,6 @@ +DATE_EXTRACT + +Extracts parts of a date, like year, month, day, hour. +The supported field types are those provided by java.time.temporal.ChronoField. +ROW date = DATE_PARSE("yyyy-MM-dd", "2022-05-06") +| EVAL year = DATE_EXTRACT("year", date) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_format.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_format.txt new file mode 100644 index 0000000000000..b772cac90a0ee --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_format.txt @@ -0,0 +1,7 @@ +DATE_FORMAT + +Returns a string representation of a date in the provided format. If no format +is specified, the yyyy-MM-dd'T'HH:mm:ss.SSSZ format is used. +FROM employees +| KEEP first_name, last_name, hire_date +| EVAL hired = DATE_FORMAT("YYYY-MM-dd", hire_date) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_parse.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_parse.txt new file mode 100644 index 0000000000000..f03321af7eb93 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_parse.txt @@ -0,0 +1,16 @@ +DATE_PARSE + +Syntax +DATE_PARSE([format,] date_string) +Parameters +format +The date format. Refer to the +DateTimeFormatter +documentation for the syntax. If null, the function returns null. +date_string +Date expression as a string. If null or an empty string, the function returns +null. +DescriptionReturns a date by parsing the second argument using the format specified in the +first argument.Example +ROW date_string = "2022-05-06" +| EVAL date = DATE_PARSE("yyyy-MM-dd", date_string) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_trunc.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_trunc.txt new file mode 100644 index 0000000000000..773a2a9ce9513 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-date_trunc.txt @@ -0,0 +1,8 @@ +DATE_TRUNC + +Rounds down a date to the closest interval. Intervals can be expressed using the +timespan literal syntax. +FROM employees +| EVAL year_hired = DATE_TRUNC(1 year, hire_date) +| STATS COUNT(emp_no) BY year_hired +| SORT year_hired diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-dissect.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-dissect.txt new file mode 100644 index 0000000000000..c4f99757f0b57 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-dissect.txt @@ -0,0 +1,25 @@ +DISSECT + +Syntax +DISSECT input "pattern" [APPEND_SEPARATOR=""] +Parameters +input +The column that contains the string you want to structure. If the column has +multiple values, DISSECT will process each value. +pattern +A dissect pattern. + +A string used as the separator between appended values, when using the append modifier. +DescriptionDISSECT enables you to extract +structured data out of a string. DISSECT matches the string against a +delimiter-based pattern, and extracts the specified keys as columns.Refer to Process data with DISSECT for the syntax of dissect patterns.ExamplesThe following example parses a string that contains a timestamp, some text, and +an IP address: +ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1" +| DISSECT a "%{date} - %{msg} - %{ip}" +| KEEP date, msg, ip +By default, DISSECT outputs keyword string columns. To convert to another +type, use Type conversion functions: +ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1" +| DISSECT a "%{date} - %{msg} - %{ip}" +| KEEP date, msg, ip +| EVAL date = TO_DATETIME(date) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-drop.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-drop.txt new file mode 100644 index 0000000000000..88d5af4315d9f --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-drop.txt @@ -0,0 +1,14 @@ +DROP + +Syntax +DROP columns +Parameters +columns +A comma-separated list of columns to remove. Supports wildcards. +DescriptionThe DROP processing command removes one or more columns.Examples +FROM employees +| DROP height +Rather than specify each column by name, you can use wildcards to drop all +columns with a name that matches a pattern: +FROM employees +| DROP height* diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-e.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-e.txt new file mode 100644 index 0000000000000..7b56bebff6dce --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-e.txt @@ -0,0 +1,5 @@ +E + + +Euler’s number. +ROW E() diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-enrich.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-enrich.txt new file mode 100644 index 0000000000000..94b18473228cb --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-enrich.txt @@ -0,0 +1,47 @@ +ENRICH + +Syntax +ENRICH policy [ON match_field] [WITH [new_name1 = ]field1, [new_name2 = ]field2, ...] +Parameters +policy +The name of the enrich policy. You need to create +and execute the enrich policy first. +match_field +The match field. ENRICH uses its value to look for records in the enrich +index. If not specified, the match will be performed on the column with the same +name as the match_field defined in the enrich policy. +fieldX +The enrich fields from the enrich index that are added to the result as new +columns. If a column with the same name as the enrich field already exists, the +existing column will be replaced by the new column. If not specified, each of +the enrich fields defined in the policy is added +new_nameX +Enables you to change the name of the column that’s added for each of the enrich +fields. Defaults to the enrich field name. +DescriptionENRICH enables you to add data from existing indices as new columns using an +enrich policy. Refer to Data enrichment for information about setting up a +policy. +Before you can use ENRICH, you need to create +and execute an enrich policy. +ExamplesThe following example uses the languages_policy enrich policy to add a new +column for each enrich field defined in the policy. The match is performed using +the match_field defined in the enrich policy and +requires that the input table has a column with the same name (language_code +in this example). ENRICH will look for records in the +enrich index based on the match field value. +ROW language_code = "1" +| ENRICH languages_policy +To use a column with a different name than the match_field defined in the +policy as the match field, use ON : +ROW a = "1" +| ENRICH languages_policy ON a +By default, each of the enrich fields defined in the policy is added as a +column. To explicitly select the enrich fields that are added, use +WITH , , ...: +ROW a = "1" +| ENRICH languages_policy ON a WITH language_name +You can rename the columns that are added using WITH new_name=: +ROW a = "1" +| ENRICH languages_policy ON a WITH name = language_name +In case of name collisions, the newly created columns will override existing +columns. \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-eval.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-eval.txt new file mode 100644 index 0000000000000..23aa334bdbb71 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-eval.txt @@ -0,0 +1,23 @@ +EVAL + +Syntax +EVAL column1 = value1[, ..., columnN = valueN] +Parameters +columnX +The column name. +valueX +The value for the column. Can be a literal, an expression, or a +function. +DescriptionThe EVAL processing command enables you to append new columns with calculated +values. EVAL supports various functions for calculating values. Refer to +Functions for more information.Examples +FROM employees +| SORT emp_no +| KEEP first_name, last_name, height +| EVAL height_feet = height * 3.281, height_cm = height * 100 +If the specified column already exists, the existing column will be dropped, and +the new column will be appended to the table: +FROM employees +| SORT emp_no +| KEEP first_name, last_name, height +| EVAL height = height * 3.281 diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-floor.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-floor.txt new file mode 100644 index 0000000000000..b27997edd8bff --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-floor.txt @@ -0,0 +1,10 @@ +FLOOR + + +Round a number down to the nearest integer. +ROW a=1.8 +| EVAL a=FLOOR(a) +This is a noop for long (including unsigned) and integer. + For double this picks the the closest double value to the integer ala + Math.floor. +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-from.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-from.txt new file mode 100644 index 0000000000000..15a471cb44ead --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-from.txt @@ -0,0 +1,29 @@ +FROM + +Syntax +FROM index_pattern [METADATA fields] +Parameters +index_pattern +A list of indices, data streams or aliases. Supports wildcards and date math. +fields +A comma-separated list of metadata fields to retrieve. +DescriptionThe FROM source command returns a table with data from a data stream, index, +or alias. Each row in the resulting table represents a document. Each column +corresponds to a field, and can be accessed by the name of that field. +By default, an ES|QL query without an explicit LIMIT uses an implicit +limit of 500. This applies to FROM too. A FROM command without LIMIT: +FROM employees +is executed as: +FROM employees +| LIMIT 500 +Examples +FROM employees +You can use date math to refer to indices, aliases +and data streams. This can be useful for time series data, for example to access +today’s index: +FROM +Use comma-separated lists or wildcards to query multiple data streams, indices, +or aliases: +FROM employees-00001,other-employees-* +Use the METADATA directive to enable metadata fields: +FROM employees [METADATA _id] diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-greatest.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-greatest.txt new file mode 100644 index 0000000000000..119ecd48edf4c --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-greatest.txt @@ -0,0 +1,11 @@ +GREATEST + + +Returns the maximum value from many columns. This is similar to MV_MAX +except it’s intended to run on multiple columns at once. +ROW a = 10, b = 20 +| EVAL g = GREATEST(a, b) +When run on keyword or text fields, this’ll return the last string + in alphabetical order. When run on boolean columns this will return + true if any values are true. +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-grok.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-grok.txt new file mode 100644 index 0000000000000..57d3cb32b7270 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-grok.txt @@ -0,0 +1,28 @@ +GROK + +Syntax +GROK input "pattern" +Parameters +input +The column that contains the string you want to structure. If the column has +multiple values, GROK will process each value. +pattern +A grok pattern. +DescriptionGROK enables you to extract +structured data out of a string. GROK matches the string against patterns, +based on regular expressions, and extracts the specified patterns as columns.Refer to Process data with GROK for the syntax of grok patterns.ExamplesThe following example parses a string that contains a timestamp, an IP address, +an email address, and a number: +ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42" +| GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}" +| KEEP date, ip, email, num +By default, GROK outputs keyword string columns. int and float types can +be converted by appending :type to the semantics in the pattern. For example +{NUMBER:num:int}: +ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42" +| GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}" +| KEEP date, ip, email, num +For other type conversions, use Type conversion functions: +ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42" +| GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}" +| KEEP date, ip, email, num +| EVAL date = TO_DATETIME(date) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-keep.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-keep.txt new file mode 100644 index 0000000000000..466a421cb247a --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-keep.txt @@ -0,0 +1,19 @@ +KEEP + +Syntax +KEEP columns +Parameters +columns:: +A comma-separated list of columns to keep. Supports wildcards.DescriptionThe KEEP processing command enables you to specify what columns are returned +and the order in which they are returned.ExamplesThe columns are returned in the specified order: +FROM employees +| KEEP emp_no, first_name, last_name, height +Rather than specify each column by name, you can use wildcards to return all +columns with a name that matches a pattern: +FROM employees +| KEEP h* +The asterisk wildcard (*) by itself translates to all columns that do not +match the other arguments. This query will first return all columns with a name +that starts with h, followed by all other columns: +FROM employees +| KEEP h*, * diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-least.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-least.txt new file mode 100644 index 0000000000000..d598679f84f57 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-least.txt @@ -0,0 +1,11 @@ +LEAST + + +Returns the minimum value from many columns. This is similar to MV_MIN +except it’s intended to run on multiple columns at once. +ROW a = 10, b = 20 +| EVAL l = LEAST(a, b) +When run on keyword or text fields, this’ll return the first string + in alphabetical order. When run on boolean columns this will return + false if any values are false. +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-left.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-left.txt new file mode 100644 index 0000000000000..2edc0378aa312 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-left.txt @@ -0,0 +1,10 @@ +LEFT + + +Return the substring that extracts length chars from the string starting from the left. +FROM employees +| KEEP last_name +| EVAL left = LEFT(last_name, 3) +| SORT last_name ASC +| LIMIT 5 +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-length.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-length.txt new file mode 100644 index 0000000000000..29e22edcb4176 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-length.txt @@ -0,0 +1,6 @@ +LENGTH + +Returns the character length of a string. +FROM employees +| KEEP first_name, last_name, height +| EVAL fn_length = LENGTH(first_name) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-limit.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-limit.txt new file mode 100644 index 0000000000000..520b8e5547e9f --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-limit.txt @@ -0,0 +1,24 @@ +LIMIT + +Syntax +LIMIT max_number_of_rows +Parameters +max_number_of_rows +The maximum number of rows to return. +DescriptionThe LIMIT processing command enables you to limit the number of rows that are +returned. +Queries do not return more than 10,000 rows, regardless of the LIMIT command’s +value.This limit only applies to the number of rows that are retrieved by the query. +Queries and aggregations run on the full data set.To overcome this limitation: +Reduce the result set size by modifying the query to only return relevant +data. Use WHERE to select a smaller subset of the data. +Shift any post-query processing to the query itself. You can use the ES|QL +STATS ... BY command to aggregate data in the query. +The default and maximum limits can be changed using these dynamic cluster +settings: +esql.query.result_truncation_default_size +esql.query.result_truncation_max_size +Example +FROM employees +| SORT emp_no ASC +| LIMIT 5 diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-limitations.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-limitations.txt new file mode 100644 index 0000000000000..c5ae151eab121 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-limitations.txt @@ -0,0 +1,149 @@ + +You are looking at preliminary documentation for a future release. +Not what you want? See the +current release documentation. +Elastic Docs +›Elasticsearch Guide [master] +›ES|QL +« ES|QL task management +ES|QL examples » +ES|QL limitationsedit +Result set size limitedit +By default, an ES|QL query returns up to 500 rows. You can increase the number +of rows up to 10,000 using the `LIMIT` command. +Queries do not return more than 10,000 rows, regardless of the `LIMIT` command’s +value. +This limit only applies to the number of rows that are retrieved by the query. +Queries and aggregations run on the full data set. +To overcome this limitation: +Reduce the result set size by modifying the query to only return relevant +data. Use `WHERE` to select a smaller subset of the data. +Shift any post-query processing to the query itself. You can use the ES|QL +`STATS ... BY` command to aggregate data in the query. +The default and maximum limits can be changed using these dynamic cluster +settings: +`esql.query.result_truncation_default_size` +`esql.query.result_truncation_max_size` +Field typesedit +Supported typesedit +ES|QL currently supports the following field types: +`alias` +`boolean` +`date` +`double` (`float`, `half_float`, `scaled_float` are represented as `double`) +`ip` +`keyword` family including `keyword`, `constant_keyword`, and `wildcard` +`int` (`short` and `byte` are represented as `int`) +`long` +`null` +`text` +`unsigned_long` +`version` +Spatial types +`geo_point` +`point` +Unsupported typesedit +ES|QL does not yet support the following field types: +TSDB metrics +`counter` +`position` +`aggregate_metric_double` +Spatial types +`geo_shape` +`shape` +Date/time +`date_nanos` +`date_range` +Other types +`binary` +`completion` +`dense_vector` +`double_range` +`flattened` +`float_range` +`histogram` +`integer_range` +`ip_range` +`long_range` +`nested` +`rank_feature` +`rank_features` +`search_as_you_type` +Querying a column with an unsupported type returns an error. If a column with an +unsupported type is not explicitly used in a query, it is returned with `null` +values, with the exception of nested fields. Nested fields are not returned at +all. +Full-text search is not supportededit +Because of the way ES|QL treats `text` values, +full-text search is not yet supported. Queries on `text` fields are like queries +on `keyword` fields: they are case-sensitive and need to match the full string. +For example, after indexing a field of type `text` with the value `Elasticsearch +query language`, the following `WHERE` clause does not match because the `LIKE` +operator is case-sensitive: +| WHERE field LIKE "elasticsearch query language" +The following `WHERE` clause does not match either, because the `LIKE` operator +tries to match the whole string: +| WHERE field LIKE "Elasticsearch" +As a workaround, use wildcards and regular expressions. For example: +| WHERE field RLIKE "[Ee]lasticsearch.*" +`text` fields behave like `keyword` fieldsedit +While ES|QL supports `text` fields, ES|QL does not treat these fields +like the Search API does. ES|QL queries do not query or aggregate the +analyzed string. Instead, an ES|QL query will try to get a `text` +field’s subfield of the keyword family type and query/aggregate +that. If it’s not possible to retrieve a `keyword` subfield, ES|QL will get the +string from a document’s `_source`. If the `_source` cannot be retrieved, for +example when using synthetic source, `null` is returned. +Note that ES|QL’s retrieval of `keyword` subfields may have unexpected +consequences. An ES|QL query on a `text` field is case-sensitive. Furthermore, +a subfield may have been mapped with a normalizer, which can +transform the original string. Or it may have been mapped with `ignore_above`, +which can truncate the string. None of these mapping operations are applied to +an ES|QL query, which may lead to false positives or negatives. +To avoid these issues, a best practice is to be explicit about the field that +you query, and query `keyword` sub-fields instead of `text` fields. +Time series data streams are not supportededit +ES|QL does not support querying time series data streams (TSDS). +Cross-cluster search is not supportededit +ES|QL does not support cross-cluster search. +Date math limitationsedit +Date math expressions work well when the leftmost expression is a datetime, for +example: +now() + 1 year - 2hour + ... +But using parentheses or putting the datetime to the right is not always supported yet. For example, the following expressions fail: +1year + 2hour + now() +now() + (1year + 2hour) +Date math does not allow subtracting two datetimes, for example: +now() - 2023-10-26 +Enrich limitationsedit +The ES|QL `ENRICH` command only supports enrich policies of type `match`. +Furthermore, `ENRICH` only supports enriching on a column of type `keyword`. +Dissect limitationsedit +The `DISSECT` command does not support reference keys. +Grok limitationsedit +The `GROK` command does not support configuring custom +patterns, or multiple patterns. The `GROK` command is not +subject to Grok watchdog settings. +Multivalue limitationsedit +ES|QL supports multivalued fields, but functions +return `null` when applied to a multivalued field, unless documented otherwise. +Work around this limitation by converting the field to single value with one of +the multivalue functions. +Timezone supportedit +ES|QL only supports the UTC timezone. +Kibana limitationsedit +The user interface to filter data is not enabled when Discover is in ES|QL +mode. To filter data, write a query that uses the `WHERE` command +instead. +In ES|QL mode, clicking a field in the field list in Discover does not show +quick statistics for that field. +Discover shows no more than 10,000 rows. This limit only applies to the number +of rows that are retrieved by the query and displayed in Discover. Queries and +aggregations run on the full data set. +Discover shows no more than 50 columns. If a query returns +more than 50 columns, Discover only shows the first 50. +Querying many many indices at once without any filters can cause an error in +kibana which looks like `[esql] > Unexpected error from Elasticsearch: The +content length (536885793) is bigger than the maximum allowed string +(536870888)`. The response from ES|QL is too long. Use `DROP` or +`KEEP` to limit the number of fields returned. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-log10.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-log10.txt new file mode 100644 index 0000000000000..dabc5bc7c05c7 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-log10.txt @@ -0,0 +1,8 @@ +LOG10 + + +Returns the log base 10. The input can be any numeric value, the return value +is always a double.Logs of negative numbers are NaN. Logs of infinites are infinite, as is the log of 0. +ROW d = 1000.0 +| EVAL s = LOG10(d) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-ltrim.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-ltrim.txt new file mode 100644 index 0000000000000..350b0b1e369ba --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-ltrim.txt @@ -0,0 +1,10 @@ +LTRIM + + +Removes leading whitespaces from strings. +ROW message = " some text ", color = " red " +| EVAL message = LTRIM(message) +| EVAL color = LTRIM(color) +| EVAL message = CONCAT("'", message, "'") +| EVAL color = CONCAT("'", color, "'") +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-max.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-max.txt new file mode 100644 index 0000000000000..22b23e89c7438 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-max.txt @@ -0,0 +1,5 @@ +MAX + +The maximum value of a numeric field. +FROM employees +| STATS MAX(languages) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-median.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-median.txt new file mode 100644 index 0000000000000..df0aa45577b2e --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-median.txt @@ -0,0 +1,9 @@ +MEDIAN + +The value that is greater than half of all values and less than half of +all values, also known as the 50% PERCENTILE. +FROM employees +| STATS MEDIAN(salary), PERCENTILE(salary, 50) +Like PERCENTILE, MEDIAN is usually approximate. +MEDIAN is also non-deterministic. +This means you can get slightly different results using the same data. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-median_absolute_deviation.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-median_absolute_deviation.txt new file mode 100644 index 0000000000000..bf7329c62fb3b --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-median_absolute_deviation.txt @@ -0,0 +1,14 @@ +MEDIAN_ABSOLUTE_DEVIATION + +The median absolute deviation, a measure of variability. It is a robust +statistic, meaning that it is useful for describing data that may have outliers, +or may not be normally distributed. For such data it can be more descriptive than +standard deviation.It is calculated as the median of each data point’s deviation from the median of +the entire sample. That is, for a random variable X, the median absolute deviation +is median(|median(X) - Xi|). +FROM employees +| STATS MEDIAN(salary), MEDIAN_ABSOLUTE_DEVIATION(salary) +Like PERCENTILE, MEDIAN_ABSOLUTE_DEVIATION is + usually approximate. +MEDIAN_ABSOLUTE_DEVIATION is also non-deterministic. +This means you can get slightly different results using the same data. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-min.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-min.txt new file mode 100644 index 0000000000000..97e021e3153ab --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-min.txt @@ -0,0 +1,5 @@ +MIN + +The minimum value of a numeric field. +FROM employees +| STATS MIN(languages) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_avg.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_avg.txt new file mode 100644 index 0000000000000..ee144a77697df --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_avg.txt @@ -0,0 +1,7 @@ +MV_AVG + +Converts a multivalued field into a single valued field containing the average +of all of the values. For example: +ROW a=[3, 5, 1, 6] +| EVAL avg_a = MV_AVG(a) +The output type is always a double and the input type can be any number. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_concat.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_concat.txt new file mode 100644 index 0000000000000..1d579bee82a43 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_concat.txt @@ -0,0 +1,11 @@ +MV_CONCAT + + +Converts a multivalued string field into a single valued field containing the +concatenation of all values separated by a delimiter: +ROW a=["foo", "zoo", "bar"] +| EVAL j = MV_CONCAT(a, ", ") +If you want to concat non-string fields call TO_STRING on them first: +ROW a=[10, 9, 8] +| EVAL j = MV_CONCAT(TO_STRING(a), ", ") +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_count.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_count.txt new file mode 100644 index 0000000000000..e6149e02c9fd9 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_count.txt @@ -0,0 +1,8 @@ +MV_COUNT + + +Converts a multivalued field into a single valued field containing a count of the number +of values: +ROW a=["foo", "zoo", "bar"] +| EVAL count_a = MV_COUNT(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_dedupe.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_dedupe.txt new file mode 100644 index 0000000000000..e844e01bdc626 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_dedupe.txt @@ -0,0 +1,8 @@ +MV_DEDUPE + + +Removes duplicates from a multivalued field. For example: +ROW a=["foo", "foo", "bar", "foo"] +| EVAL dedupe_a = MV_DEDUPE(a) +Supported types: +MV_DEDUPE may, but won’t always, sort the values in the field. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_expand.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_expand.txt new file mode 100644 index 0000000000000..b8e757914b0b0 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_expand.txt @@ -0,0 +1,11 @@ +MV_EXPAND + +Syntax +MV_EXPAND column +Parameters +column +The multivalued column to expand. +DescriptionThe MV_EXPAND processing command expands multivalued columns into one row per +value, duplicating other columns.Example +ROW a=[1,2,3], b="b", j=["a","b"] +| MV_EXPAND a diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_max.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_max.txt new file mode 100644 index 0000000000000..91ff991dfcb42 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_max.txt @@ -0,0 +1,11 @@ +MV_MAX + + +Converts a multivalued field into a single valued field containing the maximum value. For example: +ROW a=[3, 5, 1] +| EVAL max_a = MV_MAX(a) +It can be used by any field type, including keyword fields. In that case picks the +last string, comparing their utf-8 representation byte by byte: +ROW a=["foo", "zoo", "bar"] +| EVAL max_a = MV_MAX(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_median.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_median.txt new file mode 100644 index 0000000000000..293e86b022c5d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_median.txt @@ -0,0 +1,10 @@ +MV_MEDIAN + +Converts a multivalued field into a single valued field containing the median value. For example: +ROW a=[3, 5, 1] +| EVAL median_a = MV_MEDIAN(a) +It can be used by any numeric field type and returns a value of the same type. If the +row has an even number of values for a column the result will be the average of the +middle two entries. If the field is not floating point then the average rounds down: +ROW a=[3, 7, 1, 6] +| EVAL median_a = MV_MEDIAN(a) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_min.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_min.txt new file mode 100644 index 0000000000000..577464825cd72 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_min.txt @@ -0,0 +1,11 @@ +MV_MIN + + +Converts a multivalued field into a single valued field containing the minimum value. For example: +ROW a=[2, 1] +| EVAL min_a = MV_MIN(a) +It can be used by any field type, including keyword fields. In that case picks the +first string, comparing their utf-8 representation byte by byte: +ROW a=["foo", "bar"] +| EVAL min_a = MV_MIN(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_sum.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_sum.txt new file mode 100644 index 0000000000000..34973728b2710 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-mv_sum.txt @@ -0,0 +1,7 @@ +MV_SUM + +Converts a multivalued field into a single valued field containing the sum +of all of the values. For example: +ROW a=[3, 5, 6] +| EVAL sum_a = MV_SUM(a) +The input type can be any number and the output type is the same as the input type. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-now.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-now.txt new file mode 100644 index 0000000000000..2145d6b17add7 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-now.txt @@ -0,0 +1,4 @@ +NOW + +Returns current date and time. +ROW current_date = NOW() diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-numeric-fields.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-numeric-fields.txt new file mode 100644 index 0000000000000..f08b10515aa55 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-numeric-fields.txt @@ -0,0 +1,12 @@ +Numeric fields + +auto_bucket can also operate on numeric fields like this: +FROM employees +| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" +| EVAL bs = AUTO_BUCKET(salary, 20, 25324, 74999) +| SORT hire_date, salary +| KEEP hire_date, salary, bs +Unlike the example above where you are intentionally filtering on a date range, +you rarely want to filter on a numeric range. So you have find the min and max +separately. We don’t yet have an easy way to do that automatically. Improvements +coming! \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-operators.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-operators.txt new file mode 100644 index 0000000000000..29204aad6a3f6 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-operators.txt @@ -0,0 +1,181 @@ +Binary operators +Binary operators + + +Equality +Equality + + +Supported types: + +Inequality != +Inequality != + + +Supported types: + +Less than < +Less than < + + +Supported types: + +Less than or equal to <= +Less than or equal to <= + + +Supported types: + +Greater than > +Greater than > + + +Supported types: + +Greater than or equal to >= +Greater than or equal to >= + + +Supported types: + +Add + +Add + + + +Supported types: + +Subtract - +Subtract - + + +Supported types: + +Multiply * +Multiply * + + +Supported types: + +Divide / +Divide / + + +Supported types: + +Modulus % +Modulus % + + +Supported types: + +Unary operators +Unary operators + +The only unary operators is negation (-): +Supported types: + +Logical operators +Logical operators + +The following logical operators are supported: +AND +OR +NOT + +IS NULL and IS NOT NULL predicates +IS NULL and IS NOT NULL predicates + +For NULL comparison, use the IS NULL and IS NOT NULL predicates: +FROM employees +| WHERE birth_date IS NULL +| KEEP first_name, last_name +| SORT first_name +| LIMIT 3 +FROM employees +| WHERE is_rehired IS NOT NULL +| STATS COUNT(emp_no) + +CIDR_MATCH +CIDR_MATCH + +Returns true if the provided IP is contained in one of the provided CIDR +blocks.CIDR_MATCH accepts two or more arguments. The first argument is the IP +address of type ip (both IPv4 and IPv6 are supported). Subsequent arguments +are the CIDR blocks to test the IP against. +FROM hosts +| WHERE CIDR_MATCH(ip, "127.0.0.2/32", "127.0.0.3/32") + +ENDS_WITH +ENDS_WITH + + +Returns a boolean that indicates whether a keyword string ends with another +string: +FROM employees +| KEEP last_name +| EVAL ln_E = ENDS_WITH(last_name, "d") +Supported types: + +IN +IN + +The IN operator allows testing whether a field or expression equals +an element in a list of literals, fields or expressions: +ROW a = 1, b = 4, c = 3 +| WHERE c-a IN (3, b / 2, a) + +IS_FINITE +IS_FINITE + +Returns a boolean that indicates whether its input is a finite number. +ROW d = 1.0 +| EVAL s = IS_FINITE(d/0) + +IS_INFINITE +IS_INFINITE + +Returns a boolean that indicates whether its input is infinite. +ROW d = 1.0 +| EVAL s = IS_INFINITE(d/0) + +IS_NAN +IS_NAN + +Returns a boolean that indicates whether its input is not a number. +ROW d = 1.0 +| EVAL s = IS_NAN(d) + +LIKE +LIKE + +Use LIKE to filter data based on string patterns using wildcards. LIKE +usually acts on a field placed on the left-hand side of the operator, but it can +also act on a constant (literal) expression. The right-hand side of the operator +represents the pattern.The following wildcard characters are supported: +* matches zero or more characters. +? matches one character. +FROM employees +| WHERE first_name LIKE "?b*" +| KEEP first_name, last_name + +RLIKE +RLIKE + +Use RLIKE to filter data based on string patterns using using +regular expressions. RLIKE usually acts on a field placed on +the left-hand side of the operator, but it can also act on a constant (literal) +expression. The right-hand side of the operator represents the pattern. +FROM employees +| WHERE first_name RLIKE ".leja.*" +| KEEP first_name, last_name + +STARTS_WITH +STARTS_WITH + + +Returns a boolean that indicates whether a keyword string starts with another +string: +FROM employees +| KEEP last_name +| EVAL ln_S = STARTS_WITH(last_name, "B") +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-overview.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-overview.txt new file mode 100644 index 0000000000000..ea9b24ba48464 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-overview.txt @@ -0,0 +1,45 @@ + +ES|QLedit +This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. +The Elasticsearch Query Language (ES|QL) provides a powerful way to filter, transform, +and analyze data stored in Elasticsearch, and in the future in other runtimes. It is +designed to be easy to learn and use, by end users, SRE teams, application +developers, and administrators. +Users can author ES|QL queries to find specific events, perform statistical +analysis, and generate visualizations. It supports a wide range of commands and +functions that enable users to perform various data operations, such as +filtering, aggregation, time-series analysis, and more. +The Elasticsearch Query Language (ES|QL) makes use of "pipes" (|) to manipulate and +transform data in a step-by-step fashion. This approach allows users to compose +a series of operations, where the output of one operation becomes the input for +the next, enabling complex data transformations and analysis. +The ES|QL Compute Engineedit +ES|QL is more than a language: it represents a significant investment in new +compute capabilities within Elasticsearch. To achieve both the functional and performance +requirements for ES|QL, it was necessary to build an entirely new compute +architecture. ES|QL search, aggregation, and transformation functions are +directly executed within Elasticsearch itself. Query expressions are not +transpiled to Query DSL for execution. This approach allows ES|QL to be +extremely performant and versatile. +The new ES|QL execution engine was designed with performance in mind — it +operates on blocks at a time instead of per row, targets vectorization and cache +locality, and embraces specialization and multi-threading. It is a separate +component from the existing Elasticsearch aggregation framework with different +performance characteristics. +The ES|QL documentation is organized in these sections: +Getting started +A tutorial to help you get started with ES|QL. +Learning ES|QL +Reference documentation for the ES|QL syntax, +commands, and functions and +operators. Information about working with metadata +fields and multivalued fields. And guidance for +data processing with DISSECT and +GROK and data enrichment with ENRICH. +Using ES|QL +An overview of using the REST API, Using ES|QL in Kibana, +Using ES|QL in Elastic Security, and Task management. +Limitations +The current limitations of ES|QL. +Examples +A few examples of what you can do with ES|QL. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-percentile.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-percentile.txt new file mode 100644 index 0000000000000..432990415fc94 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-percentile.txt @@ -0,0 +1,32 @@ +PERCENTILE + +The value at which a certain percentage of observed values occur. For example, +the 95th percentile is the value which is greater than 95% of the observed values and +the 50th percentile is the MEDIAN. +FROM employees +| STATS p0 = PERCENTILE(salary, 0) + , p50 = PERCENTILE(salary, 50) + , p99 = PERCENTILE(salary, 99) +PERCENTILE is (usually) approximateeditThere are many different algorithms to calculate percentiles. The naive +implementation simply stores all the values in a sorted array. To find the 50th +percentile, you simply find the value that is at my_array[count(my_array) * 0.5].Clearly, the naive implementation does not scale — the sorted array grows +linearly with the number of values in your dataset. To calculate percentiles +across potentially billions of values in an Elasticsearch cluster, approximate +percentiles are calculated.The algorithm used by the percentile metric is called TDigest (introduced by +Ted Dunning in +Computing Accurate Quantiles using T-Digests).When using this metric, there are a few guidelines to keep in mind: +Accuracy is proportional to q(1-q). This means that extreme percentiles (e.g. 99%) +are more accurate than less extreme percentiles, such as the median +For small sets of values, percentiles are highly accurate (and potentially +100% accurate if the data is small enough). +As the quantity of values in a bucket grows, the algorithm begins to approximate +the percentiles. It is effectively trading accuracy for memory savings. The +exact level of inaccuracy is difficult to generalize, since it depends on your +data distribution and volume of data being aggregated +The following chart shows the relative error on a uniform distribution depending +on the number of collected values and the requested percentile:It shows how precision is better for extreme percentiles. The reason why error diminishes +for large number of values is that the law of large numbers makes the distribution of +values more and more uniform and the t-digest tree can do a better job at summarizing +it. It would not be the case on more skewed distributions. +PERCENTILE is also non-deterministic. +This means you can get slightly different results using the same data. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-pi.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-pi.txt new file mode 100644 index 0000000000000..169af57566903 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-pi.txt @@ -0,0 +1,5 @@ +PI + + +The ratio of a circle’s circumference to its diameter. +ROW PI() diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-pow.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-pow.txt new file mode 100644 index 0000000000000..d74c58b7e0b6a --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-pow.txt @@ -0,0 +1,13 @@ +POW + + +Returns the value of a base (first argument) raised to the power of an exponent (second argument). +Both arguments must be numeric. The output is always a double. Note that it is still possible to overflow +a double result here; in that case, null will be returned. +ROW base = 2.0, exponent = 2 +| EVAL result = POW(base, exponent) +Fractional exponentseditThe exponent can be a fraction, which is similar to performing a root. +For example, the exponent of 0.5 will give the square root of the base: +ROW base = 4, exponent = 0.5 +| EVAL s = POW(base, exponent) +Table of supported input and output typeseditFor clarity, the following table describes the output result type for all combinations of numeric input types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-processing-commands.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-processing-commands.txt new file mode 100644 index 0000000000000..125e55bfb2996 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-processing-commands.txt @@ -0,0 +1,17 @@ +Processing commands + +ES|QL processing commands change an input table by adding, removing, or changing +rows and columns. +ES|QL supports these processing commands: +DISSECT +DROP +ENRICH +EVAL +GROK +KEEP +LIMIT +MV_EXPAND +RENAME +SORT +STATS ... BY +WHERE diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-rename.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-rename.txt new file mode 100644 index 0000000000000..27ca77b68d0fd --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-rename.txt @@ -0,0 +1,18 @@ +RENAME + +Syntax +RENAME old_name1 AS new_name1[, ..., old_nameN AS new_nameN] +Parameters +old_nameX +The name of a column you want to rename. +new_nameX +The new name of the column. +DescriptionThe RENAME processing command renames one or more columns. If a column with +the new name already exists, it will be replaced by the new column.Examples +FROM employees +| KEEP first_name, last_name, still_hired +| RENAME still_hired AS employed +Multiple columns can be renamed with a single RENAME command: +FROM employees +| KEEP first_name, last_name +| RENAME first_name AS fn, last_name AS ln diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-replace.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-replace.txt new file mode 100644 index 0000000000000..cf9102ab9471e --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-replace.txt @@ -0,0 +1,7 @@ +REPLACE + +The function substitutes in the string (1st argument) any match of the regular expression (2nd argument) with the replacement string (3rd argument).If any of the arguments are NULL, the result is NULL. +This example replaces an occurrence of the word "World" with the word "Universe": +ROW str = "Hello World" +| EVAL str = REPLACE(str, "World", "Universe") +| KEEP str diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-right.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-right.txt new file mode 100644 index 0000000000000..2cd30d32cd7c1 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-right.txt @@ -0,0 +1,10 @@ +RIGHT + + +Return the substring that extracts length chars from the string starting from the right. +FROM employees +| KEEP last_name +| EVAL right = RIGHT(last_name, 3) +| SORT last_name ASC +| LIMIT 5 +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-round.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-round.txt new file mode 100644 index 0000000000000..8ecb92ecc81be --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-round.txt @@ -0,0 +1,8 @@ +ROUND + +Rounds a number to the closest number with the specified number of digits. +Defaults to 0 digits if no number of digits is provided. If the specified number +of digits is negative, rounds to the number of digits left of the decimal point. +FROM employees +| KEEP first_name, last_name, height +| EVAL height_ft = ROUND(height * 3.281, 1) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-row.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-row.txt new file mode 100644 index 0000000000000..fa57a1bcc5660 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-row.txt @@ -0,0 +1,17 @@ +ROW + +Syntax +ROW column1 = value1[, ..., columnN = valueN] +Parameters +columnX +The column name. +valueX +The value for the column. Can be a literal, an expression, or a +function. +DescriptionThe ROW source command produces a row with one or more columns with values +that you specify. This can be useful for testing.Examples +ROW a = 1, b = "two", c = null +Use square brackets to create multi-value columns: +ROW a = [2, 1] +ROW supports the use of functions: +ROW a = ROUND(1.23, 0) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-rtrim.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-rtrim.txt new file mode 100644 index 0000000000000..63b6c428cadf2 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-rtrim.txt @@ -0,0 +1,10 @@ +RTRIM + + +Removes trailing whitespaces from strings. +ROW message = " some text ", color = " red " +| EVAL message = RTRIM(message) +| EVAL color = RTRIM(color) +| EVAL message = CONCAT("'", message, "'") +| EVAL color = CONCAT("'", color, "'") +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-show.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-show.txt new file mode 100644 index 0000000000000..cb7fab0300435 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-show.txt @@ -0,0 +1,15 @@ +SHOW + +Syntax +SHOW item +Parameters +item +Can be INFO or FUNCTIONS. +DescriptionThe SHOW source command returns information about the deployment and +its capabilities: +Use SHOW INFO to return the deployment’s version, build date and hash. +Use SHOW FUNCTIONS to return a list of all supported functions and a +synopsis of each function. +Examples +SHOW functions +| WHERE STARTS_WITH(name, "is_") diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sin.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sin.txt new file mode 100644 index 0000000000000..1c64c76791ea8 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sin.txt @@ -0,0 +1,7 @@ +SIN + + +Sine trigonometric function. Input expected in radians. +ROW a=1.8 +| EVAL sin=SIN(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sinh.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sinh.txt new file mode 100644 index 0000000000000..7a9d8a0bbcab7 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sinh.txt @@ -0,0 +1,7 @@ +SINH + + +Sine hyperbolic function. +ROW a=1.8 +| EVAL sinh=SINH(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sort.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sort.txt new file mode 100644 index 0000000000000..e1838ca567241 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sort.txt @@ -0,0 +1,29 @@ +SORT + +Syntax +SORT column1 [ASC/DESC][NULLS FIRST/NULLS LAST][, ..., columnN [ASC/DESC][NULLS FIRST/NULLS LAST]] +Parameters +columnX +The column to sort on. +DescriptionThe SORT processing command sorts a table on one or more columns.The default sort order is ascending. Use ASC or DESC to specify an explicit +sort order.Two rows with the same sort key are considered equal. You can provide additional +sort expressions to act as tie breakers.Sorting on multivalued columns uses the lowest value when sorting ascending and +the highest value when sorting descending.By default, null values are treated as being larger than any other value. With +an ascending sort order, null values are sorted last, and with a descending +sort order, null values are sorted first. You can change that by providing +NULLS FIRST or NULLS LAST.Examples +FROM employees +| KEEP first_name, last_name, height +| SORT height +Explicitly sorting in ascending order with ASC: +FROM employees +| KEEP first_name, last_name, height +| SORT height DESC +Providing additional sort expressions to act as tie breakers: +FROM employees +| KEEP first_name, last_name, height +| SORT height DESC, first_name ASC +Sorting null values first using NULLS FIRST: +FROM employees +| KEEP first_name, last_name, height +| SORT first_name ASC NULLS FIRST diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-source-commands.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-source-commands.txt new file mode 100644 index 0000000000000..8065c0e0bbfb0 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-source-commands.txt @@ -0,0 +1,7 @@ +Source commands + +An ES|QL source command produces a table, typically with data from Elasticsearch. An ES|QL query must start with a source command. +ES|QL supports these source commands: +FROM +ROW +SHOW diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-split.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-split.txt new file mode 100644 index 0000000000000..8dbd7e74731e1 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-split.txt @@ -0,0 +1,7 @@ +SPLIT + +Split a single valued string into multiple strings. For example: +ROW words="foo;bar;baz;qux;quux;corge" +| EVAL word = SPLIT(words, ";") +Which splits "foo;bar;baz;qux;quux;corge" on ; and returns an array: +Only single byte delimiters are currently supported. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sqrt.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sqrt.txt new file mode 100644 index 0000000000000..6b5c8a56a0d43 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sqrt.txt @@ -0,0 +1,8 @@ +SQRT + + +Returns the square root of a number. The input can be any numeric value, the return value +is always a double.Square roots of negative numbers are NaN. Square roots of infinites are infinite. +ROW d = 100.0 +| EVAL s = SQRT(d) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-stats.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-stats.txt new file mode 100644 index 0000000000000..2a1edb4966d15 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-stats.txt @@ -0,0 +1,50 @@ +STATS ... BY + +Syntax +STATS [column1 =] expression1[, ..., [columnN =] expressionN] [BY grouping_column1[, ..., grouping_columnN]] +Parameters +columnX +The name by which the aggregated value is returned. If omitted, the name is +equal to the corresponding expression (expressionX). +expressionX +An expression that computes an aggregated value. +grouping_columnX +The column containing the values to group by. +DescriptionThe STATS ... BY processing command groups rows according to a common value +and calculate one or more aggregated values over the grouped rows. If BY is +omitted, the output table contains exactly one row with the aggregations applied +over the entire dataset.The following aggregation functions are supported: +AVG +COUNT +COUNT_DISTINCT +MAX +MEDIAN +MEDIAN_ABSOLUTE_DEVIATION +MIN +PERCENTILE +SUM +STATS without any groups is much much faster than adding a group. +Grouping on a single column is currently much more optimized than grouping + on many columns. In some tests we have seen grouping on a single keyword + column to be five times faster than grouping on two keyword columns. Do + not try to work around this by combining the two columns together with + something like CONCAT and then grouping - that is not going to be + faster. +ExamplesCalculating a statistic and grouping by the values of another column: +FROM employees +| STATS count = COUNT(emp_no) BY languages +| SORT languages +Omitting BY returns one row with the aggregations applied over the entire +dataset: +FROM employees +| STATS avg_lang = AVG(languages) +It’s possible to calculate multiple values: +FROM employees +| STATS avg_lang = AVG(languages), max_lang = MAX(languages) +It’s also possible to group by multiple values (only supported for long and +keyword family fields): +FROM employees +| EVAL hired = DATE_FORMAT("YYYY", hire_date) +| STATS avg_salary = AVG(salary) BY hired, languages.long +| EVAL avg_salary = ROUND(avg_salary) +| SORT hired, languages.long diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-substring.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-substring.txt new file mode 100644 index 0000000000000..a113ad838cc8a --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-substring.txt @@ -0,0 +1,17 @@ +SUBSTRING + +Returns a substring of a string, specified by a start position and an optional +length. This example returns the first three characters of every last name: +FROM employees +| KEEP last_name +| EVAL ln_sub = SUBSTRING(last_name, 1, 3) +A negative start position is interpreted as being relative to the end of the +string. This example returns the last three characters of of every last name: +FROM employees +| KEEP last_name +| EVAL ln_sub = SUBSTRING(last_name, -3, 3) +If length is omitted, substring returns the remainder of the string. This +example returns all characters except for the first: +FROM employees +| KEEP last_name +| EVAL ln_sub = SUBSTRING(last_name, 2) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sum.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sum.txt new file mode 100644 index 0000000000000..bc24875fce219 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-sum.txt @@ -0,0 +1,5 @@ +SUM + +The sum of a numeric field. +FROM employees +| STATS SUM(languages) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-syntax.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-syntax.txt new file mode 100644 index 0000000000000..8656c63f308f3 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-syntax.txt @@ -0,0 +1,94 @@ + +ES|QL syntax referenceedit +Basic syntaxedit +An ES|QL query is composed of a source command followed +by an optional series of processing commands, +separated by a pipe character: `|`. For example: +source-command +| processing-command1 +| processing-command2 +The result of a query is the table produced by the final processing command. +For an overview of all supported commands, functions, and operators, refer to Commands and Functions and operators. +For readability, this documentation puts each processing command on a new +line. However, you can write an ES|QL query as a single line. The following +query is identical to the previous one: +source-command | processing-command1 | processing-command2 +Identifiersedit +The identifiers can be used as they are and don’t require quoting, unless +containing special characters, in which case they must be quoted with +backticks (```). What "special characters" means is command dependent. +For FROM, KEEP, DROP, +RENAME, MV_EXPAND and +ENRICH these are: `=`, ```, `,`, ` ` (space), `|` , +`[`, `]`, `\t` (TAB), `\r` (CR), `\n` (LF); one `/` is allowed unquoted, but +a sequence of two or more require quoting. +The rest of the commands - those allowing for identifiers be used in +expressions - require quoting if the identifier contains characters other than +letters, numbers and `_` and doesn’t start with a letter, `_` or `@`. +For instance: +// Retain just one field +FROM index +| KEEP 1.field +is legal. However, if same field is to be used with an EVAL, +it’d have to be quoted: +// Copy one field +FROM index +| EVAL my_field = `1.field` +Literalsedit +ES|QL currently supports numeric and string literals. +String literalsedit +A string literal is a sequence of unicode characters delimited by double +quotes (`"`). +// Filter by a string value +FROM index +| WHERE first_name == "Georgi" +If the literal string itself contains quotes, these need to be escaped (`\\"`). +ES|QL also supports the triple-quotes (`"""`) delimiter, for convenience: +ROW name = """Indiana "Indy" Jones""" +The special characters CR, LF and TAB can be provided with the usual escaping: +`\r`, `\n`, `\t`, respectively. +Numerical literalsedit +The numeric literals are accepted in decimal and in the scientific notation +with the exponent marker (`e` or `E`), starting either with a digit, decimal +point `.` or the negative sign `-`: +1969 -- integer notation +3.14 -- decimal notation +.1234 -- decimal notation starting with decimal point +4E5 -- scientific notation (with exponent marker) +1.2e-3 -- scientific notation with decimal point +-.1e2 -- scientific notation starting with the negative sign +The integer numeric literals are implicitly converted to the `integer`, `long` +or the `double` type, whichever can first accommodate the literal’s value. +The floating point literals are implicitly converted the `double` type. +To obtain constant values of different types, use one of the numeric +conversion functions. +Commentsedit +ES|QL uses C++ style comments: +double slash `//` for single line comments +`/*` and `*/` for block comments +// Query the employees index +FROM employees +| WHERE height > 2 +FROM /* Query the employees index */ employees +| WHERE height > 2 +FROM employees +/* Query the + * employees + * index */ +| WHERE height > 2 +Timespan literalsedit +Datetime intervals and timespans can be expressed using timespan literals. +Timespan literals are a combination of a number and a qualifier. These +qualifiers are supported: +`millisecond`/`milliseconds` +`second`/`seconds` +`minute`/`minutes` +`hour`/`hours` +`day`/`days` +`week`/`weeks` +`month`/`months` +`year`/`years` +Timespan literals are not whitespace sensitive. These expressions are all valid: +`1day` +`1 day` +`1 day` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tan.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tan.txt new file mode 100644 index 0000000000000..63b752c8c6248 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tan.txt @@ -0,0 +1,7 @@ +TAN + + +Tangent trigonometric function. Input expected in radians. +ROW a=1.8 +| EVAL tan=TAN(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tanh.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tanh.txt new file mode 100644 index 0000000000000..83493cec93984 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tanh.txt @@ -0,0 +1,7 @@ +TANH + + +Tangent hyperbolic function. +ROW a=1.8 +| EVAL tanh=TANH(a) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tau.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tau.txt new file mode 100644 index 0000000000000..b60a1bde563d2 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-tau.txt @@ -0,0 +1,5 @@ +TAU + + +The ratio of a circle’s circumference to its radius. +ROW TAU() diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_boolean.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_boolean.txt new file mode 100644 index 0000000000000..a6259f436f076 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_boolean.txt @@ -0,0 +1,10 @@ +TO_BOOLEAN + +Converts an input value to a boolean value.The input can be a single- or multi-valued field or an expression. The input +type must be of a string or numeric type.A string value of "true" will be case-insensitive converted to the Boolean +true. For anything else, including the empty string, the function will +return false. For example: +ROW str = ["true", "TRuE", "false", "", "yes", "1"] +| EVAL bool = TO_BOOLEAN(str) +The numerical value of 0 will be converted to false, anything else will be +converted to true.Alias: TO_BOOL \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_cartesianpoint.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_cartesianpoint.txt new file mode 100644 index 0000000000000..e50645f73fb45 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_cartesianpoint.txt @@ -0,0 +1,8 @@ +TO_CARTESIANPOINT + +Converts an input value to a point value.The input can be a single- or multi-valued field or an expression. +The input type must be a string or a cartesian point.A string will only be successfully converted if it respects the +WKT Point format: +row wkt = ["POINT(4297.11 -1475.53)", "POINT(7580.93 2272.77)"] +| mv_expand wkt +| eval pt = to_cartesianpoint(wkt) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_datetime.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_datetime.txt new file mode 100644 index 0000000000000..d985309c75c62 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_datetime.txt @@ -0,0 +1,17 @@ +TO_DATETIME + +Converts an input value to a date value.The input can be a single- or multi-valued field or an expression. The input +type must be of a string or numeric type.A string will only be successfully converted if it’s respecting the format +yyyy-MM-dd'T'HH:mm:ss.SSS'Z' (to convert dates in other formats, use DATE_PARSE). For example: +ROW string = ["1953-09-02T00:00:00.000Z", "1964-06-02T00:00:00.000Z", "1964-06-02 00:00:00"] +| EVAL datetime = TO_DATETIME(string) +Note that in this example, the last value in the source multi-valued +field has not been converted. The reason being that if the date format is not +respected, the conversion will result in a null value. When this happens a +Warning header is added to the response. The header will provide information +on the source of the failure:"Line 1:112: evaluation of [TO_DATETIME(string)] failed, treating result as null. Only first 20 failures recorded."A following header will contain the failure reason and the offending value:"java.lang.IllegalArgumentException: failed to parse date field [1964-06-02 00:00:00] with format [yyyy-MM-dd'T'HH:mm:ss.SSS'Z']"If the input parameter is of a numeric type, its value will be interpreted as +milliseconds since the Unix epoch. +For example: +ROW int = [0, 1] +| EVAL dt = TO_DATETIME(int) +Alias: TO_DT \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_degrees.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_degrees.txt new file mode 100644 index 0000000000000..e6df993088477 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_degrees.txt @@ -0,0 +1,7 @@ +TO_DEGREES + +Converts a number in radians +to degrees.The input can be a single- or multi-valued field or an expression. The input +type must be of a numeric type and result is always double.Example: +ROW rad = [1.57, 3.14, 4.71] +| EVAL deg = TO_DEGREES(rad) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_double.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_double.txt new file mode 100644 index 0000000000000..2e1dd75654abe --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_double.txt @@ -0,0 +1,12 @@ +TO_DOUBLE + +Converts an input value to a double value.The input can be a single- or multi-valued field or an expression. The input +type must be of a boolean, date, string or numeric type.Example: +ROW str1 = "5.20128E11", str2 = "foo" +| EVAL dbl = TO_DOUBLE("520128000000"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2) +Note that in this example, the last conversion of the string isn’t +possible. When this happens, the result is a null value. In this case a +Warning header is added to the response. The header will provide information +on the source of the failure:"Line 1:115: evaluation of [TO_DOUBLE(str2)] failed, treating result as null. Only first 20 failures recorded."A following header will contain the failure reason and the offending value:"java.lang.NumberFormatException: For input string: \"foo\""If the input parameter is of a date type, its value will be interpreted as +milliseconds since the Unix epoch, +converted to double.Boolean true will be converted to double 1.0, false to 0.0.Alias: TO_DBL \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_geopoint.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_geopoint.txt new file mode 100644 index 0000000000000..4aabac29f8c6d --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_geopoint.txt @@ -0,0 +1,7 @@ +TO_GEOPOINT + +Converts an input value to a geo_point value.The input can be a single- or multi-valued field or an expression. +The input type must be a string or a geo_point.A string will only be successfully converted if it respects the +WKT Point format: +row wkt = "POINT(42.97109630194 14.7552534413725)" +| eval pt = to_geopoint(wkt) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_integer.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_integer.txt new file mode 100644 index 0000000000000..eab5669791922 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_integer.txt @@ -0,0 +1,12 @@ +TO_INTEGER + +Converts an input value to an integer value.The input can be a single- or multi-valued field or an expression. The input +type must be of a boolean, date, string or numeric type.Example: +ROW long = [5013792, 2147483647, 501379200000] +| EVAL int = TO_INTEGER(long) +Note that in this example, the last value of the multi-valued field cannot +be converted as an integer. When this happens, the result is a null value. +In this case a Warning header is added to the response. The header will +provide information on the source of the failure:"Line 1:61: evaluation of [TO_INTEGER(long)] failed, treating result as null. Only first 20 failures recorded."A following header will contain the failure reason and the offending value:"org.elasticsearch.xpack.ql.QlIllegalArgumentException: [501379200000] out of [integer] range"If the input parameter is of a date type, its value will be interpreted as +milliseconds since the Unix epoch, +converted to integer.Boolean true will be converted to integer 1, false to 0.Alias: TO_INT \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_ip.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_ip.txt new file mode 100644 index 0000000000000..0e8f2fd1274a1 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_ip.txt @@ -0,0 +1,10 @@ +TO_IP + +Converts an input string to an IP value.The input can be a single- or multi-valued field or an expression.Example: +ROW str1 = "1.1.1.1", str2 = "foo" +| EVAL ip1 = TO_IP(str1), ip2 = TO_IP(str2) +| WHERE CIDR_MATCH(ip1, "1.0.0.0/8") +Note that in the example above the last conversion of the string isn’t +possible. When this happens, the result is a null value. In this case a +Warning header is added to the response. The header will provide information +on the source of the failure:"Line 1:68: evaluation of [TO_IP(str2)] failed, treating result as null. Only first 20 failures recorded."A following header will contain the failure reason and the offending value:"java.lang.IllegalArgumentException: 'foo' is not an IP string literal." \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_long.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_long.txt new file mode 100644 index 0000000000000..37a73209c7043 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_long.txt @@ -0,0 +1,12 @@ +TO_LONG + +Converts an input value to a long value.The input can be a single- or multi-valued field or an expression. The input +type must be of a boolean, date, string or numeric type.Example: +ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo" +| EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3) +Note that in this example, the last conversion of the string isn’t +possible. When this happens, the result is a null value. In this case a +Warning header is added to the response. The header will provide information +on the source of the failure:"Line 1:113: evaluation of [TO_LONG(str3)] failed, treating result as null. Only first 20 failures recorded."A following header will contain the failure reason and the offending value:"java.lang.NumberFormatException: For input string: \"foo\""If the input parameter is of a date type, its value will be interpreted as +milliseconds since the Unix epoch, +converted to long.Boolean true will be converted to long 1, false to 0. \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_radians.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_radians.txt new file mode 100644 index 0000000000000..d0118e1fa0271 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_radians.txt @@ -0,0 +1,7 @@ +TO_RADIANS + +Converts a number in degrees to +radians.The input can be a single- or multi-valued field or an expression. The input +type must be of a numeric type and result is always double.Example: +ROW deg = [90.0, 180.0, 270.0] +| EVAL rad = TO_RADIANS(deg) diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_string.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_string.txt new file mode 100644 index 0000000000000..4cb34acc5e054 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_string.txt @@ -0,0 +1,10 @@ +TO_STRING + + +Converts a field into a string. For example: +ROW a=10 +| EVAL j = TO_STRING(a) +It also works fine on multivalued fields: +ROW a=[10, 9, 8] +| EVAL j = TO_STRING(a) +Alias: TO_STRSupported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_unsigned_long.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_unsigned_long.txt new file mode 100644 index 0000000000000..ae42a582079b3 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_unsigned_long.txt @@ -0,0 +1,12 @@ +TO_UNSIGNED_LONG + +Converts an input value to an unsigned long value.The input can be a single- or multi-valued field or an expression. The input +type must be of a boolean, date, string or numeric type.Example: +ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo" +| EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3) +Note that in this example, the last conversion of the string isn’t +possible. When this happens, the result is a null value. In this case a +Warning header is added to the response. The header will provide information +on the source of the failure:"Line 1:133: evaluation of [TO_UL(str3)] failed, treating result as null. Only first 20 failures recorded."A following header will contain the failure reason and the offending value:"java.lang.NumberFormatException: Character f is neither a decimal digit number, decimal point, nor \"e\" notation exponential mark."If the input parameter is of a date type, its value will be interpreted as +milliseconds since the Unix epoch, +converted to unsigned long.Boolean true will be converted to unsigned long 1, false to 0.Alias: TO_ULONG, TO_UL \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_version.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_version.txt new file mode 100644 index 0000000000000..84ec4214c6279 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-to_version.txt @@ -0,0 +1,6 @@ +TO_VERSION + + +Converts an input string to a version value. For example: +ROW v = TO_VERSION("1.2.3") +The input can be a single- or multi-valued field or an expression.Alias: TO_VERSupported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-trim.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-trim.txt new file mode 100644 index 0000000000000..5a7e51b0aa2ff --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-trim.txt @@ -0,0 +1,8 @@ +TRIM + + +Removes leading and trailing whitespaces from strings. +ROW message = " some text ", color = " red " +| EVAL message = TRIM(message) +| EVAL color = TRIM(color) +Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-where.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-where.txt new file mode 100644 index 0000000000000..f03e351e933f8 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/docs/esql-where.txt @@ -0,0 +1,51 @@ +WHERE + +Syntax +WHERE expression +Parameters +expression +A boolean expression. +DescriptionThe WHERE processing command produces a table that contains all the rows from +the input table for which the provided condition evaluates to true.Examples +FROM employees +| KEEP first_name, last_name, still_hired +| WHERE still_hired == true +Which, if still_hired is a boolean field, can be simplified to: +FROM employees +| KEEP first_name, last_name, still_hired +| WHERE still_hired +WHERE supports various functions. For example the +LENGTH function: +FROM employees +| KEEP first_name, last_name, height +| WHERE LENGTH(first_name) < 4 +For a complete list of all functions, refer to Functions and operators.For NULL comparison, use the IS NULL and IS NOT NULL predicates: +FROM employees +| WHERE birth_date IS NULL +| KEEP first_name, last_name +| SORT first_name +| LIMIT 3 +FROM employees +| WHERE is_rehired IS NOT NULL +| STATS COUNT(emp_no) +Use LIKE to filter data based on string patterns using wildcards. LIKE +usually acts on a field placed on the left-hand side of the operator, but it can +also act on a constant (literal) expression. The right-hand side of the operator +represents the pattern.The following wildcard characters are supported: +* matches zero or more characters. +? matches one character. +FROM employees +| WHERE first_name LIKE "?b*" +| KEEP first_name, last_name +Use RLIKE to filter data based on string patterns using using +regular expressions. RLIKE usually acts on a field placed on +the left-hand side of the operator, but it can also act on a constant (literal) +expression. The right-hand side of the operator represents the pattern. +FROM employees +| WHERE first_name RLIKE ".leja.*" +| KEEP first_name, last_name +The IN operator allows testing whether a field or expression equals +an element in a list of literals, fields or expressions: +ROW a = 1, b = 4, c = 3 +| WHERE c-a IN (3, b / 2, a) +For a complete list of all operators, refer to Operators. \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts new file mode 100644 index 0000000000000..dcc26adc52e43 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts @@ -0,0 +1,305 @@ +/* + * Copyright 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 Fs from 'fs'; +import { keyBy, mapValues, once, pick } from 'lodash'; +import pLimit from 'p-limit'; +import Path from 'path'; +import { lastValueFrom, Observable } from 'rxjs'; +import { promisify } from 'util'; +import type { FunctionRegistrationParameters } from '..'; +import { + CreateChatCompletionResponseChunk, + FunctionVisibility, + MessageRole, +} from '../../../common/types'; +import { concatenateOpenAiChunks } from '../../../common/utils/concatenate_openai_chunks'; +import { processOpenAiStream } from '../../../common/utils/process_openai_stream'; +import { streamIntoObservable } from '../../service/util/stream_into_observable'; + +const readFile = promisify(Fs.readFile); +const readdir = promisify(Fs.readdir); + +const loadSystemMessage = once(async () => { + const data = await readFile(Path.join(__dirname, './system_message.txt')); + return data.toString('utf-8'); +}); + +const loadEsqlDocs = once(async () => { + const dir = Path.join(__dirname, './docs'); + const files = (await readdir(dir)).filter((file) => Path.extname(file) === '.txt'); + + if (!files.length) { + return {}; + } + + const limiter = pLimit(10); + return keyBy( + await Promise.all( + files.map((file) => + limiter(async () => { + const data = (await readFile(Path.join(dir, file))).toString('utf-8'); + const filename = Path.basename(file, '.txt'); + + const keyword = filename + .replace('esql-', '') + .replace('agg-', '') + .replaceAll('-', '_') + .toUpperCase(); + + return { + keyword: keyword === 'STATS_BY' ? 'STATS' : keyword, + data, + }; + }) + ) + ), + 'keyword' + ); +}); + +export function registerEsqlFunction({ + client, + registerFunction, + resources, +}: FunctionRegistrationParameters) { + registerFunction( + { + name: 'execute_query', + contexts: ['core'], + visibility: FunctionVisibility.User, + description: 'Execute an ES|QL query', + parameters: { + type: 'object', + additionalProperties: false, + properties: { + query: { + type: 'string', + }, + }, + required: ['query'], + } as const, + }, + async ({ arguments: { query } }) => { + const response = await ( + await resources.context.core + ).elasticsearch.client.asCurrentUser.transport.request({ + method: 'POST', + path: '_query', + body: { + query, + }, + }); + + return { content: response }; + } + ); + + registerFunction( + { + name: 'esql', + contexts: ['core'], + description: `This function answers ES|QL related questions including query generation and syntax/command questions.`, + visibility: FunctionVisibility.System, + parameters: { + type: 'object', + additionalProperties: false, + properties: { + switch: { + type: 'boolean', + }, + }, + } as const, + }, + async ({ messages, connectorId }, signal) => { + const [systemMessage, esqlDocs] = await Promise.all([loadSystemMessage(), loadEsqlDocs()]); + + const withEsqlSystemMessage = (message?: string) => [ + { + '@timestamp': new Date().toISOString(), + message: { role: MessageRole.System, content: `${systemMessage}\n${message ?? ''}` }, + }, + ...messages.slice(1), + ]; + + const source$ = streamIntoObservable( + await client.chat({ + connectorId, + messages: withEsqlSystemMessage(), + signal, + stream: true, + functions: [ + { + name: 'get_esql_info', + description: + 'Use this function to get more information about syntax, commands and examples. Take a deep breath and reason about what commands and functions you expect to use. Do you need to group data? Request `STATS`. Extract data? Request `DISSECT` AND `GROK`. Convert a column based on a set of conditionals? Request `EVAL` and `CASE`.', + parameters: { + type: 'object', + properties: { + commands: { + type: 'array', + items: { + type: 'string', + }, + description: 'A list of processing or source commands', + }, + functions: { + type: 'array', + items: { + type: 'string', + }, + description: 'A list of functions.', + }, + }, + required: ['commands', 'functions'], + }, + }, + ], + functionCall: 'get_esql_info', + }) + ).pipe(processOpenAiStream(), concatenateOpenAiChunks()); + + const response = await lastValueFrom(source$); + + const args = JSON.parse(response.message.function_call.arguments) as { + commands: string[]; + functions: string[]; + }; + + const keywords = args.commands.concat(args.functions).concat('SYNTAX').concat('OVERVIEW'); + + const messagesToInclude = mapValues(pick(esqlDocs, keywords), ({ data }) => data); + + const esqlResponse$: Observable = streamIntoObservable( + await client.chat({ + messages: [ + ...withEsqlSystemMessage( + `Format every ES|QL query as Markdown: + \`\`\`esql + + \`\`\` + + Prefer to use commands and functions for which you have documentation. + + Pay special attention to these instructions. Not following these instructions to the tee + will lead to excruciating consequences for the user. + + #1 + Directive: ONLY use aggregation functions in STATS commands, and use ONLY aggregation functions in stats commands, NOT in SORT or EVAL. + Rationale: Only aggregation functions are supported in STATS commands, and aggregation functions are only supported in STATS commands. + Action: Create new columns using EVAL first and then aggregate over them in STATS commands. Do not use aggregation functions anywhere else, such as SORT or EVAL. + Example: EVAL is_failure_as_number = CASE(event.outcome == "failure", 1, 0) | STATS total_failures = SUM(is_failure_as_number) BY my_grouping_name + + #2 + Directive: Use the \`=\` operator to create new columns in STATS and EVAL, DO NOT UNDER ANY CIRCUMSTANCES use \`AS\`. + Rationale: The \`=\` operator is used for aliasing. Using \`AS\` leads to syntax errors. + Action: When creating a new column in a command, use the = operator. + Example: STATS total_requests = COUNT(*) + + #3 + Directive: Use placeholder values for information that is missing. + Rationale: It is critical to generate a syntactically valid query. + Action: When you don't know the arguments to a function because information is missing, use placeholder values. + Example: "Here's an ES|QL query that generates a timeseries of 50 buckets calculating the average duration. I've used + "2023-01-23T12:15:00.000Z" and "2023-01-23T12:30:00.000Z" as placeholder values. Replace them with the start + and end date that work for your use case." + + #4 + Directive: Wrap string literals in double quotes. + Rationale: It is critical to generate a syntactically valid query. + Action: When using string literals in function calls, wrap them in double quotes, not single quotes. + Example: DATE_EXTRACT("year", @timestamp) + + At the start of every message, YOU MUST, for every instruction that is relevant to the query you want to construct, + repeat its directives, verbatim, at the start of every message. Exclude the rationales, actions, and examples. Follow + it up by using a delimiter: -- + + Example: + + #1: + #2: + #3: + + -- + + Here is an ES|QL query that you can use: + + ` + ), + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.Assistant, + content: '', + function_call: { + name: 'get_esql_info', + arguments: JSON.stringify(args), + trigger: MessageRole.Assistant as const, + }, + }, + }, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + name: 'get_esql_info', + content: JSON.stringify({ + documentation: messagesToInclude, + }), + }, + }, + ], + connectorId, + functions: [], + signal, + stream: true, + }) + ).pipe(processOpenAiStream()); + + return esqlResponse$.pipe((source) => { + return new Observable((subscriber) => { + let cachedContent: string = ''; + + function includesDivider() { + const firstDividerIndex = cachedContent.indexOf('--'); + return firstDividerIndex !== -1; + } + + source.subscribe({ + next: (message) => { + if (includesDivider()) { + subscriber.next(message); + } + cachedContent += message.choices[0].delta.content || ''; + }, + complete: () => { + if (!includesDivider()) { + subscriber.next({ + created: 0, + id: '', + model: '', + object: 'chat.completion.chunk', + choices: [ + { + delta: { + content: cachedContent, + }, + }, + ], + }); + } + subscriber.complete(); + }, + error: (error) => { + subscriber.error(error); + }, + }); + }); + }); + } + ); +} diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/system_message.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/system_message.txt new file mode 100644 index 0000000000000..7dca13c490180 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/system_message.txt @@ -0,0 +1,220 @@ +You are a helpful assistant for generating and executing ES|QL queries. +Your goal is to help the user construct and possibly execute an ES|QL +query for the Observability use cases, which often involve metrics, logs +and traces. + +ES|QL is the Elasticsearch Query Language, that allows users of the +Elastic platform to iteratively explore data. An ES|QL query consists +of a series of commands, separated by pipes. Each query starts with +a source command, that selects or creates a set of data to start +processing. This source command is then followed by one or more +processing commands, which can transform the data returned by the +previous command. + +ES|QL is not Elasticsearch SQL, nor is it anything like SQL. SQL +commands are not available in ES|QL. Make sure you write a query +using ONLY commands specified in this conversation. + +# Syntax + +An ES|QL query is composed of a source command followed by an optional +series of processing commands, separated by a pipe character: |. For +example: + + | + | + +Binary operators: ==, !=, <, <=, >, >=. +Logical operators are supported: AND, OR, NOT +Predicates: IS NULL, IS NOT NULL +Timestamp literal syntax: NOW() - 15 days, 24 hours, 1 week + +## Source commands + +Source commands select a data source. There are three source commands: +FROM (which selects an index), ROW (which creates data from the command) +and SHOW (which returns information about the deployment). + +## Processing commands + +ES|QL processing commands change an input table by adding, removing, or +changing rows and columns. The following commands are available: + +- DISSECT: extracts structured data out of a string, using a dissect +pattern. +- DROP: drops one or more columns +- ENRICH: adds data from existing indices as new columns +- EVAL: adds a new column with calculated values. Supported functions for + EVAL are: + - Mathematical functions + - String functions + - Date-time functions + - Type conversation functions + - Conditional functions and expressions + - Multi-value functions +Aggregation functions are not supported for EVAL. +- GROK: extracts structured data out of a string, using a grok pattern +- KEEP: keeps one or more columns, drop the ones that are not kept +- LIMIT: returns the first n number of rows. The maximum value for this +is 10000. +- MV_EXPAND: expands multi-value columns into a single row per value +- RENAME: renames a column +- SORT: sorts the row in a table +- STATS ... BY: groups rows according to a common value and calculates +one or more aggregated values over the grouped rows. This commands only + supports aggregation functions, and no other functions or operators. +- WHERE: produces a table that contains all the rows from the input table + for which the provided condition returns true. WHERE supports the same + functions as EVAL. + +## Functions and operators + +### Aggregation functions +- AVG +- COUNT +- COUNT_DISTINCT +- MAX +- MEDIAN +- MEDIAN_ABSOLUTE_DEVIATION +- MIN +- PERCENTILE +- SUM + +### Mathematical functions + +- ABS +- ACOS +- ASIN +- ATAN +- ATAN2 +- CEIL +- COS +- COSH +- E +- FLOOR +- LOG10 +- PI +- POW +- ROUND +- SIN +- SINH +- SQRT +- TAN +- TANH +- TAU + +### String functions +- CONCAT +- LEFT +- LENGTH +- LTRIM +- REPLACE +- RIGHT +- RTRIM +- SPLIT +- SUBSTRING +- TRIM + +### Date-time functions +- AUTO_BUCKET +- DATE_EXTRACT +- DATE_FORMAT +- DATE_PARSE +- DATE_TRUNC +- NOW + +### Type conversion functions +- TO_BOOLEAN +- TO_DATETIME +- TO_DEGREES +- TO_DOUBLE +- TO_INTEGER +- TO_IP +- TO_LONG +- TO_RADIANS +- TO_STRING +- TO_UNSIGNED_LONG +- TO_VERSION + +### Conditional functions and expressions +- CASE +- COALESCE +- GREATEST +- LEAST + +### Multivalue functions +- MV_AVG +- MV_CONCAT +- MV_COUNT +- MV_DEDUPE +- MV_MAX +- MV_MEDIAN +- MV_MIN +- MV_SUM + +### Operators +- Binary operators +- Logical operators +- IS NULL and IS NOT NULL predicates +- CIDR_MATCH +- ENDS_WITH +- IN +- IS_FINITE +- IS_INFINITE +- IS_NAN +- LIKE +- RLIKE +- STARTS_WITH + +Here are some example queries: + +FROM employees +| WHERE still_hired == true +| EVAL hired = DATE_FORMAT("YYYY", hire_date) +| STATS avg_salary = AVG(salary) BY languages +| EVAL avg_salary = ROUND(avg_salary) +| EVAL lang_code = TO_STRING(languages) +| ENRICH languages_policy ON lang_code WITH lang = language_name +| WHERE lang IS NOT NULL +| KEEP avg_salary, lang +| SORT avg_salary ASC +| LIMIT 3 + +FROM employees + | EVAL trunk_worked_seconds = avg_worked_seconds / 100000000 * 100000000 + | STATS c = count(languages.long) BY languages.long, trunk_worked_seconds + | SORT c desc, languages.long, trunk_worked_seconds + +ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1" +| DISSECT a "%{date} - %{msg} - %{ip}" +| KEEP date, msg, ip +| EVAL date = TO_DATETIME(date) + +FROM employees +| WHERE first_name LIKE "?b*" +| KEEP first_name, last_name + +FROM employees +| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" +| EVAL bucket = AUTO_BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +| STATS AVG(salary) BY bucket +| SORT bucket + +ROW a = 1, b = "two", c = null + +FROM employees +| EVAL is_recent_hire = CASE(hire_date <= "2023-01-01T00:00:00Z", 1, 0) +| STATS total_recent_hires = SUM(is_recent_hire), total_hires = COUNT(*) BY country +| EVAL recent_hiring_rate = total_recent_hires / total_hires + +FROM logs-* +| WHERE @timestamp <= NOW() - 24 hours +// divide data in 1 hour buckets +| EVAL bucket = DATE_TRUNC(1 hour, @timestamp) +// convert a keyword field into a numeric field to aggregate over it +| EVAL is_5xx = CASE(http.response.status_code >= 500, 1, 0) +// count total events and failed events to calculate a rate +| STATS total_events = COUNT(*), total_failures = SUM(is_5xx) BY host.hostname, bucket +| EVAL failure_rate_per_host = total_failures / total_events +| DROP total_events, total_failures + diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/get_dataset_info.ts b/x-pack/plugins/observability_ai_assistant/server/functions/get_dataset_info.ts index bd48e1bda2f05..7cb35e09f78e4 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/get_dataset_info.ts +++ b/x-pack/plugins/observability_ai_assistant/server/functions/get_dataset_info.ts @@ -63,15 +63,19 @@ export function registerGetDatasetInfoFunction({ if (index === '') { return { - indices, - fields: [], + content: { + indices, + fields: [], + }, }; } if (indices.length === 0) { return { - indices, - fields: [], + content: { + indices, + fields: [], + }, }; } diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/index.ts b/x-pack/plugins/observability_ai_assistant/server/functions/index.ts index 6300852cbc064..b25e69c53689c 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/functions/index.ts @@ -54,18 +54,22 @@ export const registerFunctions: ChatRegistrationFunction = async ({ If a function call fails, DO NOT UNDER ANY CIRCUMSTANCES execute it again. Ask the user for guidance and offer them options. Note that ES|QL (the Elasticsearch query language, which is NOT Elasticsearch SQL, but a new piped language) is the preferred query language. + + Use the "get_dataset_info" function if it is not clear what fields or indices the user means, or if you want to get more information about the mappings. - If the user asks about a query, or ES|QL, always call the "esql" function. DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries yourself. Even if the "recall" function was used before that, follow it up with the "esql" function.` + If the user asks about a query, or ES|QL, always call the "esql" function. DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries or explain anything about the ES|QL query language yourself. + Even if the "recall" function was used before that, follow it up with the "esql" function. If a query fails, do not attempt to correct it yourself. Again you should call the "esql" function, + even if it has been called before. + + If the "get_dataset_info" function returns no data, and the user asks for a query, generate a query anyway with the "esql" function, but be explicit about it potentially being incorrect. + ` ); if (isReady) { description += `You can use the "summarize" functions to store new information you have learned in a knowledge database. Once you have established that you did not know the answer to a question, and the user gave you this information, it's important that you create a summarisation of what you have learned and store it in the knowledge database. Don't create a new summarization if you see a similar summarization in the conversation, instead, update the existing one by re-using its ID. Additionally, you can use the "recall" function to retrieve relevant information from the knowledge database. - `; - description += `Here are principles you MUST adhere to, in order: - - DO NOT make any assumptions about where and how users have stored their data. ALWAYS first call get_dataset_info function with empty string to get information about available indices. Once you know about available indices you MUST use this function again to get a list of available fields for specific index. If user provides an index name make sure its a valid index first before using it to retrieve the field list by calling this function with an empty string! `; registerSummarizationFunction(registrationParameters); diff --git a/x-pack/plugins/observability_ai_assistant/server/routes/knowledge_base/route.ts b/x-pack/plugins/observability_ai_assistant/server/routes/knowledge_base/route.ts index 40a47a5a46cfa..5490c8052e615 100644 --- a/x-pack/plugins/observability_ai_assistant/server/routes/knowledge_base/route.ts +++ b/x-pack/plugins/observability_ai_assistant/server/routes/knowledge_base/route.ts @@ -4,6 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + +import type { + MlDeploymentAllocationState, + MlDeploymentState, +} from '@elastic/elasticsearch/lib/api/types'; import { notImplemented } from '@hapi/boom'; import { nonEmptyStringRt, toBooleanRt } from '@kbn/io-ts-utils'; import * as t from 'io-ts'; @@ -20,8 +25,9 @@ const getKnowledgeBaseStatus = createObservabilityAIAssistantServerRoute({ ): Promise<{ ready: boolean; error?: any; - deployment_state?: string; - allocation_state?: string; + deployment_state?: MlDeploymentState; + allocation_state?: MlDeploymentAllocationState; + model_name?: string; }> => { const client = await resources.service.getClient({ request: resources.request }); diff --git a/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts index 062377cda5112..0349e5ec899f9 100644 --- a/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts @@ -90,6 +90,7 @@ describe('Observability AI Assistant service', () => { const loggerMock: DeeplyMockedKeys = { log: jest.fn(), error: jest.fn(), + debug: jest.fn(), } as any; const functionClientMock: DeeplyMockedKeys = { diff --git a/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts index c111af3d92d48..9423977428d66 100644 --- a/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts @@ -406,6 +406,9 @@ export class ObservabilityAIAssistantClient { function_call: functionCall ? { name: functionCall } : undefined, }; + this.dependencies.logger.debug(`Sending conversation to connector`); + this.dependencies.logger.debug(JSON.stringify(request, null, 2)); + const executeResult = await this.dependencies.actionsClient.execute({ actionId: connectorId, params: { diff --git a/x-pack/plugins/observability_ai_assistant/server/service/knowledge_base_service/index.ts b/x-pack/plugins/observability_ai_assistant/server/service/knowledge_base_service/index.ts index a3c92c5cdcdba..dd44675c800ca 100644 --- a/x-pack/plugins/observability_ai_assistant/server/service/knowledge_base_service/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/service/knowledge_base_service/index.ts @@ -275,15 +275,18 @@ export class KnowledgeBaseService { const elserModelStats = modelStats.trained_model_stats[0]; const deploymentState = elserModelStats.deployment_stats?.state; const allocationState = elserModelStats.deployment_stats?.allocation_status.state; + return { ready: deploymentState === 'started' && allocationState === 'fully_allocated', deployment_state: deploymentState, allocation_state: allocationState, + model_name: ELSER_MODEL_ID, }; } catch (error) { return { error: error instanceof errors.ResponseError ? error.body.error : String(error), ready: false, + model_name: ELSER_MODEL_ID, }; } }; diff --git a/x-pack/plugins/observability_ai_assistant/tsconfig.json b/x-pack/plugins/observability_ai_assistant/tsconfig.json index 03c1fddb28ecf..fdac7a82d4df2 100644 --- a/x-pack/plugins/observability_ai_assistant/tsconfig.json +++ b/x-pack/plugins/observability_ai_assistant/tsconfig.json @@ -7,6 +7,7 @@ "../../../typings/**/*", "common/**/*", "public/**/*", + "scripts/**/*", "typings/**/*", "public/**/*.json", "server/**/*" @@ -48,7 +49,11 @@ "@kbn/licensing-plugin", "@kbn/share-plugin", "@kbn/utility-types-jest", - "@kbn/analytics-client" + "@kbn/analytics-client", + "@kbn/tooling-log", + "@kbn/babel-register", + "@kbn/dev-cli-runner", + "@kbn/core-analytics-browser" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_shared/public/hooks/use_chart_theme.tsx b/x-pack/plugins/observability_shared/public/hooks/use_chart_theme.tsx index 87e9e61036a71..fc989e0026943 100644 --- a/x-pack/plugins/observability_shared/public/hooks/use_chart_theme.tsx +++ b/x-pack/plugins/observability_shared/public/hooks/use_chart_theme.tsx @@ -5,38 +5,36 @@ * 2.0. */ -import { PartialTheme } from '@elastic/charts'; -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; +import { LIGHT_THEME, DARK_THEME, PartialTheme, Theme } from '@elastic/charts'; import { useMemo } from 'react'; import { useTheme } from './use_theme'; -export function useChartTheme(): PartialTheme[] { +export function useChartThemes(): { baseTheme: Theme; theme: PartialTheme[] } { const theme = useTheme(); - const baseChartTheme = theme.darkMode - ? EUI_CHARTS_THEME_DARK.theme - : EUI_CHARTS_THEME_LIGHT.theme; + const baseTheme = theme.darkMode ? DARK_THEME : LIGHT_THEME; - return useMemo( - () => [ - { - chartMargins: { - left: 10, - right: 10, - top: 35, - bottom: 10, - }, - background: { - color: 'transparent', - }, - lineSeriesStyle: { - point: { visible: false }, - }, - areaSeriesStyle: { - point: { visible: false }, - }, + return useMemo(() => { + const themeOverrides: PartialTheme = { + chartMargins: { + left: 10, + right: 10, + top: 35, + bottom: 10, }, - baseChartTheme, - ], - [baseChartTheme] - ); + background: { + color: 'transparent', + }, + lineSeriesStyle: { + point: { visible: false }, + }, + areaSeriesStyle: { + point: { visible: false }, + }, + }; + + return { + theme: [themeOverrides], + baseTheme, + }; + }, [baseTheme]); } diff --git a/x-pack/plugins/observability_shared/public/index.ts b/x-pack/plugins/observability_shared/public/index.ts index ecd00f627321b..2fdb1a1960c09 100644 --- a/x-pack/plugins/observability_shared/public/index.ts +++ b/x-pack/plugins/observability_shared/public/index.ts @@ -58,7 +58,7 @@ export { export type { TrackEvent } from './hooks/use_track_metric'; export { useQuickTimeRanges } from './hooks/use_quick_time_ranges'; export { useTimeZone } from './hooks/use_time_zone'; -export { useChartTheme } from './hooks/use_chart_theme'; +export { useChartThemes } from './hooks/use_chart_theme'; export { useLinkProps, shouldHandleLinkEvent } from './hooks/use_link_props'; export type { LinkDescriptor, Options as UseLinkPropsOptions } from './hooks/use_link_props'; export { NavigationWarningPromptProvider, Prompt } from './components/navigation_warning_prompt'; diff --git a/x-pack/plugins/observability_shared/public/plugin.ts b/x-pack/plugins/observability_shared/public/plugin.ts index 93d17b297cfbf..f2caeb94cbca4 100644 --- a/x-pack/plugins/observability_shared/public/plugin.ts +++ b/x-pack/plugins/observability_shared/public/plugin.ts @@ -5,19 +5,32 @@ * 2.0. */ -import { BehaviorSubject } from 'rxjs'; -import type { CoreStart, Plugin, CoreSetup } from '@kbn/core/public'; -import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; import { CasesUiStart } from '@kbn/cases-plugin/public'; -import { SpacesPluginStart } from '@kbn/spaces-plugin/public'; +import type { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import type { EmbeddableStart } from '@kbn/embeddable-plugin/public'; -import type { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; -import { createNavigationRegistry } from './components/page_template/helpers/navigation_registry'; +import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; +import type { + BrowserUrlService, + SharePluginSetup, + SharePluginStart, +} from '@kbn/share-plugin/public'; +import { SpacesPluginStart } from '@kbn/spaces-plugin/public'; +import { BehaviorSubject } from 'rxjs'; import { createLazyObservabilityPageTemplate } from './components/page_template'; +import { createNavigationRegistry } from './components/page_template/helpers/navigation_registry'; +import { + type FlamegraphLocator, + FlamegraphLocatorDefinition, +} from './locators/profiling/flamegraph_locator'; +import { + type StacktracesLocator, + StacktracesLocatorDefinition, +} from './locators/profiling/stacktraces_locator'; +import { + type TopNFunctionsLocator, + TopNFunctionsLocatorDefinition, +} from './locators/profiling/topn_functions_locator'; import { updateGlobalNavigation } from './services/update_global_navigation'; -import { FlamegraphLocatorDefinition } from './locators/profiling/flamegraph_locator'; -import { TopNFunctionsLocatorDefinition } from './locators/profiling/topn_functions_locator'; -import { StacktracesLocatorDefinition } from './locators/profiling/stacktraces_locator'; export interface ObservabilitySharedSetup { share: SharePluginSetup; @@ -36,6 +49,14 @@ export type ObservabilitySharedPluginSetup = ReturnType; export type ProfilingLocators = ObservabilitySharedPluginSetup['locators']['profiling']; +interface ObservabilitySharedLocators { + profiling: { + flamegraphLocator: FlamegraphLocator; + topNFunctionsLocator: TopNFunctionsLocator; + stacktracesLocator: StacktracesLocator; + }; +} + export class ObservabilitySharedPlugin implements Plugin { private readonly navigationRegistry = createNavigationRegistry(); private isSidebarEnabled$: BehaviorSubject; @@ -46,19 +67,7 @@ export class ObservabilitySharedPlugin implements Plugin { public setup(coreSetup: CoreSetup, pluginsSetup: ObservabilitySharedSetup) { return { - locators: { - profiling: { - flamegraphLocator: pluginsSetup.share.url.locators.create( - new FlamegraphLocatorDefinition() - ), - topNFunctionsLocator: pluginsSetup.share.url.locators.create( - new TopNFunctionsLocatorDefinition() - ), - stacktracesLocator: pluginsSetup.share.url.locators.create( - new StacktracesLocatorDefinition() - ), - }, - }, + locators: this.createLocators(pluginsSetup.share.url), navigation: { registerSections: this.navigationRegistry.registerSections, }, @@ -79,6 +88,7 @@ export class ObservabilitySharedPlugin implements Plugin { }); return { + locators: this.createLocators(plugins.share.url), navigation: { PageTemplate, registerSections: this.navigationRegistry.registerSections, @@ -89,4 +99,14 @@ export class ObservabilitySharedPlugin implements Plugin { } public stop() {} + + private createLocators(urlService: BrowserUrlService): ObservabilitySharedLocators { + return { + profiling: { + flamegraphLocator: urlService.locators.create(new FlamegraphLocatorDefinition()), + topNFunctionsLocator: urlService.locators.create(new TopNFunctionsLocatorDefinition()), + stacktracesLocator: urlService.locators.create(new StacktracesLocatorDefinition()), + }, + }; + } } diff --git a/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx index a006a4724a9bf..621a3b2ba0329 100644 --- a/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx +++ b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx @@ -143,7 +143,7 @@ export function DifferentialTopNFunctionsGrid({ baseRows: getFunctionsRows({ calculateImpactEstimates, topNFunctions: base, - totalSeconds: 900, + totalSeconds, }), comparisonRows: getFunctionsRows({ baselineScaleFactor, diff --git a/x-pack/plugins/profiling/public/components/flamegraph/index.tsx b/x-pack/plugins/profiling/public/components/flamegraph/index.tsx index 33879e1fa55d4..cbebc80606703 100644 --- a/x-pack/plugins/profiling/public/components/flamegraph/index.tsx +++ b/x-pack/plugins/profiling/public/components/flamegraph/index.tsx @@ -14,6 +14,7 @@ import { PartialTheme, Settings, Tooltip, + LEGACY_LIGHT_THEME, } from '@elastic/charts'; import { EuiFlexGroup, EuiFlexItem, useEuiTheme } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -123,6 +124,8 @@ export function FlameGraph({ { const selectedElement = elements[0] as Maybe; if (Number.isNaN(selectedElement?.vmIndex)) { diff --git a/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx b/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx index ad4aedfc81b46..2d73d795c09ca 100644 --- a/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx +++ b/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx @@ -132,6 +132,7 @@ export function StackedBarChart({ color={chart.Color} xAccessor={'Timestamp'} yAccessors={['Count']} + stackAccessors={['true']} stackMode={asPercentages ? StackMode.Percentage : undefined} xScaleType={ScaleType.Time} timeZone={timeZone} diff --git a/x-pack/plugins/profiling/public/hooks/use_profiling_charts_theme.ts b/x-pack/plugins/profiling/public/hooks/use_profiling_charts_theme.ts index 8e9eb4b689541..40d3d68379094 100644 --- a/x-pack/plugins/profiling/public/hooks/use_profiling_charts_theme.ts +++ b/x-pack/plugins/profiling/public/hooks/use_profiling_charts_theme.ts @@ -4,11 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { RecursivePartial, Theme } from '@elastic/charts'; -import { merge } from 'lodash'; +import { PartialTheme } from '@elastic/charts'; import { useProfilingDependencies } from '../components/contexts/profiling_dependencies/use_profiling_dependencies'; -const profilingTheme: RecursivePartial = { +const profilingThemeOverrides: PartialTheme = { barSeriesStyle: { rectBorder: { strokeOpacity: 1, @@ -38,10 +37,9 @@ export function useProfilingChartsTheme() { } = useProfilingDependencies(); const chartsBaseTheme = charts.theme.useChartsBaseTheme(); - const chartsTheme = charts.theme.useChartsTheme(); return { chartsBaseTheme, - chartsTheme: merge({}, chartsTheme, profilingTheme), + chartsTheme: profilingThemeOverrides, }; } diff --git a/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/index.ts b/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/index.ts index b5f4e8f433009..3da0d8be4f0be 100644 --- a/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/index.ts +++ b/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/index.ts @@ -12,3 +12,4 @@ export * from './range'; export * from './types'; export * from './indices'; export * from './constants'; +export * from './privileges'; diff --git a/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/privileges.test.ts b/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/privileges.test.ts new file mode 100644 index 0000000000000..5c25db68c87a1 --- /dev/null +++ b/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/privileges.test.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EntityAnalyticsPrivileges } from '../../api/entity_analytics/common'; +import { getMissingRiskEnginePrivileges } from './privileges'; + +describe('getMissingRiskEnginePrivileges', () => { + it('returns the missing cluster privileges', () => { + const noClusterPrivileges: EntityAnalyticsPrivileges['privileges'] = { + elasticsearch: { + cluster: { + manage_index_templates: false, + manage_transform: false, + }, + index: { + 'risk-score.risk-score-*': { + read: true, + write: true, + }, + }, + }, + }; + + const missingPrivileges = getMissingRiskEnginePrivileges(noClusterPrivileges); + + expect(missingPrivileges).toEqual({ + clusterPrivileges: ['manage_index_templates', 'manage_transform'], + indexPrivileges: [], + }); + }); + + it('returns the missing index privileges', () => { + const noIndexPrivileges: EntityAnalyticsPrivileges['privileges'] = { + elasticsearch: { + cluster: { + manage_index_templates: true, + manage_transform: true, + }, + index: { + 'risk-score.risk-score-*': { + read: false, + write: false, + }, + }, + }, + }; + + const missingPrivileges = getMissingRiskEnginePrivileges(noIndexPrivileges); + + expect(missingPrivileges).toEqual({ + clusterPrivileges: [], + indexPrivileges: [['risk-score.risk-score-*', ['read', 'write']]], + }); + }); +}); diff --git a/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/privileges.ts b/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/privileges.ts new file mode 100644 index 0000000000000..add0a0e56efce --- /dev/null +++ b/x-pack/plugins/security_solution/common/entity_analytics/risk_engine/privileges.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EntityAnalyticsPrivileges } from '../../api/entity_analytics/common'; +import { + RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES, + RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES, +} from './constants'; + +export type MissingClusterPrivileges = string[]; +export type MissingIndexPrivileges = Array; + +export interface MissingPrivileges { + clusterPrivileges: MissingClusterPrivileges; + indexPrivileges: MissingIndexPrivileges; +} + +export const getMissingIndexPrivileges = ( + privileges: EntityAnalyticsPrivileges['privileges']['elasticsearch']['index'] +): MissingIndexPrivileges => { + const missingIndexPrivileges: MissingIndexPrivileges = []; + + if (!privileges) { + return missingIndexPrivileges; + } + + for (const [indexName, requiredPrivileges] of Object.entries( + RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES + )) { + const missingPrivileges = requiredPrivileges.filter( + (privilege) => !privileges[indexName][privilege] + ); + + if (missingPrivileges.length) { + missingIndexPrivileges.push([indexName, missingPrivileges]); + } + } + + return missingIndexPrivileges; +}; + +export const getMissingRiskEnginePrivileges = ( + privileges: EntityAnalyticsPrivileges['privileges'] +): MissingPrivileges => { + const missingIndexPrivileges = getMissingIndexPrivileges(privileges.elasticsearch.index); + const missingClusterPrivileges = RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES.filter( + (privilege) => !privileges.elasticsearch.cluster?.[privilege] + ); + + return { + indexPrivileges: missingIndexPrivileges, + clusterPrivileges: missingClusterPrivileges, + }; +}; diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 328cdf3a35219..a9f3affba56d7 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -82,7 +82,7 @@ export const allowedExperimentalValues = Object.freeze({ /** * Enables expandable flyout in create rule page, alert preview */ - expandableFlyoutInCreateRuleEnabled: false, + expandableFlyoutInCreateRuleEnabled: true, /* * Enables new Set of filters on the Alerts page. * diff --git a/x-pack/plugins/security_solution/public/assistant/content/anonymization/index.ts b/x-pack/plugins/security_solution/public/assistant/content/anonymization/index.ts index 06be36e0a2bc9..353cc3b3afce9 100644 --- a/x-pack/plugins/security_solution/public/assistant/content/anonymization/index.ts +++ b/x-pack/plugins/security_solution/public/assistant/content/anonymization/index.ts @@ -7,6 +7,7 @@ /** By default, these fields are allowed to be sent to the assistant */ export const DEFAULT_ALLOW = [ + '_id', '@timestamp', 'cloud.availability_zone', 'cloud.provider', @@ -28,6 +29,7 @@ export const DEFAULT_ALLOW = [ 'host.risk.calculated_level', 'host.risk.calculated_score_norm', 'kibana.alert.last_detected', + 'kibana.alert.risk_score', 'kibana.alert.rule.description', 'kibana.alert.rule.name', 'kibana.alert.rule.references', @@ -42,6 +44,7 @@ export const DEFAULT_ALLOW = [ 'kibana.alert.rule.threat.technique.subtechnique.name', 'kibana.alert.rule.threat.technique.subtechnique.reference', 'kibana.alert.severity', + 'kibana.alert.workflow_status', 'process.args', 'process.command_line', 'process.executable', @@ -73,6 +76,7 @@ export const DEFAULT_ALLOW = [ /** By default, these fields will be anonymized */ export const DEFAULT_ALLOW_REPLACEMENT = [ + '_id', // the document's _id is replaced with an anonymized value 'cloud.availability_zone', 'cloud.provider', 'cloud.region', diff --git a/x-pack/plugins/security_solution/public/common/components/charts/common.test.tsx b/x-pack/plugins/security_solution/public/common/components/charts/common.test.tsx index 572706719eb88..71c3c0793d72b 100644 --- a/x-pack/plugins/security_solution/public/common/components/charts/common.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/charts/common.test.tsx @@ -19,7 +19,7 @@ import { WrappedByAutoSizer, useThemes, } from './common'; -import { LIGHT_THEME, DARK_THEME } from '@elastic/charts'; +import { LEGACY_LIGHT_THEME, LEGACY_DARK_THEME } from '@elastic/charts'; jest.mock('../../lib/kibana'); @@ -181,14 +181,14 @@ describe('checkIfAllValuesAreZero', () => { (useUiSetting as jest.Mock).mockImplementation(() => false); const { result } = renderHook(() => useThemes()); - expect(result.current.baseTheme).toBe(LIGHT_THEME); + expect(result.current.baseTheme).toBe(LEGACY_LIGHT_THEME); }); it('should return dark baseTheme when isDarkMode true', () => { (useUiSetting as jest.Mock).mockImplementation(() => true); const { result } = renderHook(() => useThemes()); - expect(result.current.baseTheme).toBe(DARK_THEME); + expect(result.current.baseTheme).toBe(LEGACY_DARK_THEME); }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/charts/common.tsx b/x-pack/plugins/security_solution/public/common/components/charts/common.tsx index bf8f561cdfdf3..73fab4a3a8890 100644 --- a/x-pack/plugins/security_solution/public/common/components/charts/common.tsx +++ b/x-pack/plugins/security_solution/public/common/components/charts/common.tsx @@ -17,7 +17,7 @@ import type { BarSeriesStyle, Theme, } from '@elastic/charts'; -import { DARK_THEME, LIGHT_THEME, Position } from '@elastic/charts'; +import { LEGACY_DARK_THEME, LEGACY_LIGHT_THEME, Position } from '@elastic/charts'; import { EuiFlexGroup } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; @@ -114,8 +114,8 @@ const theme: PartialTheme = { }; export const useThemes = (): { baseTheme: Theme; theme: PartialTheme } => { const isDarkMode = useUiSetting(DEFAULT_DARK_MODE); - // TODO use the EUI charts theme see src/plugins/charts/public/services/theme/README.md - const baseTheme = isDarkMode ? DARK_THEME : LIGHT_THEME; + // TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md + const baseTheme = isDarkMode ? LEGACY_DARK_THEME : LEGACY_LIGHT_THEME; return { baseTheme, theme, diff --git a/x-pack/plugins/security_solution/public/common/components/charts/donutchart.test.tsx b/x-pack/plugins/security_solution/public/common/components/charts/donutchart.test.tsx index 18313b002b223..e29b72fbc0004 100644 --- a/x-pack/plugins/security_solution/public/common/components/charts/donutchart.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/charts/donutchart.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Severity } from '@kbn/securitysolution-io-ts-alerting-types'; -import { LIGHT_THEME, Partition, Settings } from '@elastic/charts'; +import { LEGACY_LIGHT_THEME, Partition, Settings } from '@elastic/charts'; import { parsedMockAlertsData } from '../../../overview/components/detection_response/alerts_by_status/mock_data'; import { render } from '@testing-library/react'; import type { DonutChartProps } from './donutchart'; @@ -47,7 +47,7 @@ jest.mock('./draggable_legend', () => { }; }); -const mockBaseTheme = LIGHT_THEME; +const mockBaseTheme = LEGACY_LIGHT_THEME; jest.mock('./common', () => { return { useThemes: jest.fn(() => ({ @@ -93,7 +93,7 @@ describe('DonutChart', () => { expect(container.querySelector(`[data-test-subj="es-chart-settings"]`)).toBeInTheDocument(); const settingsProps = (Settings as jest.Mock).mock.calls[0][0]; - expect(settingsProps.baseTheme).toEqual(LIGHT_THEME); + expect(settingsProps.baseTheme).toEqual(LEGACY_LIGHT_THEME); expect(settingsProps.theme[0]).toEqual({ chartMargins: { bottom: 0, left: 0, right: 0, top: 0 }, partition: { diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts index b1c8c3975197e..a3d9d5f732cf0 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts @@ -33,7 +33,7 @@ export const checkRecognizer = async ({ signal, }: CheckRecognizerProps): Promise => KibanaServices.get().http.fetch( - `/internal/ml/modules/recognize/${indexPatternName}`, + `/internal/ml/modules/recognize/${indexPatternName.map((i) => encodeURIComponent(i))}`, { method: 'GET', version: '1', @@ -52,13 +52,16 @@ export const checkRecognizer = async ({ * @throws An error if response is not OK */ export const getModules = async ({ moduleId = '', signal }: GetModulesProps): Promise => - KibanaServices.get().http.fetch(`/internal/ml/modules/get_module/${moduleId}`, { - method: 'GET', - version: '1', - asSystemRequest: true, - signal, - query: { filter: 'security' }, - }); + KibanaServices.get().http.fetch( + `/internal/ml/modules/get_module/${encodeURIComponent(moduleId)}`, + { + method: 'GET', + version: '1', + asSystemRequest: true, + signal, + query: { filter: 'security' }, + } + ); /** * Creates ML Jobs + Datafeeds for the given configTemplate + indexPatternName @@ -79,7 +82,7 @@ export const setupMlJob = async ({ prefix = '', }: MlSetupArgs): Promise => { const response = await KibanaServices.get().http.fetch( - `/internal/ml/modules/setup/${configTemplate}`, + `/internal/ml/modules/setup/${encodeURIComponent(configTemplate)}`, { method: 'POST', version: '1', diff --git a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx index 56f81529600d8..b79f9c736f5cc 100644 --- a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx @@ -9,6 +9,7 @@ import dateMath from '@kbn/datemath'; import type { EuiSuperDatePickerProps, EuiSuperDatePickerRecentRange, + EuiSuperUpdateButtonProps, OnRefreshChangeProps, OnRefreshProps, OnTimeChangeProps, @@ -42,6 +43,10 @@ import { } from './selectors'; import type { Inputs } from '../../store/inputs/model'; +const refreshButtonProps: EuiSuperUpdateButtonProps = { + fill: false, +}; + const MAX_RECENTLY_USED_RANGES = 9; interface Range { @@ -219,6 +224,7 @@ export const SuperDatePickerComponent = React.memo( isDisabled={disabled} width={width} compressed={compressed} + updateButtonProps={refreshButtonProps} /> ); }, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/constants.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/constants.ts new file mode 100644 index 0000000000000..3d3b6bc74e72d --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/constants.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. + */ + +export const TABLE_CLASS_NAME = 'rule-update-diff-table'; +export const CODE_CLASS_NAME = 'rule-update-diff-code'; +export const GUTTER_CLASS_NAME = 'rule-update-diff-gutter'; +export const DARK_THEME_CLASS_NAME = 'rule-update-diff-dark-theme'; + +export const COLORS = { + light: { + gutterBackground: { + deletion: 'rgb(255, 215, 213)', + insertion: 'rgb(204, 255, 216)', + }, + lineBackground: { + deletion: 'rgb(255, 235, 233)', + insertion: 'rgb(230, 255, 236)', + }, + characterBackground: { + deletion: 'rgba(255, 129, 130, 0.4)', + insertion: 'rgb(171, 242, 188)', + }, + }, + dark: { + gutterBackground: { + deletion: 'rgba(248, 81, 73, 0.3)', + insertion: 'rgba(63, 185, 80, 0.3)', + }, + lineBackground: { + deletion: 'rgba(248, 81, 73, 0.1)', + insertion: 'rgba(46, 160, 67, 0.15)', + }, + characterBackground: { + deletion: 'rgba(248, 81, 73, 0.4)', + insertion: 'rgba(46, 160, 67, 0.4)', + }, + }, +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/diff_view.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/diff_view.tsx index 8905d0aca4e6f..3139cb5478907 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/diff_view.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/diff_view.tsx @@ -6,6 +6,7 @@ */ import React, { useMemo } from 'react'; +import classNames from 'classnames'; import { css, Global } from '@emotion/react'; import { Diff, @@ -23,9 +24,16 @@ import type { HunkTokens, } from 'react-diff-view'; import unidiff from 'unidiff'; -import { useEuiTheme } from '@elastic/eui'; +import { useEuiTheme, COLOR_MODES_STANDARD } from '@elastic/eui'; import { Hunks } from './hunks'; import { markEdits, DiffMethod } from './mark_edits'; +import { + TABLE_CLASS_NAME, + CODE_CLASS_NAME, + GUTTER_CLASS_NAME, + DARK_THEME_CLASS_NAME, + COLORS, +} from './constants'; interface UseExpandReturn { expandRange: (start: number, end: number) => void; @@ -137,53 +145,73 @@ const convertToDiffFile = (oldSource: string, newSource: string) => { return diffFile; }; -const TABLE_CLASS_NAME = 'rule-update-diff-table'; -const CODE_CLASS_NAME = 'rule-update-diff-code'; -const GUTTER_CLASS_NAME = 'rule-update-diff-gutter'; - const CustomStyles: React.FC = ({ children }) => { const { euiTheme } = useEuiTheme(); const customCss = css` - .${TABLE_CLASS_NAME} .diff-gutter-col { - width: ${euiTheme.size.xl}; + .${CODE_CLASS_NAME}.diff-code { + padding: 0 ${euiTheme.size.l} 0 ${euiTheme.size.m}; } - .${CODE_CLASS_NAME}.diff-code, .${GUTTER_CLASS_NAME}.diff-gutter { - background: transparent; + .${TABLE_CLASS_NAME} .diff-gutter-col { + width: ${euiTheme.size.xl}; } + /* Vertical line separating two sides of the diff view */ .${GUTTER_CLASS_NAME}:nth-child(3) { border-left: 1px solid ${euiTheme.colors.mediumShade}; } + /* Gutter of a line with deletions */ .${GUTTER_CLASS_NAME}.diff-gutter-delete { - color: ${euiTheme.colors.dangerText}; font-weight: bold; + background: ${COLORS.light.gutterBackground.deletion}; + } + .${DARK_THEME_CLASS_NAME} .${GUTTER_CLASS_NAME}.diff-gutter-delete { + background: ${COLORS.dark.gutterBackground.deletion}; } + /* Gutter of a line with insertions */ .${GUTTER_CLASS_NAME}.diff-gutter-insert { - color: ${euiTheme.colors.successText}; font-weight: bold; + background: ${COLORS.light.gutterBackground.insertion}; + } + .${DARK_THEME_CLASS_NAME} .${GUTTER_CLASS_NAME}.diff-gutter-insert { + background: ${COLORS.dark.gutterBackground.insertion}; } - .${CODE_CLASS_NAME}.diff-code { - padding: 0 ${euiTheme.size.l} 0 ${euiTheme.size.m}; + /* Background of a line with deletions */ + .${CODE_CLASS_NAME}.diff-code-delete { + background: ${COLORS.light.lineBackground.deletion}; + } + .${DARK_THEME_CLASS_NAME} .${CODE_CLASS_NAME}.diff-code-delete { + background: ${COLORS.dark.lineBackground.deletion}; } - .${CODE_CLASS_NAME}.diff-code-delete .diff-code-edit, - .${CODE_CLASS_NAME}.diff-code-insert .diff-code-edit { - background: transparent; + /* Background of a line with insertions */ + .${CODE_CLASS_NAME}.diff-code-insert { + background: ${COLORS.light.lineBackground.insertion}; + } + .${DARK_THEME_CLASS_NAME} .${CODE_CLASS_NAME}.diff-code-insert { + background: ${COLORS.dark.lineBackground.insertion}; } + /* Accented background of removed characters / words */ .${CODE_CLASS_NAME}.diff-code-delete .diff-code-edit { - color: ${euiTheme.colors.dangerText}; - text-decoration: line-through; + font-weight: 700; + background: ${COLORS.light.characterBackground.deletion}; + } + .${DARK_THEME_CLASS_NAME} .${CODE_CLASS_NAME}.diff-code-delete .diff-code-edit { + background: ${COLORS.dark.characterBackground.deletion}; } + /* Accented background of inserted characters / words */ .${CODE_CLASS_NAME}.diff-code-insert .diff-code-edit { - color: ${euiTheme.colors.successText}; - text-decoration: underline; + font-weight: 700; + background: ${COLORS.light.characterBackground.insertion}; + } + .${DARK_THEME_CLASS_NAME} .${CODE_CLASS_NAME}.diff-code-insert .diff-code-edit { + background: ${COLORS.dark.characterBackground.insertion}; } `; @@ -229,6 +257,12 @@ export const DiffView = ({ */ const tokens = useTokens(hunks, diffMethod, oldSource); + const { colorMode } = useEuiTheme(); + + const tableClassName = classNames(TABLE_CLASS_NAME, { + [DARK_THEME_CLASS_NAME]: colorMode === COLOR_MODES_STANDARD.dark, + }); + return ( diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx index c9160c3cba1b9..17c5368a4b1c5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx @@ -66,7 +66,9 @@ const RulesPageComponent: React.FC = () => { const { loading: listsConfigLoading, canWriteIndex: canWriteListsIndex, + canCreateIndex: canCreateListsIndex, needsConfiguration: needsListsConfiguration, + needsIndex: needsListsIndex, } = useListsConfig(); const loading = userInfoLoading || listsConfigLoading; @@ -85,6 +87,14 @@ const RulesPageComponent: React.FC = () => { return null; } + // - if lists data stream does not exist and user doesn't have enough privileges to create it, + // lists button should be disabled + // - if data stream exists and user doesn't have enough privileges to create it, + // user still can import value lists, so button should not be disabled if user has enough other privileges + const cantCreateNonExistentListIndex = needsListsIndex && !canCreateListsIndex; + const isImportValueListDisabled = + cantCreateNonExistentListIndex || !canWriteListsIndex || !canUserCRUD || loading; + return ( <> @@ -117,11 +127,18 @@ const RulesPageComponent: React.FC = () => { - + {i18n.IMPORT_VALUE_LISTS} diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/alerts_histogram.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/alerts_histogram.tsx index 7137ba563d365..9f96b375abc98 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/alerts_histogram.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/alerts_histogram.tsx @@ -95,6 +95,7 @@ export const AlertsHistogram = React.memo( yScaleType={ScaleType.Linear} xAccessor="x" yAccessors={yAccessors} + stackAccessors={['true']} splitSeriesAccessors={splitSeriesAccessors} data={data} /> diff --git a/x-pack/plugins/security_solution/public/detections/components/callouts/missing_privileges_callout/use_missing_privileges.ts b/x-pack/plugins/security_solution/public/detections/components/callouts/missing_privileges_callout/use_missing_privileges.ts index cc5376c29d892..a25174a4f37a6 100644 --- a/x-pack/plugins/security_solution/public/detections/components/callouts/missing_privileges_callout/use_missing_privileges.ts +++ b/x-pack/plugins/security_solution/public/detections/components/callouts/missing_privileges_callout/use_missing_privileges.ts @@ -11,7 +11,7 @@ import type { Privilege } from '../../../containers/detection_engine/alerts/type import { useUserData } from '../../user_info'; import { useUserPrivileges } from '../../../../common/components/user_privileges'; -const REQUIRED_INDEX_PRIVILIGES = ['read', 'write', 'view_index_metadata', 'maintenance'] as const; +const REQUIRED_INDEX_PRIVILEGES = ['read', 'write', 'view_index_metadata', 'manage'] as const; const getIndexName = (indexPrivileges: Privilege['index']) => { const [indexName] = Object.keys(indexPrivileges); @@ -24,7 +24,7 @@ const getMissingIndexPrivileges = ( ): MissingIndexPrivileges | undefined => { const indexName = getIndexName(indexPrivileges); const privileges = indexPrivileges[indexName]; - const missingPrivileges = REQUIRED_INDEX_PRIVILIGES.filter((privelege) => !privileges[privelege]); + const missingPrivileges = REQUIRED_INDEX_PRIVILEGES.filter((privilege) => !privileges[privilege]); if (missingPrivileges.length) { return [indexName, missingPrivileges]; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.mock.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.mock.ts index 94d506b1e7af7..2b8c2f5df996f 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.mock.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.mock.ts @@ -13,4 +13,6 @@ export const getUseListsConfigMock: () => jest.Mocked = () enabled: true, loading: false, needsConfiguration: false, + needsIndex: false, + canCreateIndex: false, }); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx index 81eaede2a821e..b8439e2f9a861 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx @@ -13,10 +13,14 @@ import { useListsPrivileges } from './use_lists_privileges'; import { getUseListsIndexMock } from './use_lists_index.mock'; import { getUseListsPrivilegesMock } from './use_lists_privileges.mock'; import { useListsConfig } from './use_lists_config'; +import { useUserPrivileges } from '../../../../common/components/user_privileges'; jest.mock('../../../../common/lib/kibana'); jest.mock('./use_lists_index'); jest.mock('./use_lists_privileges'); +jest.mock('../../../../common/components/user_privileges'); + +const useUserPrivilegesMock = useUserPrivileges as jest.Mock; describe('useListsConfig', () => { let listsIndexMock: ReturnType; @@ -27,16 +31,19 @@ describe('useListsConfig', () => { listsPrivilegesMock = getUseListsPrivilegesMock(); (useListsIndex as jest.Mock).mockReturnValue(listsIndexMock); (useListsPrivileges as jest.Mock).mockReturnValue(listsPrivilegesMock); + useUserPrivilegesMock.mockReturnValue({ + detectionEnginePrivileges: { result: { cluster: { manage: false } } }, + }); }); it("returns the user's write permissions", () => { listsPrivilegesMock.canWriteIndex = false; const { result } = renderHook(() => useListsConfig()); - expect(result.current.canWriteIndex).toEqual(false); + expect(result.current.canWriteIndex).toBe(false); listsPrivilegesMock.canWriteIndex = true; const { result: result2 } = renderHook(() => useListsConfig()); - expect(result2.current.canWriteIndex).toEqual(true); + expect(result2.current.canWriteIndex).toBe(true); }); describe('when lists are disabled', () => { @@ -46,8 +53,8 @@ describe('useListsConfig', () => { it('indicates that lists are not enabled, and need configuration', () => { const { result } = renderHook(() => useListsConfig()); - expect(result.current.enabled).toEqual(false); - expect(result.current.needsConfiguration).toEqual(true); + expect(result.current.enabled).toBe(false); + expect(result.current.needsConfiguration).toBe(true); }); }); @@ -61,16 +68,26 @@ describe('useListsConfig', () => { listsPrivilegesMock.canManageIndex = false; const { result } = renderHook(() => useListsConfig()); - expect(result.current.needsConfiguration).toEqual(true); + expect(result.current.needsConfiguration).toBe(true); expect(listsIndexMock.createIndex).not.toHaveBeenCalled(); }); - it('attempts to create the indexes if the user can manage indexes', () => { + it('attempts to create the indexes if the user can manage indexes and have cluster privilege', () => { + useUserPrivilegesMock.mockReturnValue({ + detectionEnginePrivileges: { result: { cluster: { manage: true } } }, + }); listsPrivilegesMock.canManageIndex = true; renderHook(() => useListsConfig()); expect(listsIndexMock.createIndex).toHaveBeenCalled(); }); + + it('does not call create index if the user can manage indexes but not cluster privilege', () => { + listsPrivilegesMock.canManageIndex = true; + + renderHook(() => useListsConfig()); + expect(listsIndexMock.createIndex).not.toHaveBeenCalled(); + }); }); describe('when lists are enabled and indexes exist', () => { @@ -81,7 +98,39 @@ describe('useListsConfig', () => { it('does not need configuration', () => { const { result } = renderHook(() => useListsConfig()); - expect(result.current.needsConfiguration).toEqual(false); + expect(result.current.needsConfiguration).toBe(false); + }); + }); + + describe('create index privileges', () => { + it('canCreateIndex is true, when user can manage indices and cluster', () => { + useUserPrivilegesMock.mockReturnValue({ + detectionEnginePrivileges: { result: { cluster: { manage: true } } }, + }); + listsPrivilegesMock.canManageIndex = true; + + const { result } = renderHook(() => useListsConfig()); + expect(result.current.canCreateIndex).toBe(true); + }); + + it('canCreateIndex is false, when user can manage indices and can not manage cluster', () => { + useUserPrivilegesMock.mockReturnValue({ + detectionEnginePrivileges: { result: { cluster: { manage: false } } }, + }); + listsPrivilegesMock.canManageIndex = true; + + const { result } = renderHook(() => useListsConfig()); + expect(result.current.canCreateIndex).toBe(false); + }); + + it('canCreateIndex is false, when user can not manage indices and can manage cluster', () => { + useUserPrivilegesMock.mockReturnValue({ + detectionEnginePrivileges: { result: { cluster: { manage: true } } }, + }); + listsPrivilegesMock.canManageIndex = false; + + const { result } = renderHook(() => useListsConfig()); + expect(result.current.canCreateIndex).toBe(false); }); }); }); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.tsx index e07367367d153..f8db3528ba615 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.tsx @@ -10,6 +10,7 @@ import { useEffect } from 'react'; import { useKibana } from '../../../../common/lib/kibana'; import { useListsIndex } from './use_lists_index'; import { useListsPrivileges } from './use_lists_privileges'; +import { useUserPrivileges } from '../../../../common/components/user_privileges'; export interface UseListsConfigReturn { canManageIndex: boolean | null; @@ -17,13 +18,18 @@ export interface UseListsConfigReturn { enabled: boolean; loading: boolean; needsConfiguration: boolean; + needsIndex: boolean; + canCreateIndex: boolean | null; } export const useListsConfig = (): UseListsConfigReturn => { const { createIndex, indexExists, loading: indexLoading, error: indexError } = useListsIndex(); const { canManageIndex, canWriteIndex, loading: privilegesLoading } = useListsPrivileges(); + const { detectionEnginePrivileges } = useUserPrivileges(); + const { lists } = useKibana().services; + const canManageCluster = detectionEnginePrivileges.result?.cluster.manage ?? null; const enabled = lists != null; const loading = indexLoading || privilegesLoading; const needsIndex = indexExists === false; @@ -31,12 +37,23 @@ export const useListsConfig = (): UseListsConfigReturn => { const needsIndexConfiguration = needsIndex && (canManageIndex === false || (canManageIndex === true && hasIndexError)); const needsConfiguration = !enabled || needsIndexConfiguration; + // Index can be created only when manage cluster privilege assigned to user role. + // It's needed to create index templates + const canCreateIndex = canManageIndex && canManageCluster; useEffect(() => { - if (needsIndex && canManageIndex) { + if (needsIndex && canCreateIndex) { createIndex(); } - }, [canManageIndex, createIndex, needsIndex]); + }, [createIndex, needsIndex, canCreateIndex]); - return { canManageIndex, canWriteIndex, enabled, loading, needsConfiguration }; + return { + canManageIndex, + canWriteIndex, + enabled, + loading, + needsConfiguration, + needsIndex, + canCreateIndex, + }; }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts index b35c07e86f057..97f782c7dd95c 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts @@ -35,6 +35,14 @@ export const UPLOAD_VALUE_LISTS_TOOLTIP = i18n.translate( } ); +export const UPLOAD_VALUE_LISTS_PRIVILEGES_TOOLTIP = i18n.translate( + 'xpack.securitySolution.lists.detectionEngine.rules.uploadValueListsButtonPrivilegesTooltip', + { + defaultMessage: + 'A user with manage cluster privileges must visit the Rules page before you can import value lists.', + } +); + export const ADD_NEW_RULE = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.addNewRuleTitle', { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts index 13408e349007d..73cb1cbd57ff0 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts @@ -15,7 +15,6 @@ import { ASSET_CRITICALITY_PRIVILEGES_URL, } from '../../../common/constants'; -import { KibanaServices } from '../../common/lib/kibana'; import type { CalculateScoresResponse, EnableRiskEngineResponse, @@ -25,89 +24,90 @@ import type { } from '../../../server/lib/entity_analytics/types'; import type { RiskScorePreviewRequestSchema } from '../../../common/entity_analytics/risk_engine/risk_score_preview/request_schema'; import type { EntityAnalyticsPrivileges } from '../../../common/api/entity_analytics/common'; +import { useKibana } from '../../common/lib/kibana/kibana_react'; -/** - * Fetches preview risks scores - */ -export const fetchRiskScorePreview = async ({ - signal, - params, -}: { - signal?: AbortSignal; - params: RiskScorePreviewRequestSchema; -}): Promise => { - return KibanaServices.get().http.fetch(RISK_SCORE_PREVIEW_URL, { - version: '1', - method: 'POST', - body: JSON.stringify(params), - signal, - }); -}; +export const useEntityAnalyticsRoutes = () => { + const http = useKibana().services.http; -/** - * Fetches risks engine status - */ -export const fetchRiskEngineStatus = async ({ - signal, -}: { - signal?: AbortSignal; -}): Promise => { - return KibanaServices.get().http.fetch(RISK_ENGINE_STATUS_URL, { - version: '1', - method: 'GET', + /** + * Fetches preview risks scores + */ + const fetchRiskScorePreview = ({ signal, - }); -}; + params, + }: { + signal?: AbortSignal; + params: RiskScorePreviewRequestSchema; + }) => + http.fetch(RISK_SCORE_PREVIEW_URL, { + version: '1', + method: 'POST', + body: JSON.stringify(params), + signal, + }); -/** - * Init risk score engine - */ -export const initRiskEngine = async (): Promise => { - return KibanaServices.get().http.fetch(RISK_ENGINE_INIT_URL, { - version: '1', - method: 'POST', - }); -}; + /** + * Fetches risks engine status + */ + const fetchRiskEngineStatus = ({ signal }: { signal?: AbortSignal }) => + http.fetch(RISK_ENGINE_STATUS_URL, { + version: '1', + method: 'GET', + signal, + }); -/** - * Enable risk score engine - */ -export const enableRiskEngine = async (): Promise => { - return KibanaServices.get().http.fetch(RISK_ENGINE_ENABLE_URL, { - version: '1', - method: 'POST', - }); -}; + /** + * Init risk score engine + */ + const initRiskEngine = () => + http.fetch(RISK_ENGINE_INIT_URL, { + version: '1', + method: 'POST', + }); -/** - * Disable risk score engine - */ -export const disableRiskEngine = async (): Promise => { - return KibanaServices.get().http.fetch(RISK_ENGINE_DISABLE_URL, { - version: '1', - method: 'POST', - }); -}; + /** + * Enable risk score engine + */ + const enableRiskEngine = () => + http.fetch(RISK_ENGINE_ENABLE_URL, { + version: '1', + method: 'POST', + }); -/** - * Get risk engine privileges - */ -export const fetchRiskEnginePrivileges = async (): Promise => { - return KibanaServices.get().http.fetch(RISK_ENGINE_PRIVILEGES_URL, { - version: '1', - method: 'GET', - }); -}; + /** + * Disable risk score engine + */ + const disableRiskEngine = () => + http.fetch(RISK_ENGINE_DISABLE_URL, { + version: '1', + method: 'POST', + }); -/** - * Get asset criticality privileges - */ -export const fetchAssetCriticalityPrivileges = async (): Promise => { - return KibanaServices.get().http.fetch( - ASSET_CRITICALITY_PRIVILEGES_URL, - { + /** + * Get risk engine privileges + */ + const fetchRiskEnginePrivileges = () => + http.fetch(RISK_ENGINE_PRIVILEGES_URL, { + version: '1', + method: 'GET', + }); + + /** + * Get asset criticality privileges + */ + const fetchAssetCriticalityPrivileges = () => + http.fetch(ASSET_CRITICALITY_PRIVILEGES_URL, { version: '1', method: 'GET', - } - ); + }); + + return { + fetchRiskScorePreview, + fetchRiskEngineStatus, + initRiskEngine, + enableRiskEngine, + disableRiskEngine, + fetchRiskEnginePrivileges, + fetchAssetCriticalityPrivileges, + }; }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_asset_criticality_privileges.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_asset_criticality_privileges.ts index 7314dcc6147a4..afed24ac49e63 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_asset_criticality_privileges.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_asset_criticality_privileges.ts @@ -5,8 +5,9 @@ * 2.0. */ import { useQuery } from '@tanstack/react-query'; -import { fetchAssetCriticalityPrivileges } from '../api'; +import { useEntityAnalyticsRoutes } from '../api'; export const useAssetCriticalityPrivileges = () => { + const { fetchAssetCriticalityPrivileges } = useEntityAnalyticsRoutes(); return useQuery(['GET', 'FETCH_ASSET_CRITICALITY_PRIVILEGES'], fetchAssetCriticalityPrivileges); }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_disable_risk_engine_mutation.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_disable_risk_engine_mutation.ts index 8b3ca2d0ac2ad..9f601d191d440 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_disable_risk_engine_mutation.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_disable_risk_engine_mutation.ts @@ -6,7 +6,7 @@ */ import type { UseMutationOptions } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query'; -import { disableRiskEngine } from '../api'; +import { useEntityAnalyticsRoutes } from '../api'; import { useInvalidateRiskEngineStatusQuery } from './use_risk_engine_status'; import type { EnableRiskEngineResponse, @@ -17,6 +17,7 @@ export const DISABLE_RISK_ENGINE_MUTATION_KEY = ['POST', 'DISABLE_RISK_ENGINE']; export const useDisableRiskEngineMutation = (options?: UseMutationOptions<{}>) => { const invalidateRiskEngineStatusQuery = useInvalidateRiskEngineStatusQuery(); + const { disableRiskEngine } = useEntityAnalyticsRoutes(); return useMutation( () => disableRiskEngine(), diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_enable_risk_engine_mutation.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_enable_risk_engine_mutation.ts index c4d5070014fc2..0f1a5995b7656 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_enable_risk_engine_mutation.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_enable_risk_engine_mutation.ts @@ -6,7 +6,7 @@ */ import type { UseMutationOptions } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query'; -import { enableRiskEngine } from '../api'; +import { useEntityAnalyticsRoutes } from '../api'; import { useInvalidateRiskEngineStatusQuery } from './use_risk_engine_status'; import type { EnableRiskEngineResponse, @@ -16,9 +16,9 @@ export const ENABLE_RISK_ENGINE_MUTATION_KEY = ['POST', 'ENABLE_RISK_ENGINE']; export const useEnableRiskEngineMutation = (options?: UseMutationOptions<{}>) => { const invalidateRiskEngineStatusQuery = useInvalidateRiskEngineStatusQuery(); - + const { enableRiskEngine } = useEntityAnalyticsRoutes(); return useMutation( - () => enableRiskEngine(), + enableRiskEngine, { ...options, mutationKey: ENABLE_RISK_ENGINE_MUTATION_KEY, diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_init_risk_engine_mutation.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_init_risk_engine_mutation.ts index 1e2a695652edf..aa8a19c4a7a6a 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_init_risk_engine_mutation.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_init_risk_engine_mutation.ts @@ -6,7 +6,7 @@ */ import type { UseMutationOptions } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query'; -import { initRiskEngine } from '../api'; +import { useEntityAnalyticsRoutes } from '../api'; import { useInvalidateRiskEngineStatusQuery } from './use_risk_engine_status'; import type { InitRiskEngineResponse, @@ -17,7 +17,7 @@ export const INIT_RISK_ENGINE_STATUS_KEY = ['POST', 'INIT_RISK_ENGINE']; export const useInitRiskEngineMutation = (options?: UseMutationOptions<{}>) => { const invalidateRiskEngineStatusQuery = useInvalidateRiskEngineStatusQuery(); - + const { initRiskEngine } = useEntityAnalyticsRoutes(); return useMutation(() => initRiskEngine(), { ...options, mutationKey: INIT_RISK_ENGINE_STATUS_KEY, diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts index 84360372ff876..01e9c6ac8dfea 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts @@ -6,7 +6,7 @@ */ import { useQuery } from '@tanstack/react-query'; import dateMath from '@kbn/datemath'; -import { fetchRiskScorePreview } from '../api'; +import { useEntityAnalyticsRoutes } from '../api'; import type { RiskScorePreviewRequestSchema } from '../../../../common/entity_analytics/risk_engine/risk_score_preview/request_schema'; export const useRiskScorePreview = ({ @@ -14,9 +14,10 @@ export const useRiskScorePreview = ({ range, filter, }: RiskScorePreviewRequestSchema) => { + const { fetchRiskScorePreview } = useEntityAnalyticsRoutes(); + return useQuery(['POST', 'FETCH_PREVIEW_RISK_SCORE', range, filter], async ({ signal }) => { const params: RiskScorePreviewRequestSchema = { data_view_id: dataViewId }; - if (range) { const startTime = dateMath.parse(range.start)?.utc().toISOString(); const endTime = dateMath diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_privileges.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_privileges.ts index 2a3ffa40856cb..5278b537048ff 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_privileges.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_privileges.ts @@ -5,8 +5,9 @@ * 2.0. */ import { useQuery } from '@tanstack/react-query'; -import { fetchRiskEnginePrivileges } from '../api'; +import { useEntityAnalyticsRoutes } from '../api'; export const useRiskEnginePrivileges = () => { + const { fetchRiskEnginePrivileges } = useEntityAnalyticsRoutes(); return useQuery(['GET', 'FETCH_RISK_ENGINE_PRIVILEGES'], fetchRiskEnginePrivileges); }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_status.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_status.ts index ed591213b2dcf..07ef32f0a3e41 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_status.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_engine_status.ts @@ -6,7 +6,7 @@ */ import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useCallback } from 'react'; -import { fetchRiskEngineStatus } from '../api'; +import { useEntityAnalyticsRoutes } from '../api'; import { RiskEngineStatus } from '../../../../common/entity_analytics/risk_engine/types'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; const FETCH_RISK_ENGINE_STATUS = ['GET', 'FETCH_RISK_ENGINE_STATUS']; @@ -29,7 +29,7 @@ export const useIsNewRiskScoreModuleInstalled = () => { export const useRiskEngineStatus = () => { const isNewRiskScoreModuleAvailable = useIsExperimentalFeatureEnabled('riskScoringRoutesEnabled'); - + const { fetchRiskEngineStatus } = useEntityAnalyticsRoutes(); return useQuery(FETCH_RISK_ENGINE_STATUS, async ({ signal }) => { if (!isNewRiskScoreModuleAvailable) { return { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/translations.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/translations.tsx index ed58f50f28279..d7e45c0ff80f3 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/translations.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/translations.tsx @@ -9,9 +9,9 @@ import { EuiCode, EuiLink } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; +import type { MissingPrivileges } from '../../../../common/entity_analytics/risk_engine'; import { useKibana } from '../../../common/lib/kibana'; import { CommaSeparatedValues } from '../../../detections/components/callouts/missing_privileges_callout/comma_separated_values'; -import type { MissingPrivileges } from './use_missing_risk_engine_privileges'; export const MISSING_PRIVILEGES_CALLOUT_TITLE = i18n.translate( 'xpack.securitySolution.riskEngine.missingPrivilegesCallOut.messageTitle', diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/use_missing_risk_engine_privileges.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/use_missing_risk_engine_privileges.ts index 76f57281e9f93..aeda116c7a188 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/use_missing_risk_engine_privileges.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_engine_privileges_callout/use_missing_risk_engine_privileges.ts @@ -6,49 +6,17 @@ */ import { useMemo } from 'react'; -import type { EntityAnalyticsPrivileges } from '../../../../common/api/entity_analytics/common'; import { useRiskEnginePrivileges } from '../../api/hooks/use_risk_engine_privileges'; -import { - RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES, - RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES, -} from '../../../../common/entity_analytics/risk_engine'; - -const getMissingIndexPrivileges = ( - privileges: EntityAnalyticsPrivileges['privileges']['elasticsearch']['index'] -): MissingIndexPrivileges => { - const missingIndexPrivileges: MissingIndexPrivileges = []; - - if (!privileges) { - return missingIndexPrivileges; - } - - for (const [indexName, requiredPrivileges] of Object.entries( - RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES - )) { - const missingPrivileges = requiredPrivileges.filter( - (privilege) => !privileges[indexName][privilege] - ); - - if (missingPrivileges.length) { - missingIndexPrivileges.push([indexName, missingPrivileges]); - } - } - - return missingIndexPrivileges; -}; - -export type MissingClusterPrivileges = string[]; -export type MissingIndexPrivileges = Array<[indexName: string, privileges: string[]]>; - -export interface MissingPrivileges { - clusterPrivileges: MissingClusterPrivileges; - indexPrivileges: MissingIndexPrivileges; -} - +import type { MissingPrivileges } from '../../../../common/entity_analytics/risk_engine'; +import { getMissingRiskEnginePrivileges } from '../../../../common/entity_analytics/risk_engine'; export type MissingPrivilegesResponse = | { isLoading: true } | { isLoading: false; hasAllRequiredPrivileges: true } - | { isLoading: false; missingPrivileges: MissingPrivileges; hasAllRequiredPrivileges: false }; + | { + isLoading: false; + missingPrivileges: MissingPrivileges; + hasAllRequiredPrivileges: false; + }; export const useMissingPrivileges = (): MissingPrivilegesResponse => { const { data: privilegesResponse, isLoading } = useRiskEnginePrivileges(); @@ -67,18 +35,16 @@ export const useMissingPrivileges = (): MissingPrivilegesResponse => { }; } - const { privileges } = privilegesResponse; - const missinIndexPrivileges = getMissingIndexPrivileges(privileges.elasticsearch.index); - const missingClusterPrivileges = RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES.filter( - (privilege) => !privileges.elasticsearch.cluster?.[privilege] + const { indexPrivileges, clusterPrivileges } = getMissingRiskEnginePrivileges( + privilegesResponse.privileges ); return { isLoading: false, hasAllRequiredPrivileges: false, missingPrivileges: { - indexPrivileges: missinIndexPrivileges, - clusterPrivileges: missingClusterPrivileges, + indexPrivileges, + clusterPrivileges, }, }; }, [isLoading, privilegesResponse]); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx index b5849ce5f9350..1752ff91c3f03 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx @@ -14,7 +14,6 @@ import { ABOUT_SECTION_TEST_ID } from './test_ids'; import { Description } from './description'; import { Reason } from './reason'; import { MitreAttack } from './mitre_attack'; -import { AlertStatus } from './alert_status'; export interface AboutSectionProps { /** @@ -42,7 +41,6 @@ export const AboutSection: VFC = ({ expanded = true }) => { - ); }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/alert_status.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/alert_status.test.tsx deleted file mode 100644 index 31d9d686c4bd0..0000000000000 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/alert_status.test.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { act, render } from '@testing-library/react'; -import { AlertStatus } from './alert_status'; -import { RightPanelContext } from '../context'; -import { WORKFLOW_STATUS_DETAILS_TEST_ID, WORKFLOW_STATUS_TITLE_TEST_ID } from './test_ids'; -import { mockSearchHit } from '../../shared/mocks/mock_search_hit'; -import { TestProviders } from '../../../../common/mock'; -import { useBulkGetUserProfiles } from '../../../../common/components/user_profiles/use_bulk_get_user_profiles'; - -jest.mock('../../../../common/components/user_profiles/use_bulk_get_user_profiles'); - -const renderAlertStatus = (contextValue: RightPanelContext) => - render( - - - - - - ); - -const mockUserProfiles = [ - { uid: 'user-id-1', enabled: true, user: { username: 'user1', full_name: 'User 1' }, data: {} }, -]; - -describe('', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - it('should render alert status history information', async () => { - (useBulkGetUserProfiles as jest.Mock).mockReturnValue({ - isLoading: false, - data: mockUserProfiles, - }); - const contextValue = { - searchHit: { - ...mockSearchHit, - fields: { - 'kibana.alert.workflow_user': 'user-id-1', - 'kibana.alert.workflow_status_updated_at': '2023-11-01T22:33:26.893Z', - }, - }, - } as unknown as RightPanelContext; - - const { getByTestId } = renderAlertStatus(contextValue); - - await act(async () => { - expect(getByTestId(WORKFLOW_STATUS_TITLE_TEST_ID)).toBeInTheDocument(); - expect(getByTestId(WORKFLOW_STATUS_DETAILS_TEST_ID)).toBeInTheDocument(); - }); - }); - - it('should render empty component if missing workflow_user value', async () => { - const contextValue = { - searchHit: { - some_field: 'some_value', - }, - } as unknown as RightPanelContext; - - const { container } = renderAlertStatus(contextValue); - - await act(async () => { - expect(container).toBeEmptyDOMElement(); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/alert_status.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/alert_status.tsx deleted file mode 100644 index 07ce258b7dd7c..0000000000000 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/alert_status.tsx +++ /dev/null @@ -1,60 +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 { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle } from '@elastic/eui'; -import { getUserDisplayName } from '@kbn/user-profile-components'; -import { FormattedMessage } from '@kbn/i18n-react'; -import type { FC } from 'react'; -import React from 'react'; -import { WORKFLOW_STATUS_DETAILS_TEST_ID, WORKFLOW_STATUS_TITLE_TEST_ID } from './test_ids'; -import { useRightPanelContext } from '../context'; -import { useBulkGetUserProfiles } from '../../../../common/components/user_profiles/use_bulk_get_user_profiles'; -import { PreferenceFormattedDate } from '../../../../common/components/formatted_date'; - -/** - * Displays info about who last updated the alert's workflow status and when. - */ -export const AlertStatus: FC = () => { - const { searchHit } = useRightPanelContext(); - const statusUpdatedBy = searchHit.fields?.['kibana.alert.workflow_user'] as string; - const statusUpdatedAt = searchHit.fields?.['kibana.alert.workflow_status_updated_at']; - - const result = useBulkGetUserProfiles({ uids: new Set(statusUpdatedBy) }); - const user = result.data?.[0]?.user; - - if (!statusUpdatedBy || !statusUpdatedAt || result.isLoading || user == null) { - return null; - } - - return ( - - - - -
- -
-
-
- - , - }} - /> - -
- ); -}; - -AlertStatus.displayName = 'AlertStatus'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx index 806a43f9f5497..5e6bcb2add441 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx @@ -60,7 +60,7 @@ const columns: Array> = [ /> ), 'data-test-subj': 'fieldCell', - width: '50%', + width: '30%', }, { field: 'description', @@ -71,7 +71,7 @@ const columns: Array> = [ /> ), 'data-test-subj': 'valueCell', - width: '50%', + width: '70%', render: (description: { field: string; values: string[] | null | undefined; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts index fd9c15b2c079c..5b176a34014ab 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts @@ -43,10 +43,6 @@ const MITRE_ATTACK_TEST_ID = `${PREFIX}MitreAttack` as const; export const MITRE_ATTACK_TITLE_TEST_ID = `${MITRE_ATTACK_TEST_ID}Title` as const; export const MITRE_ATTACK_DETAILS_TEST_ID = `${MITRE_ATTACK_TEST_ID}Details` as const; -export const WORKFLOW_STATUS_TEST_ID = `${PREFIX}WorkflowStatus` as const; -export const WORKFLOW_STATUS_TITLE_TEST_ID = `${WORKFLOW_STATUS_TEST_ID}Title` as const; -export const WORKFLOW_STATUS_DETAILS_TEST_ID = `${WORKFLOW_STATUS_TEST_ID}Details` as const; - /* Investigation section */ export const INVESTIGATION_SECTION_TEST_ID = `${PREFIX}InvestigationSection` as const; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx index 8351d70216be7..c0083d8f80b2d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx @@ -47,6 +47,7 @@ export const getColumns: ColumnsProvider = ({ {i18n.FIELD} ), + width: '30%', render: (field, data) => { return ( @@ -60,6 +61,7 @@ export const getColumns: ColumnsProvider = ({ {i18n.VALUE} ), + width: '70%', render: (values, data) => { const fieldFromBrowserField = getFieldFromBrowserField( [data.category as string, 'fields', data.field], diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 1948434b39c9f..305ce11d165ef 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -20,7 +20,9 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/168340 +// FLAKY: https://github.com/elastic/kibana/issues/168427 +describe.skip( 'Automated Response Actions', { tags: [ diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts index f927db6b0842d..78239fbca02d1 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts @@ -44,7 +44,9 @@ describe( const testNote = 'test note'; const updatedTestNote = 'updated test note'; - describe('Renders and saves protection updates', () => { + // FLAKY: https://github.com/elastic/kibana/issues/169187 + // FLAKY: https://github.com/elastic/kibana/issues/169188 + describe.skip('Renders and saves protection updates', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; const defaultDate = moment.utc().subtract(1, 'days'); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts index b806323726018..4093581366321 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts @@ -22,7 +22,8 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170674 +describe.skip('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts index 75074b0d3f94a..e932250dada6b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts @@ -20,7 +20,9 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/169821 +// FLAKY: https://github.com/elastic/kibana/issues/169822 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts index dad573bb09c2b..8be29e75ddd9c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts @@ -26,7 +26,9 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => { login(); }); - describe('Execute operations:', () => { + // FLAKY: https://github.com/elastic/kibana/issues/170373 + // FLAKY: https://github.com/elastic/kibana/issues/171444 + describe.skip('Execute operations:', () => { const homeFilePath = process.env.CI || true ? '/home/vagrant' : `/home/ubuntu`; let indexedPolicy: IndexedFleetEndpointPolicyResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts index e76a0beb82dca..a470098b4f55f 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts @@ -26,7 +26,9 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => { login(); }); - describe('File operations:', () => { + // FLAKY: https://github.com/elastic/kibana/issues/170424 + // FLAKY: https://github.com/elastic/kibana/issues/173456 + describe.skip('File operations:', () => { const homeFilePath = Cypress.env('IS_CI') ? '/home/vagrant' : '/home/ubuntu'; const fileContent = 'This is a test file for the get-file command.'; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts index 44fdf9d63fb68..fb5fcd0476c14 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts @@ -26,7 +26,9 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/173464 +// FLAKY: https://github.com/elastic/kibana/issues/173465 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts index c7120ded692b9..ba2ebf1c1a88a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts @@ -24,7 +24,9 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/173459 +// FLAKY: https://github.com/elastic/kibana/issues/170563 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts index e0b26bc2f77dd..046a185babda3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts @@ -20,7 +20,9 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/173463 +// FLAKY: https://github.com/elastic/kibana/issues/170814 +describe.skip( 'Unenroll agent from fleet with agent tamper protection is disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts index ed47855ac894a..d5b018e9b03a4 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/173466 +describe.skip( 'Uninstall agent from host when agent tamper protection is disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts index 17cb52c2cb042..cf37edfb0274b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts @@ -20,7 +20,9 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/173460 +// FLAKY: https://github.com/elastic/kibana/issues/170706 +describe.skip( 'Unenroll agent from fleet when agent tamper protection is enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts index 527566bed608b..a7220e3bd7f1d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts @@ -22,7 +22,9 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/173471 +// FLAKY: https://github.com/elastic/kibana/issues/170601 +describe.skip( 'Uninstall agent from host when agent tamper protection is enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts index a5654734c15e4..55058897c4f95 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts @@ -21,7 +21,9 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170816 +// FLAKY: https://github.com/elastic/kibana/issues/173458 +describe.skip( 'Unenroll agent from fleet changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts index 0768c4a49ca39..d01b5cbfdd086 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts @@ -23,7 +23,9 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/173457 +// FLAKY: https://github.com/elastic/kibana/issues/170604 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts index d8630a50a83b9..379afba46b7fd 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts @@ -23,7 +23,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/173467 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts index 4fe0e6eb7b95a..449090d781330 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts @@ -1162,6 +1162,17 @@ export const AdvancedPolicySchema: AdvancedPolicySchemaType[] = [ } ), }, + { + key: 'windows.advanced.events.callstacks.timeout_microseconds', + first_supported_version: '8.12', + documentation: i18n.translate( + 'xpack.securitySolution.endpoint.policy.advanced.windows.advanced.events.callstacks.timeout_microseconds', + { + defaultMessage: + 'Maximum runtime of inline callstack collection/enrichment. Default: 100000', + } + ), + }, { key: 'windows.advanced.artifacts.global.proxy_url', first_supported_version: '8.8', diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/flyout/__snapshots__/index.test.tsx.snap index 88bf414235613..5ef25f98932c0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/__snapshots__/index.test.tsx.snap @@ -62,6 +62,56 @@ exports[`Flyout rendering it renders correctly against snapshot 1`] = `
+
+
+
+
+ +
+
+
+
+
+ +
@@ -109,31 +159,21 @@ exports[`Flyout rendering it renders correctly against snapshot 1`] = ` data-test-subj="timeline-status" > - Unsaved + + + Unsaved + +
-
- -
diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/action_menu/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/action_menu/index.tsx index b2e3230490ce7..2208b6ee706b8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/action_menu/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/action_menu/index.tsx @@ -7,6 +7,7 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; +import styled from 'styled-components'; import { useKibana } from '../../../../common/lib/kibana/kibana_react'; import { APP_ID } from '../../../../../common'; import type { TimelineTabs } from '../../../../../common/types'; @@ -25,6 +26,12 @@ interface TimelineActionMenuProps { activeTab: TimelineTabs; } +const VerticalDivider = styled.span` + width: 0px; + height: 20px; + border-left: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; +`; + const TimelineActionMenuComponent = ({ mode = 'normal', timelineId, @@ -49,11 +56,6 @@ const TimelineActionMenuComponent = ({ - {userCasesPermissions.create && userCasesPermissions.read ? ( - - - - ) : null} + {userCasesPermissions.create && userCasesPermissions.read ? ( + <> + + + + + + + + ) : null} diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.test.tsx index 80bd77bb81096..efae77571138d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.test.tsx @@ -52,11 +52,11 @@ jest.mock('../../../containers/all', () => { }); jest.mock('../../timeline/properties/new_template_timeline', () => ({ - NewTemplateTimeline: jest.fn(() =>
{'Create new timeline template'}
), + NewTemplateTimeline: jest.fn(() =>
{'Create new Timeline template'}
), })); jest.mock('../../timeline/properties/helpers', () => ({ - NewTimeline: jest.fn().mockReturnValue(
{'Create new timeline'}
), + NewTimeline: jest.fn().mockReturnValue(
{'Create new Timeline'}
), })); jest.mock('../../../../common/containers/source', () => ({ diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.tsx index 69b71adb9fb6e..2c9e537ce4b06 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_timeline_button/index.tsx @@ -39,10 +39,10 @@ const AddTimelineButtonComponent: React.FC = ({ () => ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx index 14158e884e1bb..b6e4d354e9c6f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx @@ -28,6 +28,7 @@ import { TimelineActionMenu } from '../action_menu'; import { AddToFavoritesButton } from '../../timeline/properties/helpers'; import { TimelineStatusInfo } from './timeline_status_info'; import { timelineDefaults } from '../../../store/timeline/defaults'; +import { AddTimelineButton } from '../add_timeline_button'; interface FlyoutHeaderPanelProps { timelineId: string; @@ -141,6 +142,14 @@ const FlyoutHeaderPanelComponent: React.FC = ({ timeline > + {!show ? ( + + + + ) : null} + + + = ({ timeline - - - {show && ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.test.tsx index f7fda862f793f..55285e18638cf 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.test.tsx @@ -28,18 +28,6 @@ describe('TestComponent', () => { it('should render the status correctly when timeline has unsaved changes', () => { render(); - expect(screen.getByText('Has unsaved changes')).toBeVisible(); - }); - - it('should render the status correctly when timeline is saved', () => { - const updatedTime = Date.now(); - render(); - expect(screen.getByText('Saved')).toBeVisible(); - }); - - it('should render the status correctly when timeline is saved some time ago', () => { - const updatedTime = Date.now() - 10000; - render(); - expect(screen.getByTestId('timeline-status')).toHaveTextContent(/Saved10 seconds ago/); + expect(screen.getByText('Unsaved changes')).toBeVisible(); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.tsx index ed164ddab47fc..ebd2f5bede310 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/timeline_status_info.tsx @@ -6,8 +6,7 @@ */ import React from 'react'; -import { EuiTextColor, EuiText } from '@elastic/eui'; -import { FormattedRelative } from '@kbn/i18n-react'; +import { EuiText, EuiBadge } from '@elastic/eui'; import styled from 'styled-components'; import { TimelineStatus } from '../../../../../common/api/timeline'; @@ -29,21 +28,13 @@ export const TimelineStatusInfo = React.memo( let statusContent: React.ReactNode = null; if (isUnsaved || !updated) { - statusContent = {i18n.UNSAVED}; + statusContent = {i18n.UNSAVED}; } else if (changed) { - statusContent = {i18n.UNSAVED_CHANGES}; - } else { - statusContent = ( - <> - {i18n.SAVED} - - - ); + statusContent = {i18n.UNSAVED_CHANGES}; } + + if (!statusContent) return null; + return ( {statusContent} diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/translations.ts index 56036f899e61f..f3e7306eae315 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/translations.ts @@ -26,7 +26,7 @@ export const SAVED = i18n.translate('xpack.securitySolution.timeline.properties. export const UNSAVED_CHANGES = i18n.translate( 'xpack.securitySolution.timeline.properties.hasChangesLabel', { - defaultMessage: 'Has unsaved changes', + defaultMessage: 'Unsaved changes', } ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap index cfcbd3b1be2b2..8475b548dd795 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap @@ -75,63 +75,6 @@ Array [ class="euiFlexGroup emotion-euiFlexGroup-responsive-none-flexStart-center-row" />
-
-
-
-

- Assignees: -

-
-
-
-
-
-
-
- - - -
-
-
-
-
, @@ -265,63 +208,6 @@ exports[`Details Panel Component DetailsPanel:EventDetails: rendering it should class="euiFlexGroup emotion-euiFlexGroup-responsive-none-flexStart-center-row" />
-
-
-
-

- Assignees: -

-
-
-
-
-
-
-
- - - -
-
-
-
-
diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx index 18cef99f0cb20..2b195eb11fe3c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx @@ -175,7 +175,7 @@ export const ExpandableEventTitle = React.memo( )} - {scopeId !== TableId.rulePreview && ( + {isAlert && scopeId !== TableId.rulePreview && ( = ({ initialized, show: isOpen, isLoading, + activeTab, } = useDeepEqualSelector((state) => pick( [ @@ -95,6 +96,7 @@ const StatefulTimelineComponent: React.FC = ({ 'initialized', 'show', 'isLoading', + 'activeTab', ], getTimeline(state, timelineId) ?? timelineDefaults ) @@ -195,6 +197,18 @@ const StatefulTimelineComponent: React.FC = ({ const showTimelineTour = isOpen && !isLoading && canEditTimeline; + const handleSwitchToTab = useCallback( + (tab: TimelineTabs) => { + dispatch( + timelineActions.setActiveTabTimeline({ + id: timelineId, + activeTab: tab, + }) + ); + }, + [timelineId, dispatch] + ); + return ( = ({ /> - {showTimelineTour ? : null} + {showTimelineTour ? ( + + ) : null} ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/pin/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/pin/index.tsx index 6e359920701f3..369fadfb82457 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/pin/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/pin/index.tsx @@ -54,7 +54,7 @@ export const Pin = React.memo( isTemplate, isPinned: pinned, }); - const pinAriaLabel = ariaLabel != null ? ariaLabel : defaultAriaLabel; + const pinAriaLabel = ariaLabel != null && !isTemplate ? ariaLabel : defaultAriaLabel; return ( = ({ return compact ? ( = ({ /> ) : ( { return ( - + {Object.values(TIMELINE_TOUR_CONFIG_ANCHORS).map((anchor) => { return
; })} @@ -58,6 +61,12 @@ describe('Timeline Tour', () => { fireEvent.click(screen.getByText('Next')); + await waitFor(() => { + expect(screen.getByTestId('timeline-tour-step-4')).toBeVisible(); + }); + + fireEvent.click(screen.getByText('Next')); + await waitFor(() => { expect(screen.queryByText('Finish tour')).toBeVisible(); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx index 96c703fb1b841..7285798688461 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx @@ -12,6 +12,7 @@ import React, { useEffect, useCallback, useState } from 'react'; import { EuiButton, EuiButtonEmpty, EuiTourStep } from '@elastic/eui'; +import type { TimelineTabs } from '../../../../../common/types'; import { useIsElementMounted } from '../../../../detection_engine/rule_management_ui/components/rules_table/rules_table/guided_onboarding/use_is_element_mounted'; import { NEW_FEATURES_TOUR_STORAGE_KEYS } from '../../../../../common/constants'; import { useKibana } from '../../../../common/lib/kibana'; @@ -25,7 +26,13 @@ interface TourState { tourSubtitle: string; } -const TimelineTourComp = () => { +interface TimelineTourProps { + activeTab: TimelineTabs; + switchToTab: (tab: TimelineTabs) => void; +} + +const TimelineTourComp = (props: TimelineTourProps) => { + const { activeTab, switchToTab } = props; const { services: { storage }, } = useKibana(); @@ -86,6 +93,12 @@ const TimelineTourComp = () => { const isElementAtCurrentStepMounted = useIsElementMounted(nextEl); + const currentStepConfig = timelineTourSteps[tourState.currentTourStep - 1]; + + if (currentStepConfig?.timelineTab && currentStepConfig.timelineTab !== activeTab) { + switchToTab(currentStepConfig.timelineTab); + } + if (!tourState.isTourActive || !isElementAtCurrentStepMounted) { return null; } @@ -93,14 +106,16 @@ const TimelineTourComp = () => { return ( <> {timelineTourSteps.map((steps, idx) => { - if (tourState.currentTourStep !== idx + 1) return null; + const stepCount = idx + 1; + if (tourState.currentTourStep !== stepCount) return null; + const panelProps = { + 'data-test-subj': `timeline-tour-step-${idx + 1}`, + }; return ( { content={steps.content} anchor={`#${steps.anchor}`} subtitle={tourConfig.tourSubtitle} - footerAction={getFooterAction(steps.step)} + footerAction={getFooterAction(stepCount)} /> ); })} diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx index fe668d4e5d9ec..8b1e416324b1b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx @@ -8,6 +8,7 @@ import { EuiText, EuiCode } from '@elastic/eui'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { TimelineTabs } from '../../../../../common/types'; import * as i18n from './translations'; export const TIMELINE_TOUR_CONFIG_ANCHORS = { @@ -15,17 +16,17 @@ export const TIMELINE_TOUR_CONFIG_ANCHORS = { DATA_VIEW: 'timeline-data-view', DATA_PROVIDER: 'toggle-data-provider', SAVE_TIMELINE: 'save-timeline-action', + ADD_TO_FAVORITES: 'add-to-favorites', }; export const timelineTourSteps = [ { - step: 1, title: i18n.TIMELINE_TOUR_TIMELINE_ACTIONS_STEP_TITLE, content: ( {i18n.TIMELINE_TOUR_NEW}, openButton: {i18n.TIMELINE_TOUR_OPEN}, @@ -36,13 +37,25 @@ export const timelineTourSteps = [ anchor: TIMELINE_TOUR_CONFIG_ANCHORS.ACTION_MENU, }, { - step: 2, + title: i18n.TIMELINE_TOUR_ADD_TO_FAVORITES_STEP_TITLE, + content: ( + + + + ), + anchor: TIMELINE_TOUR_CONFIG_ANCHORS.ADD_TO_FAVORITES, + }, + { + timelineTab: TimelineTabs.query, title: i18n.TIMELINE_TOUR_CHANGE_DATA_VIEW_TITLE, content: ( {i18n.TIMELINE_TOUR_DATA_VIEW}, }} @@ -52,19 +65,18 @@ export const timelineTourSteps = [ anchor: TIMELINE_TOUR_CONFIG_ANCHORS.DATA_VIEW, }, { - step: 3, + timelineTab: TimelineTabs.query, title: i18n.TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_TITLE, content: {i18n.TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_DESCRIPTION}, anchor: TIMELINE_TOUR_CONFIG_ANCHORS.DATA_PROVIDER, }, { - step: 4, title: i18n.TIMELINE_TOUR_SAVE_TIMELINE_STEP_TITLE, content: ( {i18n.TIMELINE_TOUR_SAVE}, editButton: {i18n.TIMELINE_TOUR_EDIT}, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts index 3b51ad38a6763..3bb3b0e7eac00 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts @@ -31,7 +31,7 @@ export const TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_TITLE = i18n.translate( export const TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_DESCRIPTION = i18n.translate( 'xpack.securitySolution.timeline.tour.dataProviderToggle.description', { - defaultMessage: 'Click to expand or collapse the query builder', + defaultMessage: 'Click to expand or collapse the query builder.', } ); @@ -49,6 +49,13 @@ export const TIMELINE_TOUR_CHANGE_DATA_VIEW_TITLE = i18n.translate( } ); +export const TIMELINE_TOUR_ADD_TO_FAVORITES_STEP_TITLE = i18n.translate( + 'xpack.securitySolution.timeline.tour.addToFavorites.title', + { + defaultMessage: 'A new and intuitive way to favorite your Timeline', + } +); + export const TIMELINE_TOUR_NEXT = i18n.translate('xpack.securitySolution.timeline.tour.next', { defaultMessage: 'Next', }); diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts index 22b51692eb33f..f3a7070aa7e33 100644 --- a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts +++ b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts @@ -61,7 +61,7 @@ const DEFAULT_CONFIGURATION: Readonly = [ const DEFAULT_REGION = 'aws-eu-west-1'; const PROJECT_NAME_PREFIX = 'kibana-cypress-security-solution-ephemeral'; -const BASE_ENV_URL = 'https://global.qa.cld.elstc.co'; +const BASE_ENV_URL = 'https://console.qa.cld.elstc.co'; let log: ToolingLog; const API_HEADERS = Object.freeze({ 'kbn-xsrf': 'cypress-creds', @@ -571,6 +571,7 @@ ${JSON.stringify(cypressConfigFile, null, 2)} KIBANA_PASSWORD: credentials.password, CLOUD_SERVERLESS: true, + IS_SERVERLESS: true, }; if (process.env.DEBUG && !process.env.CI) { @@ -582,6 +583,7 @@ ${JSON.stringify(cypressConfigFile, null, 2)} ---------------------------------------------- `); } + process.env.TEST_CLOUD_HOST_NAME = new URL(BASE_ENV_URL).hostname; if (isOpen) { await cypress.open({ diff --git a/x-pack/plugins/security_solution/server/assistant/jest.config.js b/x-pack/plugins/security_solution/server/assistant/jest.config.js new file mode 100644 index 0000000000000..787dae7ce8d68 --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/jest.config.js @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../..', + roots: ['/x-pack/plugins/security_solution/server/assistant'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/plugins/security_solution/server/assistant', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/security_solution/server/assistant/**/*.{ts,tsx}', + ], + moduleNameMapper: require('../__mocks__/module_name_map'), +}; diff --git a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.test.ts new file mode 100644 index 0000000000000..715d656944c86 --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.test.ts @@ -0,0 +1,162 @@ +/* + * Copyright 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { DynamicTool } from 'langchain/tools'; +import { omit } from 'lodash/fp'; + +import type { RequestBody } from '@kbn/elastic-assistant-plugin/server/lib/langchain/types'; +import { ALERT_COUNTS_TOOL } from './alert_counts_tool'; +import type { RetrievalQAChain } from 'langchain/chains'; + +describe('AlertCountsTool', () => { + const alertsIndexPattern = 'alerts-index'; + const esClient = { + search: jest.fn().mockResolvedValue({}), + } as unknown as ElasticsearchClient; + const replacements = { key: 'value' }; + const request = { + body: { + assistantLangChain: false, + alertsIndexPattern: '.alerts-security.alerts-default', + allow: ['@timestamp', 'cloud.availability_zone', 'user.name'], + allowReplacement: ['user.name'], + replacements, + size: 20, + }, + } as unknown as KibanaRequest; + const assistantLangChain = true; + const chain = {} as unknown as RetrievalQAChain; + const modelExists = true; + const rest = { + assistantLangChain, + chain, + modelExists, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('isSupported', () => { + it('returns false when the alertsIndexPattern is undefined', () => { + const params = { + esClient, + request, + ...rest, + }; + + expect(ALERT_COUNTS_TOOL.isSupported(params)).toBe(false); + }); + + it('returns false when the request is missing required anonymization parameters', () => { + const requestMissingAnonymizationParams = { + body: { + assistantLangChain: false, + alertsIndexPattern: '.alerts-security.alerts-default', + size: 20, + }, + } as unknown as KibanaRequest; + const params = { + esClient, + request: requestMissingAnonymizationParams, + ...rest, + }; + + expect(ALERT_COUNTS_TOOL.isSupported(params)).toBe(false); + }); + + it('returns true if alertsIndexPattern is defined and request includes required anonymization parameters', () => { + const params = { + alertsIndexPattern, + esClient, + request, + ...rest, + }; + + expect(ALERT_COUNTS_TOOL.isSupported(params)).toBe(true); + }); + }); + + describe('getTool', () => { + it('returns a `DynamicTool` with a `func` that calls `esClient.search()` with the expected query', async () => { + const tool: DynamicTool = ALERT_COUNTS_TOOL.getTool({ + alertsIndexPattern, + esClient, + replacements, + request, + ...rest, + }) as DynamicTool; + + await tool.func(''); + + expect(esClient.search).toHaveBeenCalledWith({ + aggs: { statusBySeverity: { terms: { field: 'kibana.alert.severity' } } }, + index: ['alerts-index'], + query: { + bool: { + filter: [ + { + bool: { + filter: [{ match_phrase: { 'kibana.alert.workflow_status': 'open' } }], + must_not: [{ exists: { field: 'kibana.alert.building_block_type' } }], + }, + }, + { range: { '@timestamp': { gte: 'now/d', lte: 'now/d' } } }, + ], + }, + }, + size: 0, + }); + }); + + it('returns null when the request is missing required anonymization parameters', () => { + const requestWithMissingParams = omit('body.allow', request) as unknown as KibanaRequest< + unknown, + unknown, + RequestBody + >; + + const tool = ALERT_COUNTS_TOOL.getTool({ + alertsIndexPattern, + esClient, + replacements, + request: requestWithMissingParams, + ...rest, + }); + + expect(tool).toBeNull(); + }); + + it('returns null when the alertsIndexPattern is undefined', () => { + const tool = ALERT_COUNTS_TOOL.getTool({ + // alertsIndexPattern is undefined + esClient, + replacements, + request, + + ...rest, + }); + + expect(tool).toBeNull(); + }); + + it('returns a tool instance with the expected tags', () => { + const tool = ALERT_COUNTS_TOOL.getTool({ + alertsIndexPattern, + esClient, + replacements, + request, + + ...rest, + }) as DynamicTool; + + expect(tool.tags).toEqual(['alerts', 'alerts-count']); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts new file mode 100644 index 0000000000000..e1c265c3dc239 --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.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 type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; +import { DynamicTool } from 'langchain/tools'; + +import { requestHasRequiredAnonymizationParams } from '@kbn/elastic-assistant-plugin/server/lib/langchain/helpers'; +import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; +import { getAlertsCountQuery } from './get_alert_counts_query'; +import { APP_UI_ID } from '../../../../common'; + +export interface AlertCountsToolParams extends AssistantToolParams { + alertsIndexPattern: string; +} +export const ALERT_COUNTS_TOOL_DESCRIPTION = + 'Call this for the counts of last 24 hours of open alerts in the environment, grouped by their severity'; + +export const ALERT_COUNTS_TOOL: AssistantTool = { + id: 'alert-counts-tool', + name: 'AlertCountsTool', + description: ALERT_COUNTS_TOOL_DESCRIPTION, + sourceRegister: APP_UI_ID, + isSupported: (params: AssistantToolParams): params is AlertCountsToolParams => { + const { request, alertsIndexPattern } = params; + return requestHasRequiredAnonymizationParams(request) && alertsIndexPattern != null; + }, + getTool(params: AssistantToolParams) { + if (!this.isSupported(params)) return null; + const { alertsIndexPattern, esClient } = params as AlertCountsToolParams; + return new DynamicTool({ + name: 'AlertCountsTool', + description: ALERT_COUNTS_TOOL_DESCRIPTION, + func: async () => { + const query = getAlertsCountQuery(alertsIndexPattern); + + const result = await esClient.search(query); + + return JSON.stringify(result); + }, + tags: ['alerts', 'alerts-count'], + }); + }, +}; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_query.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.test.ts similarity index 100% rename from x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_query.test.ts rename to x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.test.ts diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_query.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.ts similarity index 100% rename from x-pack/plugins/elastic_assistant/server/lib/langchain/tools/alert_counts/get_alert_counts_query.ts rename to x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.ts diff --git a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.test.ts new file mode 100644 index 0000000000000..19e3bf7e7b40a --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.test.ts @@ -0,0 +1,109 @@ +/* + * Copyright 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 { RetrievalQAChain } from 'langchain/chains'; +import type { DynamicTool } from 'langchain/tools'; +import { ESQL_KNOWLEDGE_BASE_TOOL } from './esql_language_knowledge_base_tool'; +import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { RequestBody } from '@kbn/elastic-assistant-plugin/server/lib/langchain/types'; + +describe('EsqlLanguageKnowledgeBaseTool', () => { + const chain = {} as RetrievalQAChain; + const esClient = { + search: jest.fn().mockResolvedValue({}), + } as unknown as ElasticsearchClient; + const request = { + body: { + assistantLangChain: false, + alertsIndexPattern: '.alerts-security.alerts-default', + allow: ['@timestamp', 'cloud.availability_zone', 'user.name'], + allowReplacement: ['user.name'], + replacements: { key: 'value' }, + size: 20, + }, + } as unknown as KibanaRequest; + const rest = { + chain, + esClient, + request, + }; + + describe('isSupported', () => { + it('returns false if assistantLangChain is false', () => { + const params = { + assistantLangChain: false, + modelExists: true, + ...rest, + }; + + expect(ESQL_KNOWLEDGE_BASE_TOOL.isSupported(params)).toBe(false); + }); + + it('returns false if modelExists is false (the ELSER model is not installed)', () => { + const params = { + assistantLangChain: true, + modelExists: false, // <-- ELSER model is not installed + ...rest, + }; + + expect(ESQL_KNOWLEDGE_BASE_TOOL.isSupported(params)).toBe(false); + }); + + it('returns true if assistantLangChain and modelExists are true', () => { + const params = { + assistantLangChain: true, + modelExists: true, + ...rest, + }; + + expect(ESQL_KNOWLEDGE_BASE_TOOL.isSupported(params)).toBe(true); + }); + }); + + describe('getTool', () => { + it('returns null if assistantLangChain is false', () => { + const tool = ESQL_KNOWLEDGE_BASE_TOOL.getTool({ + assistantLangChain: false, + modelExists: true, + ...rest, + }); + + expect(tool).toBeNull(); + }); + + it('returns null if modelExists is false (the ELSER model is not installed)', () => { + const tool = ESQL_KNOWLEDGE_BASE_TOOL.getTool({ + assistantLangChain: true, + modelExists: false, // <-- ELSER model is not installed + ...rest, + }); + + expect(tool).toBeNull(); + }); + + it('should return a Tool instance if assistantLangChain and modelExists are true', () => { + const tool = ESQL_KNOWLEDGE_BASE_TOOL.getTool({ + assistantLangChain: true, + modelExists: true, + ...rest, + }); + + expect(tool?.name).toEqual('ESQLKnowledgeBaseTool'); + }); + + it('should return a tool with the expected tags', () => { + const tool = ESQL_KNOWLEDGE_BASE_TOOL.getTool({ + assistantLangChain: true, + modelExists: true, + ...rest, + }) as DynamicTool; + + expect(tool.tags).toEqual(['esql', 'query-generation', 'knowledge-base']); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts new file mode 100644 index 0000000000000..3dc7dfd8d976c --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ChainTool } from 'langchain/tools'; +import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; +import { APP_UI_ID } from '../../../../common'; + +export type EsqlKnowledgeBaseToolParams = AssistantToolParams; + +export const ESQL_KNOWLEDGE_BASE_TOOL: AssistantTool = { + id: 'esql-knowledge-base-tool', + name: 'ESQLKnowledgeBaseTool', + description: + 'Call this for knowledge on how to build an ESQL query, or answer questions about the ES|QL query language.', + sourceRegister: APP_UI_ID, + isSupported: (params: AssistantToolParams): params is EsqlKnowledgeBaseToolParams => { + const { assistantLangChain, modelExists } = params; + return assistantLangChain && modelExists; + }, + getTool(params: AssistantToolParams) { + if (!this.isSupported(params)) return null; + const { chain } = params as EsqlKnowledgeBaseToolParams; + return new ChainTool({ + name: 'ESQLKnowledgeBaseTool', + description: + 'Call this for knowledge on how to build an ESQL query, or answer questions about the ES|QL query language.', + chain, + tags: ['esql', 'query-generation', 'knowledge-base'], + }); + }, +}; diff --git a/x-pack/plugins/security_solution/server/assistant/tools/index.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/index.test.ts new file mode 100644 index 0000000000000..047c84ceddf3b --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/index.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getAssistantTools } from '.'; + +describe('getAssistantTools', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return an array of applicable tools', () => { + const tools = getAssistantTools(); + + const minExpectedTools = 3; // 3 tools are currently implemented + + expect(tools.length).toBeGreaterThanOrEqual(minExpectedTools); + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/index.ts b/x-pack/plugins/security_solution/server/assistant/tools/index.ts new file mode 100644 index 0000000000000..790e674a4b390 --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { AssistantTool } from '@kbn/elastic-assistant-plugin/server'; +import { ESQL_KNOWLEDGE_BASE_TOOL } from './esql_language_knowledge_base/esql_language_knowledge_base_tool'; +import { OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL } from './open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool'; +import { ALERT_COUNTS_TOOL } from './alert_counts/alert_counts_tool'; + +export const getAssistantTools = (): AssistantTool[] => [ + ALERT_COUNTS_TOOL, + ESQL_KNOWLEDGE_BASE_TOOL, + OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL, +]; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_query.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.test.ts similarity index 69% rename from x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_query.test.ts rename to x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.test.ts index 673b1cae326fb..a0cf067099e92 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_query.test.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.test.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { getOpenAlertsQuery } from './get_open_alerts_query'; +import { getOpenAndAcknowledgedAlertsQuery } from './get_open_and_acknowledged_alerts_query'; -describe('getOpenAlertsQuery', () => { +describe('getOpenAndAcknowledgedAlertsQuery', () => { it('returns the expected query', () => { const alertsIndexPattern = 'alerts-*'; const allow = ['field1', 'field2']; const size = 10; - const query = getOpenAlertsQuery({ alertsIndexPattern, allow, size }); + const query = getOpenAndAcknowledgedAlertsQuery({ alertsIndexPattern, allow, size }); expect(query).toEqual({ allow_no_indices: true, @@ -30,8 +30,20 @@ describe('getOpenAlertsQuery', () => { must: [], filter: [ { - match_phrase: { - 'kibana.alert.workflow_status': 'open', + bool: { + should: [ + { + match_phrase: { + 'kibana.alert.workflow_status': 'open', + }, + }, + { + match_phrase: { + 'kibana.alert.workflow_status': 'acknowledged', + }, + }, + ], + minimum_should_match: 1, }, }, { diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_query.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.ts similarity index 73% rename from x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_query.ts rename to x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.ts index 4b8e1afb23ee0..9fffaf85d1f21 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/get_open_alerts_query.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.ts @@ -5,7 +5,7 @@ * 2.0. */ -export const getOpenAlertsQuery = ({ +export const getOpenAndAcknowledgedAlertsQuery = ({ alertsIndexPattern, allow, size, @@ -28,8 +28,20 @@ export const getOpenAlertsQuery = ({ must: [], filter: [ { - match_phrase: { - 'kibana.alert.workflow_status': 'open', + bool: { + should: [ + { + match_phrase: { + 'kibana.alert.workflow_status': 'open', + }, + }, + { + match_phrase: { + 'kibana.alert.workflow_status': 'acknowledged', + }, + }, + ], + minimum_should_match: 1, }, }, { diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/helpers.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/helpers.test.ts similarity index 100% rename from x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/helpers.test.ts rename to x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/helpers.test.ts diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/helpers.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/helpers.ts similarity index 100% rename from x-pack/plugins/elastic_assistant/server/lib/langchain/tools/open_alerts/helpers.ts rename to x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/helpers.ts diff --git a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.test.ts new file mode 100644 index 0000000000000..c485c001704eb --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.test.ts @@ -0,0 +1,298 @@ +/* + * Copyright 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { DynamicTool } from 'langchain/tools'; +import { omit } from 'lodash/fp'; + +import { OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL } from './open_and_acknowledged_alerts_tool'; +import type { RequestBody } from '@kbn/elastic-assistant-plugin/server/lib/langchain/types'; +import { MAX_SIZE } from './helpers'; +import type { RetrievalQAChain } from 'langchain/chains'; +import { mockAlertsFieldsApi } from '@kbn/elastic-assistant-plugin/server/__mocks__/alerts'; + +describe('OpenAndAcknowledgedAlertsTool', () => { + const alertsIndexPattern = 'alerts-index'; + const esClient = { + search: jest.fn().mockResolvedValue(mockAlertsFieldsApi), + } as unknown as ElasticsearchClient; + const replacements = { key: 'value' }; + const request = { + body: { + assistantLangChain: false, + alertsIndexPattern: '.alerts-security.alerts-default', + allow: ['@timestamp', 'cloud.availability_zone', 'user.name'], + allowReplacement: ['user.name'], + replacements, + size: 20, + }, + } as unknown as KibanaRequest; + const assistantLangChain = true; + const chain = {} as unknown as RetrievalQAChain; + const modelExists = true; + const rest = { + assistantLangChain, + esClient, + chain, + modelExists, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('isSupported', () => { + it('returns false when alertsIndexPattern is undefined', () => { + const params = { + request, + size: 20, + ...rest, + }; + + expect(OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.isSupported(params)).toBe(false); + }); + + it('returns false when the request is missing required anonymization parameters', () => { + const requestMissingAnonymizationParams = { + body: { + assistantLangChain: false, + alertsIndexPattern: '.alerts-security.alerts-default', + size: 20, + }, + } as unknown as KibanaRequest; + const params = { + request: requestMissingAnonymizationParams, + ...rest, + }; + + expect(OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.isSupported(params)).toBe(false); + }); + + it('returns false when size is undefined', () => { + const params = { + alertsIndexPattern, + allow: request.body.allow, + allowReplacement: request.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request, + ...rest, + }; + + expect(OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.isSupported(params)).toBe(false); + }); + + it('returns false when size is out of range', () => { + const params = { + alertsIndexPattern, + allow: request.body.allow, + allowReplacement: request.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request, + size: MAX_SIZE + 1, // <-- size is out of range + + ...rest, + }; + + expect(OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.isSupported(params)).toBe(false); + }); + + it('returns true when anonymization fields, alertsIndexPattern, and size within reange is provided', () => { + const params = { + alertsIndexPattern, + size: 20, + request, + ...rest, + }; + + expect(OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.isSupported(params)).toBe(true); + }); + }); + describe('getTool', () => { + it('returns a `DynamicTool` with a `func` that calls `esClient.search()` with the expected query', async () => { + const tool: DynamicTool = OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.getTool({ + alertsIndexPattern, + allow: request.body.allow, + allowReplacement: request.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request, + size: request.body.size, + ...rest, + }) as DynamicTool; + + await tool.func(''); + + expect(esClient.search).toHaveBeenCalledWith({ + allow_no_indices: true, + body: { + _source: false, + fields: [ + { + field: '@timestamp', + include_unmapped: true, + }, + { + field: 'cloud.availability_zone', + include_unmapped: true, + }, + { + field: 'user.name', + include_unmapped: true, + }, + ], + query: { + bool: { + filter: [ + { + bool: { + filter: [ + { + bool: { + should: [ + { + match_phrase: { + 'kibana.alert.workflow_status': 'open', + }, + }, + { + match_phrase: { + 'kibana.alert.workflow_status': 'acknowledged', + }, + }, + ], + minimum_should_match: 1, + }, + }, + { + range: { + '@timestamp': { + format: 'strict_date_optional_time', + gte: 'now-1d/d', + lte: 'now/d', + }, + }, + }, + ], + must: [], + must_not: [ + { + exists: { + field: 'kibana.alert.building_block_type', + }, + }, + ], + should: [], + }, + }, + ], + }, + }, + runtime_mappings: {}, + size: 20, + sort: [ + { + 'kibana.alert.risk_score': { + order: 'desc', + }, + }, + { + '@timestamp': { + order: 'desc', + }, + }, + ], + }, + ignore_unavailable: true, + index: ['alerts-index'], + }); + }); + + it('returns null when the request is missing required anonymization parameters', () => { + const requestWithMissingParams = omit('body.allow', request) as unknown as KibanaRequest< + unknown, + unknown, + RequestBody + >; + + const tool = OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.getTool({ + alertsIndexPattern, + allow: requestWithMissingParams.body.allow, + allowReplacement: requestWithMissingParams.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request: requestWithMissingParams, + size: requestWithMissingParams.body.size, + ...rest, + }); + + expect(tool).toBeNull(); + }); + + it('returns null when alertsIndexPattern is undefined', () => { + const tool = OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.getTool({ + // alertsIndexPattern is undefined + allow: request.body.allow, + allowReplacement: request.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request, + size: request.body.size, + ...rest, + }); + + expect(tool).toBeNull(); + }); + + it('returns null when size is undefined', () => { + const tool = OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.getTool({ + alertsIndexPattern, + allow: request.body.allow, + allowReplacement: request.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request, + ...rest, + // size is undefined + }); + + expect(tool).toBeNull(); + }); + + it('returns null when size out of range', () => { + const tool = OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.getTool({ + alertsIndexPattern, + allow: request.body.allow, + allowReplacement: request.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request, + size: MAX_SIZE + 1, // <-- size is out of range + ...rest, + }); + + expect(tool).toBeNull(); + }); + + it('returns a tool instance with the expected tags', () => { + const tool = OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL.getTool({ + alertsIndexPattern, + allow: request.body.allow, + allowReplacement: request.body.allowReplacement, + onNewReplacements: jest.fn(), + replacements, + request, + size: request.body.size, + ...rest, + }) as DynamicTool; + + expect(tool.tags).toEqual(['alerts', 'open-and-acknowledged-alerts']); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts new file mode 100644 index 0000000000000..210fdd42c1555 --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts @@ -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 type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; +import { getAnonymizedValue, transformRawData } from '@kbn/elastic-assistant-common'; +import { DynamicTool } from 'langchain/tools'; +import { requestHasRequiredAnonymizationParams } from '@kbn/elastic-assistant-plugin/server/lib/langchain/helpers'; + +import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; +import { getOpenAndAcknowledgedAlertsQuery } from './get_open_and_acknowledged_alerts_query'; +import { getRawDataOrDefault, sizeIsOutOfRange } from './helpers'; +import { APP_UI_ID } from '../../../../common'; + +export interface OpenAndAcknowledgedAlertsToolParams extends AssistantToolParams { + alertsIndexPattern: string; + size: number; +} + +export const OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL_DESCRIPTION = + 'Call this for knowledge about the latest n open and acknowledged alerts (sorted by `kibana.alert.risk_score`) in the environment, or when answering questions about open alerts'; + +/** + * Returns a tool for querying open and acknowledged alerts, or null if the + * request doesn't have all the required parameters. + */ +export const OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL: AssistantTool = { + id: 'open-and-acknowledged-alerts-tool', + name: 'OpenAndAcknowledgedAlertsTool', + description: OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL_DESCRIPTION, + sourceRegister: APP_UI_ID, + isSupported: (params: AssistantToolParams): params is OpenAndAcknowledgedAlertsToolParams => { + const { alertsIndexPattern, request, size } = params; + return ( + requestHasRequiredAnonymizationParams(request) && + alertsIndexPattern != null && + size != null && + !sizeIsOutOfRange(size) + ); + }, + getTool(params: AssistantToolParams) { + if (!this.isSupported(params)) return null; + + const { + alertsIndexPattern, + allow, + allowReplacement, + esClient, + onNewReplacements, + replacements, + size, + } = params as OpenAndAcknowledgedAlertsToolParams; + return new DynamicTool({ + name: 'OpenAndAcknowledgedAlertsTool', + description: OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL_DESCRIPTION, + func: async () => { + const query = getOpenAndAcknowledgedAlertsQuery({ + alertsIndexPattern, + allow: allow ?? [], + size, + }); + + const result = await esClient.search(query); + + // Accumulate replacements locally so we can, for example use the same + // replacement for a hostname when we see it in multiple alerts: + let localReplacements = { ...replacements }; + const localOnNewReplacements = (newReplacements: Record) => { + localReplacements = { ...localReplacements, ...newReplacements }; // update the local state + + onNewReplacements?.(localReplacements); // invoke the callback with the latest replacements + }; + + return JSON.stringify( + result.hits?.hits?.map((x) => + transformRawData({ + allow: allow ?? [], + allowReplacement: allowReplacement ?? [], + currentReplacements: localReplacements, // <-- the latest local replacements + getAnonymizedValue, + onNewReplacements: localOnNewReplacements, // <-- the local callback + rawData: getRawDataOrDefault(x.fields), + }) + ) + ); + }, + tags: ['alerts', 'open-and-acknowledged-alerts'], + }); + }, +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts index a3df4faa14c56..e2fa437a03543 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts @@ -6,6 +6,7 @@ */ import objectHash from 'object-hash'; +import sortBy from 'lodash/sortBy'; import type { SuppressionFieldsLatest } from '@kbn/rule-registry-plugin/common/schemas'; import { @@ -79,9 +80,7 @@ export const wrapSuppressedThresholdALerts = ({ completeRule.ruleParams.ruleId ); - const suppressedValues = Object.entries(bucket.key) - .map(([key, value]) => value) - .sort((a, b) => a.localeCompare(b)); + const suppressedValues = sortBy(Object.entries(bucket.key).map(([_, value]) => value)); const id = objectHash([ hit._index, diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/get_user_risk_engine_privileges.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/get_user_risk_engine_privileges.ts deleted file mode 100644 index 03920c099000f..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/get_user_risk_engine_privileges.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { KibanaRequest } from '@kbn/core/server'; -import type { SecurityPluginStart } from '@kbn/security-plugin/server'; -import { - RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES, - RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES, -} from '../../../../common/entity_analytics/risk_engine'; -import { checkAndFormatPrivileges } from '../utils/check_and_format_privileges'; - -export const getUserRiskEnginePrivileges = async ( - request: KibanaRequest, - security: SecurityPluginStart -) => { - return checkAndFormatPrivileges({ - request, - security, - privilegesToCheck: { - elasticsearch: { - cluster: RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES, - index: RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES, - }, - }, - }); -}; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_privileges.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_privileges.test.ts new file mode 100644 index 0000000000000..f464292713420 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_privileges.test.ts @@ -0,0 +1,88 @@ +/* + * Copyright 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 { EntityAnalyticsPrivileges } from '../../../../common/api/entity_analytics/common'; +import { _getMissingPrivilegesMessage } from './risk_engine_privileges'; + +describe('_getMissingPrivilegesMessage', () => { + it('should create correct message for user with no cluster privileges', () => { + const noClusterPrivileges: EntityAnalyticsPrivileges = { + privileges: { + elasticsearch: { + cluster: { + manage_index_templates: false, + manage_transform: false, + }, + index: { + 'risk-score.risk-score-*': { + read: true, + write: true, + }, + }, + }, + }, + has_all_required: false, + }; + + const result = _getMissingPrivilegesMessage(noClusterPrivileges); + + expect(result).toMatchInlineSnapshot( + `"User is missing risk engine privileges. Missing cluster privileges: manage_index_templates, manage_transform."` + ); + }); + + it('should create correct message for user with no index privileges', () => { + const noIndexPrivileges: EntityAnalyticsPrivileges = { + privileges: { + elasticsearch: { + cluster: { + manage_index_templates: true, + manage_transform: true, + }, + index: { + 'risk-score.risk-score-*': { + read: false, + write: false, + }, + }, + }, + }, + has_all_required: false, + }; + + const result = _getMissingPrivilegesMessage(noIndexPrivileges); + + expect(result).toMatchInlineSnapshot( + `"User is missing risk engine privileges. Missing index privileges for index \\"risk-score.risk-score-*\\": read, write. "` + ); + }); + + it('should create correct message for user with no cluster or index privileges', () => { + const noClusterOrIndexPrivileges: EntityAnalyticsPrivileges = { + privileges: { + elasticsearch: { + cluster: { + manage_index_templates: false, + manage_transform: false, + }, + index: { + 'risk-score.risk-score-*': { + read: false, + write: false, + }, + }, + }, + }, + has_all_required: false, + }; + + const result = _getMissingPrivilegesMessage(noClusterOrIndexPrivileges); + + expect(result).toMatchInlineSnapshot( + `"User is missing risk engine privileges. Missing index privileges for index \\"risk-score.risk-score-*\\": read, write. Missing cluster privileges: manage_index_templates, manage_transform."` + ); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_privileges.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_privileges.ts new file mode 100644 index 0000000000000..df7914e5b242b --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_privileges.ts @@ -0,0 +1,109 @@ +/* + * Copyright 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 { + IKibanaResponse, + KibanaRequest, + KibanaResponseFactory, + StartServicesAccessor, +} from '@kbn/core/server'; +import { buildSiemResponse } from '@kbn/lists-plugin/server/routes'; +import type { SecurityPluginStart } from '@kbn/security-plugin/server'; +import { i18n } from '@kbn/i18n'; +import type { EntityAnalyticsPrivileges } from '../../../../common/api/entity_analytics/common'; +import type { SecuritySolutionPluginStartDependencies } from '../../../plugin_contract'; +import type { SecuritySolutionRequestHandlerContext } from '../../../types'; +import { + RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES, + RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES, + getMissingRiskEnginePrivileges, +} from '../../../../common/entity_analytics/risk_engine'; +import { checkAndFormatPrivileges } from '../utils/check_and_format_privileges'; + +export const getUserRiskEnginePrivileges = async ( + request: KibanaRequest, + security: SecurityPluginStart +) => { + return checkAndFormatPrivileges({ + request, + security, + privilegesToCheck: { + elasticsearch: { + cluster: RISK_ENGINE_REQUIRED_ES_CLUSTER_PRIVILEGES, + index: RISK_ENGINE_REQUIRED_ES_INDEX_PRIVILEGES, + }, + }, + }); +}; + +export const _getMissingPrivilegesMessage = (riskEnginePrivileges: EntityAnalyticsPrivileges) => { + const { indexPrivileges, clusterPrivileges } = getMissingRiskEnginePrivileges( + riskEnginePrivileges.privileges + ); + + const indexPrivilegesMessage = indexPrivileges + .map(([indexName, privileges]) => + i18n.translate('xpack.securitySolution.entityAnalytics.riskEngine.missingIndexPrivilege', { + defaultMessage: 'Missing index privileges for index "{indexName}": {privileges}.', + values: { + indexName, + privileges: privileges.join(', '), + }, + }) + ) + .join('\n'); + + const clusterPrivilegesMessage = !clusterPrivileges.length + ? '' + : i18n.translate('xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege', { + defaultMessage: 'Missing cluster privileges: {privileges}.', + values: { + privileges: clusterPrivileges.join(', '), + }, + }); + + const unauthorizedMessage = i18n.translate( + 'xpack.securitySolution.entityAnalytics.riskEngine.unauthorized', + { + defaultMessage: 'User is missing risk engine privileges.', + } + ); + + return `${unauthorizedMessage} ${indexPrivilegesMessage} ${clusterPrivilegesMessage}`; +}; + +/** + * This function is used to check if the user has the required privileges to access the risk engine. + * It is used to wrap a risk engine route handler which requires full access to the risk engine. + * @param getStartServices - Kibana's start services accessor + * @param handler - The route handler to wrap + **/ +export const withRiskEnginePrivilegeCheck = ( + getStartServices: StartServicesAccessor, + handler: ( + context: SecuritySolutionRequestHandlerContext, + request: KibanaRequest, + response: KibanaResponseFactory + ) => Promise +) => { + return async ( + context: SecuritySolutionRequestHandlerContext, + request: KibanaRequest, + response: KibanaResponseFactory + ) => { + const [_, { security }] = await getStartServices(); + const privileges = await getUserRiskEnginePrivileges(request, security); + if (!privileges.has_all_required) { + const siemResponse = buildSiemResponse(response); + return siemResponse.error({ + statusCode: 403, + body: _getMissingPrivilegesMessage(privileges), + }); + } + return handler(context, request, response); + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.test.ts index eb7ae66c2c3d3..429b13f3a3738 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.test.ts @@ -7,7 +7,7 @@ import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { riskEngineDisableRoute } from './disable'; - +import { riskEnginePrivilegesMock } from './risk_engine_privileges.mock'; import { RISK_ENGINE_DISABLE_URL } from '../../../../../common/constants'; import { serverMock, @@ -48,9 +48,13 @@ describe('risk score disable route', () => { describe('when task manager is available', () => { beforeEach(() => { - getStartServicesMock = jest - .fn() - .mockResolvedValue([{}, { taskManager: mockTaskManagerStart }]); + getStartServicesMock = jest.fn().mockResolvedValue([ + {}, + { + taskManager: mockTaskManagerStart, + security: riskEnginePrivilegesMock.createMockSecurityStartWithFullRiskEngineAccess(), + }, + ]); riskEngineDisableRoute(server.router, getStartServicesMock); }); @@ -84,7 +88,13 @@ describe('risk score disable route', () => { describe('when task manager is unavailable', () => { beforeEach(() => { - getStartServicesMock = jest.fn().mockResolvedValueOnce([{}, { taskManager: undefined }]); + getStartServicesMock = jest.fn().mockResolvedValue([ + {}, + { + taskManager: undefined, + security: riskEnginePrivilegesMock.createMockSecurityStartWithFullRiskEngineAccess(), + }, + ]); riskEngineDisableRoute(server.router, getStartServicesMock); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts index dde7ddbee9e83..4f9ffc99057be 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/disable.ts @@ -12,6 +12,7 @@ import { RISK_ENGINE_DISABLE_URL, APP_ID } from '../../../../../common/constants import type { StartPlugins } from '../../../../plugin'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { TASK_MANAGER_UNAVAILABLE_ERROR } from './translations'; +import { withRiskEnginePrivilegeCheck } from '../risk_engine_privileges'; export const riskEngineDisableRoute = ( router: SecuritySolutionPluginRouter, @@ -25,31 +26,34 @@ export const riskEngineDisableRoute = ( tags: ['access:securitySolution', `access:${APP_ID}-entity-analytics`], }, }) - .addVersion({ version: '1', validate: {} }, async (context, request, response) => { - const siemResponse = buildSiemResponse(response); + .addVersion( + { version: '1', validate: {} }, + withRiskEnginePrivilegeCheck(getStartServices, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); - const [_, { taskManager }] = await getStartServices(); - const securitySolution = await context.securitySolution; - const riskEngineClient = securitySolution.getRiskEngineDataClient(); + const [_, { taskManager }] = await getStartServices(); + const securitySolution = await context.securitySolution; + const riskEngineClient = securitySolution.getRiskEngineDataClient(); - if (!taskManager) { - return siemResponse.error({ - statusCode: 400, - body: TASK_MANAGER_UNAVAILABLE_ERROR, - }); - } + if (!taskManager) { + return siemResponse.error({ + statusCode: 400, + body: TASK_MANAGER_UNAVAILABLE_ERROR, + }); + } - try { - await riskEngineClient.disableRiskEngine({ taskManager }); - return response.ok({ body: { success: true } }); - } catch (e) { - const error = transformError(e); + try { + await riskEngineClient.disableRiskEngine({ taskManager }); + return response.ok({ body: { success: true } }); + } catch (e) { + const error = transformError(e); - return siemResponse.error({ - statusCode: error.statusCode, - body: { message: error.message, full_error: JSON.stringify(e) }, - bypassErrorFormat: true, - }); - } - }); + return siemResponse.error({ + statusCode: error.statusCode, + body: { message: error.message, full_error: JSON.stringify(e) }, + bypassErrorFormat: true, + }); + } + }) + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.test.ts index 02ccf01dc6166..4932de0b2d270 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.test.ts @@ -7,7 +7,6 @@ import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { riskEngineEnableRoute } from './enable'; - import { RISK_ENGINE_ENABLE_URL } from '../../../../../common/constants'; import { serverMock, @@ -15,6 +14,7 @@ import { requestMock, } from '../../../detection_engine/routes/__mocks__'; import { riskEngineDataClientMock } from '../risk_engine_data_client.mock'; +import { riskEnginePrivilegesMock } from './risk_engine_privileges.mock'; describe('risk score enable route', () => { let server: ReturnType; @@ -48,9 +48,13 @@ describe('risk score enable route', () => { describe('when task manager is available', () => { beforeEach(() => { - getStartServicesMock = jest - .fn() - .mockResolvedValue([{}, { taskManager: mockTaskManagerStart }]); + getStartServicesMock = jest.fn().mockResolvedValue([ + {}, + { + taskManager: mockTaskManagerStart, + security: riskEnginePrivilegesMock.createMockSecurityStartWithFullRiskEngineAccess(), + }, + ]); riskEngineEnableRoute(server.router, getStartServicesMock); }); @@ -84,7 +88,13 @@ describe('risk score enable route', () => { describe('when task manager is unavailable', () => { beforeEach(() => { - getStartServicesMock = jest.fn().mockResolvedValueOnce([{}, { taskManager: undefined }]); + getStartServicesMock = jest.fn().mockResolvedValue([ + {}, + { + taskManager: undefined, + security: riskEnginePrivilegesMock.createMockSecurityStartWithFullRiskEngineAccess(), + }, + ]); riskEngineEnableRoute(server.router, getStartServicesMock); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts index bebc8b7236bb8..e63a914efadb9 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/enable.ts @@ -12,6 +12,7 @@ import { RISK_ENGINE_ENABLE_URL, APP_ID } from '../../../../../common/constants' import { TASK_MANAGER_UNAVAILABLE_ERROR } from './translations'; import type { StartPlugins } from '../../../../plugin'; import type { SecuritySolutionPluginRouter } from '../../../../types'; +import { withRiskEnginePrivilegeCheck } from '../risk_engine_privileges'; export const riskEngineEnableRoute = ( router: SecuritySolutionPluginRouter, @@ -25,29 +26,32 @@ export const riskEngineEnableRoute = ( tags: ['access:securitySolution', `access:${APP_ID}-entity-analytics`], }, }) - .addVersion({ version: '1', validate: {} }, async (context, request, response) => { - const siemResponse = buildSiemResponse(response); - const [_, { taskManager }] = await getStartServices(); - const securitySolution = await context.securitySolution; - const riskEngineClient = securitySolution.getRiskEngineDataClient(); - if (!taskManager) { - return siemResponse.error({ - statusCode: 400, - body: TASK_MANAGER_UNAVAILABLE_ERROR, - }); - } + .addVersion( + { version: '1', validate: {} }, + withRiskEnginePrivilegeCheck(getStartServices, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const [_, { taskManager }] = await getStartServices(); + const securitySolution = await context.securitySolution; + const riskEngineClient = securitySolution.getRiskEngineDataClient(); + if (!taskManager) { + return siemResponse.error({ + statusCode: 400, + body: TASK_MANAGER_UNAVAILABLE_ERROR, + }); + } - try { - await riskEngineClient.enableRiskEngine({ taskManager }); - return response.ok({ body: { success: true } }); - } catch (e) { - const error = transformError(e); + try { + await riskEngineClient.enableRiskEngine({ taskManager }); + return response.ok({ body: { success: true } }); + } catch (e) { + const error = transformError(e); - return siemResponse.error({ - statusCode: error.statusCode, - body: { message: error.message, full_error: JSON.stringify(e) }, - bypassErrorFormat: true, - }); - } - }); + return siemResponse.error({ + statusCode: error.statusCode, + body: { message: error.message, full_error: JSON.stringify(e) }, + bypassErrorFormat: true, + }); + } + }) + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts index a76af277949fd..ffc6608505804 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/init.ts @@ -13,7 +13,7 @@ import type { StartPlugins } from '../../../../plugin'; import { TASK_MANAGER_UNAVAILABLE_ERROR } from './translations'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import type { InitRiskEngineResultResponse } from '../../types'; - +import { withRiskEnginePrivilegeCheck } from '../risk_engine_privileges'; export const riskEngineInitRoute = ( router: SecuritySolutionPluginRouter, getStartServices: StartServicesAccessor @@ -26,59 +26,62 @@ export const riskEngineInitRoute = ( tags: ['access:securitySolution', `access:${APP_ID}-entity-analytics`], }, }) - .addVersion({ version: '1', validate: {} }, async (context, request, response) => { - const siemResponse = buildSiemResponse(response); - const securitySolution = await context.securitySolution; - const [_, { taskManager }] = await getStartServices(); - const riskEngineDataClient = securitySolution.getRiskEngineDataClient(); - const riskScoreDataClient = securitySolution.getRiskScoreDataClient(); - const spaceId = securitySolution.getSpaceId(); + .addVersion( + { version: '1', validate: {} }, + withRiskEnginePrivilegeCheck(getStartServices, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const securitySolution = await context.securitySolution; + const [_, { taskManager }] = await getStartServices(); + const riskEngineDataClient = securitySolution.getRiskEngineDataClient(); + const riskScoreDataClient = securitySolution.getRiskScoreDataClient(); + const spaceId = securitySolution.getSpaceId(); - try { - if (!taskManager) { - return siemResponse.error({ - statusCode: 400, - body: TASK_MANAGER_UNAVAILABLE_ERROR, + try { + if (!taskManager) { + return siemResponse.error({ + statusCode: 400, + body: TASK_MANAGER_UNAVAILABLE_ERROR, + }); + } + + const initResult = await riskEngineDataClient.init({ + taskManager, + namespace: spaceId, + riskScoreDataClient, }); - } - const initResult = await riskEngineDataClient.init({ - taskManager, - namespace: spaceId, - riskScoreDataClient, - }); + const initResultResponse: InitRiskEngineResultResponse = { + risk_engine_enabled: initResult.riskEngineEnabled, + risk_engine_resources_installed: initResult.riskEngineResourcesInstalled, + risk_engine_configuration_created: initResult.riskEngineConfigurationCreated, + legacy_risk_engine_disabled: initResult.legacyRiskEngineDisabled, + errors: initResult.errors, + }; - const initResultResponse: InitRiskEngineResultResponse = { - risk_engine_enabled: initResult.riskEngineEnabled, - risk_engine_resources_installed: initResult.riskEngineResourcesInstalled, - risk_engine_configuration_created: initResult.riskEngineConfigurationCreated, - legacy_risk_engine_disabled: initResult.legacyRiskEngineDisabled, - errors: initResult.errors, - }; + if ( + !initResult.riskEngineEnabled || + !initResult.riskEngineResourcesInstalled || + !initResult.riskEngineConfigurationCreated + ) { + return siemResponse.error({ + statusCode: 400, + body: { + message: initResultResponse.errors.join('\n'), + full_error: initResultResponse, + }, + bypassErrorFormat: true, + }); + } + return response.ok({ body: { result: initResultResponse } }); + } catch (e) { + const error = transformError(e); - if ( - !initResult.riskEngineEnabled || - !initResult.riskEngineResourcesInstalled || - !initResult.riskEngineConfigurationCreated - ) { return siemResponse.error({ - statusCode: 400, - body: { - message: initResultResponse.errors.join('\n'), - full_error: initResultResponse, - }, + statusCode: error.statusCode, + body: { message: error.message, full_error: JSON.stringify(e) }, bypassErrorFormat: true, }); } - return response.ok({ body: { result: initResultResponse } }); - } catch (e) { - const error = transformError(e); - - return siemResponse.error({ - statusCode: error.statusCode, - body: { message: error.message, full_error: JSON.stringify(e) }, - bypassErrorFormat: true, - }); - } - }); + }) + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts index d035119ec0f1e..62b9bf4584aed 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/privileges.ts @@ -12,7 +12,7 @@ import { RISK_ENGINE_PRIVILEGES_URL, APP_ID } from '../../../../../common/consta import type { StartPlugins } from '../../../../plugin'; import type { SecuritySolutionPluginRouter } from '../../../../types'; -import { getUserRiskEnginePrivileges } from '../get_user_risk_engine_privileges'; +import { getUserRiskEnginePrivileges } from '../risk_engine_privileges'; export const riskEnginePrivilegesRoute = ( router: SecuritySolutionPluginRouter, diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_engine_privileges.mock.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_engine_privileges.mock.ts new file mode 100644 index 0000000000000..10c772cfcf05e --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_engine_privileges.mock.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 { securityMock } from '@kbn/security-plugin/server/mocks'; + +const createMockSecurityStartWithFullRiskEngineAccess = () => { + const mockSecurityStart = securityMock.createStart(); + + const mockCheckPrivileges = jest.fn().mockResolvedValue({ + hasAllRequested: true, + privileges: { + elasticsearch: { + cluster: ['manage', 'monitor'], + index: { + 'index-name': ['read'], + }, + }, + }, + }); + + mockSecurityStart.authz.checkPrivilegesDynamicallyWithRequest = jest + .fn() + .mockReturnValue(mockCheckPrivileges); + + return mockSecurityStart; +}; + +export const riskEnginePrivilegesMock = { + createMockSecurityStartWithFullRiskEngineAccess, +}; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 4841ec9fed73d..227a7ea7e1439 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -46,7 +46,7 @@ import { AppClientFactory } from './client'; import type { ConfigType } from './config'; import { createConfig } from './config'; import { initUiSettings } from './ui_settings'; -import { APP_ID, DEFAULT_ALERTS_INDEX, SERVER_APP_ID } from '../common/constants'; +import { APP_ID, APP_UI_ID, DEFAULT_ALERTS_INDEX, SERVER_APP_ID } from '../common/constants'; import { registerEndpointRoutes } from './endpoint/routes/metadata'; import { registerPolicyRoutes } from './endpoint/routes/policy'; import { registerActionRoutes } from './endpoint/routes/actions'; @@ -114,6 +114,7 @@ import { allRiskScoreIndexPattern, } from '../common/entity_analytics/risk_engine'; import { isEndpointPackageV2 } from '../common/endpoint/utils/package_v2'; +import { getAssistantTools } from './assistant/tools'; export type { SetupPlugins, StartPlugins, PluginSetup, PluginStart } from './plugin_contract'; @@ -509,6 +510,9 @@ export class Plugin implements ISecuritySolutionPlugin { this.licensing$ = plugins.licensing.license$; + // Assistant Tool and Feature Registration + plugins.elasticAssistant.registerTools(APP_UI_ID, getAssistantTools()); + if (this.lists && plugins.taskManager && plugins.fleet) { // Exceptions, Artifacts and Manifests start const taskManager = plugins.taskManager; diff --git a/x-pack/plugins/security_solution/server/plugin_contract.ts b/x-pack/plugins/security_solution/server/plugin_contract.ts index b59d9aac37efe..8370e405c6807 100644 --- a/x-pack/plugins/security_solution/server/plugin_contract.ts +++ b/x-pack/plugins/security_solution/server/plugin_contract.ts @@ -41,6 +41,7 @@ import type { CloudExperimentsPluginStart } from '@kbn/cloud-experiments-plugin/ import type { SharePluginStart } from '@kbn/share-plugin/server'; import type { GuidedOnboardingPluginSetup } from '@kbn/guided-onboarding-plugin/server'; import type { PluginSetup as UnifiedSearchServerPluginSetup } from '@kbn/unified-search-plugin/server'; +import type { ElasticAssistantPluginStart } from '@kbn/elastic-assistant-plugin/server'; import type { AppFeaturesService } from './lib/app_features_service/app_features_service'; import type { ExperimentalFeatures } from '../common'; @@ -72,6 +73,7 @@ export interface SecuritySolutionPluginStartDependencies { cloudExperiments?: CloudExperimentsPluginStart; data: DataPluginStart; dataViews: DataViewsPluginStart; + elasticAssistant: ElasticAssistantPluginStart; eventLog: IEventLogClientService; fleet?: FleetPluginStart; licensing: LicensingPluginStart; diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index 4400f4b8c31e3..2158fe97996dc 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -84,6 +84,7 @@ "@kbn/kibana-react-plugin", "@kbn/ecs-data-quality-dashboard", "@kbn/elastic-assistant", + "@kbn/elastic-assistant-plugin", "@kbn/data-views-plugin", "@kbn/datemath", "@kbn/ui-theme", @@ -183,6 +184,7 @@ "@kbn/zod-helpers", "@kbn/core-http-common", "@kbn/search-errors", - "@kbn/stack-connectors-plugin" + "@kbn/stack-connectors-plugin", + "@kbn/elastic-assistant-common" ] } diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/repository_edit.test.tsx b/x-pack/plugins/snapshot_restore/__jest__/client_integration/repository_edit.test.tsx index dc05d9c09e627..1beb7c1fb532e 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/repository_edit.test.tsx +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/repository_edit.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { act } from 'react-dom/test-utils'; -import { setupEnvironment, pageHelpers, nextTick, TestBed, getRandomString } from './helpers'; +import { setupEnvironment, pageHelpers, TestBed, getRandomString } from './helpers'; import { RepositoryForm } from '../../public/application/components/repository_form'; import { RepositoryEditTestSubjects } from './helpers/repository_edit.helpers'; import { RepositoryAddTestSubjects } from './helpers/repository_add.helpers'; @@ -45,12 +45,11 @@ describe('', () => { repository: REPOSITORY_EDIT, snapshots: { count: 0 }, }); - testBed = await setup(httpSetup); await act(async () => { - await nextTick(); - testBed.component.update(); + testBed = await setup(httpSetup); }); + testBed.component.update(); }); test('should set the correct page title', () => { @@ -78,18 +77,70 @@ describe('', () => { }); }); - describe('should populate the correct values', () => { + describe('should disable client, bucket / container and base path fields for managed repositories', () => { const mountComponentWithMock = async (repository: any) => { httpRequestsMockHelpers.setGetRepositoryResponse(REPOSITORY_NAME, { repository: { name: getRandomString(), ...repository }, snapshots: { count: 0 }, + isManagedRepository: true, + }); + + await act(async () => { + testBed = await setup(httpSetup); }); - testBed = await setup(httpSetup); + testBed.component.update(); + }; + + it('azure repository', async () => { + await mountComponentWithMock({ type: 'azure' }); + const { find } = testBed; + const clientInput = find('clientInput'); + expect(clientInput.props().disabled).toEqual(true); + + const containerInput = find('containerInput'); + expect(containerInput.props().disabled).toEqual(true); + + const basePathInput = find('basePathInput'); + expect(basePathInput.props().disabled).toEqual(true); + }); + + it('gcs repository', async () => { + await mountComponentWithMock({ type: 'gcs' }); + const { find } = testBed; + const clientInput = find('clientInput'); + expect(clientInput.props().disabled).toEqual(true); + + const bucketInput = find('bucketInput'); + expect(bucketInput.props().disabled).toEqual(true); + const basePathInput = find('basePathInput'); + expect(basePathInput.props().disabled).toEqual(true); + }); + + it('s3 repository', async () => { + await mountComponentWithMock({ type: 's3' }); + const { find } = testBed; + const clientInput = find('clientInput'); + expect(clientInput.props().disabled).toEqual(true); + + const bucketInput = find('bucketInput'); + expect(bucketInput.props().disabled).toEqual(true); + + const basePathInput = find('basePathInput'); + expect(basePathInput.props().disabled).toEqual(true); + }); + }); + + describe('should populate the correct values', () => { + const mountComponentWithMock = async (repository: any) => { + httpRequestsMockHelpers.setGetRepositoryResponse(REPOSITORY_NAME, { + repository: { name: getRandomString(), ...repository }, + snapshots: { count: 0 }, + }); await act(async () => { - await nextTick(); - testBed.component.update(); + testBed = await setup(httpSetup); }); + testBed.component.update(); }; it('fs repository', async () => { diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_two.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_two.tsx index fc33fb7f682c6..3845f2c8c7567 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_two.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_two.tsx @@ -97,6 +97,7 @@ export const RepositoryFormStepTwo: React.FunctionComponent = ({ {/* Repository settings fields */} , replaceSettings?: boolean @@ -30,6 +31,7 @@ interface Props { export const AzureSettings: React.FunctionComponent = ({ repository, + isManagedRepository, updateRepositorySettings, settingErrors, }) => { @@ -101,6 +103,7 @@ export const AzureSettings: React.FunctionComponent = ({ }); }} data-test-subj="clientInput" + disabled={isManagedRepository} /> @@ -145,6 +148,7 @@ export const AzureSettings: React.FunctionComponent = ({ }); }} data-test-subj="containerInput" + disabled={isManagedRepository} /> @@ -189,6 +193,7 @@ export const AzureSettings: React.FunctionComponent = ({ }); }} data-test-subj="basePathInput" + disabled={isManagedRepository} /> diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx index 97eb0b25b1485..4cacb7e628e07 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx @@ -15,6 +15,7 @@ import { ChunkSizeField, MaxSnapshotsField, MaxRestoreField } from './common'; interface Props { repository: GCSRepository; + isManagedRepository?: boolean; updateRepositorySettings: ( updatedSettings: Partial, replaceSettings?: boolean @@ -24,6 +25,7 @@ interface Props { export const GCSSettings: React.FunctionComponent = ({ repository, + isManagedRepository, updateRepositorySettings, settingErrors, }) => { @@ -89,6 +91,7 @@ export const GCSSettings: React.FunctionComponent = ({ }); }} data-test-subj="clientInput" + disabled={isManagedRepository} /> @@ -133,6 +136,7 @@ export const GCSSettings: React.FunctionComponent = ({ }); }} data-test-subj="bucketInput" + disabled={isManagedRepository} /> @@ -177,6 +181,7 @@ export const GCSSettings: React.FunctionComponent = ({ }); }} data-test-subj="basePathInput" + disabled={isManagedRepository} /> diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx index 90c4cff74a3b0..2909279379299 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx @@ -23,12 +23,14 @@ import { S3Settings } from './s3_settings'; interface Props { repository: Repository | EmptyRepository; + isManagedRepository?: boolean; updateRepository: (updatedFields: Partial) => void; settingErrors: RepositorySettingsValidation; } export const TypeSettings: React.FunctionComponent = ({ repository, + isManagedRepository, updateRepository, settingErrors, }) => { @@ -71,6 +73,7 @@ export const TypeSettings: React.FunctionComponent = ({ return ( diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx index 887d416f9e85e..26cb2a091762a 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx @@ -23,6 +23,7 @@ import { ChunkSizeField, MaxSnapshotsField, MaxRestoreField } from './common'; interface Props { repository: S3Repository; + isManagedRepository?: boolean; updateRepositorySettings: ( updatedSettings: Partial, replaceSettings?: boolean @@ -32,6 +33,7 @@ interface Props { export const S3Settings: React.FunctionComponent = ({ repository, + isManagedRepository, updateRepositorySettings, settingErrors, }) => { @@ -124,6 +126,7 @@ export const S3Settings: React.FunctionComponent = ({ }); }} data-test-subj="clientInput" + disabled={isManagedRepository} /> @@ -168,6 +171,7 @@ export const S3Settings: React.FunctionComponent = ({ }); }} data-test-subj="bucketInput" + disabled={isManagedRepository} /> @@ -212,6 +216,7 @@ export const S3Settings: React.FunctionComponent = ({ }); }} data-test-subj="basePathInput" + disabled={isManagedRepository} /> diff --git a/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx b/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx index c16d3dd0bdb55..c8996d9fcaa4b 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx @@ -18,6 +18,7 @@ import { ScaleType, Settings, niceTimeFormatter, + PartialTheme, } from '@elastic/charts'; import moment from 'moment-timezone'; import { @@ -41,7 +42,7 @@ import { } from './index_threshold_api'; import { IndexThresholdRuleParams } from './types'; -const customTheme = () => { +const chartThemeOverrides = (): PartialTheme => { return { lineSeriesStyle: { line: { @@ -182,7 +183,6 @@ export const ThresholdVisualization: React.FunctionComponent = ({ if (!charts || !uiSettings || !dataFieldsFormats) { return null; } - const chartsTheme = charts.theme.useChartsTheme(); const chartsBaseTheme = charts.theme.useChartsBaseTheme(); const domain = getDomain(alertInterval, startVisualizationAt); @@ -265,7 +265,7 @@ export const ThresholdVisualization: React.FunctionComponent = ({ {alertVisualizationDataKeys.length ? ( } + labelAppend={ + + {i18n.OPTIONAL_LABEL} + + } > - + + {i18n.OPTIONAL_LABEL} + + } + > + {i18n.REQUIRED_LABEL} + + } > { onBrushed?.(getBrushData(brushArea)); }} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx index 2eaad6a876133..caea2441ae364 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx @@ -119,6 +119,7 @@ export const MetricItem = ({ }); } }} + // TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md baseTheme={DARK_THEME} locale={i18n.getLocale()} /> diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_timing_breakdown/network_timings_donut.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_timing_breakdown/network_timings_donut.tsx index 7a53a21ca0590..96c75246193b1 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_timing_breakdown/network_timings_donut.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_timing_breakdown/network_timings_donut.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { Chart, Datum, - LIGHT_THEME, + LEGACY_LIGHT_THEME, PartialTheme, Partition, PartitionLayout, @@ -69,7 +69,9 @@ export const NetworkTimingsDonut = () => { diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx index d6e4a185ded23..2d44735857f40 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx @@ -22,7 +22,7 @@ import { } from '@elastic/charts'; import { useEuiTheme } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useChartTheme } from '../../../../../../hooks/use_chart_theme'; +import { useBaseChartTheme } from '../../../../../../hooks/use_base_chart_theme'; import { BAR_HEIGHT } from './constants'; import { WaterfallChartChartContainer, WaterfallChartTooltip } from './styles'; import { WaterfallData } from '../../common/network_data/types'; @@ -77,7 +77,7 @@ export const WaterfallBarChart = ({ barStyleAccessor, index, }: Props) => { - const theme = useChartTheme(); + const baseChartTheme = useBaseChartTheme(); const { euiTheme } = useEuiTheme(); const { onElementClick, onProjectionClick } = useWaterfallContext(); const handleElementClick = useMemo(() => onElementClick, [onElementClick]); @@ -100,7 +100,9 @@ export const WaterfallBarChart = ({ { - const theme = useChartTheme(); + const baseChartTheme = useBaseChartTheme(); const { euiTheme } = useEuiTheme(); return ( @@ -48,8 +48,9 @@ export const WaterfallChartFixedAxis = ({ tickFormat, domain, barStyleAccessor } color: 'transparent', }, }, - theme, ]} + // TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md + baseTheme={baseChartTheme} locale={i18n.getLocale()} /> diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_theme_context.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_theme_context.tsx index 1415b1076cdd9..c2c19f815b90f 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_theme_context.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/contexts/synthetics_theme_context.tsx @@ -7,7 +7,6 @@ import { euiLightVars, euiDarkVars } from '@kbn/ui-theme'; import React, { createContext, useContext, useMemo } from 'react'; -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { DARK_THEME, LIGHT_THEME, PartialTheme, Theme } from '@elastic/charts'; export interface SyntheticsAppColors { @@ -46,7 +45,6 @@ const defaultContext: SyntheticsThemeContextValues = { }, chartTheme: { baseTheme: LIGHT_THEME, - theme: EUI_CHARTS_THEME_LIGHT.theme, }, }; @@ -89,7 +87,6 @@ export const SyntheticsThemeContextProvider: React.FC = ({ colors, chartTheme: { baseTheme: darkMode ? DARK_THEME : LIGHT_THEME, - theme: darkMode ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme, }, }; }, [colors, darkMode]); diff --git a/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_chart_theme.ts b/x-pack/plugins/synthetics/public/hooks/use_base_chart_theme.ts similarity index 61% rename from x-pack/plugins/uptime/public/legacy_uptime/hooks/use_chart_theme.ts rename to x-pack/plugins/synthetics/public/hooks/use_base_chart_theme.ts index f9faca7927d9d..be10a050905e6 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_chart_theme.ts +++ b/x-pack/plugins/synthetics/public/hooks/use_base_chart_theme.ts @@ -5,16 +5,13 @@ * 2.0. */ -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; +import { DARK_THEME, LIGHT_THEME, Theme } from '@elastic/charts'; import { useMemo } from 'react'; import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; -export const useChartTheme = () => { +export const useBaseChartTheme = (): Theme => { const [darkMode] = useUiSetting$('theme:darkMode'); - - const theme = useMemo(() => { - return darkMode ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme; + return useMemo(() => { + return darkMode ? DARK_THEME : LIGHT_THEME; }, [darkMode]); - - return theme; }; diff --git a/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.test.ts index 58faf6ba14877..6796c07a763cd 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.test.ts @@ -41,145 +41,52 @@ describe('getServiceLocations', function () { }, }); - describe('when out of production', () => { - it('should return all locations regardless of the `showExperimentalLocations` key', async () => { - const locations = await getServiceLocations({ - isDev: true, - config: { - service: { - manifestUrl: 'http://local.dev', - showExperimentalLocations: false, - }, - enabled: true, - }, - // @ts-ignore - logger: { - error: jest.fn(), - }, - }); - - expect(locations).toEqual({ - throttling: { - [BandwidthLimitKey.DOWNLOAD]: 100, - [BandwidthLimitKey.UPLOAD]: 50, + it('should return all locations', async () => { + const locations = await getServiceLocations({ + isDev: true, + config: { + service: { + manifestUrl: 'http://local.dev', }, - locations: [ - { - geo: { - lat: 41.25, - lon: -95.86, - }, - id: 'us_central', - isInvalid: false, - label: 'US Central', - url: 'https://local.dev', - isServiceManaged: true, - status: LocationStatus.GA, - }, - { - geo: { - lat: 41.25, - lon: -95.86, - }, - id: 'us_east', - isInvalid: false, - label: 'US East', - url: 'https://local.dev', - isServiceManaged: true, - status: LocationStatus.EXPERIMENTAL, - }, - ], - }); + enabled: true, + }, + // @ts-ignore + logger: { + error: jest.fn(), + }, }); - }); - describe('when in production', () => { - it('should return only GA locations and throttling when `showExperimentalLocations` is set to false', async () => { - const locations = await getServiceLocations({ - isDev: false, - config: { - service: { - manifestUrl: 'http://local.dev', - showExperimentalLocations: false, + expect(locations).toEqual({ + throttling: { + [BandwidthLimitKey.DOWNLOAD]: 100, + [BandwidthLimitKey.UPLOAD]: 50, + }, + locations: [ + { + geo: { + lat: 41.25, + lon: -95.86, }, - enabled: true, - }, - // @ts-ignore - logger: { - error: jest.fn(), - }, - }); - - expect(locations).toEqual({ - throttling: { - [BandwidthLimitKey.DOWNLOAD]: 100, - [BandwidthLimitKey.UPLOAD]: 50, + id: 'us_central', + isInvalid: false, + label: 'US Central', + url: 'https://local.dev', + isServiceManaged: true, + status: LocationStatus.GA, }, - locations: [ - { - geo: { - lat: 41.25, - lon: -95.86, - }, - id: 'us_central', - isInvalid: false, - label: 'US Central', - url: 'https://local.dev', - isServiceManaged: true, - status: LocationStatus.GA, - }, - ], - }); - }); - - it('should return all locations and throttling when `showExperimentalLocations` flag is set to true', async () => { - const locations = await getServiceLocations({ - isDev: false, - config: { - service: { - manifestUrl: 'http://local.dev', - showExperimentalLocations: true, + { + geo: { + lat: 41.25, + lon: -95.86, }, - enabled: true, - }, - // @ts-ignore - logger: { - error: jest.fn(), - }, - }); - - expect(locations).toEqual({ - throttling: { - [BandwidthLimitKey.DOWNLOAD]: 100, - [BandwidthLimitKey.UPLOAD]: 50, + id: 'us_east', + isInvalid: false, + label: 'US East', + url: 'https://local.dev', + isServiceManaged: true, + status: LocationStatus.EXPERIMENTAL, }, - locations: [ - { - geo: { - lat: 41.25, - lon: -95.86, - }, - id: 'us_central', - isInvalid: false, - label: 'US Central', - url: 'https://local.dev', - isServiceManaged: true, - status: LocationStatus.GA, - }, - { - geo: { - lat: 41.25, - lon: -95.86, - }, - id: 'us_east', - isInvalid: false, - label: 'US East', - url: 'https://local.dev', - isServiceManaged: true, - status: LocationStatus.EXPERIMENTAL, - }, - ], - }); + ], }); }); }); diff --git a/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.ts b/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.ts index 21a8278e8d165..3f8f02fcbf456 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/get_service_locations.ts @@ -45,12 +45,7 @@ export async function getServiceLocations(server: SyntheticsServerSetup) { locations: Record; }>(server.config.service!.manifestUrl!); - const availableLocations = - server.isDev || server.config.service?.showExperimentalLocations - ? Object.entries(data.locations) - : Object.entries(data.locations).filter(([_, location]) => { - return location.status === LocationStatus.GA; - }); + const availableLocations = Object.entries(data.locations); availableLocations.forEach(([locationId, location]) => { locations.push({ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart.tsx index 31fff05ab2dce..3e3c47216ebc6 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart.tsx @@ -6,7 +6,15 @@ */ import React, { VFC } from 'react'; -import { Axis, BarSeries, Chart, Position, ScaleType, Settings } from '@elastic/charts'; +import { + Axis, + BarSeries, + Chart, + Position, + ScaleType, + Settings, + LEGACY_LIGHT_THEME, +} from '@elastic/charts'; import { EuiComboBoxOptionOption, EuiThemeProvider } from '@elastic/eui'; import { TimeRangeBounds } from '@kbn/data-plugin/common'; import { i18n } from '@kbn/i18n'; @@ -51,6 +59,8 @@ export const IndicatorsBarChart: VFC = ({ { const chartTheme = [ - theme, + ...(theme ? [theme] : []), EUI_SPARKLINE_THEME_PARTIAL, { chartMargins: { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx index 4d2945f86ed23..3f2b5a111566b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx @@ -41,7 +41,7 @@ export const AlertSummaryWidgetFullSize = ({ hideChart, }: AlertSummaryWidgetFullSizeProps) => { const chartTheme = [ - theme, + ...(theme ? [theme] : []), { chartPaddings: { top: 7, @@ -86,7 +86,7 @@ export const AlertSummaryWidgetFullSize = ({ visible: true, }} style={{ - tickLine: { size: 0.0001, padding: 4 }, + tickLine: { size: 0, padding: 4 }, tickLabel: { alignment: { horizontal: Position.Left, vertical: Position.Bottom } }, }} /> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/types.ts index 019b6018e69b9..48a49acf5ad7c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/types.ts @@ -25,7 +25,7 @@ export interface AlertSummaryTimeRange { } export interface ChartProps { - theme: PartialTheme; + theme?: PartialTheme; baseTheme: Theme; onBrushEnd?: BrushEndListener; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx index ec34ef4b300d2..4999496f669c3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx @@ -18,7 +18,15 @@ import { EuiLoadingChart, } from '@elastic/eui'; import { euiLightVars as lightEuiTheme } from '@kbn/ui-theme'; -import { Axis, BarSeries, Chart, CurveType, LineSeries, Settings } from '@elastic/charts'; +import { + Axis, + BarSeries, + Chart, + CurveType, + LineSeries, + Settings, + LEGACY_LIGHT_THEME, +} from '@elastic/charts'; import { assign, fill } from 'lodash'; import moment from 'moment'; import { formatMillisForDisplay } from '../../../lib/execution_duration_utils'; @@ -106,13 +114,14 @@ export const ExecutionDurationChart: React.FunctionComponent = ({ <> diff --git a/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/duration_chart.tsx b/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/duration_chart.tsx index 409d646553908..8e5da4fa970ab 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/duration_chart.tsx +++ b/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/duration_chart.tsx @@ -111,6 +111,7 @@ export const DurationChartComponent = ({ onBrushEnd={onBrushEnd} onLegendItemClick={legendToggleVisibility} locale={i18n.getLocale()} + // TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md {...chartTheme} /> = ({ onBrushEnd={onBrushEnd} onElementClick={onBarClicked} locale={i18n.getLocale()} + // TODO connect to charts.theme service see src/plugins/charts/public/services/theme/README.md {...chartTheme} /> { - const theme = useChartTheme(); + const baseChartTheme = useBaseChartTheme(); const { onElementClick, onProjectionClick } = useWaterfallContext(); const handleElementClick = useMemo(() => onElementClick, [onElementClick]); const handleProjectionClick = useMemo(() => onProjectionClick, [onProjectionClick]); @@ -97,7 +97,8 @@ export const WaterfallBarChart = ({ { - const theme = useChartTheme(); + const baseChartTheme = useBaseChartTheme(); return ( - + = ({ darkMo colors, chartTheme: { baseTheme: darkMode ? DARK_THEME : LIGHT_THEME, - theme: darkMode ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme, }, }; }, [colors, darkMode]); diff --git a/x-pack/plugins/synthetics/public/hooks/use_chart_theme.ts b/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_base_chart_theme.ts similarity index 61% rename from x-pack/plugins/synthetics/public/hooks/use_chart_theme.ts rename to x-pack/plugins/uptime/public/legacy_uptime/hooks/use_base_chart_theme.ts index f9faca7927d9d..f8cb8dfd4134f 100644 --- a/x-pack/plugins/synthetics/public/hooks/use_chart_theme.ts +++ b/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_base_chart_theme.ts @@ -5,16 +5,13 @@ * 2.0. */ -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { useMemo } from 'react'; import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +import { DARK_THEME, LIGHT_THEME, Theme } from '@elastic/charts'; -export const useChartTheme = () => { +export const useBaseChartTheme = (): Theme => { const [darkMode] = useUiSetting$('theme:darkMode'); - - const theme = useMemo(() => { - return darkMode ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme; + return useMemo(() => { + return darkMode ? DARK_THEME : LIGHT_THEME; }, [darkMode]); - - return theme; }; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx b/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx index 955fade76f57a..9b304be467dfa 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx @@ -45,7 +45,7 @@ export const mockContextValue: AppDeps = { settings: settingsServiceMock.createStartContract(), toasts: notificationServiceMock.createSetupContract().toasts, theme: { - useChartsTheme: jest.fn(), + useChartsBaseTheme: jest.fn(), } as any, // For our test harness, we don't use this mocked out http service http: httpServiceMock.createSetupContract(), diff --git a/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx b/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx index cf55178fdb961..5d50690d3ecae 100644 --- a/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx @@ -12,6 +12,7 @@ import { Chart, LineAnnotation, LineSeries, + PartialTheme, Position, ScaleType, Settings, @@ -33,7 +34,7 @@ import { comparators } from '../../../../models/watch/comparators'; import { SectionError, Error } from '../../../../components'; import { useAppContext } from '../../../../app_context'; -const customTheme = () => { +const customTheme = (): PartialTheme => { return { lineSeriesStyle: { line: { @@ -90,7 +91,7 @@ const getTimeBuckets = (watch: any, timeBuckets: any) => { export const WatchVisualization = () => { const { createTimeBuckets, theme, uiSettings } = useAppContext(); const { watch } = useContext(WatchContext); - const chartsTheme = theme.useChartsTheme(); + const chartBaseTheme = theme.useChartsBaseTheme(); const { index, timeField, @@ -216,7 +217,8 @@ export const WatchVisualization = () => { {watchVisualizationDataKeys.length ? ( { + let agentPolicyId: string; + let agentPolicyId2: string; + let agentPolicyId3: string; + let agentPolicyId4: string; + + beforeEach(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + + const { body: agentPolicyResponse } = await supertest + .post(`/api/fleet/agent_policies`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy', + namespace: 'default', + }); + + agentPolicyId = agentPolicyResponse.item.id; + + const { body: agentPolicyResponse2 } = await supertest + .post(`/api/fleet/agent_policies`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy 2', + namespace: 'default', + }); + + agentPolicyId2 = agentPolicyResponse2.item.id; + + const { body: agentPolicyResponse3 } = await supertest + .post(`/api/fleet/agent_policies`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy 3', + namespace: 'default', + }); + + agentPolicyId3 = agentPolicyResponse3.item.id; + + const { body: agentPolicyResponse4 } = await supertest + .post(`/api/fleet/agent_policies`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy 4', + namespace: 'default', + }); + + agentPolicyId4 = agentPolicyResponse4.item.id; + + await createPackagePolicy( + supertest, + agentPolicyId, + 'cspm', + 'cloudbeat/cis_aws', + 'aws', + 'cspm', + 'CSPM-1' + ); + + await createPackagePolicy( + supertest, + agentPolicyId2, + 'kspm', + 'cloudbeat/cis_k8s', + 'vanilla', + 'kspm', + 'KSPM-1' + ); + + await createPackagePolicy( + supertest, + agentPolicyId3, + 'vuln_mgmt', + 'cloudbeat/vuln_mgmt_aws', + 'aws', + 'vuln_mgmt', + 'CNVM-1' + ); + + await createPackagePolicy( + supertest, + agentPolicyId4, + 'kspm', + 'cloudbeat/cis_k8s', + 'vanilla', + 'kspm', + 'KSPM-2' + ); + }); + + afterEach(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + }); + + it(`Should return all benchmarks if user has CSP integrations`, async () => { + const { body: res }: { body: GetBenchmarkResponse } = await supertest + .get(`/internal/cloud_security_posture/benchmarks`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2') + .set('kbn-xsrf', 'xxxx') + .expect(200); + + expect(res.items.length).equal(3); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/cloud_security_posture/index.ts b/x-pack/test/api_integration/apis/cloud_security_posture/index.ts index c1a64ff01397e..99f47ffb8e007 100644 --- a/x-pack/test/api_integration/apis/cloud_security_posture/index.ts +++ b/x-pack/test/api_integration/apis/cloud_security_posture/index.ts @@ -16,7 +16,8 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./status/status_index_timeout')); loadTestFile(require.resolve('./status/status_unprivileged')); loadTestFile(require.resolve('./status/status_indexing')); - loadTestFile(require.resolve('./benchmark')); + loadTestFile(require.resolve('./benchmark/v1')); + loadTestFile(require.resolve('./benchmark/v2')); loadTestFile(require.resolve('./find_csp_benchmark_rule')); // Place your tests files under this directory and add the following here: diff --git a/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts b/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts index 9104aaba3dc9f..0414faead6c67 100644 --- a/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts +++ b/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts @@ -44,7 +44,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { groupBy: ['service.name', 'service.environment', 'transaction.type', 'transaction.name'], }; - registry.when('transaction duration alert', { config: 'basic', archives: [] }, () => { + // FLAKY: https://github.com/elastic/kibana/issues/173267 + registry.when.skip('transaction duration alert', { config: 'basic', archives: [] }, () => { before(async () => { const opbeansJava = apm .service({ name: 'opbeans-java', environment: 'production', agentName: 'java' }) diff --git a/x-pack/test/apm_api_integration/tests/alerts/transaction_error_rate.spec.ts b/x-pack/test/apm_api_integration/tests/alerts/transaction_error_rate.spec.ts index a3f69827cf7a8..f1b3537e46f2a 100644 --- a/x-pack/test/apm_api_integration/tests/alerts/transaction_error_rate.spec.ts +++ b/x-pack/test/apm_api_integration/tests/alerts/transaction_error_rate.spec.ts @@ -249,7 +249,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); }); - it('shows alert count=1 for opbeans-node on service inventory', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/173419 + it.skip('shows alert count=1 for opbeans-node on service inventory', async () => { const serviceInventoryAlertCounts = await fetchServiceInventoryAlertCounts(apmApiClient); expect(serviceInventoryAlertCounts).to.eql({ 'opbeans-node': 1, @@ -257,7 +258,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - it('shows alert count=0 in opbeans-java service', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/173439 + it.skip('shows alert count=0 in opbeans-java service', async () => { const serviceTabAlertCount = await fetchServiceTabAlertCount({ apmApiClient, serviceName: 'opbeans-java', diff --git a/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts b/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts index a388a4d90af3b..d82868aa068b3 100644 --- a/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts +++ b/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts @@ -35,7 +35,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return colorMapping; } - describe('sync colors', function () { + // FLAKY: https://github.com/elastic/kibana/issues/148557 + describe.skip('sync colors', function () { before(async function () { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( diff --git a/x-pack/test/functional/apps/discover/saved_queries.ts b/x-pack/test/functional/apps/discover/saved_queries.ts index 2795ce3beafd6..466524f4dbf80 100644 --- a/x-pack/test/functional/apps/discover/saved_queries.ts +++ b/x-pack/test/functional/apps/discover/saved_queries.ts @@ -26,7 +26,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const savedQueryName = 'shared-saved-query'; const destinationSpaceId = 'nondefaultspace'; - describe('Discover Saved Queries', () => { + // Failing: See https://github.com/elastic/kibana/issues/173094 + describe.skip('Discover Saved Queries', () => { before('initialize tests', async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( diff --git a/x-pack/test/functional/apps/infra/hosts_view.ts b/x-pack/test/functional/apps/infra/hosts_view.ts index f06ac57e893cb..f9932421690e0 100644 --- a/x-pack/test/functional/apps/infra/hosts_view.ts +++ b/x-pack/test/functional/apps/infra/hosts_view.ts @@ -424,7 +424,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should have an option to open the chart in lens', async () => { - await pageObjects.infraHostsView.clickAndValidateMetriChartActionOptions(); + await retry.try(async () => { + await pageObjects.infraHostsView.clickAndValidateMetricChartActionOptions(); + }); }); }); diff --git a/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts b/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts index da5858e0ffc1d..1f09b68fbf4f2 100644 --- a/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts +++ b/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts @@ -73,6 +73,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: 'Maximum of bytes 19,986', value: '5,727.322', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingTrendline: false, showingBar: false, }, @@ -138,6 +139,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: '', value: '5,727.322', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingTrendline: false, showingBar: false, }, diff --git a/x-pack/test/functional/apps/lens/group6/metric.ts b/x-pack/test/functional/apps/lens/group6/metric.ts index c2276e1cdf5ab..e1e2644907096 100644 --- a/x-pack/test/functional/apps/lens/group6/metric.ts +++ b/x-pack/test/functional/apps/lens/group6/metric.ts @@ -128,6 +128,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: 'Average of bytes 19,755', value: '19,755', color: 'rgba(245, 247, 250, 1)', + trendlineColor: 'rgba(245, 247, 250, 1)', showingTrendline: true, showingBar: false, }, @@ -137,6 +138,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: 'Average of bytes 18,994', value: '18,994', color: 'rgba(245, 247, 250, 1)', + trendlineColor: 'rgba(245, 247, 250, 1)', showingTrendline: true, showingBar: false, }, @@ -146,6 +148,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: 'Average of bytes 17,246', value: '17,246', color: 'rgba(245, 247, 250, 1)', + trendlineColor: 'rgba(245, 247, 250, 1)', showingTrendline: true, showingBar: false, }, @@ -155,6 +158,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: 'Average of bytes 15,687', value: '15,687', color: 'rgba(245, 247, 250, 1)', + trendlineColor: 'rgba(245, 247, 250, 1)', showingTrendline: true, showingBar: false, }, @@ -164,6 +168,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: 'Average of bytes 15,614.333', value: '15,614.333', color: 'rgba(245, 247, 250, 1)', + trendlineColor: 'rgba(245, 247, 250, 1)', showingTrendline: true, showingBar: false, }, @@ -173,6 +178,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { extraText: 'Average of bytes 5,722.775', value: '5,722.775', color: 'rgba(245, 247, 250, 1)', + trendlineColor: 'rgba(245, 247, 250, 1)', showingTrendline: true, showingBar: false, }, diff --git a/x-pack/test/functional/apps/lens/open_in_lens/agg_based/goal.ts b/x-pack/test/functional/apps/lens/open_in_lens/agg_based/goal.ts index 78d0e220c61bd..55cb376db2e24 100644 --- a/x-pack/test/functional/apps/lens/open_in_lens/agg_based/goal.ts +++ b/x-pack/test/functional/apps/lens/open_in_lens/agg_based/goal.ts @@ -49,6 +49,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '140.05%', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -80,6 +81,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '131,040,360.81%', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -111,6 +113,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '14.37%', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -154,6 +157,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '65,047,486.03', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -163,6 +167,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '66,144,823.35', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -172,6 +177,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '65,933,477.76', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -181,6 +187,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '65,157,898.23', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -190,6 +197,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '65,365,950.93', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, @@ -198,7 +206,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { subtitle: undefined, extraText: undefined, value: undefined, - color: 'rgba(0, 0, 0, 0)', + color: 'rgba(255, 255, 255, 1)', + trendlineColor: undefined, showingBar: true, showingTrendline: false, }, diff --git a/x-pack/test/functional/apps/lens/open_in_lens/agg_based/metric.ts b/x-pack/test/functional/apps/lens/open_in_lens/agg_based/metric.ts index af22bc8408de3..89cb1d7880baa 100644 --- a/x-pack/test/functional/apps/lens/open_in_lens/agg_based/metric.ts +++ b/x-pack/test/functional/apps/lens/open_in_lens/agg_based/metric.ts @@ -50,6 +50,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '14,005', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -80,6 +81,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '13,104,036,080.615', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -110,6 +112,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '1,437', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -164,6 +167,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '13,228,964,670.613', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -173,6 +177,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '13,186,695,551.251', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -182,6 +187,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '13,073,190,186.423', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -191,6 +197,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '13,031,579,645.108', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -200,6 +207,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { extraText: '', value: '13,009,497,206.823', color: 'rgba(245, 247, 250, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, @@ -208,7 +216,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { subtitle: undefined, extraText: undefined, value: undefined, - color: 'rgba(0, 0, 0, 0)', + color: 'rgba(255, 255, 255, 1)', + trendlineColor: undefined, showingBar: false, showingTrendline: false, }, diff --git a/x-pack/test/functional/es_archives/security_solution/ecs_compliant/mappings.json b/x-pack/test/functional/es_archives/security_solution/ecs_compliant/mappings.json index 897ac651fcb43..1e2c79a11e26e 100644 --- a/x-pack/test/functional/es_archives/security_solution/ecs_compliant/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/ecs_compliant/mappings.json @@ -66,6 +66,9 @@ "properties": { "name": { "type": "keyword" + }, + "uptime": { + "type": "long" } } }, diff --git a/x-pack/test/functional/page_objects/infra_hosts_view.ts b/x-pack/test/functional/page_objects/infra_hosts_view.ts index 3d37fc4da913f..3fbb3d361d879 100644 --- a/x-pack/test/functional/page_objects/infra_hosts_view.ts +++ b/x-pack/test/functional/page_objects/infra_hosts_view.ts @@ -108,7 +108,7 @@ export function InfraHostsViewProvider({ getService }: FtrProviderContext) { return container.findAllByCssSelector('[data-test-subj*="hostsView-metricChart-"]'); }, - async clickAndValidateMetriChartActionOptions() { + async clickAndValidateMetricChartActionOptions() { const element = await testSubjects.find('hostsView-metricChart-tx'); await element.moveMouseTo(); const button = await element.findByTestSubject('embeddablePanelToggleMenuIcon'); diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 5c7eef4cb9263..d0c962d8c574a 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -1336,8 +1336,12 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont return findService.allByCssSelector('[data-test-subj="mtrVis"] .echChart li'); }, - async getMetricElementIfExists(selector: string, container: WebElementWrapper) { - return (await findService.descendantExistsByCssSelector(selector, container)) + async getMetricElementIfExists( + selector: string, + container: WebElementWrapper, + timeout?: number + ) { + return (await findService.descendantExistsByCssSelector(selector, container, timeout)) ? await container.findByCssSelector(selector) : undefined; }, @@ -1357,8 +1361,11 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont color: await ( await this.getMetricElementIfExists('.echMetric', tile) )?.getComputedStyle('background-color'), + trendlineColor: await ( + await this.getMetricElementIfExists('.echSingleMetricSparkline__svg > rect', tile, 500) + )?.getAttribute('fill'), showingTrendline: Boolean( - await this.getMetricElementIfExists('.echSingleMetricSparkline', tile) + await this.getMetricElementIfExists('.echSingleMetricSparkline', tile, 500) ), }; }, diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts index 9acb3600587c3..47500e713b0ff 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts @@ -63,6 +63,7 @@ export default function ({ loadTestFile, getService }: FtrProviderContext) { loadTestFile(require.resolve('./pagerduty_connector')); loadTestFile(require.resolve('./server_log_connector')); loadTestFile(require.resolve('./servicenow_itom_connector')); + loadTestFile(require.resolve('./servicenow_itsm_connector')); loadTestFile(require.resolve('./slack_connector')); loadTestFile(require.resolve('./webhook_connector')); loadTestFile(require.resolve('./xmatters_connector')); diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/servicenow_itsm_connector.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/servicenow_itsm_connector.ts new file mode 100644 index 0000000000000..03c498d0bac21 --- /dev/null +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/servicenow_itsm_connector.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const commonScreenshots = getService('commonScreenshots'); + const screenshotDirectories = ['response_ops_docs', 'stack_connectors']; + const pageObjects = getPageObjects(['common', 'header']); + const actions = getService('actions'); + const testSubjects = getService('testSubjects'); + + describe('servicenow itsm connector', function () { + beforeEach(async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + }); + + it('servicenow itsm connector screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('servicenow'); + await testSubjects.setValue('nameInput', 'ServiceNow ITSM test connector'); + await testSubjects.setValue('credentialsApiUrlFromInput', 'https://dev123.service-now.com'); + await testSubjects.click('input'); + await commonScreenshots.takeScreenshot( + 'servicenow-connector-oauth', + screenshotDirectories, + 1920, + 1600 + ); + await testSubjects.click('input'); + await testSubjects.setValue('connector-servicenow-username-form-input', 'testuser'); + await testSubjects.setValue('connector-servicenow-password-form-input', 'testpassword'); + await commonScreenshots.takeScreenshot( + 'servicenow-connector-basic', + screenshotDirectories, + 1920, + 1400 + ); + await testSubjects.click('euiFlyoutCloseButton'); + }); + }); +} diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold_alert_suppression.ts index 59ab5185f6ab6..39b012748930b 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold_alert_suppression.ts @@ -655,6 +655,82 @@ export default ({ getService }: FtrProviderContext) => { }); }); + // should work correctly if one of the suppressed fields is keyword, another - number + it('should update an existing alert in the time window with multiple fields of different types', async () => { + const id = uuidv4(); + const timestamp = '2020-10-28T05:45:00.000Z'; + const firstRunDoc = { + id, + '@timestamp': timestamp, + agent: { + name: 'agent-1', + }, + host: { + uptime: 100, + }, + }; + + const secondRunDoc = { + ...firstRunDoc, + '@timestamp': '2020-10-28T06:15:00.000Z', + }; + + await indexListOfDocuments([firstRunDoc, firstRunDoc, secondRunDoc, secondRunDoc]); + + const rule: ThresholdRuleCreateProps = { + ...getThresholdRuleForAlertTesting(['ecs_compliant']), + query: `id:${id}`, + threshold: { + field: ['agent.name', 'host.uptime'], + value: 2, + }, + alert_suppression: { + duration: { + value: 2, + unit: 'h', + }, + }, + from: 'now-35m', + interval: '30m', + }; + + const { previewId } = await previewRule({ + supertest, + rule, + timeframeEnd: new Date('2020-10-28T06:30:00.000Z'), + invocationCount: 2, + }); + + const previewAlerts = await getPreviewAlerts({ + es, + previewId, + sort: ['agent.type', ALERT_ORIGINAL_TIME], + }); + + expect(previewAlerts.length).toEqual(1); + + expect(previewAlerts[0]._source).toEqual( + expect.objectContaining({ + [ALERT_SUPPRESSION_TERMS]: [ + { + field: 'agent.name', + value: 'agent-1', + }, + { + field: 'host.uptime', + value: 100, + }, + ], + [TIMESTAMP]: '2020-10-28T06:00:00.000Z', + [ALERT_LAST_DETECTED]: '2020-10-28T06:30:00.000Z', + [ALERT_ORIGINAL_TIME]: timestamp, + [ALERT_SUPPRESSION_START]: '2020-10-28T06:00:00.000Z', + [ALERT_SUPPRESSION_END]: '2020-10-28T06:30:00.000Z', + [ALERT_SUPPRESSION_DOCS_COUNT]: 1, + }) + ); + }); + it('should correctly suppress when using a timestamp override', async () => { const id = uuidv4(); const timestamp = '2020-10-28T05:45:00.000Z'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/risk_engine_privileges.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/risk_engine_privileges.ts index c187e0ad5ff10..1336aa5c21ac1 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/risk_engine_privileges.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/risk_engine_privileges.ts @@ -81,10 +81,9 @@ const USERNAME_TO_ROLES = { export default ({ getService }: FtrProviderContext) => { const userHelper = usersAndRolesFactory(getService('security')); - describe('@ess Entity Analytics - Risk Engine Privileges API', () => { + describe('@ess Entity Analytics - Risk Engine Privileges', () => { const supertestWithoutAuth = getService('supertestWithoutAuth'); const riskEngineRoutesNoAuth = riskEngineRouteHelpersFactoryNoAuth(supertestWithoutAuth); - async function createPrivilegeTestUsers() { const rolePromises = ROLES.map((role) => userHelper.createRole(role)); @@ -197,5 +196,41 @@ export default ({ getService }: FtrProviderContext) => { }); }); }); + + describe('Risk engine init API privilege check', () => { + it('returns 403 when the user doesnt have all risk engine privileges', async () => { + await riskEngineRoutesNoAuth.init( + { + username: 'no_cluster_manage_index_templates', + password: USER_PASSWORD, + }, + 403 + ); + }); + }); + + describe('Risk engine enable API privilege check', () => { + it('returns 403 when the user doesnt have all risk engine privileges', async () => { + await riskEngineRoutesNoAuth.enable( + { + username: 'no_cluster_manage_index_templates', + password: USER_PASSWORD, + }, + 403 + ); + }); + }); + + describe('Risk engine disable API privilege check', () => { + it('returns 403 when the user doesnt have all risk engine privileges', async () => { + await riskEngineRoutesNoAuth.disable( + { + username: 'no_cluster_manage_index_templates', + password: USER_PASSWORD, + }, + 403 + ); + }); + }); }); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts index b3a5b1faa006c..5a29900f5e8d6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts @@ -509,11 +509,16 @@ export const riskEngineRouteHelpersFactory = ( .expect(200), }); +interface Credentials { + username: string; + password: string; +} + export const riskEngineRouteHelpersFactoryNoAuth = ( supertestWithoutAuth: SuperTest.SuperTest, namespace?: string ) => ({ - privilegesForUser: async ({ username, password }: { username: string; password: string }) => + privilegesForUser: async ({ username, password }: Credentials) => await supertestWithoutAuth .get(RISK_ENGINE_PRIVILEGES_URL) .auth(username, password) @@ -521,6 +526,33 @@ export const riskEngineRouteHelpersFactoryNoAuth = ( .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send() .expect(200), + init: async ({ username, password }: Credentials, expectStatusCode: number = 200) => + await supertestWithoutAuth + .post(routeWithNamespace(RISK_ENGINE_INIT_URL, namespace)) + .auth(username, password) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send() + .expect(expectStatusCode), + enable: async ({ username, password }: Credentials, expectStatusCode: number = 200) => + await supertestWithoutAuth + .post(routeWithNamespace(RISK_ENGINE_ENABLE_URL, namespace)) + .auth(username, password) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send() + .expect(expectStatusCode), + disable: async ({ username, password }: Credentials, expectStatusCode: number = 200) => + await supertestWithoutAuth + .post(routeWithNamespace(RISK_ENGINE_DISABLE_URL, namespace)) + .auth(username, password) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send() + .expect(expectStatusCode), }); export const installLegacyRiskScore = async ({ diff --git a/x-pack/test/security_solution_cypress/cypress/README.md b/x-pack/test/security_solution_cypress/cypress/README.md index 16a93f0c3b5d5..0fa6bae6e2164 100644 --- a/x-pack/test/security_solution_cypress/cypress/README.md +++ b/x-pack/test/security_solution_cypress/cypress/README.md @@ -304,8 +304,51 @@ Store the saved key on `~/.elastic/cloud.json` using the following format: } ``` -#### Known limitations -- Currently RBAC cannot be tested. +Store the email and password of the account you used to login in the QA Environment at the root directory of your Kibana project on `.ftr/role_users.json`, using the following format: + +```json +{ + "admin": { + "email": "", + "password": "" + } +} +``` + +#### Testing with different roles + +If you want to execute a test using Cypress on visual mode with MKI, you need to make sure you have the user created in your organization, and add it tot he `.ftr/role_users.json`: + +```json +{ + "admin": { + "email": "", + "password": "" + }, + "": { + "email": "", + "password": "" + } +} +``` + +As role names please use: +- admin +- detections_admin +- editor +- endpoint_operations_analyst +- endpoint_policy_manager +- none +- platform_engineer +- rule_author +- soc_manager +- t1_analyst +- t2_analyst +- t3_analyst +- threat_intelligence_analyst +- viewer + +The above should be the same used on the automation. #### PLIs diff --git a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless.config.ts b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless.config.ts index 3a1be3ed0221a..62aec8c49e787 100644 --- a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless.config.ts +++ b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless.config.ts @@ -7,6 +7,7 @@ import { defineCypressConfig } from '@kbn/cypress-config'; import { esArchiver } from './support/es_archiver'; +import { samlAuthentication } from './support/saml_auth'; // eslint-disable-next-line import/no-default-export export default defineCypressConfig({ @@ -39,6 +40,7 @@ export default defineCypressConfig({ specPattern: './cypress/e2e/**/*.cy.ts', setupNodeEvents(on, config) { esArchiver(on, config); + samlAuthentication(on, config); // eslint-disable-next-line @typescript-eslint/no-var-requires require('@cypress/grep/src/plugin')(config); return config; diff --git a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts index 342c3da34bef6..c88faf0d9cfe3 100644 --- a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts +++ b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts @@ -7,6 +7,7 @@ import { defineCypressConfig } from '@kbn/cypress-config'; import { esArchiver } from './support/es_archiver'; +import { samlAuthentication } from './support/saml_auth'; // eslint-disable-next-line import/no-default-export export default defineCypressConfig({ @@ -41,6 +42,7 @@ export default defineCypressConfig({ specPattern: './cypress/e2e/**/*.cy.ts', setupNodeEvents(on, config) { esArchiver(on, config); + samlAuthentication(on, config); process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // eslint-disable-next-line @typescript-eslint/no-var-requires require('@cypress/grep/src/plugin')(config); diff --git a/x-pack/test/security_solution_cypress/cypress/cypress_serverless.config.ts b/x-pack/test/security_solution_cypress/cypress/cypress_serverless.config.ts index b925e18a83478..b76c7ff22bcbc 100644 --- a/x-pack/test/security_solution_cypress/cypress/cypress_serverless.config.ts +++ b/x-pack/test/security_solution_cypress/cypress/cypress_serverless.config.ts @@ -7,6 +7,7 @@ import { defineCypressConfig } from '@kbn/cypress-config'; import { esArchiver } from './support/es_archiver'; +import { samlAuthentication } from './support/saml_auth'; // eslint-disable-next-line import/no-default-export export default defineCypressConfig({ @@ -31,6 +32,7 @@ export default defineCypressConfig({ experimentalMemoryManagement: true, setupNodeEvents(on, config) { esArchiver(on, config); + samlAuthentication(on, config); // eslint-disable-next-line @typescript-eslint/no-var-requires require('@cypress/grep/src/plugin')(config); return config; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments.cy.ts index 1d94d2a2870c7..21a67b7fb4ea4 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments.cy.ts @@ -23,12 +23,12 @@ import { waitForAlertsToPopulate } from '../../../../../tasks/create_new_rule'; import { alertDetailsFlyoutShowsAssignees, alertDetailsFlyoutShowsAssigneesBadge, - alertsTableShowsAssigneesBadgeForAlert, + alertsTableShowsAssigneesBadgeForFirstAlert, alertsTableShowsAssigneesForAlert, - updateAssigneesForAlert, + updateAssigneesForFirstAlert, checkEmptyAssigneesStateInAlertDetailsFlyout, checkEmptyAssigneesStateInAlertsTable, - removeAllAssigneesForAlert, + removeAllAssigneesForFirstAlert, bulkUpdateAssignees, alertsTableShowsAssigneesForAllAlerts, bulkRemoveAllAssignees, @@ -42,10 +42,7 @@ import { } from '../../../../../tasks/alert_assignments'; import { ALERTS_COUNT } from '../../../../../screens/alerts'; -// FLAKY: https://github.com/elastic/kibana/issues/172611 -// FLAKY: https://github.com/elastic/kibana/issues/172623 -// FLAKY: https://github.com/elastic/kibana/issues/172663 -describe.skip('Alert user assignment - ESS & Serverless', { tags: ['@ess', '@serverless'] }, () => { +describe('Alert user assignment - ESS & Serverless', { tags: ['@ess', '@serverless'] }, () => { before(() => { cy.task('esArchiverLoad', { archiveName: 'auditbeat_multiple' }); @@ -81,13 +78,13 @@ describe.skip('Alert user assignment - ESS & Serverless', { tags: ['@ess', '@ser it('alert with some assignees in alerts table', () => { const users = [ROLES.detections_admin, ROLES.t1_analyst]; - updateAssigneesForAlert(users); + updateAssigneesForFirstAlert(users); alertsTableShowsAssigneesForAlert(users); }); it(`alert with some assignees in alert's details flyout`, () => { const users = [ROLES.detections_admin, ROLES.t1_analyst]; - updateAssigneesForAlert(users); + updateAssigneesForFirstAlert(users); expandFirstAlert(); alertDetailsFlyoutShowsAssignees(users); }); @@ -100,13 +97,13 @@ describe.skip('Alert user assignment - ESS & Serverless', { tags: ['@ess', '@ser ROLES.soc_manager, ROLES.detections_admin, ]; - updateAssigneesForAlert(users); - alertsTableShowsAssigneesBadgeForAlert(users); + updateAssigneesForFirstAlert(users); + alertsTableShowsAssigneesBadgeForFirstAlert(users); }); it(`alert with many assignees (collapsed into badge) in alert's details flyout`, () => { const users = [ROLES.detections_admin, ROLES.t1_analyst, ROLES.t2_analyst]; - updateAssigneesForAlert(users); + updateAssigneesForFirstAlert(users); expandFirstAlert(); alertDetailsFlyoutShowsAssigneesBadge(users); }); @@ -116,7 +113,7 @@ describe.skip('Alert user assignment - ESS & Serverless', { tags: ['@ess', '@ser it('adding new assignees via `More actions` in alerts table', () => { // Assign users const users = [ROLES.detections_admin, ROLES.t1_analyst]; - updateAssigneesForAlert(users); + updateAssigneesForFirstAlert(users); // Assignees should appear in the alerts table alertsTableShowsAssigneesForAlert(users); @@ -159,12 +156,12 @@ describe.skip('Alert user assignment - ESS & Serverless', { tags: ['@ess', '@ser it('updating assignees via `More actions` in alerts table', () => { // Initially assigned users const initialAssignees = [ROLES.detections_admin, ROLES.t1_analyst]; - updateAssigneesForAlert(initialAssignees); + updateAssigneesForFirstAlert(initialAssignees); alertsTableShowsAssigneesForAlert(initialAssignees); // Update assignees const updatedAssignees = [ROLES.t1_analyst, ROLES.t2_analyst]; - updateAssigneesForAlert(updatedAssignees); + updateAssigneesForFirstAlert(updatedAssignees); const expectedAssignees = [ROLES.detections_admin, ROLES.t2_analyst]; @@ -223,10 +220,10 @@ describe.skip('Alert user assignment - ESS & Serverless', { tags: ['@ess', '@ser it('removing all assignees via `More actions` in alerts table', () => { // Initially assigned users const initialAssignees = [ROLES.detections_admin, ROLES.t1_analyst]; - updateAssigneesForAlert(initialAssignees); + updateAssigneesForFirstAlert(initialAssignees); alertsTableShowsAssigneesForAlert(initialAssignees); - removeAllAssigneesForAlert(); + removeAllAssigneesForFirstAlert(); // Alert should not show any assignee in alerts table or in details flyout checkEmptyAssigneesStateInAlertsTable(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_complete.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_complete.cy.ts index 8d32661b5f7f4..72afcb304f893 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_complete.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_complete.cy.ts @@ -15,7 +15,7 @@ import { ALERTS_URL } from '../../../../../urls/navigation'; import { waitForAlertsToPopulate } from '../../../../../tasks/create_new_rule'; import { alertsTableShowsAssigneesForAlert, - updateAssigneesForAlert, + updateAssigneesForFirstAlert, bulkRemoveAllAssignees, loadPageAs, } from '../../../../../tasks/alert_assignments'; @@ -78,7 +78,7 @@ describe.skip( bulkRemoveAllAssignees(); refreshAlertPageFilter(); - updateAssigneesForAlert([role]); + updateAssigneesForFirstAlert([role]); // Assignees should appear in the alerts table alertsTableShowsAssigneesForAlert([role]); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_essentials.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_essentials.cy.ts index 71bb5f882ce9d..5ae60a01a0e8b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_essentials.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/assignments/assignments_serverless_essentials.cy.ts @@ -15,7 +15,7 @@ import { ALERTS_URL } from '../../../../../urls/navigation'; import { waitForAlertsToPopulate } from '../../../../../tasks/create_new_rule'; import { alertsTableShowsAssigneesForAlert, - updateAssigneesForAlert, + updateAssigneesForFirstAlert, bulkRemoveAllAssignees, loadPageAs, } from '../../../../../tasks/alert_assignments'; @@ -78,7 +78,7 @@ describe.skip( bulkRemoveAllAssignees(); refreshAlertPageFilter(); - updateAssigneesForAlert([role]); + updateAssigneesForFirstAlert([role]); // Assignees should appear in the alerts table alertsTableShowsAssigneesForAlert([role]); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts index dc52a7269faf1..ab0fbb0cf445a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts @@ -86,7 +86,8 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); }); - describe('ES|QL query validation', () => { + // FLAKY: https://github.com/elastic/kibana/issues/172881 + describe.skip('ES|QL query validation', () => { beforeEach(() => { login(); visit(CREATE_RULE_URL); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts index 9d486d11c9a56..fd1a57b19c894 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts @@ -45,232 +45,244 @@ import { waitForPageToBeLoaded, } from '../../../../tasks/rule_details'; -describe('Related integrations', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, () => { - const DATA_STREAM_NAME = 'logs-related-integrations-test'; - const PREBUILT_RULE_NAME = 'Prebuilt rule with related integrations'; - const RULE_RELATED_INTEGRATIONS: IntegrationDefinition[] = [ - { - package: 'aws', - version: '1.17.0', - integration: 'cloudfront', - installed: true, - enabled: true, - }, - { - package: 'aws', - version: '1.17.0', - integration: 'cloudtrail', - installed: true, - enabled: false, - }, - { package: 'aws', version: '1.17.0', integration: 'unknown', installed: false, enabled: false }, - { package: 'system', version: '1.17.0', installed: true, enabled: true }, - ]; - const PREBUILT_RULE = createRuleAssetSavedObject({ - name: PREBUILT_RULE_NAME, - index: [DATA_STREAM_NAME], - query: '*:*', - rule_id: 'rule_1', - related_integrations: RULE_RELATED_INTEGRATIONS.map((x) => omit(x, ['installed', 'enabled'])), - }); - - beforeEach(() => { - login(); - cleanFleet(); - deleteAlertsAndRules(); - addAndInstallPrebuiltRules([PREBUILT_RULE]); - }); - - describe('integrations not installed', () => { - describe('rules management table', () => { - beforeEach(() => { - visitRulesManagementTable(); - disableAutoRefresh(); - }); +// FLAKY: https://github.com/elastic/kibana/issues/173307 +// FLAKY: https://github.com/elastic/kibana/issues/173306 +describe.skip( + 'Related integrations', + { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, + () => { + const DATA_STREAM_NAME = 'logs-related-integrations-test'; + const PREBUILT_RULE_NAME = 'Prebuilt rule with related integrations'; + const RULE_RELATED_INTEGRATIONS: IntegrationDefinition[] = [ + { + package: 'aws', + version: '1.17.0', + integration: 'cloudfront', + installed: true, + enabled: true, + }, + { + package: 'aws', + version: '1.17.0', + integration: 'cloudtrail', + installed: true, + enabled: false, + }, + { + package: 'aws', + version: '1.17.0', + integration: 'unknown', + installed: false, + enabled: false, + }, + { package: 'system', version: '1.17.0', installed: true, enabled: true }, + ]; + const PREBUILT_RULE = createRuleAssetSavedObject({ + name: PREBUILT_RULE_NAME, + index: [DATA_STREAM_NAME], + query: '*:*', + rule_id: 'rule_1', + related_integrations: RULE_RELATED_INTEGRATIONS.map((x) => omit(x, ['installed', 'enabled'])), + }); - it('should display a badge with the installed integrations', () => { - cy.get(INTEGRATIONS_POPOVER).should( - 'have.text', - `0/${RULE_RELATED_INTEGRATIONS.length} integrations` - ); - }); + beforeEach(() => { + login(); + cleanFleet(); + deleteAlertsAndRules(); + addAndInstallPrebuiltRules([PREBUILT_RULE]); + }); - it('should display a popover when clicking the badge with the installed integrations', () => { - openIntegrationsPopover(); + describe('integrations not installed', () => { + describe('rules management table', () => { + beforeEach(() => { + visitRulesManagementTable(); + disableAutoRefresh(); + }); - cy.get(INTEGRATIONS_POPOVER_TITLE).should( - 'have.text', - `[${RULE_RELATED_INTEGRATIONS.length}] Related integrations available` - ); - cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); - cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + it('should display a badge with the installed integrations', () => { + cy.get(INTEGRATIONS_POPOVER).should( + 'have.text', + `0/${RULE_RELATED_INTEGRATIONS.length} integrations` + ); + }); - RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { - cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { - matchCase: false, + it('should display a popover when clicking the badge with the installed integrations', () => { + openIntegrationsPopover(); + + cy.get(INTEGRATIONS_POPOVER_TITLE).should( + 'have.text', + `[${RULE_RELATED_INTEGRATIONS.length}] Related integrations available` + ); + cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); + cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + + RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { + cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { + matchCase: false, + }); + cy.get(INTEGRATION_STATUS).eq(index).should('have.text', 'Not installed'); }); - cy.get(INTEGRATION_STATUS).eq(index).should('have.text', 'Not installed'); }); }); - }); - describe('rule details', () => { - beforeEach(() => { - visitFirstInstalledPrebuiltRuleDetailsPage(); - }); + describe('rule details', () => { + beforeEach(() => { + visitFirstInstalledPrebuiltRuleDetailsPage(); + }); - it('should display the integrations in the definition section', () => { - cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); - cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + it('should display the integrations in the definition section', () => { + cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); + cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); - RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { - cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { - matchCase: false, + RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { + cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { + matchCase: false, + }); + cy.get(INTEGRATION_STATUS).eq(index).should('have.text', 'Not installed'); }); - cy.get(INTEGRATION_STATUS).eq(index).should('have.text', 'Not installed'); }); }); }); - }); - describe('integrations installed (AWS CloudFront (enabled), AWS CloudTrail (disabled), System (enabled))', () => { - beforeEach(() => { - installIntegrations({ - packages: [ - { name: 'aws', version: '1.17.0' }, - { name: 'system', version: '1.17.0' }, - ], - agentPolicy: { - name: 'Agent policy', - namespace: 'default', - monitoring_enabled: ['logs'], - inactivity_timeout: 1209600, - }, - packagePolicy: AWS_PACKAGE_POLICY, - }); - }); - - describe('rules management table', () => { + describe('integrations installed (AWS CloudFront (enabled), AWS CloudTrail (disabled), System (enabled))', () => { beforeEach(() => { - visitRulesManagementTable(); - disableAutoRefresh(); + installIntegrations({ + packages: [ + { name: 'aws', version: '1.17.0' }, + { name: 'system', version: '1.17.0' }, + ], + agentPolicy: { + name: 'Agent policy', + namespace: 'default', + monitoring_enabled: ['logs'], + inactivity_timeout: 1209600, + }, + packagePolicy: AWS_PACKAGE_POLICY, + }); }); - it('should display a badge with the installed integrations', () => { - const enabledIntegrations = RULE_RELATED_INTEGRATIONS.filter((x) => x.enabled).length; - const totalIntegrations = RULE_RELATED_INTEGRATIONS.length; - - cy.get(INTEGRATIONS_POPOVER).should( - 'have.text', - `${enabledIntegrations}/${totalIntegrations} integrations` - ); - }); + describe('rules management table', () => { + beforeEach(() => { + visitRulesManagementTable(); + disableAutoRefresh(); + }); - it('should display a popover when clicking the badge with the installed integrations', () => { - openIntegrationsPopover(); + it('should display a badge with the installed integrations', () => { + const enabledIntegrations = RULE_RELATED_INTEGRATIONS.filter((x) => x.enabled).length; + const totalIntegrations = RULE_RELATED_INTEGRATIONS.length; - cy.get(INTEGRATIONS_POPOVER_TITLE).should( - 'have.text', - `[${RULE_RELATED_INTEGRATIONS.length}] Related integrations available` - ); - cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); - cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + cy.get(INTEGRATIONS_POPOVER).should( + 'have.text', + `${enabledIntegrations}/${totalIntegrations} integrations` + ); + }); - RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { - cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { - matchCase: false, + it('should display a popover when clicking the badge with the installed integrations', () => { + openIntegrationsPopover(); + + cy.get(INTEGRATIONS_POPOVER_TITLE).should( + 'have.text', + `[${RULE_RELATED_INTEGRATIONS.length}] Related integrations available` + ); + cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); + cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + + RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { + cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { + matchCase: false, + }); + cy.get(INTEGRATION_STATUS) + .eq(index) + .should('have.text', getIntegrationStatus(integration)); }); - cy.get(INTEGRATION_STATUS) - .eq(index) - .should('have.text', getIntegrationStatus(integration)); }); }); - }); - describe('rule details', () => { - beforeEach(() => { - visitFirstInstalledPrebuiltRuleDetailsPage(); - waitForPageToBeLoaded(PREBUILT_RULE_NAME); - }); - - it('should display the integrations in the definition section', () => { - cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); - cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + describe('rule details', () => { + beforeEach(() => { + visitFirstInstalledPrebuiltRuleDetailsPage(); + waitForPageToBeLoaded(PREBUILT_RULE_NAME); + }); - RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { - cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { - matchCase: false, + it('should display the integrations in the definition section', () => { + cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); + cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + + RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { + cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { + matchCase: false, + }); + cy.get(INTEGRATION_STATUS) + .eq(index) + .should('have.text', getIntegrationStatus(integration)); }); - cy.get(INTEGRATION_STATUS) - .eq(index) - .should('have.text', getIntegrationStatus(integration)); }); - }); - - const RELATED_INTEGRATION_FIELD = 'kibana.alert.rule.parameters.related_integrations'; - - it(`the alerts generated should have a "${RELATED_INTEGRATION_FIELD}" field containing the integrations`, () => { - deleteDataStream(DATA_STREAM_NAME); - createDocument(DATA_STREAM_NAME, generateEvent()); - - clickEnableRuleSwitch(); - waitForAlertsToPopulate(); - fetchRuleAlerts({ - ruleId: 'rule_1', - fields: [RELATED_INTEGRATION_FIELD], - size: 1, - }).then((alertsResponse) => { - expect(alertsResponse.body.hits.hits[0].fields).to.deep.equal({ - [RELATED_INTEGRATION_FIELD]: RULE_RELATED_INTEGRATIONS.map((x) => - omit(x, ['installed', 'enabled']) - ), + const RELATED_INTEGRATION_FIELD = 'kibana.alert.rule.parameters.related_integrations'; + + it(`the alerts generated should have a "${RELATED_INTEGRATION_FIELD}" field containing the integrations`, () => { + deleteDataStream(DATA_STREAM_NAME); + createDocument(DATA_STREAM_NAME, generateEvent()); + + clickEnableRuleSwitch(); + waitForAlertsToPopulate(); + + fetchRuleAlerts({ + ruleId: 'rule_1', + fields: [RELATED_INTEGRATION_FIELD], + size: 1, + }).then((alertsResponse) => { + expect(alertsResponse.body.hits.hits[0].fields).to.deep.equal({ + [RELATED_INTEGRATION_FIELD]: RULE_RELATED_INTEGRATIONS.map((x) => + omit(x, ['installed', 'enabled']) + ), + }); }); }); }); }); - }); - describe('related Integrations Advanced Setting is disabled', () => { - before(() => { - disableRelatedIntegrations(); - }); - - after(() => { - enableRelatedIntegrations(); - }); - - describe('rules management table', () => { - beforeEach(() => { - visitRulesManagementTable(); - disableAutoRefresh(); + describe('related Integrations Advanced Setting is disabled', () => { + before(() => { + disableRelatedIntegrations(); }); - it('should not display a badge with the installed integrations', () => { - cy.get(RULE_NAME).should('have.text', PREBUILT_RULE_NAME); - cy.get(INTEGRATION_LINK).should('not.exist'); + after(() => { + enableRelatedIntegrations(); }); - }); - describe('rule details', () => { - beforeEach(() => { - visitFirstInstalledPrebuiltRuleDetailsPage(); + describe('rules management table', () => { + beforeEach(() => { + visitRulesManagementTable(); + disableAutoRefresh(); + }); + + it('should not display a badge with the installed integrations', () => { + cy.get(RULE_NAME).should('have.text', PREBUILT_RULE_NAME); + cy.get(INTEGRATION_LINK).should('not.exist'); + }); }); - it('should display the integrations in the definition section', () => { - cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); - cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); + describe('rule details', () => { + beforeEach(() => { + visitFirstInstalledPrebuiltRuleDetailsPage(); + }); + + it('should display the integrations in the definition section', () => { + cy.get(INTEGRATION_LINK).should('have.length', RULE_RELATED_INTEGRATIONS.length); + cy.get(INTEGRATION_STATUS).should('have.length', RULE_RELATED_INTEGRATIONS.length); - RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { - cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { - matchCase: false, + RULE_RELATED_INTEGRATIONS.forEach((integration, index) => { + cy.get(INTEGRATION_LINK).eq(index).contains(getIntegrationName(integration), { + matchCase: false, + }); + cy.get(INTEGRATION_STATUS).eq(index).should('have.text', 'Not installed'); }); - cy.get(INTEGRATION_STATUS).eq(index).should('have.text', 'Not installed'); }); }); }); - }); -}); + } +); const INSTALLED_PREBUILT_RULES_RESPONSE_ALIAS = 'prebuiltRules'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts index c0a2295887a1f..a6e82d8e6aa97 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts @@ -88,7 +88,7 @@ describe('attach timeline to case', { tags: ['@ess', '@serverless'] }, () => { it('modal can be re-opened once closed', function () { visitTimeline(this.timelineId); attachTimelineToExistingCase(); - cy.get('[data-test-subj="all-cases-modal-cancel-button"]').click({ force: true }); + cy.get('[data-test-subj="all-cases-modal-cancel-button"]').click(); cy.get('[data-test-subj="all-cases-modal"]').should('not.exist'); attachTimelineToExistingCase(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts index 8891a835b1fd7..698a97df6b5d6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts @@ -106,10 +106,10 @@ describe('Cases', { tags: ['@ess', '@serverless'] }, () => { ); cy.get(CASE_DETAILS_USERNAMES) .eq(REPORTER) - .should('have.text', Cypress.env(ELASTICSEARCH_USERNAME)); + .should('contain', Cypress.env(ELASTICSEARCH_USERNAME)); cy.get(CASE_DETAILS_USERNAMES) .eq(PARTICIPANTS) - .should('have.text', Cypress.env(ELASTICSEARCH_USERNAME)); + .should('contain', Cypress.env(ELASTICSEARCH_USERNAME)); cy.get(CASE_DETAILS_TAGS).should('have.text', expectedTags); EXPECTED_METRICS.forEach((metric) => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts index f857805462877..b0b1a11bc69e0 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts @@ -46,7 +46,8 @@ describe('Overview Page', { tags: ['@ess', '@serverless'] }, () => { }); }); - describe('Favorite Timelines', () => { + // https://github.com/elastic/kibana/issues/173168 + describe('Favorite Timelines', { tags: ['@brokenInServerless'] }, () => { it('should appear on overview page', () => { createTimeline(getTimeline()) .then((response) => response.body.data.persistTimeline.timeline.savedObjectId) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts index e24998fd9f304..e48a03aef2d39 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts @@ -21,7 +21,7 @@ import { KQL_INPUT, NETWORK, LOADING_INDICATOR, - openNavigationPanel, + openNavigationPanel as toggleNavigationPanel, } from '../../../screens/security_header'; import { TIMELINE_DATE_PICKER_CONTAINER, TIMELINE_TITLE } from '../../../screens/timeline'; @@ -228,7 +228,7 @@ describe('url state', { tags: ['@ess', '@brokenInServerless'] }, () => { kqlSearch('source.ip: "10.142.0.9" {enter}'); navigateFromHeaderTo(HOSTS); - openNavigationPanel(EXPLORE_PANEL_BTN); + toggleNavigationPanel(EXPLORE_PANEL_BTN); cy.get(NETWORK) .should('have.attr', 'href') .and( @@ -236,14 +236,13 @@ describe('url state', { tags: ['@ess', '@brokenInServerless'] }, () => { `/app/security/network?sourcerer=(default:(id:security-solution-default,selectedPatterns:!('auditbeat-*')))&query=(language:kuery,query:'source.ip:%20%2210.142.0.9%22%20')&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2019-08-01T20:33:29.186Z')),timeline:(linkTo:!(global),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2019-08-01T20:33:29.186Z')))` ); }); - it('sets KQL in host page and detail page and check if href match on breadcrumb, tabs and subTabs', () => { visit(ABSOLUTE_DATE_RANGE.urlHostNew); kqlSearch('host.name: "siem-kibana" {enter}'); openAllHosts(); waitForAllHostsToBeLoaded(); - openNavigationPanel(EXPLORE_PANEL_BTN); + toggleNavigationPanel(EXPLORE_PANEL_BTN); cy.get(HOSTS) .should('have.attr', 'href') .and( @@ -256,6 +255,7 @@ describe('url state', { tags: ['@ess', '@brokenInServerless'] }, () => { 'contain', `/app/security/network?sourcerer=(default:(id:security-solution-default,selectedPatterns:!('auditbeat-*')))&query=(language:kuery,query:'host.name:%20%22siem-kibana%22%20')&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2023-01-01T21:33:29.186Z')),timeline:(linkTo:!(global),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2023-01-01T21:33:29.186Z')))` ); + toggleNavigationPanel(EXPLORE_PANEL_BTN); cy.get(HOSTS_NAMES).first().should('have.text', 'siem-kibana'); openFirstHostDetails(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/users/users_tabs.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/users/users_tabs.cy.ts index 0d884816ad964..1f198bb7627c9 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/users/users_tabs.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/users/users_tabs.cy.ts @@ -18,6 +18,7 @@ import { login } from '../../../tasks/login'; import { visitUserDetailsPage, visitWithTimeRange } from '../../../tasks/navigation'; import { USERS_URL } from '../../../urls/navigation'; +import { waitForTabToBeLoaded } from '../../../tasks/common'; describe('Users stats and tables', { tags: ['@ess', '@serverless'] }, () => { before(() => { @@ -48,7 +49,7 @@ describe('Users stats and tables', { tags: ['@ess', '@serverless'] }, () => { it(`renders all authentications`, () => { const totalUsers = 1; - cy.get(AUTHENTICATIONS_TAB).click(); + waitForTabToBeLoaded(AUTHENTICATIONS_TAB); cy.get(AUTHENTICATIONS_TABLE) .find(HEADER_SUBTITLE) @@ -56,19 +57,19 @@ describe('Users stats and tables', { tags: ['@ess', '@serverless'] }, () => { }); it(`renders anomalies tab`, () => { - cy.get(ANOMALIES_TAB).click({ force: true }); + waitForTabToBeLoaded(ANOMALIES_TAB); cy.get(ANOMALIES_TAB_CONTENT).should('exist'); }); it(`renders events tab`, () => { - cy.get(EVENTS_TAB).click({ force: true }); + waitForTabToBeLoaded(EVENTS_TAB); cy.get(EVENTS_TAB_CONTENT).should('exist'); }); it(`renders users risk tab`, () => { - cy.get(RISK_SCORE_TAB).click({ force: true }); + waitForTabToBeLoaded(RISK_SCORE_TAB); cy.get(RISK_SCORE_TAB_CONTENT).should('exist'); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_action_column.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_action_column.cy.ts index df8136f3e74d9..b8e31186a1366 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_action_column.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_action_column.cy.ts @@ -15,7 +15,7 @@ import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { ALERTS_URL } from '../../../urls/navigation'; -describe('Alerts Table Action column', { tags: ['@ess', '@serverless'] }, () => { +describe.skip('Alerts Table Action column', { tags: ['@ess', '@serverless'] }, () => { before(() => { cy.task('esArchiverLoad', { archiveName: 'process_ancestry', diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_controls.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_controls.cy.ts index 29ef82c419ac0..5cab08d5ceb16 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_controls.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alert_table_controls.cy.ts @@ -13,6 +13,7 @@ import { import { FIELDS_BROWSER_BTN } from '../../../screens/rule_details'; import { addsFields, + clearFieldsBrowser, closeFieldsBrowser, filterFieldsBrowser, removeField, @@ -27,10 +28,11 @@ import { GET_DATA_GRID_HEADER_CELL_ACTION_GROUP, } from '../../../screens/common/data_grid'; import { createRule } from '../../../tasks/api_calls/rules'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; -import { ALERTS_URL, TIMELINES_URL } from '../../../urls/navigation'; +import { ALERTS_URL } from '../../../urls/navigation'; import { DATAGRID_HEADER } from '../../../screens/timeline'; /* @@ -40,93 +42,100 @@ import { DATAGRID_HEADER } from '../../../screens/timeline'; * * */ -describe(`Alert Table Controls`, { tags: ['@ess', '@serverless'] }, () => { +describe.skip(`Alert Table Controls`, { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { + deleteAlertsAndRules(); login(); createRule(getNewRule()); visit(ALERTS_URL); waitForAlertsToPopulate(); }); - it('full screen, column sorting', () => { + it('should enter and exit full screen, column sorting', () => { cy.get(DATA_GRID_FULL_SCREEN) .should('have.attr', 'aria-label', 'Enter fullscreen') .trigger('click'); cy.get(DATA_GRID_FULL_SCREEN) .should('have.attr', 'aria-label', 'Exit fullscreen') .trigger('click'); + }); + + it('should have correct column sorting values', () => { cy.get(DATA_GRID_COLUMN_ORDER_BTN).should('be.visible'); + + cy.log('Date Column'); + + const timestampField = DATA_GRID_FIELDS.TIMESTAMP.fieldName; + cy.get(GET_DATA_GRID_HEADER(timestampField)).trigger('click'); + cy.get(GET_DATA_GRID_HEADER_CELL_ACTION_GROUP(timestampField)) + .should('be.visible') + .should('contain.text', 'Sort Old-New'); + + cy.log('Number column'); + + const riskScoreField = DATA_GRID_FIELDS.RISK_SCORE.fieldName; + cy.get(GET_DATA_GRID_HEADER(riskScoreField)).trigger('click'); + cy.get(GET_DATA_GRID_HEADER_CELL_ACTION_GROUP(riskScoreField)) + .should('be.visible') + .should('contain.text', 'Sort Low-High'); + + cy.log('Text Column'); + + const ruleField = DATA_GRID_FIELDS.RULE.fieldName; + cy.get(GET_DATA_GRID_HEADER(ruleField)).trigger('click'); + cy.get(GET_DATA_GRID_HEADER_CELL_ACTION_GROUP(ruleField)) + .should('be.visible') + .should('contain.text', 'Sort A-Z'); }); - context('Sorting', () => { - it('Date Column', () => { - const timestampField = DATA_GRID_FIELDS.TIMESTAMP.fieldName; - cy.get(GET_DATA_GRID_HEADER(timestampField)).trigger('click'); - cy.get(GET_DATA_GRID_HEADER_CELL_ACTION_GROUP(timestampField)) - .should('be.visible') - .should('contain.text', 'Sort Old-New'); - }); - - it('Number column', () => { - const riskScoreField = DATA_GRID_FIELDS.RISK_SCORE.fieldName; - cy.get(GET_DATA_GRID_HEADER(riskScoreField)).trigger('click'); - cy.get(GET_DATA_GRID_HEADER_CELL_ACTION_GROUP(riskScoreField)) - .should('be.visible') - .should('contain.text', 'Sort Low-High'); - }); - - it('Text Column', () => { - const ruleField = DATA_GRID_FIELDS.RULE.fieldName; - cy.get(GET_DATA_GRID_HEADER(ruleField)).trigger('click'); - cy.get(GET_DATA_GRID_HEADER_CELL_ACTION_GROUP(ruleField)) - .should('be.visible') - .should('contain.text', 'Sort A-Z'); - }); + it('should retain column configuration when a column is added or removed after reloading the page', () => { + const severityFieldName = 'kibana.alert.severity'; + const idFieldName = '_id'; + + cy.get(DATAGRID_HEADER(severityFieldName)).should('exist'); + cy.get(DATAGRID_HEADER(idFieldName)).should('not.exist'); + + cy.get(FIELDS_BROWSER_BTN).click(); + cy.get(FIELDS_BROWSER_CONTAINER).should('exist'); + + cy.log('remove severity field'); + + filterFieldsBrowser(severityFieldName); + removeField(severityFieldName); + + cy.log('add id field'); + + clearFieldsBrowser(); + filterFieldsBrowser(idFieldName); + addsFields([idFieldName]); + closeFieldsBrowser(); + + cy.get(DATAGRID_HEADER(severityFieldName)).should('not.exist'); + cy.get(DATAGRID_HEADER(idFieldName)).should('exist'); + + cy.reload(); + waitForAlerts(); + + cy.get(DATAGRID_HEADER(severityFieldName)).should('not.exist'); + cy.get(DATAGRID_HEADER(idFieldName)).should('exist'); }); - context('Columns Configuration', () => { - it('should retain column configuration when a column is removed when coming back to alert page', () => { - const fieldName = 'kibana.alert.severity'; - cy.get(FIELDS_BROWSER_BTN).click(); - cy.get(FIELDS_BROWSER_CONTAINER).should('be.visible'); - - filterFieldsBrowser(fieldName); - removeField(fieldName); - closeFieldsBrowser(); - cy.get(DATAGRID_HEADER(fieldName)).should('not.exist'); - - visit(TIMELINES_URL); - visit(ALERTS_URL); - waitForAlerts(); - cy.get(DATAGRID_HEADER('_id')).should('not.exist'); - }); - it('should retain column configuration when a column is added when coming back to alert page', () => { - cy.get(FIELDS_BROWSER_BTN).click(); - cy.get(FIELDS_BROWSER_CONTAINER).should('be.visible'); - - addsFields(['_id']); - closeFieldsBrowser(); - cy.get(DATAGRID_HEADER('_id')).should('be.visible'); - - visit(TIMELINES_URL); - visit(ALERTS_URL); - waitForAlerts(); - cy.get(DATAGRID_HEADER('_id')).should('be.visible'); - }); - it('should retain columns configuration when switching between eventrenderedView and gridView', () => { - const fieldName = '_id'; - cy.get(FIELDS_BROWSER_BTN).click(); - cy.get(FIELDS_BROWSER_CONTAINER).should('be.visible'); - - addsFields([fieldName]); - closeFieldsBrowser(); - cy.get(DATAGRID_HEADER(fieldName)).should('be.visible'); - - switchAlertTableToEventRenderedView(); - cy.get(DATAGRID_HEADER(fieldName)).should('not.exist'); - - switchAlertTableToGridView(); - cy.get(DATAGRID_HEADER(fieldName)).should('be.visible'); - }); + it('should retain columns configuration when switching between eventrenderedView and gridView', () => { + const fieldName = '_id'; + cy.get(FIELDS_BROWSER_BTN).click(); + cy.get(FIELDS_BROWSER_CONTAINER).should('be.visible'); + + addsFields([fieldName]); + closeFieldsBrowser(); + + cy.get(DATAGRID_HEADER(fieldName)).should('be.visible'); + + switchAlertTableToEventRenderedView(); + + cy.get(DATAGRID_HEADER(fieldName)).should('not.exist'); + + switchAlertTableToGridView(); + + cy.get(DATAGRID_HEADER(fieldName)).should('be.visible'); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts index 911b870d08347..f05b5cc9ab020 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts @@ -36,7 +36,7 @@ import { openActiveTimeline } from '../../../tasks/timeline'; import { ALERTS_URL } from '../../../urls/navigation'; -describe('Alerts cell actions', { tags: ['@ess', '@serverless'] }, () => { +describe.skip('Alerts cell actions', { tags: ['@ess', '@serverless'] }, () => { before(() => { createRule(getNewRule()); }); @@ -93,7 +93,8 @@ describe('Alerts cell actions', { tags: ['@ess', '@serverless'] }, () => { }); }); - describe('Add to timeline', () => { + // FLAKY: https://github.com/elastic/kibana/issues/172231 + describe.skip('Add to timeline', () => { beforeEach(() => { login(); visit(ALERTS_URL); @@ -126,7 +127,8 @@ describe('Alerts cell actions', { tags: ['@ess', '@serverless'] }, () => { }); }); - describe('Show Top N', () => { + // FLAKY: https://github.com/elastic/kibana/issues/172232 + describe.skip('Show Top N', () => { beforeEach(() => { login(); visit(ALERTS_URL); @@ -145,7 +147,8 @@ describe('Alerts cell actions', { tags: ['@ess', '@serverless'] }, () => { }); }); - describe('Copy to clipboard', () => { + // FLAKY: https://github.com/elastic/kibana/issues/172233 + describe.skip('Copy to clipboard', () => { beforeEach(() => { login(); visit(ALERTS_URL); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts index 448687ae956c5..c1db8eb2b44d1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts @@ -15,6 +15,7 @@ import { selectAlertsHistogram, } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { ALERTS_URL } from '../../../urls/navigation'; @@ -24,48 +25,45 @@ import { } from '../../../screens/search_bar'; import { TOASTER } from '../../../screens/alerts_detection_rules'; -describe( - 'Histogram legend hover actions', - { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, - () => { - const ruleConfigs = getNewRule(); +describe('Histogram legend hover actions', { tags: ['@ess', '@serverless'] }, () => { + const ruleConfigs = getNewRule(); - beforeEach(() => { - login(); - createRule(getNewRule({ rule_id: 'new custom rule' })); - visitWithTimeRange(ALERTS_URL); - selectAlertsHistogram(); - }); + beforeEach(() => { + deleteAlertsAndRules(); + login(); + createRule(getNewRule({ rule_id: 'new custom rule' })); + visitWithTimeRange(ALERTS_URL); + selectAlertsHistogram(); + }); - it('Filter in should add a filter to KQL bar', function () { - const expectedNumberOfAlerts = 1; - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendFilterFor(ruleConfigs.name); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( - 'have.text', - `kibana.alert.rule.name: ${ruleConfigs.name}` - ); - cy.get(ALERTS_COUNT).should('have.text', `${expectedNumberOfAlerts} alert`); - }); + it('should should add a filter in to KQL bar', () => { + const expectedNumberOfAlerts = 1; + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendFilterFor(ruleConfigs.name); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( + 'have.text', + `kibana.alert.rule.name: ${ruleConfigs.name}` + ); + cy.get(ALERTS_COUNT).should('have.text', `${expectedNumberOfAlerts} alert`); + }); - it('Filter out should add a filter to KQL bar', function () { - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendFilterOut(ruleConfigs.name); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( - 'have.text', - `NOT kibana.alert.rule.name: ${ruleConfigs.name}` - ); - cy.get(ALERTS_COUNT).should('not.exist'); + it('should add a filter out to KQL bar', () => { + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendFilterOut(ruleConfigs.name); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( + 'have.text', + `NOT kibana.alert.rule.name: ${ruleConfigs.name}` + ); + cy.get(ALERTS_COUNT).should('not.exist'); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM_DELETE).click(); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); - }); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM_DELETE).click(); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); + }); - it('Add To Timeline', function () { - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendAddToTimeline(ruleConfigs.name); + it('should add To Timeline', () => { + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendAddToTimeline(ruleConfigs.name); - cy.get(TOASTER).should('have.text', `Added ${ruleConfigs.name} to timeline`); - }); - } -); + cy.get(TOASTER).should('have.text', `Added ${ruleConfigs.name} to timeline`); + }); +}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts index 0d28bcf7c42b3..aaa8806362d06 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts @@ -12,7 +12,7 @@ import { VIEW_CASE_TOASTER_LINK, } from '../../../../screens/expandable_flyout/common'; import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; -import { ALERT_CHECKBOX } from '../../../../screens/alerts'; +import { ALERT_CHECKBOX, EMPTY_ALERT_TABLE } from '../../../../screens/alerts'; import { DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON, DOCUMENT_DETAILS_FLYOUT_EXPAND_DETAILS_BUTTON, @@ -59,23 +59,10 @@ import { getNewRule } from '../../../../objects/rule'; import { ALERTS_URL } from '../../../../urls/navigation'; import { waitForAlertsToPopulate } from '../../../../tasks/create_new_rule'; import { TOASTER } from '../../../../screens/alerts_detection_rules'; -import { goToAcknowledgedAlerts, goToClosedAlerts, waitForAlerts } from '../../../../tasks/alerts'; -import { - DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_DETAILS, - DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_TITLE, -} from '../../../../screens/expandable_flyout/alert_details_right_panel_overview_tab'; describe('Alert details expandable flyout right panel', { tags: ['@ess', '@serverless'] }, () => { const rule = getNewRule(); - before(() => { - cy.task('esArchiverLoad', { archiveName: 'auditbeat_multiple' }); - }); - - after(() => { - cy.task('esArchiverUnload', 'auditbeat_multiple'); - }); - beforeEach(() => { deleteAlertsAndRules(); login(); @@ -162,45 +149,23 @@ describe('Alert details expandable flyout right panel', { tags: ['@ess', '@serve }); it('should mark as acknowledged', () => { - cy.get(ALERT_CHECKBOX).should('have.length', 5); + cy.get(ALERT_CHECKBOX).should('have.length', 1); expandFirstAlertExpandableFlyout(); openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_MARK_AS_ACKNOWLEDGED); cy.get(TOASTER).should('have.text', 'Successfully marked 1 alert as acknowledged.'); - - goToAcknowledgedAlerts(); - waitForAlerts(); - expandFirstAlertExpandableFlyout(); - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_TITLE).should( - 'have.text', - 'Last alert status change' - ); - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_DETAILS).should( - 'contain.text', - 'Alert status updated' - ); + cy.get(EMPTY_ALERT_TABLE).should('exist'); }); it('should mark as closed', () => { - cy.get(ALERT_CHECKBOX).should('have.length', 5); + cy.get(ALERT_CHECKBOX).should('have.length', 1); expandFirstAlertExpandableFlyout(); openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_MARK_AS_CLOSED); cy.get(TOASTER).should('have.text', 'Successfully closed 1 alert.'); - - goToClosedAlerts(); - waitForAlerts(); - expandFirstAlertExpandableFlyout(); - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_TITLE).should( - 'have.text', - 'Last alert status change' - ); - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_DETAILS).should( - 'contain.text', - 'Alert status updated' - ); + cy.get(EMPTY_ALERT_TABLE).should('exist'); }); // these actions are now grouped together as we're not really testing their functionality but just the existence of the option in the dropdown diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts index fb2af6a16b022..e9fe42b6951ea 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts @@ -334,7 +334,7 @@ describe( // TODO work on getting proper data to make the prevalence section work here // we need to generate enough data to have at least one field with prevalence - it('should display prevalence section', () => { + it.skip('should display prevalence section', () => { toggleOverviewTabAboutSection(); toggleOverviewTabInvestigationSection(); toggleOverviewTabInsightsSection(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_detection.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_detection.cy.ts index 0e1f95b1e23a9..3d51fb2f595be 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_detection.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_detection.cy.ts @@ -14,6 +14,7 @@ import { ALERTS_HISTOGRAM_SERIES, ALERT_RULE_NAME, MESSAGE } from '../../../scre import { TIMELINE_QUERY, TIMELINE_VIEW_IN_ANALYZER } from '../../../screens/timeline'; import { selectAlertsHistogram } from '../../../tasks/alerts'; import { createTimeline } from '../../../tasks/timelines'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; describe('Ransomware Detection Alerts', { tags: ['@ess', '@serverless'] }, () => { before(() => { @@ -24,39 +25,38 @@ describe('Ransomware Detection Alerts', { tags: ['@ess', '@serverless'] }, () => }); }); - describe('Ransomware display in Alerts Section', () => { + after(() => { + cy.task('esArchiverUnload', 'ransomware_detection'); + }); + + describe('Ransomware in Alerts Page', () => { beforeEach(() => { login(); visitWithTimeRange(ALERTS_URL); waitForAlertsToPopulate(); }); - describe('Alerts table', () => { - it('shows Ransomware Alerts', () => { - cy.get(ALERT_RULE_NAME).should('have.text', 'Ransomware Detection Alert'); - }); - }); + it('should show ransomware alerts on alerts page', () => { + cy.log('should show ransomware alerts in alerts table'); - describe('Trend Chart', () => { - beforeEach(() => { - selectAlertsHistogram(); - }); + cy.get(ALERT_RULE_NAME).should('have.text', 'Ransomware Detection Alert'); - it('shows Ransomware Detection Alert in the trend chart', () => { - cy.get(ALERTS_HISTOGRAM_SERIES).should('have.text', 'Ransomware Detection Alert'); - }); + cy.log('should show ransomware prevention alert in the trend chart'); + + selectAlertsHistogram(); + cy.get(ALERTS_HISTOGRAM_SERIES).should('have.text', 'Ransomware Detection Alert'); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/170846 - describe.skip('Ransomware in Timelines', () => { - before(() => { + describe('Ransomware in Timelines', () => { + beforeEach(() => { + deleteTimelines(); login(); visitWithTimeRange(TIMELINES_URL); createTimeline(); }); - it('Renders ransomware entries in timelines table', () => { + it('should show ransomware entries in timelines table', () => { cy.get(TIMELINE_QUERY).type('event.code: "ransomware"{enter}'); // Wait for grid to load, it should have an analyzer icon diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts index b90413cdfe751..099f2e751458d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts @@ -29,39 +29,34 @@ describe('Ransomware Prevention Alerts', { tags: ['@ess', '@serverless'] }, () = cy.task('esArchiverUnload', 'ransomware_prevention'); }); - describe('Ransomware display in Alerts Section', () => { + describe('Ransomware in Alerts Page', () => { beforeEach(() => { login(); visitWithTimeRange(ALERTS_URL); }); - describe('Alerts table', () => { - it('shows Ransomware Alerts', () => { - cy.get(ALERT_RULE_NAME).should('have.text', 'Ransomware Prevention Alert'); - }); - }); + it('should show ransomware alerts on alerts page', () => { + cy.log('should show ransomware alerts in alert table'); - describe('Trend Chart', () => { - beforeEach(() => { - selectAlertsHistogram(); - }); + cy.get(ALERT_RULE_NAME).should('have.text', 'Ransomware Prevention Alert'); - it('shows Ransomware Prevention Alert in the trend chart', () => { - cy.get(ALERTS_HISTOGRAM_SERIES).should('have.text', 'Ransomware Prevention Alert'); - }); + cy.log('should show ransomware prevention alert in the trend chart'); + + selectAlertsHistogram(); + cy.get(ALERTS_HISTOGRAM_SERIES).should('have.text', 'Ransomware Prevention Alert'); }); }); describe('Ransomware in Timelines', function () { - before(() => { + beforeEach(() => { deleteTimelines(); + login(); createTimeline({ ...getTimeline(), query: 'event.code: "ransomware"' }).then((response) => { cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('timelineId'); }); }); - it('Renders ransomware entries in timelines table', function () { - login(); + it('should render ransomware entries in timelines table', function () { const timeline = this.timelineId; visitTimeline(timeline); // Wait for grid to load, it should have an analyzer icon diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/resolver.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/resolver.cy.ts index 9f7708a6c0d3a..4ecbcd3dbf6db 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/resolver.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/resolver.cy.ts @@ -17,7 +17,7 @@ import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { ALERTS_URL } from '../../../urls/navigation'; -describe('Analyze events view for alerts', { tags: ['@ess', '@serverless'] }, () => { +describe.skip('Analyze events view for alerts', { tags: ['@ess', '@serverless'] }, () => { before(() => { createRule(getNewRule()); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts index 9054684c53e82..d2287fb09e48b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts @@ -8,23 +8,14 @@ import { getTimeline } from '../../../objects/timeline'; import { - FAVORITE_TIMELINE, LOCKED_ICON, - NOTES, - NOTES_TAB_BUTTON, - NOTES_TEXT_AREA, PIN_EVENT, - TIMELINE_DESCRIPTION, TIMELINE_FLYOUT_WRAPPER, TIMELINE_QUERY, TIMELINE_TITLE, + TIMELINE_DATE_PICKER_CONTAINER, } from '../../../screens/timeline'; -import { - TIMELINES_DESCRIPTION, - TIMELINES_PINNED_EVENT_COUNT, - TIMELINES_NOTES_COUNT, - TIMELINES_FAVORITE, -} from '../../../screens/timelines'; +import { TIMELINES_DESCRIPTION, TIMELINES_FAVORITE } from '../../../screens/timelines'; import { createTimeline } from '../../../tasks/api_calls/timelines'; import { deleteTimelines } from '../../../tasks/api_calls/common'; @@ -32,23 +23,29 @@ import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; import { openTimelineUsingToggle } from '../../../tasks/security_main'; import { - addDescriptionToTimeline, addFilter, addNameToTimelineAndSave, - addNotesToTimeline, clickingOnCreateTemplateFromTimelineBtn, closeTimeline, createNewTimelineTemplate, + createTimelineTemplateOptionsPopoverBottomBar, expandEventAction, markAsFavorite, - openTimelineTemplateFromSettings, + openTimelineTemplate, populateTimeline, + addNameAndDescriptionToTimeline, + openTimelineTemplatesTab, } from '../../../tasks/timeline'; -import { openTimeline, waitForTimelinesPanelToBeLoaded } from '../../../tasks/timelines'; +import { + updateTimelineDates, + showStartEndDate, + setStartDate, + setEndDateNow, +} from '../../../tasks/date_picker'; +import { waitForTimelinesPanelToBeLoaded } from '../../../tasks/timelines'; import { TIMELINES_URL } from '../../../urls/navigation'; -// FLAKY: https://github.com/elastic/kibana/issues/165661 describe('Timeline Templates', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); @@ -56,12 +53,24 @@ describe('Timeline Templates', { tags: ['@ess', '@serverless'] }, () => { cy.intercept('PATCH', '/api/timeline').as('timeline'); }); - it.skip('Creates a timeline template', () => { + it('Creates a timeline template', () => { visit(TIMELINES_URL); + waitForTimelinesPanelToBeLoaded(); openTimelineUsingToggle(); + createNewTimelineTemplate(); populateTimeline(); + + cy.log('Add filter'); addFilter(getTimeline().filter); + + cy.log('Update date range'); + showStartEndDate(TIMELINE_DATE_PICKER_CONTAINER); + setEndDateNow(TIMELINE_DATE_PICKER_CONTAINER); + setStartDate('Jan 18, 2018 @ 00:00:00.000', TIMELINE_DATE_PICKER_CONTAINER); + updateTimelineDates(); + + cy.log('Try to pin an event'); cy.get(PIN_EVENT).should( 'have.attr', 'aria-label', @@ -69,36 +78,25 @@ describe('Timeline Templates', { tags: ['@ess', '@serverless'] }, () => { ); cy.get(LOCKED_ICON).should('be.visible'); - addNameToTimelineAndSave(getTimeline().title); + cy.log('Update title and description'); + addNameAndDescriptionToTimeline(getTimeline()); cy.wait('@timeline').then(({ response }) => { const timelineId = response?.body.data.persistTimeline.timeline.savedObjectId; - addDescriptionToTimeline(getTimeline().description); - addNotesToTimeline(getTimeline().notes); markAsFavorite(); - createNewTimelineTemplate(); closeTimeline(); - openTimelineTemplateFromSettings(timelineId); + cy.log('Open template from templates tab'); + openTimelineTemplatesTab(); + openTimelineTemplate(timelineId); + + cy.log('Check that the template has been created correclty'); cy.contains(getTimeline().title).should('exist'); + cy.get(TIMELINE_TITLE).should('have.text', getTimeline().title); cy.get(TIMELINES_DESCRIPTION).first().should('have.text', getTimeline().description); - cy.get(TIMELINES_PINNED_EVENT_COUNT).first().should('have.text', '1'); - cy.get(TIMELINES_NOTES_COUNT).first().should('have.text', '1'); cy.get(TIMELINES_FAVORITE).first().should('exist'); - - openTimeline(timelineId); - - cy.get(FAVORITE_TIMELINE).should('exist'); - cy.get(TIMELINE_TITLE).should('have.text', getTimeline().title); - cy.get(TIMELINE_DESCRIPTION).should('have.text', getTimeline().description); - cy.get(TIMELINE_QUERY).should('have.text', getTimeline().query); - // Comments this assertion until we agreed what to do with the filters. - // cy.get(TIMELINE_FILTER(timeline.filter)).should('exist'); - // cy.get(NOTES_COUNT).should('have.text', '1'); - cy.get(NOTES_TAB_BUTTON).click(); - cy.get(NOTES_TEXT_AREA).should('exist'); - cy.get(NOTES).should('have.text', getTimeline().notes); + cy.get(TIMELINE_QUERY).should('contain.text', getTimeline().query); }); }); @@ -113,4 +111,10 @@ describe('Timeline Templates', { tags: ['@ess', '@serverless'] }, () => { cy.get(TIMELINE_FLYOUT_WRAPPER).should('have.css', 'visibility', 'visible'); cy.get(TIMELINE_QUERY).should('have.text', getTimeline().query); }); + + it('should create timeline template from bottombar', () => { + visit(TIMELINES_URL); + createTimelineTemplateOptionsPopoverBottomBar(); + cy.get(TIMELINE_TITLE).should('have.text', 'Untitled template'); + }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts index a40479fdab26d..d048eb2155ef6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts @@ -21,6 +21,7 @@ import { SAVE_TIMELINE_ACTION_BTN, SAVE_TIMELINE_TOOLTIP, } from '../../../screens/timeline'; +import { LOADING_INDICATOR } from '../../../screens/security_header'; import { ROWS } from '../../../screens/timelines'; import { createTimelineTemplate } from '../../../tasks/api_calls/timelines'; @@ -48,20 +49,16 @@ import { createTimeline } from '../../../tasks/timelines'; import { OVERVIEW_URL, TIMELINE_TEMPLATES_URL, TIMELINES_URL } from '../../../urls/navigation'; -// Failing: See https://github.com/elastic/kibana/issues/172304 -describe.skip('Create a timeline from a template', { tags: ['@ess', '@serverless'] }, () => { - before(() => { - deleteTimelines(); - login(); - createTimelineTemplate(getTimeline()); - }); - +// FLAKY: https://github.com/elastic/kibana/issues/173339 +describe.skip('Timelines', { tags: ['@ess', '@serverless'] }, (): void => { beforeEach(() => { login(); - visit(TIMELINE_TEMPLATES_URL); + deleteTimelines(); }); - it('Should have the same query and open the timeline modal', () => { + it('creates a timeline from a template and should have the same query and open the timeline modal', () => { + createTimelineTemplate(getTimeline()); + visit(TIMELINE_TEMPLATES_URL); selectCustomTemplates(); expandEventAction(); clickingOnCreateTimelineFormTemplateBtn(); @@ -69,15 +66,9 @@ describe.skip('Create a timeline from a template', { tags: ['@ess', '@serverless cy.get(TIMELINE_QUERY).should('have.text', getTimeline().query); closeTimeline(); }); -}); - -describe('Timelines', (): void => { - before(() => { - deleteTimelines(); - }); describe('Toggle create timeline from "New" btn', () => { - context('Privileges: CRUD', { tags: '@ess' }, () => { + context('Privileges: CRUD', () => { beforeEach(() => { login(); visitWithTimeRange(OVERVIEW_URL); @@ -91,7 +82,7 @@ describe('Timelines', (): void => { }); }); - context('Privileges: READ', { tags: '@ess' }, () => { + context('Privileges: READ', () => { beforeEach(() => { login(ROLES.t1_analyst); visitWithTimeRange(OVERVIEW_URL); @@ -112,99 +103,77 @@ describe('Timelines', (): void => { }); }); - describe( - 'Creates a timeline by clicking untitled timeline from bottom bar', - { tags: ['@ess', '@serverless'] }, - () => { - beforeEach(() => { - login(); - visitWithTimeRange(OVERVIEW_URL); - openTimelineUsingToggle(); - addNameAndDescriptionToTimeline(getTimeline()); - populateTimeline(); - goToQueryTab(); - }); + it('creates a timeline by clicking untitled timeline from bottom bar', () => { + visitWithTimeRange(OVERVIEW_URL); + openTimelineUsingToggle(); + addNameAndDescriptionToTimeline(getTimeline()); + populateTimeline(); + goToQueryTab(); - it.skip('can be added filter', () => { - addFilter(getTimeline().filter); - cy.get(TIMELINE_FILTER(getTimeline().filter)).should('exist'); - }); + addFilter(getTimeline().filter); + cy.get(TIMELINE_FILTER(getTimeline().filter)).should('exist'); - it('pins an event', () => { - pinFirstEvent(); - cy.get(PIN_EVENT) - .should('have.attr', 'aria-label') - .and('match', /Unpin the event in row 2/); - }); + pinFirstEvent(); + cy.get(PIN_EVENT) + .should('have.attr', 'aria-label') + .and('match', /Unpin the event in row 2/); - it('has a lock icon', () => { - cy.get(LOCKED_ICON).should('be.visible'); - }); + cy.get(LOCKED_ICON).should('be.visible'); - // TO-DO: Issue 163398 - it.skip('can be added notes', () => { - addNotesToTimeline(getTimeline().notes); - cy.get(TIMELINE_TAB_CONTENT_GRAPHS_NOTES) - .find(NOTES_TEXT) - .should('have.text', getTimeline().notes); - }); - } - ); - - // FLAKY: https://github.com/elastic/kibana/issues/172031 - describe.skip('shows the different timeline states', () => { - before(() => { - login(); - visitWithTimeRange(OVERVIEW_URL); - openTimelineUsingToggle(); - createNewTimeline(); - }); + addNotesToTimeline(getTimeline().notes); + cy.get(TIMELINE_TAB_CONTENT_GRAPHS_NOTES) + .find(NOTES_TEXT) + .should('have.text', getTimeline().notes); + }); - it('should show the correct timeline status', { tags: ['@ess', '@serverless'] }, () => { - // Unsaved - cy.get(TIMELINE_PANEL).should('be.visible'); - cy.get(TIMELINE_STATUS).should('be.visible'); - cy.get(TIMELINE_STATUS).should('have.text', 'Unsaved'); + it('shows the different timeline states', () => { + visitWithTimeRange(TIMELINES_URL); + createTimeline(); - addNameToTimelineAndSave('Test'); + // Unsaved + cy.get(TIMELINE_PANEL).should('be.visible'); + cy.get(TIMELINE_STATUS).should('be.visible'); + cy.get(TIMELINE_STATUS).should('have.text', 'Unsaved'); - // Saved - cy.get(TIMELINE_STATUS).should('be.visible'); - cy.get(TIMELINE_STATUS) - .invoke('text') - .should('match', /^Saved/); + addNameToTimelineAndSave('Test'); - executeTimelineKQL('agent.name : *'); + // Saved + cy.get(TIMELINE_STATUS).should('not.exist'); - // Saved but has unsaved changes - cy.get(TIMELINE_STATUS).should('be.visible'); - cy.get(TIMELINE_STATUS) - .invoke('text') - .should('match', /^Has unsaved changes/); - }); + // Offsetting the extra save that is happening in the background + // for the saved search object. + cy.get(LOADING_INDICATOR).should('be.visible'); + cy.get(LOADING_INDICATOR).should('not.exist'); + + executeTimelineKQL('agent.name : *'); + + // Saved but has unsaved changes + cy.get(TIMELINE_STATUS).should('be.visible'); + cy.get(TIMELINE_STATUS) + .invoke('text') + .should('match', /^Unsaved changes/); }); - describe('saves timeline as new', () => { - before(() => { - deleteTimelines(); - login(); - visitWithTimeRange(TIMELINES_URL); - }); + it('should save timelines as new', () => { + visitWithTimeRange(TIMELINES_URL); + cy.get(ROWS).should('have.length', '0'); - it('should save timelines as new', { tags: ['@ess', '@serverless'] }, () => { - cy.get(ROWS).should('have.length', '0'); + createTimeline(); + addNameToTimelineAndSave('First'); - createTimeline(); - addNameToTimelineAndSave('First'); - addNameToTimelineAndSaveAsNew('Second'); - closeTimeline(); + // Offsetting the extra save that is happening in the background + // for the saved search object. + cy.get(LOADING_INDICATOR).should('be.visible'); + cy.get(LOADING_INDICATOR).should('not.exist'); - cy.get(ROWS).should('have.length', '2'); - cy.get(ROWS) - .first() - .invoke('text') - .should('match', /Second/); - cy.get(ROWS).last().invoke('text').should('match', /First/); - }); + addNameToTimelineAndSaveAsNew('Second'); + closeTimeline(); + + cy.get(ROWS).should('have.length', '2'); + cy.get(ROWS) + .first() + .invoke('text') + .should('match', /Second/); + cy.get(ROWS).last().invoke('text').should('match', /First/); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts index a7b4191d8b470..ad72dfd2f6ca3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts @@ -5,13 +5,7 @@ * 2.0. */ -import { - ADD_FILTER, - SERVER_SIDE_EVENT_COUNT, - TIMELINE_KQLMODE_FILTER, - TIMELINE_KQLMODE_SEARCH, - TIMELINE_SEARCH_OR_FILTER, -} from '../../../screens/timeline'; +import { ADD_FILTER, SERVER_SIDE_EVENT_COUNT } from '../../../screens/timeline'; import { LOADING_INDICATOR } from '../../../screens/security_header'; import { login } from '../../../tasks/login'; @@ -22,9 +16,11 @@ import { changeTimelineQueryLanguage, executeTimelineKQL, executeTimelineSearch, - showDataProviderQueryBuilder, + selectKqlFilterMode, + selectKqlSearchMode, } from '../../../tasks/timeline'; import { waitForTimelinesPanelToBeLoaded } from '../../../tasks/timelines'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; import { hostsUrl, TIMELINES_URL } from '../../../urls/navigation'; @@ -32,10 +28,11 @@ describe('Timeline search and filters', { tags: ['@ess', '@serverless'] }, () => describe('timeline search or filter KQL bar', () => { beforeEach(() => { login(); + deleteTimelines(); visitWithTimeRange(hostsUrl('allHosts')); }); - it('executes a KQL query', () => { + it('should execute a KQL query', () => { const hostExistsQuery = 'host.name: *'; openTimelineUsingToggle(); executeTimelineKQL(hostExistsQuery); @@ -43,7 +40,7 @@ describe('Timeline search and filters', { tags: ['@ess', '@serverless'] }, () => cy.get(SERVER_SIDE_EVENT_COUNT).should(($count) => expect(+$count.text()).to.be.gt(0)); }); - it('executes a Lucene query', () => { + it('should execute a Lucene query', () => { const messageProcessQuery = 'message:Process\\ zsh*'; openTimelineUsingToggle(); changeTimelineQueryLanguage('lucene'); @@ -53,22 +50,19 @@ describe('Timeline search and filters', { tags: ['@ess', '@serverless'] }, () => }); }); - // FLAKY: https://github.com/elastic/kibana/issues/169882 - describe.skip('Update kqlMode for timeline', () => { + describe('Update kqlMode for timeline', () => { beforeEach(() => { login(); + deleteTimelines(); visit(TIMELINES_URL); waitForTimelinesPanelToBeLoaded(); openTimelineUsingToggle(); cy.intercept('PATCH', '/api/timeline').as('update'); cy.get(LOADING_INDICATOR).should('not.exist'); - showDataProviderQueryBuilder(); - cy.get(TIMELINE_SEARCH_OR_FILTER).click(); - cy.get(TIMELINE_SEARCH_OR_FILTER).should('exist'); }); it('should be able to update timeline kqlMode with filter', () => { - cy.get(TIMELINE_KQLMODE_FILTER).click(); + selectKqlFilterMode(); addNameToTimelineAndSave('Test'); cy.wait('@update').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); @@ -78,7 +72,7 @@ describe('Timeline search and filters', { tags: ['@ess', '@serverless'] }, () => }); it('should be able to update timeline kqlMode with search', () => { - cy.get(TIMELINE_KQLMODE_SEARCH).click(); + selectKqlSearchMode(); addNameToTimelineAndSave('Test'); cy.wait('@update').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts index 0f1a513fc5d86..83de06466f251 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { IS_SERVERLESS, CLOUD_SERVERLESS } from '../env_var_names_constants'; import { getDataTestSubjectSelector } from '../helpers/common'; import { GLOBAL_FILTERS_CONTAINER } from './date_picker'; @@ -204,9 +205,15 @@ export const ALERT_ASSIGNEES_SELECT_PANEL = export const ALERT_ASSIGNEES_UPDATE_BUTTON = '[data-test-subj="securitySolutionAssigneesApplyButton"]'; -export const ALERT_USER_AVATAR = (assignee: string) => - `[data-test-subj="securitySolutionUsersAvatar-${assignee}"][title='${assignee}']`; +export const ALERT_USER_AVATAR = (assignee: string) => { + let expectedAssignee = assignee; + if (Cypress.env(IS_SERVERLESS) && !Cypress.env(CLOUD_SERVERLESS)) { + expectedAssignee = `test ${expectedAssignee}`; + } + + return `[data-test-subj^="securitySolutionUsersAvatar-"][title='${expectedAssignee}']`; +}; export const ALERT_AVATARS_PANEL = '[data-test-subj="securitySolutionUsersAvatarsPanel"]'; export const ALERT_ASIGNEES_COLUMN = diff --git a/x-pack/test/security_solution_cypress/cypress/screens/common/data_grid.ts b/x-pack/test/security_solution_cypress/cypress/screens/common/data_grid.ts index 3c86283af97b0..5a9dfe248cba3 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/common/data_grid.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/common/data_grid.ts @@ -39,10 +39,3 @@ export const DATA_GRID_FULL_SCREEN = export const DATA_GRID_FIELD_SORT_BTN = '[data-test-subj="dataGridColumnSortingButton"]'; export const DATA_GRID_COLUMN_ORDER_BTN = '[data-test-subj="dataGridColumnSelectorButton"]'; - -export const DATA_GRID_COLUMNS = '.euiDataGridHeaderCell__content'; - -export const COLUMN_ORDER_POPUP = { - TIMESTAMP: '[data-test-subj="dataGridColumnSelectorColumnItem-@timestamp"]', - REASON: '[data-test-subj="dataGridColumnSelectorColumnItem-kibana.alert.reason"]', -}; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts index e416eae01a186..e7095ac71b236 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts @@ -40,8 +40,6 @@ import { ANALYZER_PREVIEW_TEST_ID, SESSION_PREVIEW_TEST_ID, RESPONSE_BUTTON_TEST_ID, - WORKFLOW_STATUS_TITLE_TEST_ID, - WORKFLOW_STATUS_DETAILS_TEST_ID, } from '@kbn/security-solution-plugin/public/flyout/document_details/right/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; @@ -69,10 +67,6 @@ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_TITLE = getDataTe export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_DETAILS = getDataTestSubjectSelector( MITRE_ATTACK_DETAILS_TEST_ID ); -export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_TITLE = - getDataTestSubjectSelector(WORKFLOW_STATUS_TITLE_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_WORKFLOW_STATUS_DETAILS = - getDataTestSubjectSelector(WORKFLOW_STATUS_DETAILS_TEST_ID); /* Investigation section */ diff --git a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts index 35ed8f63b216b..85b3f32df8292 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts @@ -6,7 +6,7 @@ */ import type { TimelineFilter } from '../objects/timeline'; -import { getDataTestSubjectSelector, getDataTestSubjectSelectorStartWith } from '../helpers/common'; +import { getDataTestSubjectSelector } from '../helpers/common'; export const ADD_NOTE_BUTTON = '[data-test-subj="add-note"]'; @@ -24,13 +24,8 @@ export const SELECT_CASE = (id: string) => { return `[data-test-subj="cases-table-row-select-${id}"]`; }; -export const CORRELATION_EVENT_TABLE_CELL = - '[data-test-subj="eql-events-table"] [data-test-subj="statefulCell"]'; - export const CLOSE_TIMELINE_BTN = '[data-test-subj="close-timeline"]'; -export const COMBO_BOX = 'button.euiFilterSelectItem[role="option"]'; - export const COMBO_BOX_INPUT = '[data-test-subj="comboBoxInput"]'; export const CREATE_NEW_TIMELINE = '[data-test-subj="timeline-new"]'; @@ -47,24 +42,8 @@ export const DATAGRID_HEADER = (header: string) => { return `[data-test-subj="dataGridHeaderCell-${header}"]`; }; -export const DATE_PICKER_END = '[data-test-subj="superDatePickerendDatePopoverButton"]'; - -export const DATE_PICKER_START = '[data-test-subj="superDatePickerstartDatePopoverButton"]'; - -export const DELETE_TIMELINE_BTN = '[data-test-subj="delete-timeline"]'; - -export const DELETION_CONFIRMATION = '[data-test-subj="confirmModalConfirmButton"]'; - -export const DESTINATION_IP_KPI = '[data-test-subj="siem-timeline-destination-ip-kpi"]'; - -export const FAVORITE_TIMELINE = '[data-test-subj="timeline-favorite-filled-star"]'; - export const FIELD_BROWSER = '[data-test-subj="show-field-browser"]'; -export const GRAPH_TAB_BUTTON = '[data-test-subj="timelineTabs-graph"]'; - -export const HOST_KPI = '[data-test-subj="siem-timeline-host-kpi"]'; - export const ID_HEADER_FIELD = '[data-test-subj="timeline"] [data-test-subj="header-text-_id"]'; export const ID_TOGGLE_FIELD = @@ -77,16 +56,10 @@ export const LOCKED_ICON = '[data-test-subj="timeline-date-picker-lock-button"]' export const UNLOCKED_ICON = '[data-test-subj="timeline-date-picker-unlock-button"]'; -export const NOTES = '[data-test-subj="note-card-body"]'; - export const NOTE_CARD_CONTENT = '[data-test-subj="notes"]'; -export const EVENT_NOTE = '[data-test-subj="timeline-notes-button-small"]'; - export const NOTE_DESCRIPTION = '[data-test-subj="note-preview-description"]'; -export const NOTE_PREVIEW = '[data-test-subj^="note-preview"]'; - export const NOTES_TEXT_AREA = '[data-test-subj="add-a-note"] textarea'; export const NOTES_TAB_BUTTON = '[data-test-subj="timelineTabs-notes"]'; @@ -108,21 +81,10 @@ export const OPEN_TIMELINE_ICON = '[data-test-subj="open-timeline-button"]'; export const OPEN_TIMELINE_MODAL = '[data-test-subj="open-timeline-modal"]'; -export const CLOSE_OPEN_TIMELINE_MODAL_BTN = `${OPEN_TIMELINE_MODAL} > button`; - -export const OPEN_TIMELINE_TEMPLATE_ICON = - '[data-test-subj="open-timeline-modal-body-filter-template"]'; - export const PIN_EVENT = '[data-test-subj="pin"]'; -export const PINNED_TAB_BUTTON = '[data-test-subj="timelineTabs-pinned"]'; - -export const PROCESS_KPI = '[data-test-subj="siem-timeline-process-kpi"'; - export const PROVIDER_BADGE = '[data-test-subj="providerBadge"]'; -export const PROVIDER_BADGE_DELETE = '.delete-data-provider'; - export const RESET_FIELDS = '[data-test-subj="fields-browser-container"] [data-test-subj="reset-fields"]'; @@ -133,17 +95,12 @@ export const SEARCH_OR_FILTER_CONTAINER = export const INDICATOR_MATCH_ROW_RENDER = '[data-test-subj="threat-match-row"]'; -export const QUERY_EVENT_TABLE_CELL = - '[data-test-subj="query-events-table"] [data-test-subj="statefulCell"]'; - export const QUERY_TAB_BUTTON = '[data-test-subj="timelineTabs-query"]'; export const SERVER_SIDE_EVENT_COUNT = '[data-test-subj="server-side-event-count"]'; export const ALERTS_TABLE_COUNT = `[data-test-subj="toolbar-alerts-count"]`; -export const SOURCE_IP_KPI = '[data-test-subj="siem-timeline-source-ip-kpi"]'; - export const STAR_ICON = '[data-test-subj="timeline-favorite-empty-star"]'; export const TIMELINE_COLUMN_SPINNER = '[data-test-subj="timeline-loading-spinner"]'; @@ -173,8 +130,6 @@ export const TIMELINE_DATA_PROVIDER_VALUE = `[data-test-subj="value"]`; export const SAVE_DATA_PROVIDER_BTN = `[data-test-subj="save"]`; -export const TIMELINE_DESCRIPTION = '[data-test-subj="timeline-description"]'; - export const TIMELINE_DESCRIPTION_INPUT = '[data-test-subj="save-timeline-description"]'; export const TIMELINE_DROPPED_DATA_PROVIDERS = '[data-test-subj="providerContainer"]'; @@ -218,8 +173,6 @@ export const TIMELINE_FLYOUT = '[data-test-subj="timeline-flyout"]'; export const TIMELINE_FLYOUT_HEADER = '[data-test-subj="query-tab-flyout-header"]'; -export const TIMELINE_FLYOUT_BODY = '[data-test-subj="query-tab-flyout-body"]'; - export const TIMELINE_HEADER = '[data-test-subj="timeline-hide-show-container"]'; export const TIMELINE_INSPECT_BUTTON = `${TIMELINE_FLYOUT} [data-test-subj="inspect-empty-button"]`; @@ -228,7 +181,7 @@ export const TIMELINE_PANEL = `[data-test-subj="timeline-flyout-header-panel"]`; export const TIMELINE_QUERY = '[data-test-subj="timelineQueryInput"]'; -export const TIMELINE_SETTINGS_ICON = '[data-test-subj="settings-plus-in-circle"]'; +export const TIMELINE_SETTINGS_ICON = '[data-test-subj="timeline-create-open-control"]'; export const TIMELINE_SEARCH_OR_FILTER = '[data-test-subj="timeline-select-search-or-filter"]'; @@ -255,8 +208,6 @@ export const TIMESTAMP_TOGGLE_FIELD = export const TOGGLE_TIMELINE_EXPAND_EVENT = '[data-test-subj="expand-event"]'; -export const TIMELINE_SAVE_MODAL_OPEN_BUTTON = '[data-test-subj="save-timeline-btn"]'; - export const TIMELINE_SAVE_MODAL = '[data-test-subj="save-timeline-modal"]'; export const TIMELINE_EDIT_MODAL_SAVE_BUTTON = '[data-test-subj="save-button"]'; @@ -299,17 +250,11 @@ export const TIMELINE_TAB_CONTENT_GRAPHS_NOTES = export const TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN = '[data-test-subj="event-fields-table-row-@timestamp"] [data-test-subj="showExtraActionsButton"]'; -export const USER_KPI = '[data-test-subj="siem-timeline-user-kpi"]'; - export const TIMELINE_STATUS = '[data-test-subj="timeline-status"]'; -export const SAVE_TIMELINE_BTN_TOOLTIP = '[data-test-subj="save-timeline-btn-tooltip"]'; - export const ALERT_TABLE_SEVERITY_VALUES = '[data-test-subj="formatted-field-kibana.alert.severity"]'; -export const ALERT_TABLE_ACTIONS_HEADER = '[data-gridcell-column-id="expandColumn"]'; - export const ALERT_TABLE_FILE_NAME_HEADER = '[data-gridcell-column-id="file.name"]'; export const ALERT_TABLE_SEVERITY_HEADER = '[data-gridcell-column-id="kibana.alert.severity"]'; @@ -349,14 +294,6 @@ export const TIMELINE_DATE_PICKER_CONTAINER = getDataTestSubjectSelector( 'timeline-date-picker-container' ); -export const OPEN_TIMELINE_MODAL_SEARCH_BAR = `${OPEN_TIMELINE_MODAL} ${getDataTestSubjectSelector( - 'search-bar' -)}`; - -export const OPEN_TIMELINE_MODAL_TIMELINE_NAMES = `${OPEN_TIMELINE_MODAL} ${getDataTestSubjectSelectorStartWith( - 'timeline-title-' -)}`; - export const TIMELINE_FILTER_BADGE = `[data-test-subj^='timeline-filters-container'] [data-test-subj^="filter-badge"]`; export const NEW_TIMELINE_ACTION = getDataTestSubjectSelector('new-timeline-action'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/timelines.ts b/x-pack/test/security_solution_cypress/cypress/screens/timelines.ts index a90faeb6e80f3..92343b07f3b99 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/timelines.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/timelines.ts @@ -61,3 +61,5 @@ export const TIMELINES_OVERVIEW_SEARCH = `${TIMELINES_OVERVIEW} [data-test-subj= export const TIMELINES_OVERVIEW_TABLE = `${TIMELINES_OVERVIEW} [data-test-subj="timelines-table"]`; export const ROWS = '.euiTableRow'; + +export const TIMELINES_TAB_TEMPLATE = '[data-test-subj="timeline-tab-template"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/support/es_archiver.ts b/x-pack/test/security_solution_cypress/cypress/support/es_archiver.ts index c9f271265a1d1..a5149b9df1e12 100644 --- a/x-pack/test/security_solution_cypress/cypress/support/es_archiver.ts +++ b/x-pack/test/security_solution_cypress/cypress/support/es_archiver.ts @@ -18,7 +18,7 @@ export const esArchiver = ( ): EsArchiver => { const log = new ToolingLog({ level: 'verbose', writeTo: process.stdout }); - const isSnapshotServerless = config.env.IS_SERVERLESS; + const isServerless = config.env.IS_SERVERLESS; const isCloudServerless = config.env.CLOUD_SERVERLESS; const serverlessCloudUser = { @@ -27,7 +27,7 @@ export const esArchiver = ( }; let authOverride; - if (!isSnapshotServerless) { + if (isServerless) { authOverride = isCloudServerless ? serverlessCloudUser : systemIndicesSuperuser; } diff --git a/x-pack/test/security_solution_cypress/cypress/support/saml_auth.ts b/x-pack/test/security_solution_cypress/cypress/support/saml_auth.ts new file mode 100644 index 0000000000000..0026f6c91ec27 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/support/saml_auth.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ToolingLog } from '@kbn/tooling-log'; + +import { SecurityRoleName } from '@kbn/security-solution-plugin/common/test'; +import { HostOptions, SamlSessionManager } from '@kbn/test'; + +export const samlAuthentication = async ( + on: Cypress.PluginEvents, + config: Cypress.PluginConfigOptions +): Promise => { + const log = new ToolingLog({ level: 'verbose', writeTo: process.stdout }); + + const kbnHost = config.env.KIBANA_URL || config.env.BASE_URL; + + const kbnUrl = new URL(kbnHost); + + const hostOptions: HostOptions = { + protocol: kbnUrl.protocol as 'http' | 'https', + hostname: kbnUrl.hostname, + port: parseInt(kbnUrl.port, 10), + username: config.env.ELASTICSEARCH_USERNAME, + password: config.env.ELASTICSEARCH_PASSWORD, + }; + + on('task', { + getSessionCookie: async (role: string | SecurityRoleName): Promise => { + const sessionManager = new SamlSessionManager({ + hostOptions, + log, + isCloud: config.env.CLOUD_SERVERLESS, + }); + return sessionManager.getSessionCookieForRole(role); + }, + }); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts b/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts index 02ebebb6c10ea..73d17b26ab93b 100644 --- a/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts +++ b/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts @@ -39,7 +39,7 @@ function createUser(username: string, password: string, roles: string[] = []): v password, roles, full_name: username, - email: '', + email: `${username}@elastic.co`, }; rootRequest({ diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/alert_assignments.ts b/x-pack/test/security_solution_cypress/cypress/tasks/alert_assignments.ts index c0adfbf1d78fa..9dcb6bd8bdd7d 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/alert_assignments.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/alert_assignments.ts @@ -27,7 +27,7 @@ import { } from '../screens/alerts'; import { PAGE_TITLE } from '../screens/common/page'; import { DOCUMENT_DETAILS_FLYOUT_HEADER_ASSIGNEES } from '../screens/expandable_flyout/alert_details_right_panel'; -import { selectFirstPageAlerts } from './alerts'; +import { expandFirstAlertActions, selectFirstPageAlerts } from './alerts'; import { login } from './login'; import { visitWithTimeRange } from './navigation'; @@ -56,8 +56,8 @@ export const loadPageAs = (url: string, role?: SecurityRoleName) => { waitForPageTitleToBeShown(); }; -export const openAlertAssigningActionMenu = (alertIndex = 0) => { - cy.get(TIMELINE_CONTEXT_MENU_BTN).eq(alertIndex).click(); +export const openFirstAlertAssigningActionMenu = () => { + expandFirstAlertActions(); cy.get(ALERT_ASSIGN_CONTEXT_MENU_ITEM).click(); }; @@ -93,8 +93,8 @@ export const alertsTableMoreActionsAreNotAvailable = () => { cy.get(TIMELINE_CONTEXT_MENU_BTN).should('not.exist'); }; -export const asigneesMenuItemsAreNotAvailable = (alertIndex = 0) => { - cy.get(TIMELINE_CONTEXT_MENU_BTN).eq(alertIndex).click(); +export const asigneesMenuItemsAreNotAvailable = () => { + expandFirstAlertActions(); cy.get(ALERT_ASSIGN_CONTEXT_MENU_ITEM).should('not.exist'); cy.get(ALERT_UNASSIGN_CONTEXT_MENU_ITEM).should('not.exist'); }; @@ -126,12 +126,9 @@ export const alertsTableShowsAssigneesForAllAlerts = (users: SecurityRoleName[]) }); }; -export const alertsTableShowsAssigneesBadgeForAlert = ( - users: SecurityRoleName[], - alertIndex = 0 -) => { +export const alertsTableShowsAssigneesBadgeForFirstAlert = (users: SecurityRoleName[]) => { cy.get(ALERT_ASIGNEES_COLUMN) - .eq(alertIndex) + .first() .within(() => { cy.get(ALERT_ASSIGNEES_COUNT_BADGE).contains(users.length); users.forEach((user) => cy.get(`.euiAvatar${ALERT_USER_AVATAR(user)}`).should('not.exist')); @@ -166,10 +163,9 @@ export const selectAlertAssignee = (assignee: string) => { /** * This will update assignees for selected alert * @param users The list of assugnees to update. If assignee is not assigned yet it will be assigned, otherwise it will be unassigned - * @param alertIndex The index of the alert in the alerts table */ -export const updateAssigneesForAlert = (users: SecurityRoleName[], alertIndex = 0) => { - openAlertAssigningActionMenu(alertIndex); +export const updateAssigneesForFirstAlert = (users: SecurityRoleName[]) => { + openFirstAlertAssigningActionMenu(); waitForAssigneesToPopulatePopover(); users.forEach((user) => selectAlertAssignee(user)); updateAlertAssignees(); @@ -201,8 +197,8 @@ export const bulkUpdateAssignees = (users: SecurityRoleName[]) => { cy.get(ALERTS_TABLE_ROW_LOADER).should('not.exist'); }; -export const removeAllAssigneesForAlert = (alertIndex = 0) => { - cy.get(TIMELINE_CONTEXT_MENU_BTN).eq(alertIndex).click(); +export const removeAllAssigneesForFirstAlert = () => { + expandFirstAlertActions(); cy.get(ALERT_UNASSIGN_CONTEXT_MENU_ITEM).click(); cy.get(ALERTS_TABLE_ROW_LOADER).should('not.exist'); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts b/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts index cc1a06d3545de..a976336100d2f 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts @@ -273,7 +273,7 @@ export const selectCountTable = () => { }; export const selectAlertsHistogram = () => { - cy.get(SELECT_HISTOGRAM).click({ force: true }); + cy.get(SELECT_HISTOGRAM).click(); }; export const goToAcknowledgedAlerts = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/all_cases.ts b/x-pack/test/security_solution_cypress/cypress/tasks/all_cases.ts index 90d41a92c8f16..b81aaa8b8909b 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/all_cases.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/all_cases.ts @@ -12,13 +12,13 @@ import { } from '../screens/all_cases'; export const goToCreateNewCase = () => { - cy.get(ALL_CASES_CREATE_NEW_CASE_BTN, { timeout: 60000 }).click({ force: true }); + cy.get(ALL_CASES_CREATE_NEW_CASE_BTN, { timeout: 60000 }).click(); }; export const goToCaseDetails = () => { - cy.get(ALL_CASES_NAME).click({ force: true }); + cy.get(ALL_CASES_NAME).click(); }; export const goToEditExternalConnection = () => { - cy.get(EDIT_EXTERNAL_CONNECTION).click({ force: true }); + cy.get(EDIT_EXTERNAL_CONNECTION).click(); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/case_details.ts b/x-pack/test/security_solution_cypress/cypress/tasks/case_details.ts index 0609c784064a7..269e5311b1d10 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/case_details.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/case_details.ts @@ -14,9 +14,9 @@ import { } from '../screens/case_details'; export const deleteCase = () => { - cy.get(CASE_ACTIONS).first().click({ force: true }); - cy.get(CASE_DELETE).click({ force: true }); - cy.get(DELETE_CASE_CONFIRM_BUTTON).click({ force: true }); + cy.get(CASE_ACTIONS).first().click(); + cy.get(CASE_DELETE).click(); + cy.get(DELETE_CASE_CONFIRM_BUTTON).click(); }; export const openCaseTimeline = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/common.ts b/x-pack/test/security_solution_cypress/cypress/tasks/common.ts index b7d0062cd5d02..21a20a7027a12 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/common.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/common.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { recurse } from 'cypress-recurse'; import { KIBANA_LOADING_ICON } from '../screens/security_header'; import { EUI_BASIC_TABLE_LOADING } from '../screens/common/controls'; @@ -81,3 +82,13 @@ export const waitForTableToLoad = () => { cy.get(EUI_BASIC_TABLE_LOADING).should('exist'); cy.get(EUI_BASIC_TABLE_LOADING).should('not.exist'); }; + +export const waitForTabToBeLoaded = (tabId: string) => { + recurse( + () => cy.get(tabId).should('be.visible').click(), + ($el) => expect($el).to.have.class('euiTab-isSelected'), + { + delay: 500, + } + ); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/fields_browser.ts b/x-pack/test/security_solution_cypress/cypress/tasks/fields_browser.ts index e970ed1eb3da4..c31196a96a550 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/fields_browser.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/fields_browser.ts @@ -51,7 +51,7 @@ export const clearFieldsBrowser = () => { }; export const closeFieldsBrowser = () => { - cy.get(FIELD_BROWSER_CLOSE_BTN).click({ force: true }); + cy.get(FIELD_BROWSER_CLOSE_BTN).click(); cy.get(FIELDS_BROWSER_FILTER_INPUT).should('not.exist'); }; @@ -85,7 +85,7 @@ export const removesMessageField = () => { }; export const removeField = (fieldName: string) => { - cy.get(GET_FIELD_CHECKBOX(fieldName)).uncheck({ force: true }); + cy.get(GET_FIELD_CHECKBOX(fieldName)).uncheck(); }; export const resetFields = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/hosts/all_hosts.ts b/x-pack/test/security_solution_cypress/cypress/tasks/hosts/all_hosts.ts index 44009de3e530d..7c891050c6aee 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/hosts/all_hosts.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/hosts/all_hosts.ts @@ -8,7 +8,7 @@ import { ALL_HOSTS_TABLE, HOSTS_NAMES } from '../../screens/hosts/all_hosts'; export const openFirstHostDetails = () => { - cy.get(HOSTS_NAMES).first().click({ force: true }); + cy.get(HOSTS_NAMES).first().click(); }; export const waitForAllHostsToBeLoaded = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/hosts/events.ts b/x-pack/test/security_solution_cypress/cypress/tasks/hosts/events.ts index f92adb475d9df..5b1aa90a7266c 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/hosts/events.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/hosts/events.ts @@ -15,26 +15,22 @@ import { } from '../../screens/hosts/events'; export const addsHostGeoCityNameToHeader = () => { - cy.get(HOST_GEO_CITY_NAME_CHECKBOX).check({ - force: true, - }); + cy.get(HOST_GEO_CITY_NAME_CHECKBOX).check(); }; export const addsHostGeoCountryNameToHeader = () => { - cy.get(HOST_GEO_COUNTRY_NAME_CHECKBOX).check({ - force: true, - }); + cy.get(HOST_GEO_COUNTRY_NAME_CHECKBOX).check(); }; export const openEventsViewerFieldsBrowser = () => { - cy.get(EVENTS_VIEWER_FIELDS_BUTTON).click({ force: true }); + cy.get(EVENTS_VIEWER_FIELDS_BUTTON).click(); cy.get(SERVER_SIDE_EVENT_COUNT).should('not.have.text', '0'); cy.get(FIELDS_BROWSER_CONTAINER).should('exist'); }; export const opensInspectQueryModal = () => { - cy.get(INSPECT_QUERY).should('exist').trigger('mousemove', { force: true }); - cy.get(INSPECT_QUERY).should('exist').click({ force: true }); + cy.get(INSPECT_QUERY).should('exist').trigger('mousemove'); + cy.get(INSPECT_QUERY).should('exist').click(); }; export const waitsForEventsToBeLoaded = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/hosts/main.ts b/x-pack/test/security_solution_cypress/cypress/tasks/hosts/main.ts index fd271d13cb1c8..f1d9a5b3859a4 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/hosts/main.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/hosts/main.ts @@ -11,11 +11,12 @@ import { SESSIONS_TAB, UNCOMMON_PROCESSES_TAB, } from '../../screens/hosts/main'; +import { waitForTabToBeLoaded } from '../common'; -export const openAllHosts = () => cy.get(ALL_HOSTS_TAB).click({ force: true }); +export const openAllHosts = () => waitForTabToBeLoaded(ALL_HOSTS_TAB); -export const openEvents = () => cy.get(EVENTS_TAB).click({ force: true }); +export const openEvents = () => waitForTabToBeLoaded(EVENTS_TAB); -export const openUncommonProcesses = () => cy.get(UNCOMMON_PROCESSES_TAB).click({ force: true }); +export const openUncommonProcesses = () => waitForTabToBeLoaded(UNCOMMON_PROCESSES_TAB); -export const openSessions = () => cy.get(SESSIONS_TAB).click({ force: true }); +export const openSessions = () => waitForTabToBeLoaded(SESSIONS_TAB); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts index fb2a93770f8e7..90c9d245c3bba 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts @@ -41,8 +41,22 @@ export const getEnvAuth = (role: SecurityRoleName): User => { }; export const login = (role?: SecurityRoleName): void => { - const user = role ? getEnvAuth(role) : defaultUser; - loginWithUser(user); + let testRole = ''; + + if (Cypress.env(IS_SERVERLESS)) { + if (!role) { + testRole = Cypress.env(CLOUD_SERVERLESS) ? 'admin' : 'system_indices_superuser'; + } else { + testRole = role; + } + cy.task('getSessionCookie', testRole).then((cookie) => { + cy.setCookie('sid', cookie as string); + }); + cy.visit('/'); + } else { + const user = role ? getEnvAuth(role) : defaultUser; + loginWithUser(user); + } }; export const loginWithUser = (user: User): void => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/network/flows.ts b/x-pack/test/security_solution_cypress/cypress/tasks/network/flows.ts index b9febb6a39381..5aa9ae55688cc 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/network/flows.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/network/flows.ts @@ -48,5 +48,5 @@ export const clickOnShowTopN = () => { export const clickOnCopyValue = () => { cy.get(COPY).first().focus(); - cy.focused().click({ force: true }); // eslint-disable-line cypress/unsafe-to-chain-command + cy.focused().click(); // eslint-disable-line cypress/unsafe-to-chain-command }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts index 5d175ed84f34d..c71eb590f1fea 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts @@ -9,7 +9,6 @@ import { recurse } from 'cypress-recurse'; import type { Timeline, TimelineFilter } from '../objects/timeline'; import { ALL_CASES_CREATE_NEW_CASE_TABLE_BTN } from '../screens/all_cases'; -import { BASIC_TABLE_LOADING } from '../screens/common'; import { FIELDS_BROWSER_CHECKBOX } from '../screens/fields_browser'; import { LOADING_INDICATOR } from '../screens/security_header'; import { EQL_QUERY_VALIDATION_SPINNER } from '../screens/create_new_rule'; @@ -21,11 +20,8 @@ import { ATTACH_TIMELINE_TO_EXISTING_CASE_ICON, ATTACH_TIMELINE_TO_NEW_CASE_ICON, CLOSE_TIMELINE_BTN, - COMBO_BOX, COMBO_BOX_INPUT, CREATE_NEW_TIMELINE, - DELETE_TIMELINE_BTN, - DELETION_CONFIRMATION, FIELD_BROWSER, ID_HEADER_FIELD, ID_TOGGLE_FIELD, @@ -52,19 +48,16 @@ import { TIMESTAMP_TOGGLE_FIELD, TOGGLE_TIMELINE_EXPAND_EVENT, CREATE_NEW_TIMELINE_TEMPLATE, - OPEN_TIMELINE_TEMPLATE_ICON, TIMELINE_SAVE_MODAL, TIMELINE_EDIT_MODAL_SAVE_BUTTON, TIMELINE_EDIT_MODAL_SAVE_AS_NEW_SWITCH, TIMELINE_PROGRESS_BAR, QUERY_TAB_BUTTON, - CLOSE_OPEN_TIMELINE_MODAL_BTN, TIMELINE_ADD_FIELD_BUTTON, TIMELINE_DATA_PROVIDER_FIELD, TIMELINE_DATA_PROVIDER_OPERATOR, TIMELINE_DATA_PROVIDER_VALUE, SAVE_DATA_PROVIDER_BTN, - EVENT_NOTE, TIMELINE_CORRELATION_INPUT, TIMELINE_CORRELATION_TAB, TIMELINE_CREATE_TIMELINE_FROM_TEMPLATE_BTN, @@ -83,19 +76,18 @@ import { TIMELINE_LUCENELANGUAGE_BUTTON, TIMELINE_KQLLANGUAGE_BUTTON, TIMELINE_QUERY, - PROVIDER_BADGE, - PROVIDER_BADGE_DELETE, ESQL_TAB, - OPEN_TIMELINE_MODAL_TIMELINE_NAMES, - OPEN_TIMELINE_MODAL_SEARCH_BAR, - OPEN_TIMELINE_MODAL, NEW_TIMELINE_ACTION, SAVE_TIMELINE_ACTION, TOGGLE_DATA_PROVIDER_BTN, SAVE_TIMELINE_ACTION_BTN, + TIMELINE_SEARCH_OR_FILTER, + TIMELINE_KQLMODE_FILTER, + TIMELINE_KQLMODE_SEARCH, } from '../screens/timeline'; -import { REFRESH_BUTTON, TIMELINE } from '../screens/timelines'; -import { drag, drop } from './common'; + +import { REFRESH_BUTTON, TIMELINE, TIMELINES_TAB_TEMPLATE } from '../screens/timelines'; +import { drag, drop, waitForTabToBeLoaded } from './common'; import { closeFieldsBrowser, filterFieldsBrowser } from './fields_browser'; @@ -156,15 +148,7 @@ export const goToNotesTab = (): Cypress.Chainable> => { return cy.get(NOTES_TAB_BUTTON); }; -export const goToEsqlTab = () => { - recurse( - () => cy.get(ESQL_TAB).should('be.visible').click(), - ($el) => expect($el).to.have.class('euiTab-isSelected'), - { - delay: 500, - } - ); -}; +export const goToEsqlTab = () => waitForTabToBeLoaded(ESQL_TAB); export const goToCorrelationTab = () => { cy.get(TIMELINE_CORRELATION_TAB).click(); @@ -211,8 +195,7 @@ export const addEqlToTimeline = (eql: string) => { export const addFilter = (filter: TimelineFilter): Cypress.Chainable> => { cy.get(ADD_FILTER).click(); cy.get(TIMELINE_FILTER_FIELD).type(`${filter.field}{downarrow}{enter}`); - cy.get(TIMELINE_FILTER_OPERATOR).type(filter.operator); - cy.get(COMBO_BOX).contains(filter.operator).trigger('click'); + cy.get(TIMELINE_FILTER_OPERATOR).type(`${filter.operator}{downarrow}{enter}`); if (filter.operator !== 'exists') { cy.get(TIMELINE_FILTER_VALUE).type(`${filter.value}{enter}`); } @@ -313,20 +296,11 @@ export const clickIdToggleField = () => { }); }; -export const closeOpenTimelineModal = () => { - cy.get(CLOSE_OPEN_TIMELINE_MODAL_BTN).click({ force: true }); -}; - export const closeTimeline = () => { cy.get(CLOSE_TIMELINE_BTN).filter(':visible').click(); cy.get(QUERY_TAB_BUTTON).should('not.be.visible'); }; -export const removeDataProvider = () => { - cy.get(PROVIDER_BADGE).click(); - cy.get(PROVIDER_BADGE_DELETE).click(); -}; - export const createNewTimeline = () => { cy.get(NEW_TIMELINE_ACTION).should('be.visible').trigger('click'); cy.get(CREATE_NEW_TIMELINE).eq(0).should('be.visible').click({ force: true }); @@ -336,8 +310,16 @@ export const openCreateTimelineOptionsPopover = () => { cy.get(NEW_TIMELINE_ACTION).filter(':visible').should('be.visible').click(); }; -export const closeCreateTimelineOptionsPopover = () => { - cy.get(TIMELINE_SETTINGS_ICON).filter(':visible').should('be.visible').type('{esc}'); +export const createTimelineTemplateOptionsPopoverBottomBar = () => { + recurse( + () => { + cy.get(TIMELINE_SETTINGS_ICON).filter(':visible').should('be.visible').click(); + return cy.get(CREATE_NEW_TIMELINE_TEMPLATE).eq(0); + }, + (sub) => sub.is(':visible') + ); + + cy.get(CREATE_NEW_TIMELINE_TEMPLATE).eq(0).should('be.visible').click(); }; export const createNewTimelineTemplate = () => { @@ -351,7 +333,7 @@ export const executeTimelineKQL = (query: string) => { }; export const executeTimelineSearch = (query: string) => { - cy.get(TIMELINE_QUERY).type(`${query} {enter}`, { force: true }); + cy.get(TIMELINE_QUERY).type(`${query} {enter}`); }; export const expandFirstTimelineEventDetails = () => { @@ -377,12 +359,6 @@ export const saveTimeline = () => { }); }; -export const deleteTimeline = () => { - cy.get(TIMELINE_COLLAPSED_ITEMS_BTN).click(); - cy.get(DELETE_TIMELINE_BTN).click(); - cy.get(DELETION_CONFIRMATION).click(); -}; - export const markAsFavorite = () => { cy.intercept('PATCH', 'api/timeline/_favorite').as('markedAsFavourite'); cy.get(STAR_ICON).click({ force: true }); @@ -403,10 +379,12 @@ export const openTimelineFromSettings = () => { cy.get(OPEN_TIMELINE_ICON).click(); }; -export const openTimelineTemplateFromSettings = (id: string) => { - openTimelineFromSettings(); - cy.get(OPEN_TIMELINE_TEMPLATE_ICON).click({ force: true }); - cy.get(TIMELINE_TITLE_BY_ID(id)).click({ force: true }); +export const openTimelineTemplate = (id: string) => { + cy.get(TIMELINE_TITLE_BY_ID(id)).click(); +}; + +export const openTimelineTemplatesTab = () => { + cy.get(TIMELINES_TAB_TEMPLATE).click(); }; export const openTimelineById = (timelineId: string): Cypress.Chainable> => { @@ -428,13 +406,6 @@ export const pinFirstEvent = (): Cypress.Chainable> => { return cy.get(PIN_EVENT).first().click({ force: true }); }; -export const persistNoteToFirstEvent = (notes: string) => { - cy.get(EVENT_NOTE).first().click({ force: true }); - cy.get(NOTES_TEXT_AREA).type(notes); - cy.get(ADD_NOTE_BUTTON).click(); - cy.get(NOTES_TAB_BUTTON).find('.euiBadge'); -}; - export const populateTimeline = () => { executeTimelineKQL(hostExistsQuery); cy.get(SERVER_SIDE_EVENT_COUNT).should('not.have.text', '0'); @@ -509,32 +480,20 @@ export const expandEventAction = () => { cy.get(TIMELINE_COLLAPSED_ITEMS_BTN).first().click(); }; -export const setKibanaTimezoneToUTC = () => - cy - .request({ - method: 'POST', - url: 'internal/kibana/settings', - body: { changes: { 'dateFormat:tz': 'UTC' } }, - headers: { - 'kbn-xsrf': 'set-kibana-timezone-utc', - 'x-elastic-internal-origin': 'security-solution', - }, - }) - .then(() => { - cy.reload(); - }); +const showDataProviderQueryBuilder = () => { + cy.get(TOGGLE_DATA_PROVIDER_BTN).should('have.attr', 'aria-pressed', 'false'); + cy.get(TOGGLE_DATA_PROVIDER_BTN).click(); + cy.get(TOGGLE_DATA_PROVIDER_BTN).should('have.attr', 'aria-pressed', 'true'); +}; -export const openTimelineFromOpenTimelineModal = (timelineName: string) => { - cy.get(OPEN_TIMELINE_MODAL_TIMELINE_NAMES).should('have.lengthOf.gt', 0); - cy.get(BASIC_TABLE_LOADING).should('not.exist'); - cy.get(OPEN_TIMELINE_MODAL_SEARCH_BAR).type(`${timelineName}{enter}`); - cy.get(OPEN_TIMELINE_MODAL_TIMELINE_NAMES).should('have.lengthOf', 1); - cy.get(OPEN_TIMELINE_MODAL).should('contain.text', timelineName); - cy.get(OPEN_TIMELINE_MODAL_TIMELINE_NAMES).first().click(); +export const selectKqlFilterMode = () => { + showDataProviderQueryBuilder(); + cy.get(TIMELINE_SEARCH_OR_FILTER).click(); + cy.get(TIMELINE_KQLMODE_FILTER).click(); }; -export const showDataProviderQueryBuilder = () => { - cy.get(TOGGLE_DATA_PROVIDER_BTN).should('have.attr', 'aria-pressed', 'false'); - cy.get(TOGGLE_DATA_PROVIDER_BTN).trigger('click'); - cy.get(TOGGLE_DATA_PROVIDER_BTN).should('have.attr', 'aria-pressed', 'true'); +export const selectKqlSearchMode = () => { + showDataProviderQueryBuilder(); + cy.get(TIMELINE_SEARCH_OR_FILTER).click(); + cy.get(TIMELINE_KQLMODE_SEARCH).click(); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts b/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts index 355bf7447e8a2..1e59727a26527 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts @@ -20,7 +20,11 @@ import { TIMELINE_ITEM_ACTION_BTN, } from '../screens/timelines'; import { SELECT_ALL_CHECKBOX } from '../screens/shared'; -import { CREATE_NEW_TIMELINE_WITH_BORDER } from '../screens/timeline'; +import { + CREATE_NEW_TIMELINE_WITH_BORDER, + TIMELINE_COLLAPSED_ITEMS_BTN, + TIMELINE_CREATE_TIMELINE_FROM_TEMPLATE_BTN, +} from '../screens/timeline'; export const expandNotes = () => { cy.get(EXPAND_NOTES_BTN).click(); @@ -65,4 +69,10 @@ export const exportSelectedTimelines = () => { cy.get(EXPORT_TIMELINE_ACTION).click(); }; -export const createTimeline = () => cy.get(CREATE_NEW_TIMELINE_WITH_BORDER).click(); +export const createTimeline = () => + cy.get(CREATE_NEW_TIMELINE_WITH_BORDER).should('be.visible').click(); + +export const createTimelineFromFirstTemplateInList = () => { + cy.get(TIMELINE_COLLAPSED_ITEMS_BTN).first().click(); + cy.get(TIMELINE_CREATE_TIMELINE_FROM_TEMPLATE_BTN).click(); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tsconfig.json b/x-pack/test/security_solution_cypress/cypress/tsconfig.json index 45b526793e98e..d6a08efd3073f 100644 --- a/x-pack/test/security_solution_cypress/cypress/tsconfig.json +++ b/x-pack/test/security_solution_cypress/cypress/tsconfig.json @@ -40,6 +40,6 @@ "@kbn/management-settings-ids", "@kbn/es-query", "@kbn/ml-plugin", - "@kbn/license-management-plugin" + "@kbn/license-management-plugin", ] } diff --git a/x-pack/test/security_solution_cypress/package.json b/x-pack/test/security_solution_cypress/package.json index 6b366061b381c..fe8585e530f4e 100644 --- a/x-pack/test/security_solution_cypress/package.json +++ b/x-pack/test/security_solution_cypress/package.json @@ -43,8 +43,8 @@ "cypress:run:qa:serverless:explore": "yarn cypress:qa:serverless --spec './cypress/e2e/explore/**/*.cy.ts'", "cypress:run:qa:serverless:rule_management": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/rule_management/!(prebuilt_rules)/**/*.cy.ts'", "cypress:run:qa:serverless:rule_management:prebuilt_rules": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/rule_management/prebuilt_rules/**/*.cy.ts'", - "cypress:run:qa:serverless:detection_engine": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/rule_management/!(exceptions)/**/*.cy.ts'", - "cypress:run:qa:serverless:detection_engine:exceptions": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/rule_management/exceptions/**/*.cy.ts'", + "cypress:run:qa:serverless:detection_engine": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/detection_engine/!(exceptions)/**/*.cy.ts'", + "cypress:run:qa:serverless:detection_engine:exceptions": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/detection_engine/exceptions/**/*.cy.ts'", "cypress:run:qa:serverless:ai_assistant": "yarn cypress:qa:serverless --spec './cypress/e2e/ai_assistant/**/*.cy.ts'" } } \ No newline at end of file diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts index 5fa459636b44e..aab49b3c5c299 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts @@ -27,7 +27,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const find = getService('find'); const unzipPromisify = promisify(unzip); - describe('Endpoint Exceptions', function () { + // FLAKY: https://github.com/elastic/kibana/issues/173184 + describe.skip('Endpoint Exceptions', function () { targetTags(this, ['@ess', '@serverless']); this.timeout(10 * 60_000); diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark/v1.ts similarity index 92% rename from x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark.ts rename to x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark/v1.ts index f67febd8e4a13..129b59880312b 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark/v1.ts @@ -5,13 +5,13 @@ * 2.0. */ import expect from '@kbn/expect'; -import type { GetBenchmarkResponse } from '@kbn/cloud-security-posture-plugin/common/types_old'; +import type { GetBenchmarkResponse } from '@kbn/cloud-security-posture-plugin/common/types/latest'; import { ELASTIC_HTTP_VERSION_HEADER, X_ELASTIC_INTERNAL_ORIGIN_REQUEST, } from '@kbn/core-http-common'; -import { FtrProviderContext } from '../../../ftr_provider_context'; -import { createPackagePolicy } from '../../../../../test/api_integration/apis/cloud_security_posture/helper'; // eslint-disable-line @kbn/imports/no_boundary_crossing +import { FtrProviderContext } from '../../../../ftr_provider_context'; +import { createPackagePolicy } from '../../../../../../test/api_integration/apis/cloud_security_posture/helper'; // eslint-disable-line @kbn/imports/no_boundary_crossing export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -126,7 +126,6 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); expect(res.items.length).equal(3); - expect(res.total).equal(3); }); it(`Should return array size 2 when we set per page to be only 2 (total element is still 3)`, async () => { @@ -138,7 +137,6 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); expect(res.items.length).equal(2); - expect(res.total).equal(3); }); it(`Should return array size 2 when we set per page to be only 2 (total element is still 3)`, async () => { @@ -150,7 +148,6 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); expect(res.items.length).equal(1); - expect(res.total).equal(3); }); it(`Should return empty array when we set page to be above the last page number`, async () => { @@ -162,7 +159,6 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); expect(res.items.length).equal(0); - expect(res.total).equal(3); }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark/v2.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark/v2.ts new file mode 100644 index 0000000000000..dce12caae3769 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/benchmark/v2.ts @@ -0,0 +1,131 @@ +/* + * Copyright 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 type { GetBenchmarkResponse } from '@kbn/cloud-security-posture-plugin/common/types/latest'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; +import { createPackagePolicy } from '../../../../../../test/api_integration/apis/cloud_security_posture/helper'; // eslint-disable-line @kbn/imports/no_boundary_crossing + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + + describe('GET /internal/cloud_security_posture/benchmark', function () { + // security_exception: action [indices:admin/create] is unauthorized for user [elastic] with effective roles [superuser] on restricted indices [.fleet-actions-7], this action is granted by the index privileges [create_index,manage,all] + this.tags(['failsOnMKI']); + + let agentPolicyId: string; + let agentPolicyId2: string; + let agentPolicyId3: string; + let agentPolicyId4: string; + + beforeEach(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + + const { body: agentPolicyResponse } = await supertest + .post(`/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy', + namespace: 'default', + }); + + agentPolicyId = agentPolicyResponse.item.id; + + const { body: agentPolicyResponse2 } = await supertest + .post(`/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy 2', + namespace: 'default', + }); + + agentPolicyId2 = agentPolicyResponse2.item.id; + + const { body: agentPolicyResponse3 } = await supertest + .post(`/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy 3', + namespace: 'default', + }); + + agentPolicyId3 = agentPolicyResponse3.item.id; + + const { body: agentPolicyResponse4 } = await supertest + .post(`/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test policy 4', + namespace: 'default', + }); + + agentPolicyId4 = agentPolicyResponse4.item.id; + + await createPackagePolicy( + supertest, + agentPolicyId, + 'cspm', + 'cloudbeat/cis_aws', + 'aws', + 'cspm', + 'CSPM-1' + ); + + await createPackagePolicy( + supertest, + agentPolicyId2, + 'kspm', + 'cloudbeat/cis_k8s', + 'vanilla', + 'kspm', + 'KSPM-1' + ); + + await createPackagePolicy( + supertest, + agentPolicyId3, + 'vuln_mgmt', + 'cloudbeat/vuln_mgmt_aws', + 'aws', + 'vuln_mgmt', + 'CNVM-1' + ); + + await createPackagePolicy( + supertest, + agentPolicyId4, + 'kspm', + 'cloudbeat/cis_k8s', + 'vanilla', + 'kspm', + 'KSPM-2' + ); + }); + + afterEach(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + }); + + it(`Should return all benchmarks if user has CSP integrations`, async () => { + const { body: res }: { body: GetBenchmarkResponse } = await supertest + .get(`/internal/cloud_security_posture/benchmarks`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'xxx') + .set('kbn-xsrf', 'xxxx') + .expect(200); + + expect(res.items.length).equal(3); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts index 9a4a40ab4add9..460f4ac43bb43 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts @@ -13,7 +13,8 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./status/status_not_deployed_not_installed')); loadTestFile(require.resolve('./status/status_indexed')); loadTestFile(require.resolve('./status/status_indexing')); - loadTestFile(require.resolve('./benchmark')); + loadTestFile(require.resolve('./benchmark/v1')); + loadTestFile(require.resolve('./benchmark/v2')); loadTestFile(require.resolve('./find_csp_benchmark_rule')); loadTestFile(require.resolve('./telemetry')); diff --git a/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts b/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts index 43b325f9f469d..60753a0ad9bd9 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts @@ -19,6 +19,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const POLICY_NAME = `policy-${Math.random()}`; describe('Create enrich policy', function () { + // TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="enrichPoliciesEmptyPromptCreateButton"]) + this.tags(['failsOnMKI']); + before(async () => { log.debug('Creating test index'); try { diff --git a/x-pack/test_serverless/functional/test_suites/common/management/index_management/enrich_policies.ts b/x-pack/test_serverless/functional/test_suites/common/management/index_management/enrich_policies.ts index 707bd598bb3d8..66819c1e6d233 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/index_management/enrich_policies.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/index_management/enrich_policies.ts @@ -20,6 +20,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const ENRICH_POLICY_NAME = 'test-policy-1'; describe('Enrich policies tab', function () { + // TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="kibana-chrome"]) + this.tags(['failsOnMKI']); + before(async () => { log.debug('Creating required index and enrich policy'); try { diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts index 41a75282e22e9..90aea100989cc 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts @@ -22,8 +22,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'svlCommonNavigation', ]); - // Failing: See https://github.com/elastic/kibana/issues/173165 - // Failing: See https://github.com/elastic/kibana/issues/173165 + // FLAKY: https://github.com/elastic/kibana/issues/173165 describe.skip('Header menu', () => { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); @@ -52,7 +51,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Discover fallback link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogExplorer.navigateTo({ + pageState: { + // avoid aligning with the test data, because that's what Discover + // does later in this test and we wouldn't be able to check the time + // range state transfer + time: { + from: '2023-08-03T00:00:00.000Z', + to: '2023-08-03T12:00:00.000Z', + mode: 'absolute', + }, + }, + }); await PageObjects.header.waitUntilLoadingHasFinished(); }); @@ -97,7 +107,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Discover tabs', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogExplorer.navigateTo({ + pageState: { + // avoid aligning with the test data, because that's what Discover + // does later in this test and we wouldn't be able to check the time + // range state transfer + time: { + from: '2023-08-03T00:00:00.000Z', + to: '2023-08-03T12:00:00.000Z', + mode: 'absolute', + }, + }, + }); await PageObjects.header.waitUntilLoadingHasFinished(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts index 9f3d9b7e39c86..ad6f7b7278e48 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts @@ -16,7 +16,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./filter_controls')); loadTestFile(require.resolve('./flyout')); loadTestFile(require.resolve('./header_menu')); - loadTestFile(require.resolve('./header_menu')); loadTestFile(require.resolve('./flyout_highlights.ts')); }); } diff --git a/yarn.lock b/yarn.lock index bf873a460349f..69b2efda65bde 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1544,10 +1544,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@60.0.1": - version "60.0.1" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-60.0.1.tgz#da8f8afd7200651d7efbf7d71b2dd60bee9299d1" - integrity sha512-Sl386SApHeK+IIx7R/8hAA8ribkyRi+Qi5iI7ENqywtRp1en4A75OSS9+wWy03uUvN8OcrA3Aaia2gTYHA+x0w== +"@elastic/charts@61.0.3": + version "61.0.3" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-61.0.3.tgz#77a2e1f18a39dd4b421a91edfd30f19cde740594" + integrity sha512-TY7hUieULTchNFgvpi6Rt7wMxrYMCmuZ4bbS6szOGBIY4WKJvZCgMfgZ2kUdC5MVG/jEzd8Qu+Xixce7GDpRxw== dependencies: "@popperjs/core" "^2.11.8" bezier-easing "^2.1.0" @@ -8903,6 +8903,13 @@ resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.9.tgz#d868b6febb02666330410fe7f58f3c4b8258be7b" integrity sha512-MNl+rT5UmZeilaPxAVs6YaPC2m6aA8rofviZbhbxpPpl61uKodfdQVsBtgJGTqGizEf02oW3tsVe7FYB8kK14A== +"@types/cli-progress@^3.11.5": + version "3.11.5" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.5.tgz#9518c745e78557efda057e3f96a5990c717268c3" + integrity sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g== + dependencies: + "@types/node" "*" + "@types/clone@~2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@types/clone/-/clone-2.1.1.tgz#9b880d0ce9b1f209b5e0bd6d9caa38209db34024" @@ -12903,7 +12910,7 @@ cheerio-select@^2.1.0: domhandler "^5.0.3" domutils "^3.0.1" -cheerio@^1.0.0-rc.10, cheerio@^1.0.0-rc.3: +cheerio@^1.0.0-rc.12, cheerio@^1.0.0-rc.3: version "1.0.0-rc.12" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== @@ -13062,10 +13069,17 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-progress@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== + dependencies: + string-width "^4.2.3" + cli-spinners@^2.2.0, cli-spinners@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" - integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-table3@^0.6.1, cli-table3@~0.6.1: version "0.6.1" @@ -16631,10 +16645,10 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.2, fast-glob@^3.2.7, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.2, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -25694,9 +25708,9 @@ react-remove-scroll-bar@^2.3.4: tslib "^2.0.0" react-remove-scroll@^2.5.6: - version "2.5.6" - resolved "https://packages.atlassian.com/api/npm/npm-remote/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz#7510b8079e9c7eebe00e65a33daaa3aa29a10336" - integrity sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg== + version "2.5.7" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" + integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== dependencies: react-remove-scroll-bar "^2.3.4" react-style-singleton "^2.2.1" @@ -28628,10 +28642,10 @@ tabbable@^5.3.3: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.3.3.tgz#aac0ff88c73b22d6c3c5a50b1586310006b47fbf" integrity sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA== -table@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== +table@^6.8.0, table@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2"