From ee986415c871ca92bfc4f0682ab631dc574b5176 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Mon, 4 Sep 2023 19:58:26 +0200 Subject: [PATCH 01/84] [Ops] Fix typos in bk pipeline stubs (#165617) ## Summary In the created stubs, some of the buildkite steps used `agent` instead of `agents`, this failed the steps. This PR fixes these typos. see: https://buildkite.com/elastic/kibana-tests/builds/20#018a6109-c878-489d-a4e4-ad4db1e75e87 --- .../quality-gates/pipeline.tests-production.yaml | 4 ++-- .buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml | 8 ++++---- .../pipelines/quality-gates/pipeline.tests-staging.yaml | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index f2a96d0e23f92..f283e2e4f6c9a 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -5,12 +5,12 @@ env: steps: - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Observability specific Kibana tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Security specific Kibana tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - wait: ~ diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml index 1c9047c38ae92..7bb446f5713f0 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -5,22 +5,22 @@ env: steps: - label: ":pipeline::kibana::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Kibana specific tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - label: ":pipeline::fleet::seedling: Trigger Fleet Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Fleet specific Kibana tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Security specific Kibana tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - label: ":pipeline::lock::seedling: Trigger Control Plane Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Control Plane specific Kibana tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - wait: ~ diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml index bb2381df1fd28..2f3e497fc6d31 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml @@ -5,12 +5,12 @@ env: steps: - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Observability specific Kibana tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" command: echo "replace me with Security specific Kibana tests" - agent: + agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - wait: ~ From 300e2985c18498e35b2b82cd88c86459471beed3 Mon Sep 17 00:00:00 2001 From: Coen Warmer Date: Mon, 4 Sep 2023 20:18:58 +0200 Subject: [PATCH 02/84] [Observability AI Assistant] Use POST for get_apm_services_list (#165621) Co-authored-by: Dario Gieselaar --- .../get_apm_services_list.ts | 4 ++-- .../routes/assistant_functions/route.ts | 23 +++++++++---------- .../public/functions/index.ts | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/apm/public/assistant_functions/get_apm_services_list.ts b/x-pack/plugins/apm/public/assistant_functions/get_apm_services_list.ts index 83f1c53d5ca70..9047f768449e5 100644 --- a/x-pack/plugins/apm/public/assistant_functions/get_apm_services_list.ts +++ b/x-pack/plugins/apm/public/assistant_functions/get_apm_services_list.ts @@ -66,10 +66,10 @@ export function registerGetApmServicesListFunction({ } as const, }, async ({ arguments: args }, signal) => { - return callApmApi('GET /internal/apm/assistant/get_services_list', { + return callApmApi('POST /internal/apm/assistant/get_services_list', { signal, params: { - query: args, + body: args, }, }); } diff --git a/x-pack/plugins/apm/server/routes/assistant_functions/route.ts b/x-pack/plugins/apm/server/routes/assistant_functions/route.ts index 486fdb57fca84..436f514e423ff 100644 --- a/x-pack/plugins/apm/server/routes/assistant_functions/route.ts +++ b/x-pack/plugins/apm/server/routes/assistant_functions/route.ts @@ -18,7 +18,6 @@ import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; import { getMlClient } from '../../lib/helpers/get_ml_client'; import { getRandomSampler } from '../../lib/helpers/get_random_sampler'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; -import { environmentRt } from '../default_api_types'; import { getServicesItems } from '../services/get_services/get_services_items'; import { CorrelationValue, @@ -26,20 +25,20 @@ import { getApmCorrelationValues, } from './get_apm_correlation_values'; import { - type APMDownstreamDependency, downstreamDependenciesRouteRt, getAssistantDownstreamDependencies, + type APMDownstreamDependency, } from './get_apm_downstream_dependencies'; import { errorRouteRt, getApmErrorDocument } from './get_apm_error_document'; import { getApmServiceSummary, - type ServiceSummary, serviceSummaryRouteRt, + type ServiceSummary, } from './get_apm_service_summary'; import { - type ApmTimeseries, getApmTimeseries, getApmTimeseriesRt, + type ApmTimeseries, } from './get_apm_timeseries'; const getApmTimeSeriesRoute = createApmServerRoute({ @@ -204,15 +203,15 @@ interface ApmServicesListItem { type ApmServicesListContent = ApmServicesListItem[]; const getApmServicesListRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/assistant/get_services_list', + endpoint: 'POST /internal/apm/assistant/get_services_list', params: t.type({ - query: t.intersection([ + body: t.intersection([ t.type({ start: t.string, end: t.string, }), t.partial({ - 'service.environment': environmentRt.props.environment, + 'service.environment': t.string, healthStatus: t.array( t.union([ t.literal(ServiceHealthStatus.unknown), @@ -229,9 +228,9 @@ const getApmServicesListRoute = createApmServerRoute({ }, handler: async (resources): Promise<{ content: ApmServicesListContent }> => { const { params } = resources; - const { query } = params; + const { body } = params; - const { healthStatus } = query; + const { healthStatus } = body; const [apmEventClient, apmAlertsClient, mlClient, randomSampler] = await Promise.all([ @@ -245,8 +244,8 @@ const getApmServicesListRoute = createApmServerRoute({ }), ]); - const start = datemath.parse(query.start)?.valueOf()!; - const end = datemath.parse(query.end)?.valueOf()!; + const start = datemath.parse(body.start)?.valueOf()!; + const end = datemath.parse(body.end)?.valueOf()!; const serviceItems = await getServicesItems({ apmAlertsClient, @@ -254,7 +253,7 @@ const getApmServicesListRoute = createApmServerRoute({ documentType: ApmDocumentType.TransactionMetric, start, end, - environment: query['service.environment'] ?? ENVIRONMENT_ALL.value, + environment: body['service.environment'] || ENVIRONMENT_ALL.value, kuery: '', logger: resources.logger, randomSampler, diff --git a/x-pack/plugins/observability_ai_assistant/public/functions/index.ts b/x-pack/plugins/observability_ai_assistant/public/functions/index.ts index fd2e3b9c6bca2..a0c1a264bfb51 100644 --- a/x-pack/plugins/observability_ai_assistant/public/functions/index.ts +++ b/x-pack/plugins/observability_ai_assistant/public/functions/index.ts @@ -56,7 +56,7 @@ export async function registerFunctions({ ); 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. + 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. `; From f08c027c4b5378948f6b00cdb3f761562bf30a39 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 02:28:44 +0100 Subject: [PATCH 03/84] skip flaky suite (#104578) --- x-pack/test/functional/apps/discover/saved_searches.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/discover/saved_searches.ts b/x-pack/test/functional/apps/discover/saved_searches.ts index 76b380274f207..8b6f830a11406 100644 --- a/x-pack/test/functional/apps/discover/saved_searches.ts +++ b/x-pack/test/functional/apps/discover/saved_searches.ts @@ -45,7 +45,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.common.unsetTime(); }); - describe('Customize time range', () => { + // FLAKY: https://github.com/elastic/kibana/issues/104578 + describe.skip('Customize time range', () => { it('should be possible to customize time range for saved searches on dashboards', async () => { await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.clickNewDashboard(); From b8a189623fcfe1192a6d70d8cab93e9fecf8edf5 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 02:30:44 +0100 Subject: [PATCH 04/84] skip flaky suite (#165565) --- .../test_suites/common/index_management/indices.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts index f9700dfaff70a..cc165c517f6cf 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts @@ -17,7 +17,8 @@ export default function ({ getService }: FtrProviderContext) { const es = getService('es'); const log = getService('log'); - describe('Indices', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165565 + describe.skip('Indices', function () { const indexName = `index-${Math.random()}`; before(async () => { From db52c362a76b712a836a0a66b3bcadaac0c9dc41 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 02:33:46 +0100 Subject: [PATCH 05/84] @brokenInServerless tag for cypress suite --- .../rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts index 447f399c24a20..87083b935e190 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts @@ -52,7 +52,8 @@ const EXPIRED_EXCEPTION_ITEM_NAME = 'Sample exception item'; const NON_EXPIRED_EXCEPTION_ITEM_NAME = 'Sample exception item with future expiration'; -describe('Detection rules, bulk duplicate', { tags: ['@ess', '@serverless'] }, () => { +// Flaky on serverless +describe('Detection rules, bulk duplicate', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); }); From 2e514e2c2ae2888ab0f3887189bae49a588e9a21 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 02:35:03 +0100 Subject: [PATCH 06/84] @brokenInServerless tag for cypress suite --- .../cypress/e2e/investigations/timelines/data_providers.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts index c3add90e6531f..df2d45b0ee4a3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts @@ -29,7 +29,8 @@ import { getTimeline } from '../../../objects/timeline'; import { HOSTS_URL } from '../../../urls/navigation'; import { cleanKibana, scrollToBottom } from '../../../tasks/common'; -describe('timeline data providers', { tags: ['@ess', '@serverless'] }, () => { +// Failing in serverless +describe('timeline data providers', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); }); From 0eca252d0eedd40479433337d7eafe59954d97c6 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 02:37:20 +0100 Subject: [PATCH 07/84] @brokenInServerless tag for cypress suite --- .../shared_exception_list_page/import_lists.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/import_lists.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/import_lists.cy.ts index ac9c0be83b5c1..ac10e916d762f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/import_lists.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/import_lists.cy.ts @@ -20,7 +20,8 @@ import { import { login, visitWithoutDateRange } from '../../../../tasks/login'; import { EXCEPTIONS_URL } from '../../../../urls/navigation'; -describe('Import Lists', { tags: ['@ess', '@serverless'] }, () => { +// Flaky in serverless +describe('Import Lists', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { const LIST_TO_IMPORT_FILENAME = 'cypress/fixtures/7_16_exception_list.ndjson'; before(() => { cy.task('esArchiverResetKibana'); From 2284412159f2158e44fe78ba927d909a3d061a42 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 02:46:03 +0100 Subject: [PATCH 08/84] fix(NA): eslint check --- .../bulk_actions/bulk_duplicate_rules.cy.ts | 148 +++++++++--------- 1 file changed, 76 insertions(+), 72 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts index 87083b935e190..b95741083a065 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts @@ -53,83 +53,87 @@ const EXPIRED_EXCEPTION_ITEM_NAME = 'Sample exception item'; const NON_EXPIRED_EXCEPTION_ITEM_NAME = 'Sample exception item with future expiration'; // Flaky on serverless -describe('Detection rules, bulk duplicate', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - before(() => { - cleanKibana(); - }); - - beforeEach(() => { - login(); - // Make sure persisted rules table state is cleared - resetRulesTableState(); - deleteAlertsAndRules(); - cy.task('esArchiverResetKibana'); - createRule( - getNewRule({ name: RULE_NAME, ...defaultRuleData, rule_id: '1', enabled: false }) - ).then((response) => { - createRuleExceptionItem(response.body.id, [ - { - description: 'Exception item for rule default exception list', - entries: [ - { - field: 'user.name', - operator: 'included', - type: 'match', - value: 'some value', - }, - ], - name: EXPIRED_EXCEPTION_ITEM_NAME, - type: 'simple', - expire_time: expiredDate, - }, - { - description: 'Exception item for rule default exception list', - entries: [ - { - field: 'user.name', - operator: 'included', - type: 'match', - value: 'some value', - }, - ], - name: NON_EXPIRED_EXCEPTION_ITEM_NAME, - type: 'simple', - expire_time: futureDate, - }, - ]); +describe( + 'Detection rules, bulk duplicate', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cleanKibana(); }); - visitSecurityDetectionRulesPage(); - disableAutoRefresh(); - }); - - it('Duplicates rules', () => { - selectAllRules(); - duplicateSelectedRulesWithoutExceptions(); - expectManagementTableRules([`${RULE_NAME} [Duplicate]`]); - }); + beforeEach(() => { + login(); + // Make sure persisted rules table state is cleared + resetRulesTableState(); + deleteAlertsAndRules(); + cy.task('esArchiverResetKibana'); + createRule( + getNewRule({ name: RULE_NAME, ...defaultRuleData, rule_id: '1', enabled: false }) + ).then((response) => { + createRuleExceptionItem(response.body.id, [ + { + description: 'Exception item for rule default exception list', + entries: [ + { + field: 'user.name', + operator: 'included', + type: 'match', + value: 'some value', + }, + ], + name: EXPIRED_EXCEPTION_ITEM_NAME, + type: 'simple', + expire_time: expiredDate, + }, + { + description: 'Exception item for rule default exception list', + entries: [ + { + field: 'user.name', + operator: 'included', + type: 'match', + value: 'some value', + }, + ], + name: NON_EXPIRED_EXCEPTION_ITEM_NAME, + type: 'simple', + expire_time: futureDate, + }, + ]); + }); + + visitSecurityDetectionRulesPage(); + disableAutoRefresh(); + }); - describe('With exceptions', () => { - it('Duplicates rules with expired exceptions', () => { + it('Duplicates rules', () => { selectAllRules(); - duplicateSelectedRulesWithExceptions(); + duplicateSelectedRulesWithoutExceptions(); expectManagementTableRules([`${RULE_NAME} [Duplicate]`]); - goToTheRuleDetailsOf(`${RULE_NAME} [Duplicate]`); - goToExceptionsTab(); - assertExceptionItemsExists(EXCEPTION_CARD_ITEM_NAME, [NON_EXPIRED_EXCEPTION_ITEM_NAME]); - viewExpiredExceptionItems(); - assertExceptionItemsExists(EXCEPTION_CARD_ITEM_NAME, [EXPIRED_EXCEPTION_ITEM_NAME]); }); - it('Duplicates rules with exceptions, excluding expired exceptions', () => { - selectAllRules(); - duplicateSelectedRulesWithNonExpiredExceptions(); - expectManagementTableRules([`${RULE_NAME} [Duplicate]`]); - goToTheRuleDetailsOf(`${RULE_NAME} [Duplicate]`); - goToExceptionsTab(); - assertExceptionItemsExists(EXCEPTION_CARD_ITEM_NAME, [NON_EXPIRED_EXCEPTION_ITEM_NAME]); - viewExpiredExceptionItems(); - assertNumberOfExceptionItemsExists(0); + describe('With exceptions', () => { + it('Duplicates rules with expired exceptions', () => { + selectAllRules(); + duplicateSelectedRulesWithExceptions(); + expectManagementTableRules([`${RULE_NAME} [Duplicate]`]); + goToTheRuleDetailsOf(`${RULE_NAME} [Duplicate]`); + goToExceptionsTab(); + assertExceptionItemsExists(EXCEPTION_CARD_ITEM_NAME, [NON_EXPIRED_EXCEPTION_ITEM_NAME]); + viewExpiredExceptionItems(); + assertExceptionItemsExists(EXCEPTION_CARD_ITEM_NAME, [EXPIRED_EXCEPTION_ITEM_NAME]); + }); + + it('Duplicates rules with exceptions, excluding expired exceptions', () => { + selectAllRules(); + duplicateSelectedRulesWithNonExpiredExceptions(); + expectManagementTableRules([`${RULE_NAME} [Duplicate]`]); + goToTheRuleDetailsOf(`${RULE_NAME} [Duplicate]`); + goToExceptionsTab(); + assertExceptionItemsExists(EXCEPTION_CARD_ITEM_NAME, [NON_EXPIRED_EXCEPTION_ITEM_NAME]); + viewExpiredExceptionItems(); + assertNumberOfExceptionItemsExists(0); + }); }); - }); -}); + } +); From a46af0041c2a2b33eb47115c03ddee471e24c8d2 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 03:25:56 +0100 Subject: [PATCH 09/84] fix(NA): eslint check --- .../timelines/data_providers.cy.ts | 98 ++++++++++--------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts index df2d45b0ee4a3..0caaefd1c5e69 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts @@ -30,61 +30,65 @@ import { HOSTS_URL } from '../../../urls/navigation'; import { cleanKibana, scrollToBottom } from '../../../tasks/common'; // Failing in serverless -describe('timeline data providers', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - before(() => { - cleanKibana(); - }); +describe( + 'timeline data providers', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cleanKibana(); + }); - beforeEach(() => { - login(); - visit(HOSTS_URL); - waitForAllHostsToBeLoaded(); - scrollToBottom(); - createNewTimeline(); - addNameAndDescriptionToTimeline(getTimeline()); - populateTimeline(); - }); + beforeEach(() => { + login(); + visit(HOSTS_URL); + waitForAllHostsToBeLoaded(); + scrollToBottom(); + createNewTimeline(); + addNameAndDescriptionToTimeline(getTimeline()); + populateTimeline(); + }); - it('displays the data provider action menu when Enter is pressed', () => { - addDataProvider({ field: 'host.name', operator: 'exists' }); + it('displays the data provider action menu when Enter is pressed', () => { + addDataProvider({ field: 'host.name', operator: 'exists' }); - cy.get(TIMELINE_DATA_PROVIDERS_ACTION_MENU).should('not.exist'); - cy.get(`${TIMELINE_FLYOUT_HEADER} ${TIMELINE_DROPPED_DATA_PROVIDERS}`).focus(); - cy.get(`${TIMELINE_FLYOUT_HEADER} ${TIMELINE_DROPPED_DATA_PROVIDERS}`) - .first() - .parent() - .type('{enter}'); + cy.get(TIMELINE_DATA_PROVIDERS_ACTION_MENU).should('not.exist'); + cy.get(`${TIMELINE_FLYOUT_HEADER} ${TIMELINE_DROPPED_DATA_PROVIDERS}`).focus(); + cy.get(`${TIMELINE_FLYOUT_HEADER} ${TIMELINE_DROPPED_DATA_PROVIDERS}`) + .first() + .parent() + .type('{enter}'); + + cy.get(TIMELINE_DATA_PROVIDERS_ACTION_MENU).should('exist'); + }); - cy.get(TIMELINE_DATA_PROVIDERS_ACTION_MENU).should('exist'); - }); + it.skip( + 'persists timeline when data provider is updated by dragging a field from data grid', + { tags: ['@brokenInServerless'] }, + () => { + updateDataProviderbyDraggingField('host.name', 0); + waitForTimelineChanges(); + cy.reload(); + cy.get(`${GET_TIMELINE_GRID_CELL('host.name')}`) + .first() + .then((hostname) => { + cy.get(TIMELINE_DATA_PROVIDERS_CONTAINER).contains(`host.name: "${hostname.text()}"`); + }); + } + ); - it.skip( - 'persists timeline when data provider is updated by dragging a field from data grid', - { tags: ['@brokenInServerless'] }, - () => { - updateDataProviderbyDraggingField('host.name', 0); + it('persists timeline when a field is added by hover action "Add To Timeline" in data provider ', () => { + addDataProvider({ field: 'host.name', operator: 'exists' }); + waitForTimelineChanges(); + updateDataProviderByFieldHoverAction('host.name', 0); waitForTimelineChanges(); cy.reload(); cy.get(`${GET_TIMELINE_GRID_CELL('host.name')}`) .first() .then((hostname) => { - cy.get(TIMELINE_DATA_PROVIDERS_CONTAINER).contains(`host.name: "${hostname.text()}"`); - }); - } - ); - - it('persists timeline when a field is added by hover action "Add To Timeline" in data provider ', () => { - addDataProvider({ field: 'host.name', operator: 'exists' }); - waitForTimelineChanges(); - updateDataProviderByFieldHoverAction('host.name', 0); - waitForTimelineChanges(); - cy.reload(); - cy.get(`${GET_TIMELINE_GRID_CELL('host.name')}`) - .first() - .then((hostname) => { - cy.get(TIMELINE_DATA_PROVIDERS_CONTAINER).should((dataProviderContainer) => { - expect(dataProviderContainer).to.contain(`host.name: "${hostname.text()}"`); + cy.get(TIMELINE_DATA_PROVIDERS_CONTAINER).should((dataProviderContainer) => { + expect(dataProviderContainer).to.contain(`host.name: "${hostname.text()}"`); + }); }); - }); - }); -}); + }); + } +); From 968e76703722af050c6eea9106555ea3fbf8f3bd Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 03:52:34 +0100 Subject: [PATCH 10/84] @brokenInServerless tag for cypress suite --- .../e2e/exceptions/entry/use_value_list.cy.ts | 143 +++++++++--------- 1 file changed, 74 insertions(+), 69 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/use_value_list.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/use_value_list.cy.ts index e45484e5fb834..b1e2c81b4c420 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/use_value_list.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/use_value_list.cy.ts @@ -50,83 +50,88 @@ const goToRulesAndOpenValueListModal = () => { openValueListsModal(); }; -describe('Use Value list in exception entry', { tags: ['@ess', '@serverless'] }, () => { - before(() => { - cleanKibana(); - login(); - cy.task('esArchiverLoad', { archiveName: 'exceptions' }); - createRule({ - ...getNewRule(), - query: 'user.name:*', - index: ['exceptions*'], - exceptions_list: [], - rule_id: '2', - }); - visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - }); - beforeEach(() => { - createListsIndex(); - }); - - afterEach(() => { - cy.task('esArchiverUnload', 'exceptions'); - }); - - it('Should use value list in exception entry, and validate deleting value list prompt', () => { - const ITEM_NAME = 'Exception item with value list'; - const ITEM_FIELD = 'agent.name'; - - goToRulesAndOpenValueListModal(); - - // Add new value list of type keyword - const listName = 'value_list.txt'; - selectValueListType('keyword'); - selectValueListsFile(listName); - uploadValueList(); - - cy.get(VALUE_LISTS_TABLE) - .find(VALUE_LISTS_ROW) - .should(($row) => { - expect($row.text()).to.contain(listName); - expect($row.text()).to.contain('Keywords'); +// Flaky on serverless +describe( + 'Use Value list in exception entry', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cleanKibana(); + login(); + cy.task('esArchiverLoad', { archiveName: 'exceptions' }); + createRule({ + ...getNewRule(), + query: 'user.name:*', + index: ['exceptions*'], + exceptions_list: [], + rule_id: '2', }); - closeValueListsModal(); - goToRuleDetails(); - goToExceptionsTab(); + visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); + }); + beforeEach(() => { + createListsIndex(); + }); + + afterEach(() => { + cy.task('esArchiverUnload', 'exceptions'); + }); - // open add exception modal - openExceptionFlyoutFromEmptyViewerPrompt(); + it('Should use value list in exception entry, and validate deleting value list prompt', () => { + const ITEM_NAME = 'Exception item with value list'; + const ITEM_FIELD = 'agent.name'; - // add exception item name - addExceptionFlyoutItemName(ITEM_NAME); + goToRulesAndOpenValueListModal(); - addExceptionEntryFieldValue(ITEM_FIELD, 0); - addExceptionEntryOperatorValue('is in list', 0); + // Add new value list of type keyword + const listName = 'value_list.txt'; + selectValueListType('keyword'); + selectValueListsFile(listName); + uploadValueList(); - addExceptionEntryFieldMatchIncludedValue('value_list.txt', 0); + cy.get(VALUE_LISTS_TABLE) + .find(VALUE_LISTS_ROW) + .should(($row) => { + expect($row.text()).to.contain(listName); + expect($row.text()).to.contain('Keywords'); + }); + closeValueListsModal(); + goToRuleDetails(); + goToExceptionsTab(); - // The Close all alerts that match attributes in this exception option is disabled - cy.get(CLOSE_ALERTS_CHECKBOX).should('exist'); - cy.get(CLOSE_ALERTS_CHECKBOX).should('have.attr', 'disabled'); + // open add exception modal + openExceptionFlyoutFromEmptyViewerPrompt(); - // Create exception - submitNewExceptionItem(); + // add exception item name + addExceptionFlyoutItemName(ITEM_NAME); - // displays existing exception items - cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); - cy.get(NO_EXCEPTIONS_EXIST_PROMPT).should('not.exist'); - cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', ITEM_NAME); - cy.get(EXCEPTION_CARD_ITEM_CONDITIONS).should( - 'have.text', - ` ${ITEM_FIELD}included in value_list.txt` - ); + addExceptionEntryFieldValue(ITEM_FIELD, 0); + addExceptionEntryOperatorValue('is in list', 0); - // Go back to value list to delete the existing one - goToRulesAndOpenValueListModal(); + addExceptionEntryFieldMatchIncludedValue('value_list.txt', 0); - deleteValueListsFile(listName); + // The Close all alerts that match attributes in this exception option is disabled + cy.get(CLOSE_ALERTS_CHECKBOX).should('exist'); + cy.get(CLOSE_ALERTS_CHECKBOX).should('have.attr', 'disabled'); - // Toast should be shown because of exception reference - cy.get(EXCEPTIONS_TABLE_MODAL).should('exist'); - }); -}); + // Create exception + submitNewExceptionItem(); + + // displays existing exception items + cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); + cy.get(NO_EXCEPTIONS_EXIST_PROMPT).should('not.exist'); + cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', ITEM_NAME); + cy.get(EXCEPTION_CARD_ITEM_CONDITIONS).should( + 'have.text', + ` ${ITEM_FIELD}included in value_list.txt` + ); + + // Go back to value list to delete the existing one + goToRulesAndOpenValueListModal(); + + deleteValueListsFile(listName); + + // Toast should be shown because of exception reference + cy.get(EXCEPTIONS_TABLE_MODAL).should('exist'); + }); + } +); From 211d2b9ff731608e48b5389b9ff3e73d749d3f90 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 03:54:12 +0100 Subject: [PATCH 11/84] @brokenInServerless tag for cypress suite --- .../rules_table_persistent_state.cy.ts | 259 +++++++++--------- 1 file changed, 132 insertions(+), 127 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts index 7bf4d9e6eef24..675fa704f5430 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts @@ -110,167 +110,172 @@ describe('Rules table: persistent state', { tags: ['@ess', '@serverless'] }, () resetRulesTableState(); }); - describe('while on a happy path', () => { - it('activates management tab by default', () => { - visit(SECURITY_DETECTIONS_RULES_URL); + // Flaky on serverless + describe( + 'while on a happy path', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + it('activates management tab by default', () => { + visit(SECURITY_DETECTIONS_RULES_URL); - expectRulesManagementTab(); - }); - - it('leads to displaying a rule according to the specified filters', () => { - visitRulesTableWithState({ - searchTerm: 'rule', - tags: ['tag-b'], - source: 'custom', - enabled: false, - field: 'name', - order: 'asc', - perPage: 5, - page: 2, - }); - - expectManagementTableRules(['rule 6']); - }); - - it('loads from the url', () => { - visitRulesTableWithState({ - searchTerm: 'rule', - tags: ['tag-b'], - source: 'custom', - enabled: false, - field: 'name', - order: 'asc', - perPage: 5, - page: 2, + expectRulesManagementTab(); }); - expectRulesManagementTab(); - expectFilterSearchTerm('rule'); - expectFilterByTags(['tag-b']); - expectFilterByCustomRules(); - expectFilterByDisabledRules(); - expectTableSorting('Rule', 'asc'); - expectRowsPerPage(5); - expectTablePage(2); - }); + it('leads to displaying a rule according to the specified filters', () => { + visitRulesTableWithState({ + searchTerm: 'rule', + tags: ['tag-b'], + source: 'custom', + enabled: false, + field: 'name', + order: 'asc', + perPage: 5, + page: 2, + }); - it('loads from the session storage', () => { - setStorageState({ - searchTerm: 'test', - tags: ['tag-a'], - source: 'prebuilt', - enabled: true, - field: 'severity', - order: 'desc', - perPage: 10, + expectManagementTableRules(['rule 6']); }); - visit(SECURITY_DETECTIONS_RULES_MANAGEMENT_URL); - - expectRulesManagementTab(); - expectFilterSearchTerm('test'); - expectFilterByTags(['tag-a']); - expectFilterByPrebuiltRules(); - expectFilterByEnabledRules(); - expectTableSorting('Severity', 'desc'); - }); - - it('prefers url state over storage state', () => { - setStorageState({ - searchTerm: 'test', - tags: ['tag-c'], - source: 'prebuilt', - enabled: true, - field: 'severity', - order: 'desc', - perPage: 10, - }); + it('loads from the url', () => { + visitRulesTableWithState({ + searchTerm: 'rule', + tags: ['tag-b'], + source: 'custom', + enabled: false, + field: 'name', + order: 'asc', + perPage: 5, + page: 2, + }); - visitRulesTableWithState({ - searchTerm: 'rule', - tags: ['tag-b'], - source: 'custom', - enabled: false, - field: 'name', - order: 'asc', - perPage: 5, - page: 2, + expectRulesManagementTab(); + expectFilterSearchTerm('rule'); + expectFilterByTags(['tag-b']); + expectFilterByCustomRules(); + expectFilterByDisabledRules(); + expectTableSorting('Rule', 'asc'); + expectRowsPerPage(5); + expectTablePage(2); }); - expectRulesManagementTab(); - expectRulesTableState(); - expectTablePage(2); - }); + it('loads from the session storage', () => { + setStorageState({ + searchTerm: 'test', + tags: ['tag-a'], + source: 'prebuilt', + enabled: true, + field: 'severity', + order: 'desc', + perPage: 10, + }); - describe('and on the rules management tab', () => { - beforeEach(() => { - login(); visit(SECURITY_DETECTIONS_RULES_MANAGEMENT_URL); + + expectRulesManagementTab(); + expectFilterSearchTerm('test'); + expectFilterByTags(['tag-a']); + expectFilterByPrebuiltRules(); + expectFilterByEnabledRules(); + expectTableSorting('Severity', 'desc'); }); - it('persists after reloading the page', () => { - changeRulesTableState(); - goToTablePage(2); + it('prefers url state over storage state', () => { + setStorageState({ + searchTerm: 'test', + tags: ['tag-c'], + source: 'prebuilt', + enabled: true, + field: 'severity', + order: 'desc', + perPage: 10, + }); - cy.reload(); + visitRulesTableWithState({ + searchTerm: 'rule', + tags: ['tag-b'], + source: 'custom', + enabled: false, + field: 'name', + order: 'asc', + perPage: 5, + page: 2, + }); expectRulesManagementTab(); expectRulesTableState(); expectTablePage(2); }); - it('persists after navigating back from a rule details page', () => { - changeRulesTableState(); - goToTablePage(2); + describe('and on the rules management tab', () => { + beforeEach(() => { + login(); + visit(SECURITY_DETECTIONS_RULES_MANAGEMENT_URL); + }); - goToRuleDetails(); - cy.go('back'); + it('persists after reloading the page', () => { + changeRulesTableState(); + goToTablePage(2); - expectRulesManagementTab(); - expectRulesTableState(); - expectTablePage(2); - }); + cy.reload(); - it('persists after navigating to another page inside Security Solution', () => { - changeRulesTableState(); - goToTablePage(2); + expectRulesManagementTab(); + expectRulesTableState(); + expectTablePage(2); + }); - visit(DASHBOARDS_URL); - visit(SECURITY_DETECTIONS_RULES_MANAGEMENT_URL); + it('persists after navigating back from a rule details page', () => { + changeRulesTableState(); + goToTablePage(2); - expectRulesManagementTab(); - expectRulesTableState(); - expectTablePage(1); - }); + goToRuleDetails(); + cy.go('back'); - it('persists after navigating to another page outside Security Solution', () => { - changeRulesTableState(); - goToTablePage(2); + expectRulesManagementTab(); + expectRulesTableState(); + expectTablePage(2); + }); - visit(KIBANA_HOME); - visit(SECURITY_DETECTIONS_RULES_MANAGEMENT_URL); + it('persists after navigating to another page inside Security Solution', () => { + changeRulesTableState(); + goToTablePage(2); - expectRulesManagementTab(); - expectRulesTableState(); - expectTablePage(1); - }); - }); + visit(DASHBOARDS_URL); + visit(SECURITY_DETECTIONS_RULES_MANAGEMENT_URL); - describe('and on the rules monitoring tab', () => { - beforeEach(() => { - login(); - visit(SECURITY_DETECTIONS_RULES_MONITORING_URL); + expectRulesManagementTab(); + expectRulesTableState(); + expectTablePage(1); + }); + + it('persists after navigating to another page outside Security Solution', () => { + changeRulesTableState(); + goToTablePage(2); + + visit(KIBANA_HOME); + visit(SECURITY_DETECTIONS_RULES_MANAGEMENT_URL); + + expectRulesManagementTab(); + expectRulesTableState(); + expectTablePage(1); + }); }); - it('persists the selected tab', () => { - changeRulesTableState(); + describe('and on the rules monitoring tab', () => { + beforeEach(() => { + login(); + visit(SECURITY_DETECTIONS_RULES_MONITORING_URL); + }); - cy.reload(); + it('persists the selected tab', () => { + changeRulesTableState(); - expectRulesMonitoringTab(); + cy.reload(); + + expectRulesMonitoringTab(); + }); }); - }); - }); + } + ); describe('upon state format upgrade', async () => { beforeEach(() => { From 075c6f66781bede209ca1d8eecb82f1f1162b6d1 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 03:55:57 +0100 Subject: [PATCH 12/84] @brokenInServerless tag for cypress suite --- .../cypress/e2e/explore/dashboards/upgrade_risk_score.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/upgrade_risk_score.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/upgrade_risk_score.cy.ts index fcb33ff4de239..5b8ba030ade12 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/upgrade_risk_score.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/upgrade_risk_score.cy.ts @@ -38,7 +38,8 @@ import { ENTITY_ANALYTICS_URL } from '../../../urls/navigation'; const spaceId = 'default'; -describe('Upgrade risk scores', { tags: ['@ess', '@serverless'] }, () => { +// Flaky on serverless +describe('Upgrade risk scores', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); login(); From def8b659ef63bcc2abf512e44ee6160f2cd32eca Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 04:25:43 +0100 Subject: [PATCH 13/84] skip flaky suite (#165563) --- .../test_suites/common/examples/partial_results/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/partial_results/index.ts b/x-pack/test_serverless/functional/test_suites/common/examples/partial_results/index.ts index fa0036812672d..e93f275a0269d 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/partial_results/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/partial_results/index.ts @@ -12,7 +12,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects(['common']); - describe('Partial Results Example', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165563 + describe.skip('Partial Results Example', function () { before(async () => { await PageObjects.common.navigateToApp('partialResultsExample'); From d4130640dfcf04546b4420d0155306e54f1170e8 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 04:29:56 +0100 Subject: [PATCH 14/84] @brokenInServerless tag for cypress suite --- .../cypress/e2e/investigations/timelines/pagination.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts index a8ab36c7bd837..0fa319ec40021 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts @@ -22,8 +22,9 @@ import { populateTimeline } from '../../../tasks/timeline'; import { HOSTS_URL } from '../../../urls/navigation'; +// Flaky on serverless const defaultPageSize = 25; -describe('Pagination', { tags: ['@ess', '@serverless'] }, () => { +describe('Pagination', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); cy.task('esArchiverLoad', { archiveName: 'timeline' }); From 148d341d7066b20fa5e6e20486818e86c0c2d7b8 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 5 Sep 2023 00:53:53 -0400 Subject: [PATCH 15/84] [api-docs] 2023-09-05 Daily api_docs build (#165636) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/451 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.devdocs.json | 94 ++----------------- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_chat.mdx | 2 +- api_docs/cloud_chat_provider.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/log_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 20 ++++ api_docs/observability.mdx | 4 +- .../observability_a_i_assistant.devdocs.json | 8 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 8 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 32 +++++++ api_docs/security_solution.mdx | 4 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 575 files changed, 642 insertions(+), 664 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 899ca0915da84..1675e5db1912c 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-09-04 +date: 2023-09-05 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 866a72b268d5b..17d00954ff5e6 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 9403658cadad8..e69040bbcb687 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-09-04 +date: 2023-09-05 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 cce0276424e68..74220f3e48d63 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index e1b038257f9bf..8bd384647c099 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -408,7 +408,7 @@ "label": "APIEndpoint", "description": [], "signature": [ - "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/title\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /api/apm/androidmaps 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_service_summary\" | \"GET /internal/apm/assistant/get_error_document\" | \"POST /internal/apm/assistant/get_correlation_values\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"GET /internal/apm/assistant/get_services_list\"" + "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/title\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_service_summary\" | \"GET /internal/apm/assistant/get_error_document\" | \"POST /internal/apm/assistant/get_correlation_values\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"POST /internal/apm/assistant/get_services_list\"" ], "path": "x-pack/plugins/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts", "deprecated": false, @@ -455,9 +455,9 @@ "label": "APMServerRouteRepository", "description": [], "signature": [ - "{ \"GET /internal/apm/assistant/get_services_list\": { endpoint: \"GET /internal/apm/assistant/get_services_list\"; params?: ", + "{ \"POST /internal/apm/assistant/get_services_list\": { endpoint: \"POST /internal/apm/assistant/get_services_list\"; params?: ", "TypeC", - "<{ query: ", + "<{ body: ", "IntersectionC", "<[", "TypeC", @@ -468,24 +468,8 @@ "; }>, ", "PartialC", "<{ 'service.environment': ", - "UnionC", - "<[", - "LiteralC", - "<\"ENVIRONMENT_NOT_DEFINED\">, ", - "LiteralC", - "<\"ENVIRONMENT_ALL\">, ", - "BrandC", - "<", "StringC", - ", ", - { - "pluginId": "@kbn/io-ts-utils", - "scope": "common", - "docId": "kibKbnIoTsUtilsPluginApi", - "section": "def-common.NonEmptyStringBrand", - "text": "NonEmptyStringBrand" - }, - ">]>; healthStatus: ", + "; healthStatus: ", "ArrayC", "<", "UnionC", @@ -507,17 +491,7 @@ "ServiceHealthStatus", ".critical>]>>; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { query: { start: string; end: string; } & { 'service.environment'?: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", - "Branded", - " | undefined; healthStatus?: ", + " & { params: { body: { start: string; end: string; } & { 'service.environment'?: string | undefined; healthStatus?: ", "ServiceHealthStatus", "[] | undefined; }; }; }) => Promise<{ content: ApmServicesListContent; }>; } & ", "APMRouteCreateOptions", @@ -711,25 +685,7 @@ "IntersectionC", "<[", "TypeC", - "<{ 'service.environment': ", - "UnionC", - "<[", - "LiteralC", - "<\"ENVIRONMENT_NOT_DEFINED\">, ", - "LiteralC", - "<\"ENVIRONMENT_ALL\">, ", - "BrandC", - "<", - "StringC", - ", ", - { - "pluginId": "@kbn/io-ts-utils", - "scope": "common", - "docId": "kibKbnIoTsUtilsPluginApi", - "section": "def-common.NonEmptyStringBrand", - "text": "NonEmptyStringBrand" - }, - ">]>; 'service.name': ", + "<{ 'service.name': ", "StringC", "; title: ", "StringC", @@ -813,23 +769,15 @@ "StringC", "; offset: ", "StringC", + "; 'service.environment': ", + "StringC", "; }>]>>; start: ", "StringC", "; end: ", "StringC", "; }>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { body: { stats: ({ 'service.environment': \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", - "Branded", - "; 'service.name': string; title: string; timeseries: ({ name: ", + " & { params: { body: { stats: ({ 'service.name': string; title: string; timeseries: ({ name: ", "ApmTimeseriesType", ".transactionThroughput | ", "ApmTimeseriesType", @@ -845,7 +793,7 @@ "LatencyAggregationType", "; } & { 'transaction.type'?: string | undefined; }) | { name: ", "ApmTimeseriesType", - ".errorEventRate; }; } & { filter?: string | undefined; offset?: string | undefined; })[]; start: string; end: string; }; }; }) => Promise<{ content: Omit<", + ".errorEventRate; }; } & { filter?: string | undefined; offset?: string | undefined; 'service.environment'?: string | undefined; })[]; start: string; end: string; }; }; }) => Promise<{ content: Omit<", "ApmTimeseries", ", \"data\">[]; data: ", "ApmTimeseries", @@ -3193,28 +3141,6 @@ "APMRouteHandlerResources", ") => Promise; } & ", "APMRouteCreateOptions", - "; \"POST /api/apm/androidmaps 2023-10-31\": { endpoint: \"POST /api/apm/androidmaps 2023-10-31\"; params?: ", - "TypeC", - "<{ body: ", - "TypeC", - "<{ service_name: ", - "StringC", - "; service_version: ", - "StringC", - "; map_file: ", - "Type", - "; }>; }> | undefined; handler: ({}: ", - "APMRouteHandlerResources", - " & { params: { body: { service_name: string; service_version: string; map_file: string; }; }; }) => Promise<", - { - "pluginId": "fleet", - "scope": "server", - "docId": "kibFleetPluginApi", - "section": "def-server.Artifact", - "text": "Artifact" - }, - " | undefined>; } & ", - "APMRouteCreateOptions", "; \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\": { endpoint: \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 837369f938c06..1f3e0da71d41a 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-09-04 +date: 2023-09-05 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 13727c4c1f12b..7e0cb19b76349 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-09-04 +date: 2023-09-05 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 dc48993d0222d..7c9e072b32a5a 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-09-04 +date: 2023-09-05 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 873de52ad2f0c..b095e025ebb25 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-09-04 +date: 2023-09-05 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 f2d5f4479d27a..b35d2c259da58 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-09-04 +date: 2023-09-05 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 dd1fe659f2303..391741661db72 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-09-04 +date: 2023-09-05 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 ead0c0c8d39bb..34f1b185e06bc 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 9f2bb5580d01e..80664fabad87d 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-09-04 +date: 2023-09-05 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 b1edc370293f3..73b5ef4c2517e 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index 64929c3feb971..8b0f6a65ddd8e 100644 --- a/api_docs/cloud_chat.mdx +++ b/api_docs/cloud_chat.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat title: "cloudChat" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChat plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_chat_provider.mdx b/api_docs/cloud_chat_provider.mdx index bc16410b14fa2..89e27b560261f 100644 --- a/api_docs/cloud_chat_provider.mdx +++ b/api_docs/cloud_chat_provider.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChatProvider title: "cloudChatProvider" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChatProvider plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChatProvider'] --- import cloudChatProviderObj from './cloud_chat_provider.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index e172da2aede66..5410157a3a4e8 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-09-04 +date: 2023-09-05 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 8164d8ba931d5..765d3226f9c3a 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-09-04 +date: 2023-09-05 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 d7e222a6ee385..e0b54f328ba2c 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-09-04 +date: 2023-09-05 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 a16a659373d90..113f43f209db5 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-09-04 +date: 2023-09-05 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 a21182e4f1fa2..6318a4faa542c 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-09-04 +date: 2023-09-05 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 148a26daba742..9886b7a3ea00b 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-09-04 +date: 2023-09-05 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 4a1da09f9f920..a5dd74b6330d1 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-09-04 +date: 2023-09-05 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 23b057247d2f4..66ba3a87e78bb 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-09-04 +date: 2023-09-05 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 9f32e7708d7c5..91b1eb51f287b 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-09-04 +date: 2023-09-05 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 bad94974edecd..a45b5025b2fe9 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-09-04 +date: 2023-09-05 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 cd8663c63a4dd..70949b17f4987 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-09-04 +date: 2023-09-05 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 d26d267c9a539..62d0861bbbf19 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-09-04 +date: 2023-09-05 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 2d057a13b84aa..fde4b2f40f862 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-09-04 +date: 2023-09-05 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 9b47727c9e7f8..d2fa815d40409 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-09-04 +date: 2023-09-05 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 3b8f58af0e36b..c10490b5d7a9a 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-09-04 +date: 2023-09-05 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 b2bbfbc401b91..6e41bcc12d78a 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-09-04 +date: 2023-09-05 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 21ccdfb785eba..0d85b10f37cbd 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-09-04 +date: 2023-09-05 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 d0731896513df..dec5ec2987ed8 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 216ac502d9391..a01b818334271 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 2c9c6e2863f3f..b09904070bf9a 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 96049ce8778e8..bbdf4234fb74b 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 942d230ccf25f..6b0064c8f0858 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 0a25336252232..a63ae77760646 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-09-04 +date: 2023-09-05 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 426ead75115cc..675890ffa1ac8 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-09-04 +date: 2023-09-05 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 f29903433c4cd..90e742bda6198 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index cd1bcec03b3fc..ace6dbb2a4c7d 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 6fa7efd8597d8..be41e8d5bc699 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-09-04 +date: 2023-09-05 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 3c5c09c093b5d..8fd457f066ffe 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-09-04 +date: 2023-09-05 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 1935e646d97be..cf6cd38a5251c 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-09-04 +date: 2023-09-05 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 e7cfe48901da6..07418305cdc71 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-09-04 +date: 2023-09-05 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 c62e9e2ada9a9..f5aaa1ac5bd5c 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-09-04 +date: 2023-09-05 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 61391709eb35f..d72d41002cf5d 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index c2a604376318c..edabbf7f2b416 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 8a15802714534..d977e9d3c6444 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-09-04 +date: 2023-09-05 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 0c1e19017339f..cf353aeb1663c 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index f47fa9e877613..4dc1d165e75fb 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index e6d147e061386..bd676f00bd162 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-09-04 +date: 2023-09-05 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 9b6ffc281d27f..e07f5ea5cd63f 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-09-04 +date: 2023-09-05 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 d848431241b52..38013982ab985 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-09-04 +date: 2023-09-05 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 389e134529495..0e8902fbf0a0f 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index ba5e1c9e2dbf5..fcae81f5883cf 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-09-04 +date: 2023-09-05 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 5dc08f904ccec..039b050b32bc6 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-09-04 +date: 2023-09-05 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 e16aabe5884b4..9f2f3434acb56 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-09-04 +date: 2023-09-05 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 30aa5edb0990f..8f9d323b53023 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-09-04 +date: 2023-09-05 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 be89424ad5dca..f3e7d5eeaee3c 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-09-04 +date: 2023-09-05 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 8d4610f3d9758..214d3d21153e2 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 2b1d1b9e45ecc..7f245d3889e1f 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-09-04 +date: 2023-09-05 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 c18720f2f5b20..ce5cf4cc0939f 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-09-04 +date: 2023-09-05 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 813c498f37fd8..db13ee18b015e 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-09-04 +date: 2023-09-05 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 3c121f16099d2..bc8dff8530b8e 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-09-04 +date: 2023-09-05 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 13612cc6e1bc1..7cb2ca900ab10 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-09-04 +date: 2023-09-05 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 f01b85e9a890a..54c4bb33663b7 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-09-04 +date: 2023-09-05 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 2380f57b1afb6..fe86c6e0074a2 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-09-04 +date: 2023-09-05 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 f8348e3375fc7..58bf0969ecb00 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-09-04 +date: 2023-09-05 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 a2f7b9112a0dc..53425f7e23d24 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-09-04 +date: 2023-09-05 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 aba3d39086e88..a1230a39ce3f2 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-09-04 +date: 2023-09-05 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 8fcf0b01b0a00..9915ed0e2802a 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-09-04 +date: 2023-09-05 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 108f44c2631fa..586539ca0d0aa 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-09-04 +date: 2023-09-05 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 6ad91bcb6a5f8..c394ca0f93615 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-09-04 +date: 2023-09-05 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 8ecb81a2bc8b2..25a6849dd773c 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-09-04 +date: 2023-09-05 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 79873a75bf1b3..0cccce355c006 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-09-04 +date: 2023-09-05 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 10eb725db8a7a..5b47285b9edcd 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-09-04 +date: 2023-09-05 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 61cfcd6d71f54..c3c4259afdfb1 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-09-04 +date: 2023-09-05 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 1fa14fddbbb8c..9d13f55b01c3d 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 7efbbe884d5f2..6e51456817f54 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-09-04 +date: 2023-09-05 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 724c0c8adb324..9bb30d89b5db3 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 d975f7289f177..c60de50828f02 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-09-04 +date: 2023-09-05 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 8242e7c2acf60..45459e55d57d2 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index f1ab6919b6f65..64b3d4ae9600c 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 f577d11e536eb..0387bc14aa30c 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-09-04 +date: 2023-09-05 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 370cb8139cc91..a2dfb1d49ac93 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index d66ce94813eef..c36b7b83b967c 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index cf22afd96fb91..053d4313a1174 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 7d196f38a5467..5b8013b126b1a 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-09-04 +date: 2023-09-05 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 e3cf58c6a9112..c2055ef8d02bc 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-09-04 +date: 2023-09-05 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 bb66ecdcd9c59..df61103a09941 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-09-04 +date: 2023-09-05 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 99d0cd8f8fed6..fb844e6b7c754 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-09-04 +date: 2023-09-05 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 8ca9f2bf46952..30c1a22a8ec4a 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-09-04 +date: 2023-09-05 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 2a9e42159a863..09007f8b0e82e 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-09-04 +date: 2023-09-05 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 087efd0ed1b3a..a04a564cde49c 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-09-04 +date: 2023-09-05 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 a688b4bb11ac0..ce523adf57985 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 0ec80a6d5b9a1..9f4d642a9f4ef 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index eb47b8ad31282..82da938a2e3b9 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-09-04 +date: 2023-09-05 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 b5974c758f75b..b14c9ededd480 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-09-04 +date: 2023-09-05 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 5722513733587..e49db93b653a5 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-09-04 +date: 2023-09-05 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 1ad780440ef49..6b8ed504dc92d 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-09-04 +date: 2023-09-05 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 7b4e6f8248423..a5c29e677ec23 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-09-04 +date: 2023-09-05 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 c69c2e0efb03a..50523b6543892 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-09-04 +date: 2023-09-05 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 877836f928464..30878509c9908 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-09-04 +date: 2023-09-05 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 67456e908f329..001c90e047fae 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-09-04 +date: 2023-09-05 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 e674268e68dda..909659dcf4b32 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mocks.mdx b/api_docs/kbn_code_editor_mocks.mdx index d352e9cfabe5d..4d1b33ff13923 100644 --- a/api_docs/kbn_code_editor_mocks.mdx +++ b/api_docs/kbn_code_editor_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mocks title: "@kbn/code-editor-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mocks plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mocks'] --- import kbnCodeEditorMocksObj from './kbn_code_editor_mocks.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 6ff576e59d157..2d3190c184aa0 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-09-04 +date: 2023-09-05 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 e9ad3de74572b..a044b568a4c6d 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-09-04 +date: 2023-09-05 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 27b92aed9ea81..7dff56ea557ef 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 2b52f0f89b0c5..d98cbfcac9f03 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-09-04 +date: 2023-09-05 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 0cb6092fc11c5..571943ac43efc 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-09-04 +date: 2023-09-05 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 df613465fd570..f840d96fb96a8 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-09-04 +date: 2023-09-05 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 4bf87ecf7ee57..80dc326e0b499 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 676bde7a24187..59ee0aee26e27 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-09-04 +date: 2023-09-05 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 9be12944b9366..da3749b332c70 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 2c49f41ead08a..abf01e9b87809 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 75d12c6263985..eeafd6d571c92 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 570c909999a4a..56a4f9835d002 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 8ce2ce5462df3..d62cfc6e67a36 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-09-04 +date: 2023-09-05 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 8993cc4c3bce9..c734b69e04e11 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 b5bba31a21c2e..af02ffe0dc431 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 956f744cdaccd..0c91163570254 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 6d7e885eece98..2b4ca8a154b87 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 2ce73bbe29934..839b32626a245 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 3821b06a8873d..498d5d98e4a90 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-09-04 +date: 2023-09-05 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 2db3eee5ea8bd..53cde53b4ed52 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 d85074be38e63..211b46e09eabd 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 8da85febc7332..14b282a273f22 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 9382fb2606345..315c7acf87a17 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 8e8431edcd670..9b9547190aa86 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-09-04 +date: 2023-09-05 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 271187cab6b21..99e3e0ed02fa2 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 d1fb8f7ac0c69..4e1e2c7844df3 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 6bbcdd8d1bb52..647817f602e86 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 b57d8536e8b6d..5a469f8fb6cc0 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-09-04 +date: 2023-09-05 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 94f756a9119fe..fc98432fd11db 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-09-04 +date: 2023-09-05 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 3d6ff7ee0215f..707a34374771c 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 03b58b44714b3..ebfd9644f1ffa 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 44d07b498019a..86c1b2a59a51c 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 f50ee59bc0f94..941f7eeab85a6 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 3852c645fb4f3..ec369f63898dd 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 ca5721a124cc6..e392692c7a0ce 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 d67e708675b28..8871af521c930 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 61b38e0d6ac4e..6b56be8c38b51 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-09-04 +date: 2023-09-05 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 b48f4b73db5b3..e667a125a4268 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-09-04 +date: 2023-09-05 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 4bc3a145f71a3..9127767aba5b2 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 7fc4365e8a5a6..8cf713c6da2f1 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 38a4c608985e3..f1ef685c162ad 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 f76dca5017a24..324b3291c428b 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 0c456c56d9f9a..bd3bb18d01281 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 0031424b9247a..f72e86ef83440 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-09-04 +date: 2023-09-05 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 ab9b0657e001a..4d968a10b1371 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-09-04 +date: 2023-09-05 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 d3621a3a7777a..aadb7ee12c9f5 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 a7e10ea28f3bd..5891024b67a45 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 b28811d5ca6cf..f5369679076f2 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 2fdfb865b5e4c..a4628267a3b23 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 3af9ba26939ff..af7d968100a5a 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-09-04 +date: 2023-09-05 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 0773cd58c9668..6dffcd5bf011d 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 3a602d7e7e396..9f3b157a0e7ad 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 42034d6fadda2..7196d5b59d0b4 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 7ef326189216a..dbc1eaec1fb49 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-09-04 +date: 2023-09-05 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 b70300e61456e..c353870e9bd1c 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 eca0fde0c364f..1a5426df061ed 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 2da61fde35f5c..ea6fd0531228d 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 eda6107175403..bca77c3503b45 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 2f1d09bf053d8..376f67dce7275 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 2d0c8efcef163..ea1da3f4749f4 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 d146cba7023c9..bf0e09898be90 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 a639084ea937e..5775b5d5f9b73 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-09-04 +date: 2023-09-05 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 07d495610bce4..9a5c8dc842acb 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-09-04 +date: 2023-09-05 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 6b24b9c9e3b62..24b454a40a72b 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 9e425385254f0..2323310976cdf 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 bb5c8cd6748a8..efa9880e343cd 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 188ad7b4882e8..688cb85dc67d1 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 6f1bf06a0a302..ed462f0b7103e 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 53df315ec41aa..9c9a2f63eab66 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 a914dee17961c..f740c651d8dcf 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 eec0a8a98e385..2307f7280d904 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-09-04 +date: 2023-09-05 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 6ea9c339be021..897affe7c09b8 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 9862b3cc1826f..d4fdd95134136 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-09-04 +date: 2023-09-05 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 f50455cc65e96..87346e93af629 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-09-04 +date: 2023-09-05 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 f6e4bef97c16c..c8dcdc45a54a4 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 43645a080cfc4..ef1491370a696 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 eab6419744a55..f85ebe7a68529 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 66154e1e75516..018b03c72899f 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 16a6084dad9d5..d75b9c88f0d8c 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-09-04 +date: 2023-09-05 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 1c09e6a0b36d4..17ec295e2b28a 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 1a24f8471163c..af7530ebe2780 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 47643405acc3e..8c8bf1891f9f1 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 0361011ea4464..b28afa660b41c 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 6ba2126453c6c..e26626cf1aa43 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-09-04 +date: 2023-09-05 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 a26bcba8cf69b..1dde8083861cc 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 c0738dcf46aaa..4c96d38b98734 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 3dfe8c59eb2e8..c95da94e81dd9 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 a5d596027199b..313d1a1cbc7ce 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 b7097f4f42d61..b270138d4cde2 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 96ca9047cc56e..bfad413d0dbae 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 2f4b73d3fa360..a3d274221d1f7 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 18918e753aaa7..b96e16ddd9e4e 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-09-04 +date: 2023-09-05 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 f4a53b0cf8625..4ea507f43b8d8 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 aff7c06b61b86..e663c9a363275 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 c0c53ad35ebf5..c1e5800d3fc35 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 126605bc64a11..377505265a597 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-09-04 +date: 2023-09-05 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 b70d32d8873e2..08e6c40d3b799 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 45427a87ca146..374fd7a4c3600 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 e0889d91e8655..789f56c123186 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 e050b16b796d2..9ce1103581bb2 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 9f89f3f7e0c72..f65dc13cd22a7 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-09-04 +date: 2023-09-05 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 9159c7ef68551..d9393f985758f 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 25a2db252da61..2a7dcbd5d1af9 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 5935efa5d5cae..8701f13ca30dc 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 a1b380a57004a..8d37a662156d1 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-09-04 +date: 2023-09-05 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 742b72e989415..4cc7d28317be7 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 bcd8350316386..48905d30f9cfe 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 712ac608b2a73..afca185707beb 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 4b11f107b8106..f6a66c5963efc 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 587fd854f47e2..147187be6169d 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 60f337b9360c6..831b0fa16040c 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 4132d3df13f31..13f3e351a4e1b 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 ae0babce5eb43..cee4243d41ec9 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 66ddff8834c28..d0e79df85e348 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 7d25a2ccb88c1..0efde46e225c8 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 7b8fd5a52e50a..b9b84c8887fc5 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-09-04 +date: 2023-09-05 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 7f7d3e21cdeb2..7a04d07f67c12 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 ad366371f39dd..8b8849d1e1a78 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-09-04 +date: 2023-09-05 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 a4971c4a44666..bde0ba3320d89 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 d319f617aba6c..c5f0137d455e2 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 2924d830ad0b3..b09d5759718c2 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 7972293e52f74..71ec48a5a4eb3 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 d1a6940e31b21..985a16b0261ea 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 4706ebf127165..c3e93e7242086 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 99365f9ea9b68..5389c790c3889 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-09-04 +date: 2023-09-05 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 d8f8413add7b5..24d6094fecad2 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 1f68cdbe8d3ac..3348a66f9503c 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 c9e4bef10f00d..00ec9085ed5b0 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 91ffd645724d8..46cca04b8c670 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 e5b662da7c3be..15a10088397da 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 7a0ceb77a896a..f11d1ea3fd27b 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 1c22a053af476..b38bf406d436f 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-09-04 +date: 2023-09-05 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 f43b058992acc..dcc9f8b8c8e94 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 f7bcc28c2c9be..d87aa7fa00c18 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 d16812104f5e9..0243585e35df1 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 f7d106af803f8..089cd4f11e138 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 4eba90ab01edf..0d93a2c9924c8 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-09-04 +date: 2023-09-05 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 d9e15fcfaa14b..038594c4e6f50 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 ac3b0f16b3b63..8de8c4fc312c4 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 1a0222aaea429..14872988849f1 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-09-04 +date: 2023-09-05 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 39440c3a31de9..0707f752b2a6c 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-09-04 +date: 2023-09-05 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 9875560220078..35c63747efecb 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 77d4ab765d093..b13279c38b32f 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-09-04 +date: 2023-09-05 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 f3834ac7a3e9c..5740bf4cbada0 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 3b179236a1fec..3126e14f0581c 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 a74eeb190befd..d2910acd94f73 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-09-04 +date: 2023-09-05 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 478f60ee9b5c8..caca10c2fd48f 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 4798ed7c4e8df..96d43fb283968 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 28327d1450d27..52d1fb852d224 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-09-04 +date: 2023-09-05 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 a0a137cd66142..e256f3ba6d69e 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 e72dc51ae7c33..c883b482a9c69 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 da78f3ef086d5..513db41d2f316 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 24dccb85bd7bf..38cfbeb018997 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 a8df8af702bf8..cfe6994c0bbf7 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 eda475abb8f02..0bacde75c8ed3 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 33665b6556280..f1671013301da 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-09-04 +date: 2023-09-05 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 67c1e401ebc03..3f0b161976b96 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-09-04 +date: 2023-09-05 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 82bff56885e4f..696ae1d316070 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 e767e704bd28a..6461a930f9926 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 b158c355a8c55..11e95f64326de 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-09-04 +date: 2023-09-05 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 001146b5c0d0f..2fff03abb2438 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 44e2e4dcf6f66..3d8450614de08 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 5c87cea7b6764..8a4e30bc7f65e 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-09-04 +date: 2023-09-05 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 da791e96f6a8c..bbc16de105137 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-09-04 +date: 2023-09-05 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 f5ceb3c310b68..f2235fdee4dee 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 2788209ab090a..c14fe4df54dc4 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-09-04 +date: 2023-09-05 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 14fdf1d5e5780..cd44c94dbb706 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 1c0417b830e26..1244ed0c0da4c 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-09-04 +date: 2023-09-05 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 0f89b6ba60ef0..76ecfb8d270ca 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-09-04 +date: 2023-09-05 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 f00fe4d608bc1..8a115eeed4cf6 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-09-04 +date: 2023-09-05 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 7caeb321ed8d9..bda8d0b6b8ab1 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-09-04 +date: 2023-09-05 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 6edde9b4eab23..023e5b73ca23d 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-09-04 +date: 2023-09-05 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 ee19bda421aa0..247745c07f508 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-09-04 +date: 2023-09-05 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 6c4a225090d01..bb3308665a207 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-09-04 +date: 2023-09-05 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 27aafd82955bc..315988ced942c 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-09-04 +date: 2023-09-05 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 77c223bc20d19..8777eb2ca54ef 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-09-04 +date: 2023-09-05 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 7264582d726e7..387d6797cd5a5 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-09-04 +date: 2023-09-05 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 4250ff1f79e5b..efaffaf33ca7c 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-09-04 +date: 2023-09-05 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 fae3d9e21e3c3..ef7beaef0f6a9 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-09-04 +date: 2023-09-05 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 17782b1e88e9b..763e602b18868 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-09-04 +date: 2023-09-05 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 dd3f81cb15c29..918307a7aea1f 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-09-04 +date: 2023-09-05 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 f53155729fae3..8889c66a849e1 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-09-04 +date: 2023-09-05 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 221d09cf8ce38..787be9b13f6ff 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-09-04 +date: 2023-09-05 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 aa85a056e4e7d..d0134b6dd43c5 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 f94def353f5b9..1ee3655894d70 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 680d9b3b584ce..32a41d70a9325 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-09-04 +date: 2023-09-05 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 fd1a6e57c4989..a276ef5f584e8 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 841a5c4a07c1a..bd3a9ef6ceb82 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-09-04 +date: 2023-09-05 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 bfa79fd0c14be..ae8ce838528bd 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-09-04 +date: 2023-09-05 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 e560475936e61..31679eb5a4ee6 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-09-04 +date: 2023-09-05 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 a68749122ad5e..6af12ec235d93 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index f3848f7c863f6..057d553c9c272 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 005fd3482096e..2626b9b5e3793 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-09-04 +date: 2023-09-05 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 b327ad60a3f9d..9ce008af48794 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-09-04 +date: 2023-09-05 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 d66ed789d55b7..a8ab926401b82 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-09-04 +date: 2023-09-05 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 e9517ca3104b5..34abd1a51f0fd 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-09-04 +date: 2023-09-05 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 38b73a110ca77..ca7517756e605 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-09-04 +date: 2023-09-05 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 66abf444c8b53..7899f9650cd30 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-09-04 +date: 2023-09-05 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 0a174e736f20c..fdd6e0c7f3fc3 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-09-04 +date: 2023-09-05 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 de0bd895c985f..fc83a934bf7e1 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-09-04 +date: 2023-09-05 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 13781f518b5ec..0788687a910fe 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-09-04 +date: 2023-09-05 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 ad4a4b273e8e8..8af6fb11bde12 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 00e0c7067898d..c99be713b8d90 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-09-04 +date: 2023-09-05 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 0914a65226a78..b911c6e1e1952 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-09-04 +date: 2023-09-05 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 ac8fe1cfaaece..b5bda95c806cb 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-09-04 +date: 2023-09-05 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 36d70609fff30..e3d7321f12ea1 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-09-04 +date: 2023-09-05 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 535a346008b2a..65b0ac1dd0ecd 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx index 52f09760733c6..a68e429f6013e 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_generate_csv_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types title: "@kbn/generate-csv-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv-types plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] --- import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index a84641b1f31f3..df6dcbf68a99c 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-09-04 +date: 2023-09-05 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 b3432765d2cf7..7fe9a26ba9dd7 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-09-04 +date: 2023-09-05 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 df9387df99a45..f64d1c6af5206 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 ea08a7056e52e..8676c7107d4dd 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-09-04 +date: 2023-09-05 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 19b54388f1519..a0f2a90b37a14 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-09-04 +date: 2023-09-05 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 a81cc773aa125..8024bad81452e 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-09-04 +date: 2023-09-05 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 8b3a393006f29..79f69a5cc71a0 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-09-04 +date: 2023-09-05 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 b4c6a755874f1..cc4337a22a137 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-09-04 +date: 2023-09-05 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 cf05dbcd99a9f..81ae937e1aabc 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-09-04 +date: 2023-09-05 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 8b0b0c72627dd..903ff74457bd2 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-09-04 +date: 2023-09-05 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 7082d4f9a7ba9..2d1f2dd1b4f3e 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-09-04 +date: 2023-09-05 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 a33f58b9fcc80..d3f8fb3e152da 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 5c5c6dfcc83ba..3b5fe7bcd0bb7 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-09-04 +date: 2023-09-05 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 65e521ce86076..eea14a63ba6ba 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-09-04 +date: 2023-09-05 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 2e345b7349536..5c11668ffa71e 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-09-04 +date: 2023-09-05 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 70cc72bd8509a..f4b3cbee7bc65 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-09-04 +date: 2023-09-05 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 a9aac7c0659f0..277d89eeb2666 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-09-04 +date: 2023-09-05 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 9bf8ce9d546a4..3121954ab3512 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 de2011a628ca0..6d1e806fffcf2 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-09-04 +date: 2023-09-05 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 711e440bfc5f8..ffb235143b227 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 3cb969be0abb7..6dac7d9151945 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-09-04 +date: 2023-09-05 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 6e26100fbc321..c13b36d6a01b5 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 7d191045ebc7d..0643d300555bb 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index d2eae1d7bce9a..8bcf6ef9da913 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-09-04 +date: 2023-09-05 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 1fdc4c51c3650..268c13ee40c21 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-09-04 +date: 2023-09-05 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 58f7939ca5d5e..cda3b46c2c802 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 691cb37fbf092..d4c39692829a9 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 eee5c0c2f957c..edb82b7d856a9 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 25035040db3b1..9ee3a48b1ed90 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 760d63a13479d..d4fcdeafed66b 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 91fd1d78dddcc..8e0369f66c66b 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-09-04 +date: 2023-09-05 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 9a7b632bfc239..0a44b471adea8 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-09-04 +date: 2023-09-05 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 c62bb1d107814..1a8bff8e80c51 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 01a7da5e0fe1a..f376e5de94cbd 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 aa913fde4e88e..5a614d4f7e906 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-09-04 +date: 2023-09-05 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 0c835d13abcc0..cc1cd6b7c29c3 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-09-04 +date: 2023-09-05 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 cc78ed0a4b7ae..88af0e128fe6d 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-09-04 +date: 2023-09-05 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 107c55eb0c7ac..5004023259bfa 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-09-04 +date: 2023-09-05 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 2065ae3bc39cb..8ab31c0810681 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-09-04 +date: 2023-09-05 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 a4eee0f82e0b9..de7246615f050 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-09-04 +date: 2023-09-05 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 3034ca61406aa..300345dc19e9f 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 a0469d94ac6e7..65e39c56c54cf 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 4710c74dc5db0..5989125209f3c 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 41f5c96969e43..8c2fe6d0f842b 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 272f1ec79a7e3..b87966a18bcc8 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 7196a47871adc..54cb3c3ed4458 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-09-04 +date: 2023-09-05 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 268506be5de99..032e218c58780 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 6233c2ff21886..7aed7a647acd3 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-09-04 +date: 2023-09-05 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 006a6f6cec754..e1d4a47d80bc5 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-09-04 +date: 2023-09-05 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 bbf4cff07dd56..7e85861952f55 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-09-04 +date: 2023-09-05 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 fe0ec9ae2be57..3fb6a56259ba7 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 97458320821c4..ab04f163b40df 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-09-04 +date: 2023-09-05 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 fbb3acd670442..b3d04d8b790ae 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-09-04 +date: 2023-09-05 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 3051e6d9f202d..5680da729406a 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 65eb12fabc001..6e12225151607 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-09-04 +date: 2023-09-05 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 2e7ae7cd612d2..0c622fb705406 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-09-04 +date: 2023-09-05 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 1f6b1674c1b57..149efa170d300 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index d6124aaa74fc8..70d41bb5964de 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-09-04 +date: 2023-09-05 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 7c926ea4c4986..037d30c889f87 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-09-04 +date: 2023-09-05 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 8db67fd4505c6..58fbeeee2d187 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-09-04 +date: 2023-09-05 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 d1a19a7e513e3..959e2a057f24c 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-09-04 +date: 2023-09-05 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 7a45bc910bf2a..7613d4be794d4 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-09-04 +date: 2023-09-05 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 38fed573cdfc0..0323e7ebc62b4 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-09-04 +date: 2023-09-05 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 cb6552e865624..cf70a70947460 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-09-04 +date: 2023-09-05 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 eb89b1c4fffec..d04209a9f3568 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-09-04 +date: 2023-09-05 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 5f4e54cae6099..c2e009a4b77fb 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-09-04 +date: 2023-09-05 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 2da515748dd5c..31eb94cd3909e 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-09-04 +date: 2023-09-05 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 250aa6f45d7a7..0ea939bbde996 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-09-04 +date: 2023-09-05 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 c6b17080d62a8..bd5a2b4bf7477 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-09-04 +date: 2023-09-05 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 8e49b829556ba..ece34b24df02d 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index bcfaa8de5ef1c..dcec40e3a89da 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-09-04 +date: 2023-09-05 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 14310b52decfe..ef9900034a6d5 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-09-04 +date: 2023-09-05 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 d045834c6decb..0393965e2ebb2 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 294015e805f0c..3605f1aba2368 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-09-04 +date: 2023-09-05 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 eb04761a5bedd..23d87424f2b07 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-09-04 +date: 2023-09-05 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_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 59dd53bdd24e4..a7f3a7c301a2f 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index e77b728a2f4e4..feff9a8532c37 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-09-04 +date: 2023-09-05 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 7043cf400e960..43b8698ec5add 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-09-04 +date: 2023-09-05 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 ceb844bb8248b..0edc300b7fbb8 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-09-04 +date: 2023-09-05 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 974630724490f..303b370aed662 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-09-04 +date: 2023-09-05 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 549718823ae00..0e8e3606673c7 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-09-04 +date: 2023-09-05 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 bcd3688220db7..39fd4b1f96d01 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-09-04 +date: 2023-09-05 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 b8ac39ed3aac3..e1881be0c8187 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-09-04 +date: 2023-09-05 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 8a06350968685..1c4796084d273 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index bbc25b1763332..057fd8ddd0154 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-09-04 +date: 2023-09-05 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 2ebb08d1a5be5..bcab35e3734e8 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-09-04 +date: 2023-09-05 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 4ac2b02403c09..6188b4f538622 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 fb4b15d01a730..ee9589bd9fdab 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-09-04 +date: 2023-09-05 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 95d98d0230581..55ab104bac818 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-09-04 +date: 2023-09-05 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 5ee403a7fb252..16df8b1d3143c 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-09-04 +date: 2023-09-05 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 ab521d578d62b..9d02dbe8bf408 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 58e77a7bd53fd..47fd8f9a4d494 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-09-04 +date: 2023-09-05 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 6df5e0bfc0b59..5c0ca05384879 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-09-04 +date: 2023-09-05 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 ff905664e91dd..806945c74d6ef 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-09-04 +date: 2023-09-05 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 88c42fad0a387..67c024298e1af 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 5ae1f54066b70..ae9982c0af157 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-09-04 +date: 2023-09-05 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 9f4e487548a1e..f9802c7fe0576 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-09-04 +date: 2023-09-05 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 acb7bb11a3d12..6dc1d8f5b2b13 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-09-04 +date: 2023-09-05 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 7243502098eff..1b4eefb68fc5f 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-09-04 +date: 2023-09-05 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 a4056a67fc11b..e106cb033c5c2 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 44567d8461ae1..f9ad4f267548f 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index a36d774a828b5..8f8629d869e68 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-09-04 +date: 2023-09-05 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 936ee70516027..82f04c8c1f8f3 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-09-04 +date: 2023-09-05 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 e82f7255d45c8..e4ec0a2a0470d 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index 713b329594e0a..332ee7b559786 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index d163736cba8bf..b342b28412dd3 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index b6d4676f680e4..ea0dee0f20096 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 31dcd7e07428f..bed943cf01244 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-09-04 +date: 2023-09-05 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 c13a9fc7925a1..298b26586d47f 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-09-04 +date: 2023-09-05 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 1c7f02410f2e9..f8e4d0340abe9 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 71eb2e9c3ef7c..a9cfd49bd9006 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index ad8e6e97de3cb..571aa579476e0 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-09-04 +date: 2023-09-05 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 4c7dfb2f4e1f1..d320a6fe79159 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-09-04 +date: 2023-09-05 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 f4636aba01f16..7a01e2db59806 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 3f66d415c1be4..05b8167d72a32 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 2f7c7b1020f93..7fe50b1e6efa5 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-09-04 +date: 2023-09-05 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 8e28b0199e9cf..341baae0eddc6 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-09-04 +date: 2023-09-05 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 9c611d85044c3..b5bdafbe3406e 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-09-04 +date: 2023-09-05 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 b8d31a14ed26a..bd9f0e5e054b5 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-09-04 +date: 2023-09-05 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 da9f6ce9d5d80..bdb21965fe310 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-09-04 +date: 2023-09-05 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 729db3aabc618..f8166ef3df380 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 61f85c07db8d0..034c8d773754d 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-09-04 +date: 2023-09-05 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 079d165bd9e80..47ecb7343d741 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 bd00a85aafc42..c5369259e7b4d 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-09-04 +date: 2023-09-05 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 ce355c79e6cba..b9d0e9b498902 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 3322fb8ae7795..2bd6c3050ac8f 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-09-04 +date: 2023-09-05 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 cd7160c68a6ea..35e91bb002744 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 aa1b4bf6bd6b1..c1cf40e7bc764 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-09-04 +date: 2023-09-05 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 89e5a97aa5085..86fa9e7c1891f 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 e9ebc6c4d34dd..3c8e084113bee 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-09-04 +date: 2023-09-05 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 db0fb2c45b33d..28f32b9dc5257 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-09-04 +date: 2023-09-05 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 c03d3403bc1d9..997a796e86d22 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 10db8809f145e..f470445bd947b 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 e1e19875fb3e4..33873f09e4810 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-09-04 +date: 2023-09-05 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 a0ceb3b948671..274db8e8bfa85 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-09-04 +date: 2023-09-05 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 a3ef53dc7358b..9a775023878d6 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 ce3951889ab34..aed9adc9f36ba 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-09-04 +date: 2023-09-05 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 562fe2d2c6443..07c8ac15e2ccb 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-09-04 +date: 2023-09-05 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 bc7b1792a06bc..129749e6731df 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-09-04 +date: 2023-09-05 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 9e5aa8190f0ab..d36240ef6c53e 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-09-04 +date: 2023-09-05 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 3655167e60e85..cf78e32a622ed 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-09-04 +date: 2023-09-05 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 565ebfc1c67f6..d3a1875b6ce61 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-09-04 +date: 2023-09-05 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 37c04eb6e8ed4..0839df57edc00 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-09-04 +date: 2023-09-05 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 ebe7cb14223a6..407b4ab1645d0 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-09-04 +date: 2023-09-05 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 89e1d8a4e7490..8a7b3d8d10eba 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-09-04 +date: 2023-09-05 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 1ef8da4fd1b16..8af618fd3428f 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-09-04 +date: 2023-09-05 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 f14ca56b2a711..dbffcc85a47b8 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-09-04 +date: 2023-09-05 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 ac91db0ff9faa..6b1ecb4fc1a93 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-09-04 +date: 2023-09-05 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 7264212956b32..f25b8eca3b096 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-09-04 +date: 2023-09-05 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 1bf2c9e9b53f7..5077de40d935f 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-09-04 +date: 2023-09-05 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 5d509393bb515..43372f3125e20 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-09-04 +date: 2023-09-05 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 ccd497d35149e..9e04bda94e0e3 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-09-04 +date: 2023-09-05 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 28b888a532cab..871c6c2b8e718 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index e8906be6f4126..be3c8e29d5516 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-09-04 +date: 2023-09-05 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 e90938685a9b3..46f8c19cf89ec 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-09-04 +date: 2023-09-05 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 def5e7fddeff8..d8b53fc2d669f 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-09-04 +date: 2023-09-05 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 808f95cb57177..a08cefa0974a5 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-09-04 +date: 2023-09-05 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 71fab2a4a30ca..68e956c6a9fd7 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-09-04 +date: 2023-09-05 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 2e0d365f08b42..91091dbb7a330 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-09-04 +date: 2023-09-05 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 5ebcc91264602..40c628ad3325c 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-09-04 +date: 2023-09-05 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 099031ba5a3da..f22127f77ae44 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index aab54258fdf86..1e294e99efaba 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-09-04 +date: 2023-09-05 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 a2f536a06bfcc..b8c701132cb88 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-09-04 +date: 2023-09-05 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 9b243681feaf4..ed3eb341e30b8 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-09-04 +date: 2023-09-05 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 ad1d200cbef90..fabeb02cc299a 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-09-04 +date: 2023-09-05 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 29e8231029c8b..9e9cb5759dee2 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-09-04 +date: 2023-09-05 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 0525b690734d2..7b5a3ae2edbf2 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-09-04 +date: 2023-09-05 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 b7f18f9d9ab45..0dc5954a37433 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index dff93325d9d1d..aa2fb5154468f 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index c9de87d3aff23..9fa0c25531795 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index ed71a3d96bde8..72e61b9db565c 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-09-04 +date: 2023-09-05 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 2a1c0a51e660c..91d17d9fcde72 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-09-04 +date: 2023-09-05 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 60a832a0977dc..eeb74883b2962 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 29021cfa454fa..7640d66033c05 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 65885b8a1e469..51aee902356a6 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index a1a342aaad5dc..6d5783871cdc4 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 508c86da553db..8514ee21fcd37 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 247232136211d..7d88a913416d4 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 6004083673791..88da234919d93 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index baad071884889..6a569ad488335 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index b068a07ce37ac..506e3bdaa1684 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index b1752003c6291..415d96478e799 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index dc183c290a096..a76d920efbd05 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 4b22ee129531d..87679e97ee10f 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 6fbf2b6aec84f..2f9c10a8d601f 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index d541b6206bc4e..1f3f4c9e84b3c 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 78bb664c118c8..58358d769e1c8 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 8eb97e2f58550..5c0fda7795ffc 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 1973a7ab3a0e7..4b84d2688576b 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 9f595734c1cd6..844c63784a8e7 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index e910e74323d61..24d66a3f94a94 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -2652,6 +2652,26 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityPublicPluginsStart.contentManagement", + "type": "Object", + "tags": [], + "label": "contentManagement", + "description": [], + "signature": [ + { + "pluginId": "contentManagement", + "scope": "public", + "docId": "kibContentManagementPluginApi", + "section": "def-public.ContentManagementPublicStart", + "text": "ContentManagementPublicStart" + } + ], + "path": "x-pack/plugins/observability/public/plugin.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "observability", "id": "def-public.ObservabilityPublicPluginsStart.data", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index b1c722815ff86..4f5365797c3b2 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 541 | 2 | 532 | 16 | +| 542 | 2 | 533 | 16 | ## Client diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index 59f2dcee727e4..73a81e8571d20 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -399,7 +399,7 @@ "ObservabilityAIAssistantRouteHandlerResources", ") => Promise<{}>; } & ", "ObservabilityAIAssistantRouteCreateOptions", - "; \"POST /internal/observability_ai_assistant/functions/summarise\": { endpoint: \"POST /internal/observability_ai_assistant/functions/summarise\"; params?: ", + "; \"POST /internal/observability_ai_assistant/functions/summarize\": { endpoint: \"POST /internal/observability_ai_assistant/functions/summarize\"; params?: ", "TypeC", "<{ body: ", "TypeC", @@ -764,7 +764,7 @@ "ObservabilityAIAssistantRouteHandlerResources", ") => Promise<{}>; } & ", "ObservabilityAIAssistantRouteCreateOptions", - "; \"POST /internal/observability_ai_assistant/functions/summarise\": { endpoint: \"POST /internal/observability_ai_assistant/functions/summarise\"; params?: ", + "; \"POST /internal/observability_ai_assistant/functions/summarize\": { endpoint: \"POST /internal/observability_ai_assistant/functions/summarize\"; params?: ", "TypeC", "<{ body: ", "TypeC", @@ -1105,7 +1105,7 @@ "label": "ObservabilityAIAssistantAPIEndpoint", "description": [], "signature": [ - "\"POST /internal/observability_ai_assistant/chat\" | \"GET /internal/observability_ai_assistant/conversation/{conversationId}\" | \"POST /internal/observability_ai_assistant/conversations\" | \"POST /internal/observability_ai_assistant/conversation\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/auto_title\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/title\" | \"DELETE /internal/observability_ai_assistant/conversation/{conversationId}\" | \"GET /internal/observability_ai_assistant/connectors\" | \"POST /internal/observability_ai_assistant/functions/elasticsearch\" | \"POST /internal/observability_ai_assistant/functions/recall\" | \"POST /internal/observability_ai_assistant/functions/summarise\" | \"POST /internal/observability_ai_assistant/functions/setup_kb\" | \"GET /internal/observability_ai_assistant/functions/kb_status\" | \"POST /internal/observability_ai_assistant/functions/alerts\"" + "\"POST /internal/observability_ai_assistant/chat\" | \"GET /internal/observability_ai_assistant/conversation/{conversationId}\" | \"POST /internal/observability_ai_assistant/conversations\" | \"POST /internal/observability_ai_assistant/conversation\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/auto_title\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/title\" | \"DELETE /internal/observability_ai_assistant/conversation/{conversationId}\" | \"GET /internal/observability_ai_assistant/connectors\" | \"POST /internal/observability_ai_assistant/functions/elasticsearch\" | \"POST /internal/observability_ai_assistant/functions/recall\" | \"POST /internal/observability_ai_assistant/functions/summarize\" | \"POST /internal/observability_ai_assistant/functions/setup_kb\" | \"GET /internal/observability_ai_assistant/functions/kb_status\" | \"POST /internal/observability_ai_assistant/functions/alerts\"" ], "path": "x-pack/plugins/observability_ai_assistant/public/api/index.ts", "deprecated": false, @@ -1235,7 +1235,7 @@ "ObservabilityAIAssistantRouteHandlerResources", ") => Promise<{}>; } & ", "ObservabilityAIAssistantRouteCreateOptions", - "; \"POST /internal/observability_ai_assistant/functions/summarise\": { endpoint: \"POST /internal/observability_ai_assistant/functions/summarise\"; params?: ", + "; \"POST /internal/observability_ai_assistant/functions/summarize\": { endpoint: \"POST /internal/observability_ai_assistant/functions/summarize\"; params?: ", "TypeC", "<{ body: ", "TypeC", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index ed74b23cb89cd..31e4264930aee 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 466e27fd88687..939e6d954a9b7 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 3dd063884758a..040d247a44432 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-09-04 +date: 2023-09-05 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 7a78e60ca9c54..b9a92bd0e15a9 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 14fc828885c33..8c9256f9f511c 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 72500 | 223 | 61891 | 1513 | +| 72503 | 223 | 61894 | 1513 | ## Plugin Directory @@ -135,7 +135,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 541 | 2 | 532 | 16 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 542 | 2 | 533 | 16 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 42 | 0 | 39 | 7 | | observabilityLogExplorer | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin exposes and registers observability log consumption features. | 0 | 0 | 0 | 0 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 14 | 0 | 14 | 0 | @@ -160,7 +160,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 27 | 0 | 8 | 5 | | searchprofiler | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 270 | 0 | 87 | 3 | -| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 170 | 0 | 104 | 32 | +| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 172 | 0 | 106 | 32 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 6 | 0 | 6 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 17 | 0 | 16 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index ecaa947603336..17307c56df40b 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-09-04 +date: 2023-09-05 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 098608aaf23d5..c733c69c88c29 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-09-04 +date: 2023-09-05 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 81490852f2548..7dfef9cbc7f5d 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-09-04 +date: 2023-09-05 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 0ccfc6e5c1117..46f7029e4c437 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-09-04 +date: 2023-09-05 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 aa5afc089a631..652db20d467be 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-09-04 +date: 2023-09-05 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 fbee8c197f306..f05dfff64c6eb 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-09-04 +date: 2023-09-05 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 7d2698eedb107..04ca4e478bd01 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-09-04 +date: 2023-09-05 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 65589a9edc53e..deb21fb5af459 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-09-04 +date: 2023-09-05 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 bc586f9346b8b..a389e8c341df1 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-09-04 +date: 2023-09-05 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 90253b0a28e42..51f2eac47f7ee 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-09-04 +date: 2023-09-05 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 cf51e4fd5f050..cc16ca5a190d2 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-09-04 +date: 2023-09-05 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 1b1df37b6fea0..6e99575f34bea 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-09-04 +date: 2023-09-05 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 efa013facd486..32fbb58ee3493 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-09-04 +date: 2023-09-05 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 a54596f42a50a..f606643f4009d 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-09-04 +date: 2023-09-05 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 a62c992300f18..fffd6ea49de6f 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-09-04 +date: 2023-09-05 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 0c17d6db807ca..ffd1930565da5 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-09-04 +date: 2023-09-05 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 9943812818ff8..3950548c880fb 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index bda1742a17c6d..45c4a2685ac7c 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -1941,6 +1941,38 @@ ], "returnComment": [] }, + { + "parentPluginId": "securitySolution", + "id": "def-public.PluginStart.setDashboardsLandingCallout", + "type": "Function", + "tags": [], + "label": "setDashboardsLandingCallout", + "description": [], + "signature": [ + "(dashboardsLandingCallout: React.ComponentType<{}>) => void" + ], + "path": "x-pack/plugins/security_solution/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-public.PluginStart.setDashboardsLandingCallout.$1", + "type": "CompoundType", + "tags": [], + "label": "dashboardsLandingCallout", + "description": [], + "signature": [ + "React.ComponentType<{}>" + ], + "path": "x-pack/plugins/security_solution/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "securitySolution", "id": "def-public.PluginStart.getBreadcrumbsNav$", diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index d2c47afbde459..56c700c517970 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.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 | |-------------------|-----------|------------------------|-----------------| -| 170 | 0 | 104 | 32 | +| 172 | 0 | 106 | 32 | ## Client diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index b7f07cfa02f71..98f2cb7869788 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-09-04 +date: 2023-09-05 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 85e2b206262e5..fe15bc4706c25 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-09-04 +date: 2023-09-05 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 d3e8f8102ff8e..0528a3c42d91c 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-09-04 +date: 2023-09-05 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 2c0835291b96c..ca487148446ab 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-09-04 +date: 2023-09-05 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 512e5d7f50b02..2382a958e93a4 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-09-04 +date: 2023-09-05 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 ad8cfcd6b086e..0c2b0290e9db7 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-09-04 +date: 2023-09-05 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 2ba24457e986c..6385220853e90 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-09-04 +date: 2023-09-05 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 a551a36b8dadd..7d25378cd6f0e 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-09-04 +date: 2023-09-05 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 b5829c51da0e4..54715a2f5bf55 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-09-04 +date: 2023-09-05 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 a533654133b9c..546ab4089308b 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-09-04 +date: 2023-09-05 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 cb35b02c0c9f2..cfe538fc4b18e 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-09-04 +date: 2023-09-05 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 4ac2d1b7e45da..c110a53377d03 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-09-04 +date: 2023-09-05 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 bbd19b33c99c5..7bfe57d68a2d1 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-09-04 +date: 2023-09-05 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 214d59c2ef888..40acb98da6933 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-09-04 +date: 2023-09-05 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 ff914617ea2c9..0df30daa7aa12 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-09-04 +date: 2023-09-05 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 f2e82d110984d..7a11b41d310d4 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-09-04 +date: 2023-09-05 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 3aa599a10e74c..0742546f60027 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-09-04 +date: 2023-09-05 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 de13a428cb962..c7145498c1a5c 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-09-04 +date: 2023-09-05 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 ec62ba8e5a610..bbc1eb06c8e39 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-09-04 +date: 2023-09-05 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 1760914e5845f..e5d3181a1d8d6 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-09-04 +date: 2023-09-05 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 d5190a744a96e..51693988db001 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-09-04 +date: 2023-09-05 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 de2d1fdb7bd39..a60e9a0225c50 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-09-04 +date: 2023-09-05 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 3a09c11478bf9..8acfb4007dac3 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-09-04 +date: 2023-09-05 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 571d25c7d740a..603f48d60f203 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-09-04 +date: 2023-09-05 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 69973dbca64eb..7b1d9e1b20dad 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-09-04 +date: 2023-09-05 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 f357c8beb788e..fd7beddabd867 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-09-04 +date: 2023-09-05 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 d647c437f3e23..a72a03bf4fac3 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-09-04 +date: 2023-09-05 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 26293283ce30b..62c01dfb2cc5f 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-09-04 +date: 2023-09-05 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 115e3a97f04e5..11d978023890f 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-09-04 +date: 2023-09-05 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 20257c78f92dc..960eb658ca681 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-09-04 +date: 2023-09-05 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 bc34b640cd0f2..15e9fd60eafed 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-09-04 +date: 2023-09-05 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 fd7fa07acbd47..59c3f306ced16 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-09-04 +date: 2023-09-05 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 9de719a174d83..0010c70cfdbde 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-09-04 +date: 2023-09-05 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 5496a85f6e8cb..6173477d3c7a5 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-09-04 +date: 2023-09-05 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 5edba7017e4e3..fc76ac9c6fc64 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-09-04 +date: 2023-09-05 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 dde81fe2992d5..ce5bbdddd2e36 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-09-04 +date: 2023-09-05 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 4b0c6a3fc28e8..c44173caff05c 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-09-04 +date: 2023-09-05 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 0de2d846d05c1..d61f09f713d1b 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-09-04 +date: 2023-09-05 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 f45bff62d331c..bde589e42f805 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-09-04 +date: 2023-09-05 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 079df61084cff..78696e8ff2b7d 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-09-04 +date: 2023-09-05 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 b861dea9de5dc..a98046d0fe69a 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 7d8cfe702d222..bc11233812a61 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-09-04 +date: 2023-09-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From deed5e46798c8737bbc77aa360b5bfcb4872d900 Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Tue, 5 Sep 2023 07:40:32 +0200 Subject: [PATCH 16/84] [Security Solution] Fix junit report transformation (#165541) **Fixes:** https://github.com/elastic/kibana/issues/165546 ## Summary This PR fixes junit report transformation for Security Solution build steps (Cypress writes reports in `mochawesome` format and `yarn junit:transform` transforms it to junit format). ## Details After refactoring it turned out `yarn junit:merge` was moved from `cypress:*` yarn scripts to build step `*.sh` files in `.buildkite/scripts/steps/functional` folder. This way a command to run Cypress tests changed from ```sh yarn cypress:run:ess ``` to ```sh yarn cypress:run:ess; status=$?; yarn junit:merge && exit $status ``` In first case any test failure do not lead to early exist and all following commands are executed as yarn runs scripts without preserving shell settings. In the second case failing tests lead to `yarn cypress:run:ess` exit with non-zero exit code so the shell script exits immediately without giving a chance for `yarn junit:merge` to execute. This problem is solved by disabling early exit on error via `set +e`. On top of that using of `artifact_paths` config option is redundant as [post command script](https://github.com/elastic/kibana/blob/main/.buildkite/scripts/lifecycle/post_command.sh#L16) upload build artefact via a bildkite agent. #### [Failed build example](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3049#_) --- .buildkite/pipelines/on_merge_unsupported_ftrs.yml | 4 ---- .buildkite/pipelines/pull_request/base.yml | 8 -------- .buildkite/pipelines/pull_request/defend_workflows.yml | 4 ---- .buildkite/pipelines/pull_request/osquery_cypress.yml | 6 ------ .buildkite/pipelines/pull_request/response_ops.yml | 2 -- .buildkite/pipelines/pull_request/response_ops_cases.yml | 2 -- .buildkite/pipelines/pull_request/security_solution.yml | 8 -------- .buildkite/pipelines/pull_request/threat_intelligence.yml | 2 -- .buildkite/pipelines/serverless.yml | 6 ------ .buildkite/scripts/steps/functional/defend_workflows.sh | 1 + .../scripts/steps/functional/defend_workflows_vagrant.sh | 1 + .buildkite/scripts/steps/functional/osquery_cypress.sh | 5 ++++- .../scripts/steps/functional/osquery_cypress_burn.sh | 3 ++- .buildkite/scripts/steps/functional/response_ops.sh | 1 + .buildkite/scripts/steps/functional/response_ops_cases.sh | 1 + .../scripts/steps/functional/security_serverless.sh | 1 + .../steps/functional/security_serverless_explore.sh | 1 + .../functional/security_serverless_investigations.sh | 1 + .buildkite/scripts/steps/functional/security_solution.sh | 1 + .../scripts/steps/functional/security_solution_explore.sh | 1 + .../steps/functional/security_solution_investigations.sh | 1 + 21 files changed, 16 insertions(+), 44 deletions(-) diff --git a/.buildkite/pipelines/on_merge_unsupported_ftrs.yml b/.buildkite/pipelines/on_merge_unsupported_ftrs.yml index 30e7929fd6e19..5ee55e63c1408 100644 --- a/.buildkite/pipelines/on_merge_unsupported_ftrs.yml +++ b/.buildkite/pipelines/on_merge_unsupported_ftrs.yml @@ -96,8 +96,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" - command: .buildkite/scripts/steps/functional/osquery_cypress.sh label: 'Osquery Cypress Tests' @@ -110,8 +108,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-osquery/**/*" - command: .buildkite/scripts/steps/functional/synthetics_plugin.sh label: 'Synthetics @elastic/synthetics Tests' diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 7a4291fab7003..522d2e34e5682 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -146,8 +146,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" # status_exception: Native role management is not enabled in this Elasticsearch instance # - command: .buildkite/scripts/steps/functional/security_serverless_defend_workflows.sh @@ -161,8 +159,6 @@ steps: # automatic: # - exit_status: '*' # limit: 1 - # artifact_paths: - # - "target/kibana-security-solution/**/*" - command: .buildkite/scripts/steps/functional/security_serverless_investigations.sh label: 'Serverless Security Investigations Cypress Tests' @@ -176,8 +172,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" - command: .buildkite/scripts/steps/functional/security_serverless_explore.sh label: 'Serverless Security Explore Cypress Tests' @@ -191,8 +185,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" - command: .buildkite/scripts/steps/lint.sh label: 'Linting' diff --git a/.buildkite/pipelines/pull_request/defend_workflows.yml b/.buildkite/pipelines/pull_request/defend_workflows.yml index 3a50e3ece206e..00f701c4e16d9 100644 --- a/.buildkite/pipelines/pull_request/defend_workflows.yml +++ b/.buildkite/pipelines/pull_request/defend_workflows.yml @@ -10,8 +10,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" - command: .buildkite/scripts/steps/functional/defend_workflows_vagrant.sh label: 'Defend Workflows Endpoint Cypress Tests' @@ -24,5 +22,3 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" diff --git a/.buildkite/pipelines/pull_request/osquery_cypress.yml b/.buildkite/pipelines/pull_request/osquery_cypress.yml index c56d94524f60d..50c4dd4a3faa5 100644 --- a/.buildkite/pipelines/pull_request/osquery_cypress.yml +++ b/.buildkite/pipelines/pull_request/osquery_cypress.yml @@ -10,8 +10,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-osquery/**/*" - command: .buildkite/scripts/steps/functional/osquery_cypress_burn.sh label: 'Osquery Cypress Tests, burning changed specs' @@ -22,8 +20,6 @@ steps: soft_fail: true retry: automatic: false - artifact_paths: - - "target/kibana-osquery/**/*" # Error: self-signed certificate in certificate chain # - command: .buildkite/scripts/steps/functional/security_serverless_osquery.sh @@ -37,5 +33,3 @@ steps: # automatic: # - exit_status: '*' # limit: 1 - # artifact_paths: - # - "target/kibana-osquery/**/*" diff --git a/.buildkite/pipelines/pull_request/response_ops.yml b/.buildkite/pipelines/pull_request/response_ops.yml index b2ef5199fab91..38ca242949d86 100644 --- a/.buildkite/pipelines/pull_request/response_ops.yml +++ b/.buildkite/pipelines/pull_request/response_ops.yml @@ -10,5 +10,3 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" diff --git a/.buildkite/pipelines/pull_request/response_ops_cases.yml b/.buildkite/pipelines/pull_request/response_ops_cases.yml index af2e58b65ab34..312c62c01c732 100644 --- a/.buildkite/pipelines/pull_request/response_ops_cases.yml +++ b/.buildkite/pipelines/pull_request/response_ops_cases.yml @@ -9,5 +9,3 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-solution/**/*" diff --git a/.buildkite/pipelines/pull_request/security_solution.yml b/.buildkite/pipelines/pull_request/security_solution.yml index 58b416548ec5f..2b7a6faaf212c 100644 --- a/.buildkite/pipelines/pull_request/security_solution.yml +++ b/.buildkite/pipelines/pull_request/security_solution.yml @@ -10,8 +10,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - 'target/kibana-security-solution/**/*' - command: .buildkite/scripts/steps/functional/security_solution_explore.sh label: 'Explore - Security Solution Cypress Tests' @@ -24,8 +22,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - 'target/kibana-security-solution/**/*' - command: .buildkite/scripts/steps/functional/security_solution_investigations.sh label: 'Investigations - Security Solution Cypress Tests' @@ -38,8 +34,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - 'target/kibana-security-solution/**/*' - command: .buildkite/scripts/steps/functional/security_solution_burn.sh label: 'Security Solution Cypress tests, burning changed specs' @@ -51,8 +45,6 @@ steps: retry: automatic: false soft_fail: true - artifact_paths: - - 'target/kibana-security-solution/**/*' - command: .buildkite/scripts/steps/code_generation/security_solution_codegen.sh label: 'Security Solution OpenAPI codegen' diff --git a/.buildkite/pipelines/pull_request/threat_intelligence.yml b/.buildkite/pipelines/pull_request/threat_intelligence.yml index f9b9050d28d95..b91be5faffdec 100644 --- a/.buildkite/pipelines/pull_request/threat_intelligence.yml +++ b/.buildkite/pipelines/pull_request/threat_intelligence.yml @@ -10,5 +10,3 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-threat-intelligence/**/*" diff --git a/.buildkite/pipelines/serverless.yml b/.buildkite/pipelines/serverless.yml index be9816545e2bf..10d1090521adb 100644 --- a/.buildkite/pipelines/serverless.yml +++ b/.buildkite/pipelines/serverless.yml @@ -110,8 +110,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-serverless/**/*" - command: .buildkite/scripts/steps/functional/security_serverless_explore.sh label: 'Serverless Explore - Security Solution Cypress Tests' @@ -124,8 +122,6 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-serverless/**/*" - command: .buildkite/scripts/steps/functional/security_serverless_investigations.sh label: 'Serverless Investigations - Security Solution Cypress Tests' @@ -138,5 +134,3 @@ steps: automatic: - exit_status: '*' limit: 1 - artifact_paths: - - "target/kibana-security-serverless/**/*" diff --git a/.buildkite/scripts/steps/functional/defend_workflows.sh b/.buildkite/scripts/steps/functional/defend_workflows.sh index 555d6cba2d374..111fa6a23d289 100755 --- a/.buildkite/scripts/steps/functional/defend_workflows.sh +++ b/.buildkite/scripts/steps/functional/defend_workflows.sh @@ -12,4 +12,5 @@ echo "--- Defend Workflows Cypress tests" cd x-pack/plugins/security_solution +set +e yarn cypress:dw:run; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh b/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh index 57b7b43163400..0dfabadb90687 100755 --- a/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh +++ b/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh @@ -12,4 +12,5 @@ echo "--- Defend Workflows Endpoint Cypress tests" cd x-pack/plugins/security_solution +set +e yarn cypress:dw:endpoint:run; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/osquery_cypress.sh b/.buildkite/scripts/steps/functional/osquery_cypress.sh index c6cc98d71ce07..eab0f808b7352 100755 --- a/.buildkite/scripts/steps/functional/osquery_cypress.sh +++ b/.buildkite/scripts/steps/functional/osquery_cypress.sh @@ -12,4 +12,7 @@ export JOB=kibana-osquery-cypress echo "--- Osquery Cypress tests" -yarn --cwd x-pack/plugins/osquery cypress:run +cd x-pack/plugins/osquery + +set +e +yarn cypress:run; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh b/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh index b7fd648e53939..ed59007086e16 100755 --- a/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh +++ b/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh @@ -14,4 +14,5 @@ buildkite-agent meta-data set "${BUILDKITE_JOB_ID}_is_test_execution_step" 'fals echo "--- Osquery Cypress tests, burning changed specs (Chrome)" -yarn --cwd x-pack/plugins/osquery cypress:changed-specs-only +set +e +yarn cypress:changed-specs-only; status=$?; yarn junit:merge && exit $status \ No newline at end of file diff --git a/.buildkite/scripts/steps/functional/response_ops.sh b/.buildkite/scripts/steps/functional/response_ops.sh index 1c065b2373b66..05e740bbf8d55 100755 --- a/.buildkite/scripts/steps/functional/response_ops.sh +++ b/.buildkite/scripts/steps/functional/response_ops.sh @@ -12,4 +12,5 @@ echo "--- Response Ops Cypress Tests on Security Solution" cd x-pack/test/security_solution_cypress +set +e yarn cypress:run:respops:ess; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/response_ops_cases.sh b/.buildkite/scripts/steps/functional/response_ops_cases.sh index 52eb3fce1985e..895edf0395dd0 100755 --- a/.buildkite/scripts/steps/functional/response_ops_cases.sh +++ b/.buildkite/scripts/steps/functional/response_ops_cases.sh @@ -12,4 +12,5 @@ echo "--- Response Ops Cases Cypress Tests on Security Solution" cd x-pack/test/security_solution_cypress +set +e yarn cypress:run:cases:ess; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/security_serverless.sh b/.buildkite/scripts/steps/functional/security_serverless.sh index 0a14478414bf3..984697ba6129b 100644 --- a/.buildkite/scripts/steps/functional/security_serverless.sh +++ b/.buildkite/scripts/steps/functional/security_serverless.sh @@ -12,4 +12,5 @@ echo "--- Security Serverless Cypress Tests" cd x-pack/test/security_solution_cypress +set +e yarn cypress:run:serverless; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/security_serverless_explore.sh b/.buildkite/scripts/steps/functional/security_serverless_explore.sh index 805f4fe147180..64cd304a4bff2 100644 --- a/.buildkite/scripts/steps/functional/security_serverless_explore.sh +++ b/.buildkite/scripts/steps/functional/security_serverless_explore.sh @@ -12,4 +12,5 @@ echo "--- Explore - Security Solution Cypress Tests" cd x-pack/test/security_solution_cypress +set +e yarn cypress:explore:run:serverless; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/security_serverless_investigations.sh b/.buildkite/scripts/steps/functional/security_serverless_investigations.sh index 15f249d474c40..49a9392f23de1 100644 --- a/.buildkite/scripts/steps/functional/security_serverless_investigations.sh +++ b/.buildkite/scripts/steps/functional/security_serverless_investigations.sh @@ -12,4 +12,5 @@ echo "--- Investigations Cypress Tests on Serverless" cd x-pack/test/security_solution_cypress +set +e yarn cypress:investigations:run:serverless; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/security_solution.sh b/.buildkite/scripts/steps/functional/security_solution.sh index f02419a0b6f8c..ffd82a3601ba4 100755 --- a/.buildkite/scripts/steps/functional/security_solution.sh +++ b/.buildkite/scripts/steps/functional/security_solution.sh @@ -12,4 +12,5 @@ echo "--- Security Solution Cypress tests (Chrome)" cd x-pack/test/security_solution_cypress +set +e yarn cypress:run:ess; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/security_solution_explore.sh b/.buildkite/scripts/steps/functional/security_solution_explore.sh index e7d21b61f7209..03295b993dafd 100644 --- a/.buildkite/scripts/steps/functional/security_solution_explore.sh +++ b/.buildkite/scripts/steps/functional/security_solution_explore.sh @@ -12,4 +12,5 @@ echo "--- Explore Cypress Tests on Security Solution" cd x-pack/test/security_solution_cypress +set +e yarn cypress:explore:run:ess; status=$?; yarn junit:merge && exit $status diff --git a/.buildkite/scripts/steps/functional/security_solution_investigations.sh b/.buildkite/scripts/steps/functional/security_solution_investigations.sh index 217e79bc9ecfc..11e0d1fb7fea7 100644 --- a/.buildkite/scripts/steps/functional/security_solution_investigations.sh +++ b/.buildkite/scripts/steps/functional/security_solution_investigations.sh @@ -12,4 +12,5 @@ echo "--- Investigations - Security Solution Cypress Tests" cd x-pack/test/security_solution_cypress +set +e yarn cypress:investigations:run:ess; status=$?; yarn junit:merge && exit $status From a29bfb0e7b0074311a028b7bdd013f17c20e3962 Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Tue, 5 Sep 2023 01:44:57 -0500 Subject: [PATCH 17/84] [ML] Fix data comparison on basic license (#165383) --- .../routing/routes/datavisualizer/data_comparison.tsx | 2 +- .../application/routing/routes/new_job/index_or_search.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx index b8efd6b7df529..46f58318c1b92 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx @@ -52,7 +52,7 @@ export const dataComparisonRouteFactory = ( }); const PageWrapper: FC = () => { - const { context } = useRouteResolver('basic', [], basicResolvers()); + const { context } = useRouteResolver('full', [], basicResolvers()); return ( diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx index bc93f13f01a70..cb12cd22ab6c2 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx @@ -199,7 +199,7 @@ export const dataComparisonIndexOrSearchRouteFactory = ( {...props} nextStepPath={createPath(ML_PAGES.DATA_COMPARISON)} deps={deps} - mode={MODE.DATAVISUALIZER} + mode={MODE.NEW_JOB} /> ), breadcrumbs: getDataVisBreadcrumbs(navigateToPath, basePath), From 0f40b6dbc1f341f31c47ee9594b8654d898a9592 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 5 Sep 2023 09:29:11 +0200 Subject: [PATCH 18/84] [Lens] Prevent user to use decimals for custom Percentile rank function in Top values (#165616) ## Summary Fixes #165001 Decimals are still allowed as dimension column: Screenshot 2023-09-04 at 18 20 30 But considered invalid values when used inline in Top values as custom ranking function: Screenshot 2023-09-04 at 18 20 44 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../definitions/percentile_ranks.test.tsx | 68 +++++++++++++++++++ .../definitions/percentile_ranks.tsx | 8 +-- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx index 28cc1cedcd804..981beede0330f 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.test.tsx @@ -359,5 +359,73 @@ describe('percentile ranks', () => { .prop('value') ).toEqual('miaou'); }); + + it('should support decimals on dimension edit', () => { + const updateLayerSpy = jest.fn(); + const instance = mount( + + ); + + const input = instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-input"]') + .find(EuiFieldNumber); + + act(() => { + input.prop('onChange')!({ + currentTarget: { value: '10.5' }, + } as React.ChangeEvent); + }); + + instance.update(); + + expect(updateLayerSpy).toHaveBeenCalled(); + }); + + it('should not support decimals on inline edit', () => { + const updateLayerSpy = jest.fn(); + const instance = mount( + + ); + + const input = instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-input"]') + .find(EuiFieldNumber); + + act(() => { + input.prop('onChange')!({ + currentTarget: { value: '10.5' }, + } as React.ChangeEvent); + }); + + instance.update(); + + expect(updateLayerSpy).not.toHaveBeenCalled(); + + expect( + instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-form"]') + .first() + .prop('isInvalid') + ).toEqual(true); + expect( + instance + .find('[data-test-subj="lns-indexPattern-percentile_ranks-input"]') + .find(EuiFieldNumber) + .prop('value') + ).toEqual('10.5'); + }); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx index 7e071f8ddbd98..eda66e93765a5 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx @@ -189,7 +189,7 @@ export const percentileRanksOperation: OperationDefinition< }); const onChange = useCallback( (value) => { - if (!isValidNumber(value) || Number(value) === currentColumn.params.value) { + if (!isValidNumber(value, isInline) || Number(value) === currentColumn.params.value) { return; } paramEditorUpdater({ @@ -209,7 +209,7 @@ export const percentileRanksOperation: OperationDefinition< }, } as PercentileRanksIndexPatternColumn); }, - [paramEditorUpdater, currentColumn, indexPattern] + [isInline, currentColumn, paramEditorUpdater, indexPattern] ); const { inputValue, handleInputChange: handleInputChangeWithoutValidation } = useDebouncedValue< string | undefined @@ -220,7 +220,7 @@ export const percentileRanksOperation: OperationDefinition< }, { allowFalsyValue: true } ); - const inputValueIsValid = isValidNumber(inputValue); + const inputValueIsValid = isValidNumber(inputValue, isInline); const handleInputChange: EuiFieldNumberProps['onChange'] = useCallback( (e) => { @@ -250,7 +250,7 @@ export const percentileRanksOperation: OperationDefinition< compressed value={inputValue ?? ''} onChange={handleInputChange} - step="any" + step={isInline ? 1 : 'any'} aria-label={percentileRanksLabel} /> From 528884c5f32cb861f7d11260bd18236ef46d800a Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Tue, 5 Sep 2023 10:15:21 +0200 Subject: [PATCH 19/84] Enabled connector types API (#164689) Resolves: #163751 This PR adds a new API to allow the other plugins to define an **enabled connector types list** in the actions registry. The list is used during the action execution to decide if the action type is executable (enabled). This decision logic sits on the existing two other checks: 1- `isActionTypeEnabled` -> if the connector type is in the `enabledActionTypes` list in the config 2- `isLicenseValidForActionType` -> if the connector type is allowed for the active license As the only user of this feature is just security-solutions for now, we decided to allow the list to be set only once. Screenshot 2023-08-31 at 12 00 10 Screenshot 2023-08-31 at 12 13 38 Screenshot 2023-08-31 at 12 00 01 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/actions/kibana.jsonc | 3 +- x-pack/plugins/actions/server/config.ts | 17 +- x-pack/plugins/actions/server/mocks.ts | 1 + x-pack/plugins/actions/server/plugin.test.ts | 189 +++++++++++++++++++ x-pack/plugins/actions/server/plugin.ts | 41 +++- x-pack/plugins/actions/tsconfig.json | 1 + 6 files changed, 240 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/actions/kibana.jsonc b/x-pack/plugins/actions/kibana.jsonc index 9152e64ba898a..78f66742c2a03 100644 --- a/x-pack/plugins/actions/kibana.jsonc +++ b/x-pack/plugins/actions/kibana.jsonc @@ -21,7 +21,8 @@ "usageCollection", "spaces", "security", - "monitoringCollection" + "monitoringCollection", + "serverless" ], "extraPublicDirs": [ "common" diff --git a/x-pack/plugins/actions/server/config.ts b/x-pack/plugins/actions/server/config.ts index 9a620d1452f23..da45fd40cf925 100644 --- a/x-pack/plugins/actions/server/config.ts +++ b/x-pack/plugins/actions/server/config.ts @@ -64,6 +64,15 @@ const connectorTypeSchema = schema.object({ maxAttempts: schema.maybe(schema.number({ min: MIN_MAX_ATTEMPTS, max: MAX_MAX_ATTEMPTS })), }); +// We leverage enabledActionTypes list by allowing the other plugins to overwrite it by using "setEnabledConnectorTypes" in the plugin setup. +// The list can be overwritten only if it's not already been set in the config. +const enabledConnectorTypesSchema = schema.arrayOf( + schema.oneOf([schema.string(), schema.literal(EnabledActionTypes.Any)]), + { + defaultValue: [AllowedHosts.Any], + } +); + export const configSchema = schema.object({ allowedHosts: schema.arrayOf( schema.oneOf([schema.string({ hostname: true }), schema.literal(AllowedHosts.Any)]), @@ -71,12 +80,7 @@ export const configSchema = schema.object({ defaultValue: [AllowedHosts.Any], } ), - enabledActionTypes: schema.arrayOf( - schema.oneOf([schema.string(), schema.literal(EnabledActionTypes.Any)]), - { - defaultValue: [AllowedHosts.Any], - } - ), + enabledActionTypes: enabledConnectorTypesSchema, preconfiguredAlertHistoryEsIndex: schema.boolean({ defaultValue: false }), preconfigured: schema.recordOf(schema.string(), preconfiguredActionSchema, { defaultValue: {}, @@ -129,6 +133,7 @@ export const configSchema = schema.object({ }); export type ActionsConfig = TypeOf; +export type EnabledConnectorTypes = TypeOf; // It would be nicer to add the proxyBypassHosts / proxyOnlyHosts restriction on // simultaneous usage in the config validator directly, but there's no good way to express diff --git a/x-pack/plugins/actions/server/mocks.ts b/x-pack/plugins/actions/server/mocks.ts index ad26114cf7d07..70a2cfd9f8e85 100644 --- a/x-pack/plugins/actions/server/mocks.ts +++ b/x-pack/plugins/actions/server/mocks.ts @@ -31,6 +31,7 @@ const createSetupMock = () => { getCaseConnectorClass: jest.fn(), getActionsHealth: jest.fn(), getActionsConfigurationUtilities: jest.fn(), + setEnabledConnectorTypes: jest.fn(), }; return mock; }; diff --git a/x-pack/plugins/actions/server/plugin.test.ts b/x-pack/plugins/actions/server/plugin.test.ts index 66d75da5fd7cf..d3bc3be1a9deb 100644 --- a/x-pack/plugins/actions/server/plugin.test.ts +++ b/x-pack/plugins/actions/server/plugin.test.ts @@ -348,6 +348,163 @@ describe('Actions Plugin', () => { expect(pluginSetup.isPreconfiguredConnector('anotherConnectorId')).toEqual(false); }); }); + + describe('setEnabledConnectorTypes (works only on serverless)', () => { + function setup(config: ActionsConfig) { + context = coreMock.createPluginInitializerContext(config); + plugin = new ActionsPlugin(context); + coreSetup = coreMock.createSetup(); + pluginsSetup = { + taskManager: taskManagerMock.createSetup(), + encryptedSavedObjects: encryptedSavedObjectsMock.createSetup(), + licensing: licensingMock.createSetup(), + eventLog: eventLogMock.createSetup(), + usageCollection: usageCollectionPluginMock.createSetupContract(), + features: featuresPluginMock.createSetup(), + serverless: {}, + }; + } + + it('should set connector type enabled', async () => { + setup(getConfig()); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + const coreStart = coreMock.createStart(); + const pluginsStart = { + licensing: licensingMock.createStart(), + taskManager: taskManagerMock.createStart(), + encryptedSavedObjects: encryptedSavedObjectsMock.createStart(), + eventLog: eventLogMock.createStart(), + }; + const pluginStart = plugin.start(coreStart, pluginsStart); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.registerType({ + id: '.slack', + name: 'Slack', + minimumLicenseRequired: 'gold', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.setEnabledConnectorTypes(['.server-log']); + expect(pluginStart.isActionTypeEnabled('.server-log')).toBeTruthy(); + expect(pluginStart.isActionTypeEnabled('.slack')).toBeFalsy(); + }); + + it('should set all the connector types enabled when null or ["*"] passed', async () => { + setup(getConfig()); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + const coreStart = coreMock.createStart(); + const pluginsStart = { + licensing: licensingMock.createStart(), + taskManager: taskManagerMock.createStart(), + encryptedSavedObjects: encryptedSavedObjectsMock.createStart(), + eventLog: eventLogMock.createStart(), + }; + const pluginStart = plugin.start(coreStart, pluginsStart); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.registerType({ + id: '.index', + name: 'Index', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.setEnabledConnectorTypes(['*']); + expect(pluginStart.isActionTypeEnabled('.server-log')).toBeTruthy(); + expect(pluginStart.isActionTypeEnabled('.index')).toBeTruthy(); + }); + + it('should set all the connector types disabled when [] passed', async () => { + setup(getConfig()); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + const coreStart = coreMock.createStart(); + const pluginsStart = { + licensing: licensingMock.createStart(), + taskManager: taskManagerMock.createStart(), + encryptedSavedObjects: encryptedSavedObjectsMock.createStart(), + eventLog: eventLogMock.createStart(), + }; + const pluginStart = plugin.start(coreStart, pluginsStart); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.registerType({ + id: '.index', + name: 'Index', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.setEnabledConnectorTypes([]); + expect(pluginStart.isActionTypeEnabled('.server-log')).toBeFalsy(); + expect(pluginStart.isActionTypeEnabled('.index')).toBeFalsy(); + }); + + it('should throw if the enabledActionTypes is already set by the config', async () => { + setup({ ...getConfig(), enabledActionTypes: ['.email'] }); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + + expect(() => pluginSetup.setEnabledConnectorTypes(['.index'])).toThrow( + "Enabled connector types can be set only if they haven't already been set in the config" + ); + }); + }); }); describe('start()', () => { @@ -396,6 +553,38 @@ describe('Actions Plugin', () => { }; }); + it('should throw when there is an invalid connector type in enabledActionTypes', async () => { + const pluginSetup = await plugin.setup(coreSetup, { + ...pluginsSetup, + encryptedSavedObjects: { + ...pluginsSetup.encryptedSavedObjects, + canEncrypt: true, + }, + serverless: {}, + }); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + + pluginSetup.setEnabledConnectorTypes(['.server-log', 'non-existing']); + + await expect(async () => + plugin.start(coreStart, { ...pluginsStart, serverless: {} }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Action type \\"non-existing\\" is not registered."` + ); + }); + describe('getActionsClientWithRequest()', () => { it('should not throw error when ESO plugin has encryption key', async () => { await plugin.setup(coreSetup, { diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index b8b88b05049ca..415a9e36a1c01 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -40,7 +40,8 @@ import { } from '@kbn/event-log-plugin/server'; import { MonitoringCollectionSetup } from '@kbn/monitoring-collection-plugin/server'; -import { ActionsConfig, getValidatedConfig } from './config'; +import { ServerlessPluginSetup } from '@kbn/serverless/server'; +import { ActionsConfig, AllowedHosts, EnabledConnectorTypes, getValidatedConfig } from './config'; import { resolveCustomHosts } from './lib/custom_host_settings'; import { ActionsClient } from './actions_client/actions_client'; import { ActionTypeRegistry } from './action_type_registry'; @@ -100,10 +101,8 @@ import { createSubActionConnectorFramework } from './sub_action_framework'; import { IServiceAbstract, SubActionConnectorType } from './sub_action_framework/types'; import { SubActionConnector } from './sub_action_framework/sub_action_connector'; import { CaseConnector } from './sub_action_framework/case'; -import { - type IUnsecuredActionsClient, - UnsecuredActionsClient, -} from './unsecured_actions_client/unsecured_actions_client'; +import type { IUnsecuredActionsClient } from './unsecured_actions_client/unsecured_actions_client'; +import { UnsecuredActionsClient } from './unsecured_actions_client/unsecured_actions_client'; import { createBulkUnsecuredExecutionEnqueuerFunction } from './create_unsecured_execute_function'; import { createSystemConnectors } from './create_system_actions'; @@ -130,6 +129,7 @@ export interface PluginSetupContract { getCaseConnectorClass: () => IServiceAbstract; getActionsHealth: () => { hasPermanentEncryptionKey: boolean }; getActionsConfigurationUtilities: () => ActionsConfigurationUtilities; + setEnabledConnectorTypes: (connectorTypes: EnabledConnectorTypes) => void; } export interface PluginStartContract { @@ -169,6 +169,7 @@ export interface ActionsPluginsSetup { features: FeaturesPluginSetup; spaces?: SpacesPluginSetup; monitoringCollection?: MonitoringCollectionSetup; + serverless?: ServerlessPluginSetup; } export interface ActionsPluginsStart { @@ -178,6 +179,7 @@ export interface ActionsPluginsStart { eventLog: IEventLogClientService; spaces?: SpacesPluginStart; security?: SecurityPluginStart; + serverless?: ServerlessPluginSetup; } const includedHiddenTypes = [ @@ -375,6 +377,20 @@ export class ActionsPlugin implements Plugin actionsConfigUtils, + setEnabledConnectorTypes: (connectorTypes) => { + if ( + !!plugins.serverless && + this.actionsConfig.enabledActionTypes.length === 1 && + this.actionsConfig.enabledActionTypes[0] === AllowedHosts.Any + ) { + this.actionsConfig.enabledActionTypes.pop(); + this.actionsConfig.enabledActionTypes.push(...connectorTypes); + } else { + throw new Error( + "Enabled connector types can be set only if they haven't already been set in the config" + ); + } + }, }; } @@ -542,6 +558,8 @@ export class ActionsPlugin implements Plugin { return this.actionTypeRegistry!.isActionTypeEnabled(id, options); @@ -695,6 +713,19 @@ export class ActionsPlugin implements Plugin { + if ( + !!plugins.serverless && + this.actionsConfig.enabledActionTypes.length > 0 && + this.actionsConfig.enabledActionTypes[0] !== AllowedHosts.Any + ) { + this.actionsConfig.enabledActionTypes.forEach((connectorType) => { + // Throws error if action type doesn't exist + this.actionTypeRegistry?.get(connectorType); + }); + } + }; + public stop() { if (this.licenseState) { this.licenseState.clean(); diff --git a/x-pack/plugins/actions/tsconfig.json b/x-pack/plugins/actions/tsconfig.json index 0f4d2faf03e1a..3beeddef429b2 100644 --- a/x-pack/plugins/actions/tsconfig.json +++ b/x-pack/plugins/actions/tsconfig.json @@ -43,6 +43,7 @@ "@kbn/core-saved-objects-api-server-mocks", "@kbn/core-elasticsearch-server-mocks", "@kbn/core-logging-server-mocks", + "@kbn/serverless" ], "exclude": [ "target/**/*", From 531acda76cadb6ab3afd8c6a128fdd5656786660 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 5 Sep 2023 11:17:23 +0200 Subject: [PATCH 20/84] GitHub create-deploy-tag workflow: Allow kibana-operations team to trigger (#165630) --- .github/workflows/create-deploy-tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-deploy-tag.yml b/.github/workflows/create-deploy-tag.yml index ec06f8c11b49d..d91df87fd547a 100644 --- a/.github/workflows/create-deploy-tag.yml +++ b/.github/workflows/create-deploy-tag.yml @@ -19,7 +19,7 @@ concurrency: jobs: create-deploy-tag: # Temporary, we need a way to limit this to a GitHub team instead of specific users - if: contains('["watson","clintandrewhall","kobelb","lukeelmers","thomasneirynck"]', github.triggering_actor) + if: contains('["watson","clintandrewhall","kobelb","lukeelmers","thomasneirynck","jbudz","mistic","delanni","Ikuni17"]', github.triggering_actor) runs-on: ubuntu-latest permissions: contents: write From 835e66a25dcf3894167236c16a821d1317a2d039 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 5 Sep 2023 11:17:45 +0200 Subject: [PATCH 21/84] [Graph] Fix settings tabs when in dark mode (#165614) ## Summary Fixes #165354 Dark mode set at space level/Advanced settings Screenshot 2023-09-04 at 17 56 38 Light mode set at space level Screenshot 2023-09-04 at 17 57 06 Dark mode set as profile setting: Screenshot 2023-09-04 at 17 55 40 Light mode set as profile setting: Screenshot 2023-09-04 at 17 56 05 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../workspace_layout/workspace_top_nav_menu.tsx | 12 +++++------- x-pack/plugins/graph/tsconfig.json | 1 + 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx index 99ec4a3d5ce5f..f4dc33f73176c 100644 --- a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx +++ b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx @@ -12,7 +12,7 @@ import { AppMountParameters, Capabilities, CoreStart } from '@kbn/core/public'; import { useHistory, useLocation } from 'react-router-dom'; import { Start as InspectorPublicPluginStart, RequestAdapter } from '@kbn/inspector-plugin/public'; import { NavigationPublicPluginStart as NavigationStart } from '@kbn/navigation-plugin/public'; -import { toMountPoint, wrapWithTheme } from '@kbn/kibana-react-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { datasourceSelector, hasFieldsSelector } from '../../state_management'; import { GraphSavePolicy, GraphWorkspaceSavedObject, Workspace } from '../../types'; import { AsObservable, Settings, SettingsWorkspaceProps } from '../settings'; @@ -162,12 +162,10 @@ export const WorkspaceTopNavMenu = (props: WorkspaceTopNavMenuProps) => { props.coreStart.overlays.openFlyout( toMountPoint( - wrapWithTheme( - - - , - props.coreStart.theme.theme$ - ) + + + , + { theme: props.coreStart.theme, i18n: props.coreStart.i18n } ), { size: 'm', diff --git a/x-pack/plugins/graph/tsconfig.json b/x-pack/plugins/graph/tsconfig.json index f4dc6a3faaf73..1e8059c99c5d7 100644 --- a/x-pack/plugins/graph/tsconfig.json +++ b/x-pack/plugins/graph/tsconfig.json @@ -46,6 +46,7 @@ "@kbn/content-management-table-list-view-table", "@kbn/content-management-table-list-view", "@kbn/core-ui-settings-browser", + "@kbn/react-kibana-mount", ], "exclude": [ "target/**/*", From a53e3055c0f01ab8290feb059c4a468e81e0195a Mon Sep 17 00:00:00 2001 From: Ramon Butter Date: Tue, 5 Sep 2023 11:19:17 +0200 Subject: [PATCH 22/84] change quality gates notifications (#165646) --- .../quality-gates/pipeline.kibana-tests.yaml | 17 +++++++++++++++++ .../pipeline.tests-production.yaml | 16 ++++++++++++---- .../quality-gates/pipeline.tests-qa.yaml | 16 ++++++++++++---- .../quality-gates/pipeline.tests-staging.yaml | 16 ++++++++++++---- 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml index 27e55dfced9d7..0acdb66f8d5f2 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml @@ -1,4 +1,17 @@ +# This pipeline serves as the entry point for your service's quality gates definitions. When +# properly configured, it will be invoked automatically as part of the automated +# promotion process once a new version was rolled out in one of the various cloud stages. +# +# The updated environment is provided via ENVIRONMENT variable. The seedling +# step will branch and execute pipeline snippets at the following location: +# pipeline.tests-qa.yaml +# pipeline.tests-staging.yaml +# pipeline.tests-production.yaml +# +# Docs: https://docs.elastic.dev/serverless/qualitygates + env: + TEAM_CHANNEL: "#kibana-mission-control" ENVIRONMENT: ${ENVIRONMENT?} steps: @@ -8,3 +21,7 @@ steps: command: "make -C /agent run-environment-tests" agents: image: "docker.elastic.co/ci-agent-images/quality-gate-seedling:0.0.2" + +notify: + - slack: "${TEAM_CHANNEL?}" + if: build.branch == "main" && build.state == "failed" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index f283e2e4f6c9a..1c30a7f734df4 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -1,6 +1,6 @@ -env: - TEAM_CHANNEL: "#kibana-serverless-release" - ENVIRONMENT: "production" +# These pipeline steps constitute the quality gate for your service within the production +# environment. Incorporate any necessary additional logic to validate the service's integrity. +# A failure in this pipeline build will prevent further progression to the subsequent stage. steps: - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" @@ -13,9 +13,17 @@ steps: agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":rocket: Run cp e2e tests" + trigger: "ess-k8s-production-e2e-tests" + build: + message: "${BUILDKITE_MESSAGE}" + env: + REGION_ID: aws-us-east-1 + NAME_PREFIX: ci_test_${SERVICE}-promotion_ + - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" agents: - image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.1" + image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml index 7bb446f5713f0..e03e986f65833 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -1,6 +1,6 @@ -env: - TEAM_CHANNEL: "#kibana-serverless-release" - ENVIRONMENT: "qa" +# These pipeline steps constitute the quality gate for your service within the QA environment. +# Incorporate any necessary additional logic to validate the service's integrity. A failure in +# this pipeline build will prevent further progression to the subsequent stage. steps: - label: ":pipeline::kibana::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" @@ -23,9 +23,17 @@ steps: agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":rocket: Run cp e2e tests" + trigger: "ess-k8s-qa-e2e-tests-daily" + build: + message: "${BUILDKITE_MESSAGE}" + env: + REGION_ID: aws-eu-west-1 + NAME_PREFIX: ci_test_kibana-promotion_ + - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" agents: - image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.1" + image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml index 2f3e497fc6d31..83bfd0d27e34c 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml @@ -1,6 +1,6 @@ -env: - TEAM_CHANNEL: "#kibana-serverless-release" - ENVIRONMENT: "staging" +# These pipeline steps constitute the quality gate for your service within the staging environment. +# Incorporate any necessary additional logic to validate the service's integrity. A failure in +# this pipeline build will prevent further progression to the subsequent stage. steps: - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" @@ -13,9 +13,17 @@ steps: agents: image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":rocket: Run cp e2e tests" + trigger: "ess-k8s-staging-e2e-tests" + build: + message: "${BUILDKITE_MESSAGE}" + env: + REGION_ID: aws-us-east-1 + NAME_PREFIX: ci_test_kibana-promotion_ + - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" agents: - image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.1" + image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" From 22ae6bc7dbee3764deb8879b0eadaac7c948c270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Tue, 5 Sep 2023 12:00:45 +0200 Subject: [PATCH 23/84] [APM] Move index settings persistence to data access plugn (#165560) Moves persistence of APM Index Settings to the data access plugin --- .../routes/settings/apm_indices/route.ts | 2 +- .../settings/apm_indices/save_apm_indices.ts | 39 ------------------- .../server/saved_objects/apm_indices.ts | 23 +++++++++++ .../saved_objects}/save_apm_indices.test.ts | 2 +- 4 files changed, 25 insertions(+), 41 deletions(-) delete mode 100644 x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts rename x-pack/plugins/{apm/server/routes/settings/apm_indices => apm_data_access/server/saved_objects}/save_apm_indices.test.ts (95%) diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts index 434ae4785ce5a..3698a13a1f2a6 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices/route.ts @@ -8,12 +8,12 @@ import * as t from 'io-ts'; import { SavedObject } from '@kbn/core/server'; import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; +import { saveApmIndices } from '@kbn/apm-data-access-plugin/server/saved_objects/apm_indices'; import { createApmServerRoute } from '../../apm_routes/create_apm_server_route'; import { getApmIndexSettings, ApmIndexSettingsResponse, } from './get_apm_indices'; -import { saveApmIndices } from './save_apm_indices'; // get list of apm indices and values const apmIndexSettingsRoute = createApmServerRoute({ diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts deleted file mode 100644 index e9d2bd5fbea92..0000000000000 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { SavedObjectsClientContract } from '@kbn/core/server'; -import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; -import { - APMIndicesSavedObjectBody, - APM_INDEX_SETTINGS_SAVED_OBJECT_ID, - APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, -} from '@kbn/apm-data-access-plugin/server/saved_objects/apm_indices'; -import { withApmSpan } from '../../../utils/with_apm_span'; - -export function saveApmIndices( - savedObjectsClient: SavedObjectsClientContract, - apmIndices: Partial -) { - return withApmSpan('save_apm_indices', () => - savedObjectsClient.create( - APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, - { apmIndices: removeEmpty(apmIndices), isSpaceAware: true }, - { id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, overwrite: true } - ) - ); -} - -// remove empty/undefined values -function removeEmpty(apmIndices: Partial) { - return Object.entries(apmIndices) - .map(([key, value]) => [key, value?.trim()]) - .filter(([_, value]) => !!value) - .reduce((obj, [key, value]) => { - obj[key] = value; - return obj; - }, {} as Record); -} diff --git a/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts b/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts index 7ab90ef0a605c..96b9c31d6b91c 100644 --- a/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts +++ b/x-pack/plugins/apm_data_access/server/saved_objects/apm_indices.ts @@ -11,6 +11,7 @@ import { schema } from '@kbn/config-schema'; import { SavedObjectsErrorHelpers } from '@kbn/core/server'; import { SavedObjectsClientContract } from '@kbn/core/server'; import { updateApmOssIndexPaths } from './migrations/update_apm_oss_index_paths'; +import { APMIndices } from '..'; export const APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE = 'apm-indices'; export const APM_INDEX_SETTINGS_SAVED_OBJECT_ID = 'apm-indices'; @@ -73,6 +74,28 @@ export const apmIndicesSavedObjectDefinition: SavedObjectsType = { }, }; +export function saveApmIndices( + savedObjectsClient: SavedObjectsClientContract, + apmIndices: Partial +) { + return savedObjectsClient.create( + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + { apmIndices: removeEmpty(apmIndices), isSpaceAware: true }, + { id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, overwrite: true } + ); +} + +// remove empty/undefined values +function removeEmpty(apmIndices: Partial) { + return Object.entries(apmIndices) + .map(([key, value]) => [key, value?.trim()]) + .filter(([_, value]) => !!value) + .reduce((obj, [key, value]) => { + obj[key] = value; + return obj; + }, {} as Record); +} + export async function getApmIndicesSavedObject(savedObjectsClient: SavedObjectsClientContract) { try { const apmIndicesSavedObject = await savedObjectsClient.get>( diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts b/x-pack/plugins/apm_data_access/server/saved_objects/save_apm_indices.test.ts similarity index 95% rename from x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts rename to x-pack/plugins/apm_data_access/server/saved_objects/save_apm_indices.test.ts index e72282ba6275a..22278e6c16b56 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts +++ b/x-pack/plugins/apm_data_access/server/saved_objects/save_apm_indices.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { saveApmIndices } from './save_apm_indices'; +import { saveApmIndices } from './apm_indices'; import { SavedObjectsClientContract } from '@kbn/core/server'; describe('saveApmIndices', () => { From 4ce9d5d6cce65e878d84c63f71ae1852620f3062 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Tue, 5 Sep 2023 12:16:25 +0200 Subject: [PATCH 24/84] [Observability AI Assistant] Body should not be required for Kibana (#165653) --- .../observability_ai_assistant/public/functions/kibana.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts b/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts index 5ad877b2c2bff..a47acdb02d433 100644 --- a/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts +++ b/x-pack/plugins/observability_ai_assistant/public/functions/kibana.ts @@ -50,7 +50,7 @@ export function registerKibanaFunction({ description: 'The body of the request', }, }, - required: ['method', 'pathname', 'body'] as const, + required: ['method', 'pathname'] as const, }, }, ({ arguments: { method, pathname, body, query } }, signal) => { From af347a81ff17e618c9c1ef11e87c995cb66ca859 Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Tue, 5 Sep 2023 12:43:54 +0200 Subject: [PATCH 25/84] [Logs onboarding] hardcoded elastic agent version to 8.9.1 (#165659) Relates to https://github.com/elastic/kibana/issues/165657. --- .../observability_onboarding/server/routes/logs/route.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts b/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts index c28c393382930..085f7cece0d8a 100644 --- a/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts +++ b/x-pack/plugins/observability_onboarding/server/routes/logs/route.ts @@ -40,7 +40,7 @@ const installShipperSetupRoute = createObservabilityOnboardingServerRoute({ scriptDownloadUrl: string; elasticAgentVersion: string; }> { - const { core, plugins, kibanaVersion } = resources; + const { core, plugins } = resources; const coreStart = await core.start(); const kibanaUrl = @@ -53,7 +53,7 @@ const installShipperSetupRoute = createObservabilityOnboardingServerRoute({ return { apiEndpoint, scriptDownloadUrl, - elasticAgentVersion: kibanaVersion, + elasticAgentVersion: '8.9.1', }; }, }); From ba5da8dbf831cb4eee00ce6096063ecf30f4e5d4 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 13:19:43 +0100 Subject: [PATCH 26/84] @brokenInServerless tag for cypress suite --- .../cypress/e2e/investigations/timelines/toggle_column.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts index 5cdb4462839c2..dae3b4c52ea66 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts @@ -19,7 +19,7 @@ import { import { HOSTS_URL } from '../../../urls/navigation'; -describe('toggle column in timeline', { tags: ['@ess', '@serverless'] }, () => { +describe('toggle column in timeline', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); cy.intercept('POST', '/api/timeline/_export?file_name=timelines_export.ndjson').as('export'); From b39fc458aa864d15585e290477eab3565e8aa9d1 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 13:30:13 +0100 Subject: [PATCH 27/84] skip flaky suite (#165553) --- .../functional/test_suites/common/security/api_keys.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts b/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts index 99f01f2d19a19..32c12c9b713b4 100644 --- a/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts +++ b/x-pack/test_serverless/functional/test_suites/common/security/api_keys.ts @@ -29,7 +29,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const es = getService('es'); const log = getService('log'); - describe('API keys', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165553 + describe.skip('API keys', () => { after(async () => { await clearAllApiKeys(es, log); }); From a9c3ca501c6be7012b29b2d0ce298fde74cf7257 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 13:31:39 +0100 Subject: [PATCH 28/84] fix(NA): eslint check --- .../timelines/toggle_column.cy.ts | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts index dae3b4c52ea66..c2ca620a40554 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/toggle_column.cy.ts @@ -19,30 +19,34 @@ import { import { HOSTS_URL } from '../../../urls/navigation'; -describe('toggle column in timeline', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - before(() => { - cleanKibana(); - cy.intercept('POST', '/api/timeline/_export?file_name=timelines_export.ndjson').as('export'); - }); - - beforeEach(() => { - login(); - visit(HOSTS_URL); - openTimelineUsingToggle(); - populateTimeline(); - }); - - it('removes the @timestamp field from the timeline when the user un-checks the toggle', () => { - expandFirstTimelineEventDetails(); - clickTimestampToggleField(); - - cy.get(TIMESTAMP_HEADER_FIELD).should('not.exist'); - }); - - it('adds the _id field to the timeline when the user checks the field', () => { - expandFirstTimelineEventDetails(); - clickIdToggleField(); - - cy.get(ID_HEADER_FIELD).should('exist'); - }); -}); +describe( + 'toggle column in timeline', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cleanKibana(); + cy.intercept('POST', '/api/timeline/_export?file_name=timelines_export.ndjson').as('export'); + }); + + beforeEach(() => { + login(); + visit(HOSTS_URL); + openTimelineUsingToggle(); + populateTimeline(); + }); + + it('removes the @timestamp field from the timeline when the user un-checks the toggle', () => { + expandFirstTimelineEventDetails(); + clickTimestampToggleField(); + + cy.get(TIMESTAMP_HEADER_FIELD).should('not.exist'); + }); + + it('adds the _id field to the timeline when the user checks the field', () => { + expandFirstTimelineEventDetails(); + clickIdToggleField(); + + cy.get(ID_HEADER_FIELD).should('exist'); + }); + } +); From 756599f7c2a63ed44fc5cad4c58084590ff56b84 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Tue, 5 Sep 2023 08:20:39 -0500 Subject: [PATCH 29/84] [Search] Include ingest pipeline in Getting Started code snippets (#165412) ## Summary Updated the LanguageDefinition to optionally take the ingest pipeline and document keys in code snippet function arguments. To get the index pipeline info I added a new endpoint that will check for a custom pipeline ### Screenshots cURL ![image](https://github.com/elastic/kibana/assets/1972968/28eca5a3-eeb3-4243-9627-4450cdfcb5e2) python ![image](https://github.com/elastic/kibana/assets/1972968/dbb3f997-3541-463d-a9cb-11f8a501637d) javascript ![image](https://github.com/elastic/kibana/assets/1972968/f65f62b7-b07b-446d-8aa4-7e63adad95c7) PHP ![image](https://github.com/elastic/kibana/assets/1972968/f39ef998-1124-483e-b165-50e259150697) Go ![image](https://github.com/elastic/kibana/assets/1972968/06603634-b135-4a63-b61a-0402224a1efc) Ruby ![image](https://github.com/elastic/kibana/assets/1972968/9f65fd8d-bb54-4035-adc6-f6767be59137) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-search-api-panels/types.ts | 2 + .../fetch_index_pipeline_parameters.test.ts | 34 ++++ .../fetch_index_pipeline_parameters.ts | 34 ++++ .../getting_started/getting_started.tsx | 33 +++- .../getting_started/languages/console.ts | 37 ++++ .../getting_started/languages/curl.ts | 23 ++- .../getting_started/languages/go.ts | 25 ++- .../getting_started/languages/helpers.test.ts | 39 +++++ .../getting_started/languages/helpers.ts | 38 ++++ .../getting_started/languages/javascript.ts | 42 +++-- .../getting_started/languages/php.ts | 23 ++- .../getting_started/languages/python.ts | 21 ++- .../getting_started/languages/ruby.ts | 21 ++- .../components/search_index/overview.logic.ts | 25 ++- .../lib/pipelines/get_index_pipeline.test.ts | 164 ++++++++++++++++++ .../lib/pipelines/get_index_pipeline.ts | 43 +++++ .../routes/enterprise_search/indices.ts | 21 +++ 17 files changed, 558 insertions(+), 67 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.ts create mode 100644 x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts create mode 100644 x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts diff --git a/packages/kbn-search-api-panels/types.ts b/packages/kbn-search-api-panels/types.ts index 63edec82c345d..5aba2d7b46bc0 100644 --- a/packages/kbn-search-api-panels/types.ts +++ b/packages/kbn-search-api-panels/types.ts @@ -24,6 +24,8 @@ export interface LanguageDefinitionSnippetArguments { apiKey: string; indexName?: string; cloudId?: string; + ingestPipeline?: string; + extraIngestDocumentValues?: Record; } type CodeSnippet = string | ((args: LanguageDefinitionSnippetArguments) => string); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts new file mode 100644 index 0000000000000..9290289a76b72 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.test.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mockHttpValues } from '../../../__mocks__/kea_logic'; + +import { nextTick } from '@kbn/test-jest-helpers'; + +import { fetchIndexPipelineParams } from './fetch_index_pipeline_parameters'; + +describe('FetchIndexPipelineParametersApiLogic', () => { + const { http } = mockHttpValues; + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('fetchIndexPipelineParams', () => { + it('calls correct api', async () => { + const response = { + 'pipeline-name': {}, + }; + const promise = Promise.resolve(response); + http.get.mockReturnValue(promise); + const result = fetchIndexPipelineParams({ indexName: 'index-name' }); + await nextTick(); + expect(http.get).toHaveBeenCalledWith( + '/internal/enterprise_search/indices/index-name/pipeline_parameters' + ); + await expect(result).resolves.toEqual(response); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts new file mode 100644 index 0000000000000..901a40e5c9e23 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../shared/http'; + +export interface FetchIndexPipelineParametersArgs { + indexName: string; +} +export type FetchIndexPipelineParametersResponse = IngestPipelineParams; + +export const fetchIndexPipelineParams = async ({ indexName }: FetchIndexPipelineParametersArgs) => { + const route = `/internal/enterprise_search/indices/${indexName}/pipeline_parameters`; + + return await HttpLogic.values.http.get(route); +}; + +export const FetchIndexPipelineParametersApiLogic = createApiLogic( + ['fetch_index_pipeline_params_api_logic'], + fetchIndexPipelineParams, + { + showErrorFlash: false, + } +); + +export type FetchIndexPipelineParametersApiLogicActions = Actions< + FetchIndexPipelineParametersArgs, + FetchIndexPipelineParametersResponse +>; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx index 804dd5f09eee1..37f96921227e7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/getting_started.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { css } from '@emotion/react'; import dedent from 'dedent'; @@ -29,6 +29,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { SelectClientPanel, LanguageDefinition, + LanguageDefinitionSnippetArguments, LanguageClientPanel, InstallClientPanel, OverviewPanel, @@ -50,6 +51,7 @@ import { IndexViewLogic } from '../../index_view_logic'; import { OverviewLogic } from '../../overview.logic'; import { GenerateApiKeyModal } from '../generate_api_key_modal/modal'; +import { consoleDefinition } from './languages/console'; import { javascriptDefinition } from './languages/javascript'; import { languageDefinitions } from './languages/languages'; @@ -57,17 +59,28 @@ const DEFAULT_URL = 'https://localhost:9200'; export const APIGettingStarted = () => { const { http } = useValues(HttpLogic); - const { apiKey, isGenerateModalOpen } = useValues(OverviewLogic); - const { openGenerateModal, closeGenerateModal } = useActions(OverviewLogic); + const { apiKey, isGenerateModalOpen, indexPipelineParameters } = useValues(OverviewLogic); + const { fetchIndexPipelineParameters, openGenerateModal, closeGenerateModal } = + useActions(OverviewLogic); const { indexName } = useValues(IndexViewLogic); const { services } = useKibana(); const cloudContext = useCloudDetails(); - const codeArgs = { + useEffect(() => { + fetchIndexPipelineParameters({ indexName }); + }, [indexName]); + + const codeArgs: LanguageDefinitionSnippetArguments = { apiKey, cloudId: cloudContext.cloudId, + extraIngestDocumentValues: { + _extract_binary_content: indexPipelineParameters.extract_binary_content, + _reduce_whitespace: indexPipelineParameters.reduce_whitespace, + _run_ml_inference: indexPipelineParameters.run_ml_inference, + }, indexName, + ingestPipeline: indexPipelineParameters.name, url: cloudContext.elasticsearchUrl || DEFAULT_URL, }; const assetBasePath = http.basePath.prepend(`/plugins/${PLUGIN_ID}/assets/client_libraries/`); @@ -344,7 +357,11 @@ export const APIGettingStarted = () => { { 'buildSearchQuery', codeArgs )} - consoleRequest={getConsoleRequest('buildSearchQuery')} + consoleRequest={getLanguageDefinitionCodeSnippet( + consoleDefinition, + 'buildSearchQuery', + codeArgs + )} selectedLanguage={selectedLanguage} setSelectedLanguage={setSelectedLanguage} assetBasePath={assetBasePath} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts new file mode 100644 index 0000000000000..9d395b0a68c67 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/console.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LanguageDefinition } from '@kbn/search-api-panels'; + +import { ingestKeysToJSON } from './helpers'; + +export const consoleDefinition: Partial = { + buildSearchQuery: ({ indexName }) => `POST /${indexName ?? 'books'}/_search?pretty + { + "query": { + "query_string": { + "query": "snow" + } + } + }`, + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `POST _bulk?pretty${ingestPipeline ? `&pipeline=${ingestPipeline}` : ''} + { "index" : { "_index" : "${indexName}" } } + {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}} + { "index" : { "_index" : "${indexName}" } } + {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}}`; + }, +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts index 45c67a02798ec..8bac32d754064 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/curl.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const curlDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `curl -X POST "\$\{ES_URL\}/${indexName}/_search?pretty" \\ -H "Authorization: ApiKey "\$\{API_KEY\}"" \\ @@ -33,23 +35,28 @@ export API_KEY="${apiKey}"`, }, iconType: 'curl.svg', id: Languages.CURL, - ingestData: ({ indexName }) => `curl -X POST "\$\{ES_URL\}/_bulk?pretty" \\ + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `curl -X POST "\$\{ES_URL\}/_bulk?pretty${ + ingestPipeline ? `&pipeline=${ingestPipeline}` : '' + }" \\ -H "Authorization: ApiKey "\$\{API_KEY\}"" \\ -H "Content-Type: application/json" \\ -d' { "index" : { "_index" : "${indexName}" } } -{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470} +{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585} +{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328} +{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227} +{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} +{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}} { "index" : { "_index" : "${indexName}" } } -{"name": "The Handmaid'"'"'s Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311} -'`, +{"name": "The Handmaid'"'"'s Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}} +'`; + }, ingestDataIndex: '', installClient: `# if cURL is not already installed on your system # then install it with the package manager of your choice diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts index fc3d8226f9a0c..6c504bba26bdc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/go.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const goDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `searchResp, err := es.Search( es.Search.WithContext(context.Background()), @@ -56,27 +58,32 @@ if err != nil { }, iconType: 'go.svg', id: Languages.GO, - ingestData: ({ indexName }) => `buf := bytes.NewBufferString(\` + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `buf := bytes.NewBufferString(\` {"index":{"_id":"9780553351927"}} -{"name":"Snow Crash","author":"Neal Stephenson","release_date":"1992-06-01","page_count": 470} +{"name":"Snow Crash","author":"Neal Stephenson","release_date":"1992-06-01","page_count": 470${ingestDocumentKeys}} { "index": { "_id": "9780441017225"}} -{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585} +{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}} { "index": { "_id": "9780451524935"}} -{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328} +{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}} { "index": { "_id": "9781451673319"}} -{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227} +{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}} { "index": { "_id": "9780060850524"}} -{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} +{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}} { "index": { "_id": "9780385490818"}} -{"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311} +{"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}} \`) ingestResult, err := es.Bulk( bytes.NewReader(buf.Bytes()), - es.Bulk.WithIndex("${indexName}"), + es.Bulk.WithIndex("${indexName}"),${ + ingestPipeline ? `\n es.Bulk.WithPipeline("${ingestPipeline}"),` : '' + } ) -fmt.Println(ingestResult, err)`, +fmt.Println(ingestResult, err)`; + }, ingestDataIndex: '', installClient: 'go get github.com/elastic/go-elasticsearch/v8@latest', name: i18n.translate('xpack.enterpriseSearch.languages.go', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts new file mode 100644 index 0000000000000..df13ea273061e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ingestKeysToJSON, ingestKeysToPHP, ingestKeysToRuby } from './helpers'; + +describe('getting started language helpers', () => { + describe('ingestKeysToJSON', () => { + it('return empty string when given undefined', () => { + expect(ingestKeysToJSON(undefined)).toEqual(''); + }); + it('return json keys with quotes when given expected data', () => { + expect(ingestKeysToJSON({ _foo: true, _bar: false })).toEqual( + ', "_foo": true, "_bar": false' + ); + }); + }); + describe('ingestKeysToPHP', () => { + it('return empty string when given undefined', () => { + expect(ingestKeysToPHP(undefined)).toEqual(''); + }); + it('return json keys with quotes when given expected data', () => { + expect(ingestKeysToPHP({ _foo: true, _bar: false })).toEqual( + `\n '_foo' => true,\n '_bar' => false,` + ); + }); + }); + describe('ingestKeysToRuby', () => { + it('return empty string when given undefined', () => { + expect(ingestKeysToRuby(undefined)).toEqual(''); + }); + it('return json keys with quotes when given expected data', () => { + expect(ingestKeysToRuby({ _foo: true, _bar: false })).toEqual(', _foo: true, _bar: false'); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.ts new file mode 100644 index 0000000000000..5d98779a851b3 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/helpers.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LanguageDefinitionSnippetArguments } from '@kbn/search-api-panels'; + +export const ingestKeysToJSON = ( + extraIngestDocumentValues: LanguageDefinitionSnippetArguments['extraIngestDocumentValues'] +) => + extraIngestDocumentValues + ? Object.entries(extraIngestDocumentValues).reduce((result, value) => { + result += `, "${value[0]}": ${value[1]}`; + return result; + }, '') + : ''; + +export const ingestKeysToPHP = ( + extraIngestDocumentValues: LanguageDefinitionSnippetArguments['extraIngestDocumentValues'] +) => + extraIngestDocumentValues + ? Object.entries(extraIngestDocumentValues).reduce((result, value) => { + result += `\n '${value[0]}' => ${value[1]},`; + return result; + }, '') + : ''; + +export const ingestKeysToRuby = ( + extraIngestDocumentValues: LanguageDefinitionSnippetArguments['extraIngestDocumentValues'] +) => + extraIngestDocumentValues + ? Object.entries(extraIngestDocumentValues).reduce((result, value) => { + result += `, ${value[0]}: ${value[1]}`; + return result; + }, '') + : ''; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts index c73461a1aa396..51d7e4ef68625 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/javascript.ts @@ -10,11 +10,13 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const javascriptDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `// Let's search! const searchResult = await client.search({ index: '${indexName}', - q: '9HY9SWR' + q: 'snow' }); console.log(searchResult.hits.hits) @@ -35,34 +37,38 @@ const client = new Client({ }, iconType: 'javascript.svg', id: Languages.JAVASCRIPT, - ingestData: ({ indexName }) => `// Sample flight data + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `// Sample data books const dataset = [ - {'flight': '9HY9SWR', 'price': 841.2656419677076, 'delayed': false}, - {'flight': 'X98CCZO', 'price': 882.9826615595518, 'delayed': false}, - {'flight': 'UFK2WIZ', 'price': 190.6369038508356, 'delayed': true}, + {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}}, + {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}}, + {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}}, + {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}}, + {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}}, + {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}}, ]; // Index with the bulk helper const result = await client.helpers.bulk({ - datasource: dataset, - onDocument (doc) { - return { index: { _index: '${indexName}' }}; - } + datasource: dataset,${ingestPipeline ? `\n pipeline: "${ingestPipeline}",` : ''} + onDocument: (doc) => ({ index: { _index: '${indexName}' }}), }); console.log(result); /** { - total: 3, + total: 6, failed: 0, retry: 0, - successful: 3, + successful: 6, noop: 0, - time: 421, - bytes: 293, + time: 82, + bytes: 1273, aborted: false } -*/`, +*/`; + }, ingestDataIndex: '', installClient: 'npm install @elastic/elasticsearch@8', name: i18n.translate('xpack.enterpriseSearch.languages.javascript', { @@ -80,10 +86,10 @@ console.log(resp); version: { build_flavor: 'default', build_type: 'docker', - build_hash: 'c94b4700cda13820dad5aa74fae6db185ca5c304', - build_date: '2022-10-24T16:54:16.433628434Z', - build_snapshot: false, - lucene_version: '9.4.1', + build_hash: 'ca3dc3a882d76f14d2765906ce3b1cf421948d19', + build_date: '2023-08-28T11:24:16.383660553Z', + build_snapshot: true, + lucene_version: '9.7.0', minimum_wire_compatibility_version: '7.17.0', minimum_index_compatibility_version: '7.0.0' }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts index 51ea055c23ae8..3146ca60af306 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/php.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToPHP } from './helpers'; + export const phpDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `$params = [ 'index' => '${indexName}', @@ -33,7 +35,9 @@ print_r($response->asArray());`, }, iconType: 'php.svg', id: Languages.PHP, - ingestData: ({ indexName }) => `$params = [ + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToPHP(extraIngestDocumentValues) : ''; + return `$params = [${ingestPipeline ? `\n 'pipeline' => '${ingestPipeline}',` : ''} 'body' => [ [ 'index' => [ @@ -45,7 +49,7 @@ print_r($response->asArray());`, 'name' => 'Snow Crash', 'author' => 'Neal Stephenson', 'release_date' => '1992-06-01', - 'page_count' => 470, + 'page_count' => 470,${ingestDocumentKeys} ], [ 'index' => [ @@ -57,7 +61,7 @@ print_r($response->asArray());`, 'name' => 'Revelation Space', 'author' => 'Alastair Reynolds', 'release_date' => '2000-03-15', - 'page_count' => 585, + 'page_count' => 585,${ingestDocumentKeys} ], [ 'index' => [ @@ -69,7 +73,7 @@ print_r($response->asArray());`, 'name' => '1984', 'author' => 'George Orwell', 'release_date' => '1985-06-01', - 'page_count' => 328, + 'page_count' => 328,${ingestDocumentKeys} ], [ 'index' => [ @@ -81,7 +85,7 @@ print_r($response->asArray());`, 'name' => 'Fahrenheit 451', 'author' => 'Ray Bradbury', 'release_date' => '1953-10-15', - 'page_count' => 227, + 'page_count' => 227,${ingestDocumentKeys} ], [ 'index' => [ @@ -93,7 +97,7 @@ print_r($response->asArray());`, 'name' => 'Brave New World', 'author' => 'Aldous Huxley', 'release_date' => '1932-06-01', - 'page_count' => 268, + 'page_count' => 268,${ingestDocumentKeys} ], [ 'index' => [ @@ -102,17 +106,18 @@ print_r($response->asArray());`, ], ], [ - 'name' => 'The Handmaid\'s Tale', + 'name' => 'The Handmaid\\'s Tale', 'author' => 'Margaret Atwood', 'release_date' => '1985-06-01', - 'page_count' => 311, + 'page_count' => 311,${ingestDocumentKeys} ], ], ]; $response = $client->bulk($params); echo $response->getStatusCode(); - echo (string) $response->getBody();`, + echo (string) $response->getBody();`; + }, ingestDataIndex: '', installClient: 'composer require elasticsearch/elasticsearch', name: i18n.translate('xpack.enterpriseSearch.languages.php', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts index 79fb811185f18..24723ba3632da 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/python.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToJSON } from './helpers'; + export const pythonDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `client.search(index="${indexName}", q="snow")`, configureClient: ({ url, apiKey }) => `from elasticsearch import Elasticsearch @@ -27,22 +29,25 @@ client = Elasticsearch( }, iconType: 'python.svg', id: Languages.PYTHON, - ingestData: ({ indexName }) => `documents = [ + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToJSON(extraIngestDocumentValues) : ''; + return `documents = [ { "index": { "_index": "${indexName}", "_id": "9780553351927"}}, - {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470}, + {"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780441017225"}}, - {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585}, + {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780451524935"}}, - {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328}, + {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9781451673319"}}, - {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227}, + {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780060850524"}}, - {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268}, + {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268${ingestDocumentKeys}}, { "index": { "_index": "${indexName}", "_id": "9780385490818"}}, - {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311}, + {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311${ingestDocumentKeys}}, ] -client.bulk(operations=documents)`, +client.bulk(operations=documents${ingestPipeline ? `, pipeline="${ingestPipeline}"` : ''})`; + }, ingestDataIndex: '', installClient: `python -m pip install elasticsearch diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts index 779aa3a99f1fb..43a104b0f7a8b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/getting_started/languages/ruby.ts @@ -10,6 +10,8 @@ import { Languages, LanguageDefinition } from '@kbn/search-api-panels'; import { docLinks } from '../../../../../../shared/doc_links'; +import { ingestKeysToRuby } from './helpers'; + export const rubyDefinition: LanguageDefinition = { buildSearchQuery: ({ indexName }) => `client.search(index: '${indexName}', q: 'snow')`, configureClient: ({ url, apiKey, cloudId }) => `client = Elasticsearch::Client.new( @@ -26,15 +28,18 @@ export const rubyDefinition: LanguageDefinition = { }, iconType: 'ruby.svg', id: Languages.RUBY, - ingestData: ({ indexName }) => `documents = [ - { index: { _index: '${indexName}', data: {name: "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470} } }, - { index: { _index: '${indexName}', data: {name: "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585} } }, - { index: { _index: '${indexName}', data: {name: "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328} } }, - { index: { _index: '${indexName}', data: {name: "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227} } }, - { index: { _index: '${indexName}', data: {name: "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} } }, - { index: { _index: '${indexName}', data: {name: "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311} } } + ingestData: ({ indexName, ingestPipeline, extraIngestDocumentValues }) => { + const ingestDocumentKeys = ingestPipeline ? ingestKeysToRuby(extraIngestDocumentValues) : ''; + return `documents = [ + { index: { _index: '${indexName}', data: {name: "Snow Crash", author: "Neal Stephenson", release_date: "1992-06-01", page_count: 470${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268${ingestDocumentKeys}} } }, + { index: { _index: '${indexName}', data: {name: "The Handmaid's Tale", author: "Margaret Atwood", release_date: "1985-06-01", page_count: 311${ingestDocumentKeys}} } } ] -client.bulk(body: documents)`, +client.bulk(body: documents${ingestPipeline ? `, pipeline: "${ingestPipeline}"` : ''})`; + }, ingestDataIndex: '', installClient: `$ gem install elasticsearch`, name: i18n.translate('xpack.enterpriseSearch.languages.ruby', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts index 34584d394b93a..dbe0610b4a855 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts @@ -7,7 +7,9 @@ import { kea, MakeLogicType } from 'kea'; +import { DEFAULT_PIPELINE_VALUES } from '../../../../../common/constants'; import { Status } from '../../../../../common/types/api'; +import { IngestPipelineParams } from '../../../../../common/types/connectors'; import { KibanaLogic } from '../../../shared/kibana'; import { GenerateApiKeyLogic } from '../../api/generate_api_key/generate_api_key_logic'; @@ -15,6 +17,10 @@ import { CachedFetchIndexApiLogic, CachedFetchIndexApiLogicActions, } from '../../api/index/cached_fetch_index_api_logic'; +import { + FetchIndexPipelineParametersApiLogic, + FetchIndexPipelineParametersApiLogicActions, +} from '../../api/pipelines/fetch_index_pipeline_parameters'; import { SEARCH_INDICES_PATH } from '../../routes'; @@ -22,6 +28,7 @@ interface OverviewLogicActions { apiError: CachedFetchIndexApiLogicActions['apiError']; apiReset: typeof GenerateApiKeyLogic.actions.apiReset; closeGenerateModal: void; + fetchIndexPipelineParameters: FetchIndexPipelineParametersApiLogicActions['makeRequest']; openGenerateModal: void; toggleClientsPopover: void; toggleManageApiKeyPopover: void; @@ -32,6 +39,8 @@ interface OverviewLogicValues { apiKeyData: typeof GenerateApiKeyLogic.values.data; apiKeyStatus: typeof GenerateApiKeyLogic.values.status; indexData: typeof CachedFetchIndexApiLogic.values.indexData; + indexPipelineData: typeof FetchIndexPipelineParametersApiLogic.values.data; + indexPipelineParameters: IngestPipelineParams; isClientsPopoverOpen: boolean; isError: boolean; isGenerateModalOpen: boolean; @@ -48,12 +57,21 @@ export const OverviewLogic = kea ({ @@ -95,6 +113,11 @@ export const OverviewLogic = kea apiKeyStatus === Status.SUCCESS ? apiKeyData.apiKey.encoded : '', ], + indexPipelineParameters: [ + () => [selectors.indexPipelineData], + (indexPipelineData: typeof FetchIndexPipelineParametersApiLogic.values.data) => + indexPipelineData ?? DEFAULT_PIPELINE_VALUES, + ], isError: [() => [selectors.status], (status) => status === Status.ERROR], isLoading: [ () => [selectors.status, selectors.indexData], diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts new file mode 100644 index 0000000000000..58476ed18b741 --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.test.ts @@ -0,0 +1,164 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { IScopedClusterClient } from '@kbn/core/server'; + +import { DEFAULT_PIPELINE_VALUES } from '../../../common/constants'; + +import { getIndexPipelineParameters } from './get_index_pipeline'; + +describe('getIndexPipelineParameters', () => { + const defaultMockClient = () => ({ + asCurrentUser: { + get: jest.fn().mockResolvedValue({}), + indices: { + getMapping: jest.fn().mockResolvedValue({}), + }, + ingest: { + getPipeline: jest.fn().mockRejectedValue('Pipeline not found'), + }, + search: jest.fn().mockResolvedValue({ + hits: { + hits: [], + }, + }), + }, + }); + let mockClient = defaultMockClient(); + let client: IScopedClusterClient; + beforeEach(() => { + jest.resetAllMocks(); + + mockClient = defaultMockClient(); + client = mockClient as unknown as IScopedClusterClient; + }); + it('returns default pipeline if custom not found', async () => { + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual( + DEFAULT_PIPELINE_VALUES + ); + }); + it('returns connector pipeline params if found', async () => { + mockClient.asCurrentUser.search = jest.fn().mockResolvedValue({ + hits: { + hits: [ + { + _id: 'unit-test', + _source: {}, + }, + ], + }, + }); + mockClient.asCurrentUser.get = jest.fn().mockResolvedValue({ + _id: 'unit-test', + _source: { + pipeline: { + extract_binary_content: false, + name: 'unit-test-pipeline', + reduce_whitespace: true, + run_ml_inference: true, + }, + }, + }); + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: false, + name: 'unit-test-pipeline', + reduce_whitespace: true, + run_ml_inference: true, + }); + }); + it('returns default pipeline if fetch custom throws', async () => { + mockClient.asCurrentUser.ingest.getPipeline = jest.fn().mockRejectedValue('Boom'); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual( + DEFAULT_PIPELINE_VALUES + ); + }); + it('returns custom pipeline if found', async () => { + mockClient.asCurrentUser.ingest.getPipeline = jest.fn().mockResolvedValueOnce({ + 'my-index': { + fake: 'ingest-pipeline', + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: true, + name: 'my-index', + reduce_whitespace: true, + run_ml_inference: false, + }); + }); + it('returns default connector index pipeline if found in mapping', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockResolvedValueOnce({ + '.elastic-connectors-v1': { + mappings: { + _meta: { + pipeline: { + default_extract_binary_content: false, + default_name: 'my-unit-test-index', + default_reduce_whitespace: false, + default_run_ml_inference: true, + }, + }, + }, + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: false, + name: 'my-unit-test-index', + reduce_whitespace: false, + run_ml_inference: true, + }); + }); + it('returns connector params with custom pipeline name', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockResolvedValueOnce({ + '.elastic-connectors-v1': { + mappings: { + _meta: { + pipeline: { + default_extract_binary_content: false, + default_name: 'my-unit-test-index', + default_reduce_whitespace: false, + default_run_ml_inference: true, + }, + }, + }, + }, + }); + mockClient.asCurrentUser.ingest.getPipeline = jest.fn().mockResolvedValueOnce({ + 'my-index': { + fake: 'ingest-pipeline', + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual({ + extract_binary_content: false, + name: 'my-index', + reduce_whitespace: false, + run_ml_inference: true, + }); + }); + it('returns defaults if get mapping fails with IndexNotFoundException', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockRejectedValue({ + meta: { + body: { + error: { + type: 'index_not_found_exception', + }, + }, + }, + }); + + await expect(getIndexPipelineParameters('my-index', client)).resolves.toEqual( + DEFAULT_PIPELINE_VALUES + ); + }); + it('throws if get mapping fails with non-IndexNotFoundException', async () => { + mockClient.asCurrentUser.indices.getMapping = jest.fn().mockRejectedValue('Boom'); + + await expect(getIndexPipelineParameters('my-index', client)).rejects.toEqual('Boom'); + }); +}); diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts new file mode 100644 index 0000000000000..45813a109de76 --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IScopedClusterClient } from '@kbn/core/server'; + +import { IngestPipelineParams } from '../../../common/types/connectors'; +import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; + +import { getDefaultPipeline } from './get_default_pipeline'; + +export const getIndexPipelineParameters = async ( + indexName: string, + client: IScopedClusterClient +): Promise => { + // Get the default pipeline data and check for a custom pipeline in parallel + // we want to throw the error if getDefaultPipeline() fails so we're not catching it on purpose + const [defaultPipeline, connector, customPipelineResp] = await Promise.all([ + getDefaultPipeline(client), + fetchConnectorByIndexName(client, indexName), + client.asCurrentUser.ingest + .getPipeline({ + id: `${indexName}`, + }) + .catch(() => null), + ]); + if (connector && connector.pipeline) { + return connector.pipeline; + } + let pipelineName = defaultPipeline.name; + + if (customPipelineResp && customPipelineResp[indexName]) { + pipelineName = indexName; + } + + return { + ...defaultPipeline, + name: pipelineName, + }; +}; diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts index b41f391fd66f6..25342217e5192 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts @@ -44,6 +44,7 @@ import { startMlModelDownload } from '../../lib/ml/start_ml_model_download'; import { createIndexPipelineDefinitions } from '../../lib/pipelines/create_pipeline_definitions'; import { deleteIndexPipelines } from '../../lib/pipelines/delete_pipelines'; import { getCustomPipelines } from '../../lib/pipelines/get_custom_pipelines'; +import { getIndexPipelineParameters } from '../../lib/pipelines/get_index_pipeline'; import { getPipeline } from '../../lib/pipelines/get_pipeline'; import { getMlInferencePipelines } from '../../lib/pipelines/ml_inference/get_ml_inference_pipelines'; import { revertCustomPipeline } from '../../lib/pipelines/revert_custom_pipeline'; @@ -354,6 +355,26 @@ export function registerIndexRoutes({ }) ); + router.get( + { + path: '/internal/enterprise_search/indices/{indexName}/pipeline_parameters', + validate: { + params: schema.object({ + indexName: schema.string(), + }), + }, + }, + elasticsearchErrorHandler(log, async (context, request, response) => { + const indexName = decodeURIComponent(request.params.indexName); + const { client } = (await context.core).elasticsearch; + const body = await getIndexPipelineParameters(indexName, client); + return response.ok({ + body, + headers: { 'content-type': 'application/json' }, + }); + }) + ); + router.get( { path: '/internal/enterprise_search/indices/{indexName}/ml_inference/pipeline_processors', From 5f00ae97dd3715eef5a1b87e7035f5c7608f829c Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Tue, 5 Sep 2023 06:59:52 -0700 Subject: [PATCH 30/84] [ResponseOps][Alerting] ESQL alerting rule type ( pointed at main) (#165480) Resolves https://github.com/elastic/kibana/issues/153448 ## Summary The same as this [pr](https://github.com/elastic/kibana/pull/164073), but just points at main --------- Co-authored-by: Stratoula Kalafateli Co-authored-by: Alexey Antonov Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Abdon Pijpelink Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Peter Pisljar Co-authored-by: Marco Liberati --- packages/kbn-text-based-editor/index.ts | 1 + .../src/editor_footer.tsx | 46 +-- .../src/fetch_fields_from_esql.ts | 9 +- .../src/text_based_languages_editor.test.tsx | 23 ++ .../src/text_based_languages_editor.tsx | 3 + .../common/esql_query_utils.test.ts | 95 +++++ .../stack_alerts/common/esql_query_utils.ts | 63 ++++ x-pack/plugins/stack_alerts/common/index.ts | 3 + x-pack/plugins/stack_alerts/kibana.jsonc | 3 +- .../public/rule_types/es_query/constants.ts | 7 + .../expression/esql_query_expression.test.tsx | 196 ++++++++++ .../expression/esql_query_expression.tsx | 255 +++++++++++++ .../es_query/expression/expression.test.tsx | 76 +++- .../es_query/expression/expression.tsx | 10 +- .../expression/query_form_type_chooser.tsx | 97 +++-- .../test_query_row/test_query_row.tsx | 20 +- .../test_query_row_table.test.tsx | 79 ++++ .../test_query_row/test_query_row_table.tsx | 90 +++++ .../test_query_row/use_test_query.test.ts | 20 ++ .../es_query/test_query_row/use_test_query.ts | 21 +- .../public/rule_types/es_query/types.ts | 10 + .../public/rule_types/es_query/util.ts | 6 + .../rule_types/es_query/validation.test.ts | 59 +++ .../public/rule_types/es_query/validation.ts | 55 ++- .../es_query/action_context.test.ts | 30 ++ .../rule_types/es_query/action_context.ts | 33 +- .../rule_types/es_query/executor.test.ts | 187 +++++++++- .../server/rule_types/es_query/executor.ts | 52 ++- .../es_query/lib/fetch_esql_query.test.ts | 115 ++++++ .../es_query/lib/fetch_esql_query.ts | 111 ++++++ .../rule_types/es_query/rule_type.test.ts | 154 +++++++- .../server/rule_types/es_query/rule_type.ts | 33 +- .../rule_types/es_query/rule_type_params.ts | 19 +- .../server/rule_types/es_query/types.ts | 15 +- .../server/rule_types/es_query/util.ts | 10 +- x-pack/plugins/stack_alerts/tsconfig.json | 3 + .../plugins/triggers_actions_ui/kibana.jsonc | 1 + .../public/application/app.tsx | 2 + .../public/common/index.ts | 2 +- .../common/lib/kibana/kibana_react.mock.ts | 2 + .../triggers_actions_ui/public/index.ts | 1 + .../triggers_actions_ui/public/plugin.ts | 3 + .../plugins/triggers_actions_ui/tsconfig.json | 1 + .../builtin_alert_types/es_query/esql_only.ts | 340 ++++++++++++++++++ .../builtin_alert_types/es_query/index.ts | 1 + 45 files changed, 2237 insertions(+), 125 deletions(-) create mode 100644 x-pack/plugins/stack_alerts/common/esql_query_utils.test.ts create mode 100644 x-pack/plugins/stack_alerts/common/esql_query_utils.ts create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.test.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.test.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/test_query_row_table.tsx create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.test.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts create mode 100644 x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts diff --git a/packages/kbn-text-based-editor/index.ts b/packages/kbn-text-based-editor/index.ts index fd7b19839b87f..01f106af6639f 100644 --- a/packages/kbn-text-based-editor/index.ts +++ b/packages/kbn-text-based-editor/index.ts @@ -7,6 +7,7 @@ */ export type { TextBasedLanguagesEditorProps } from './src/text_based_languages_editor'; +export { fetchFieldsFromESQL } from './src/fetch_fields_from_esql'; import { TextBasedLanguagesEditor } from './src/text_based_languages_editor'; // React.lazy support diff --git a/packages/kbn-text-based-editor/src/editor_footer.tsx b/packages/kbn-text-based-editor/src/editor_footer.tsx index 6f1e6cdd0b130..f89a14d06f106 100644 --- a/packages/kbn-text-based-editor/src/editor_footer.tsx +++ b/packages/kbn-text-based-editor/src/editor_footer.tsx @@ -155,6 +155,7 @@ interface EditorFooterProps { detectTimestamp: boolean; onErrorClick: (error: MonacoError) => void; refreshErrors: () => void; + hideRunQueryText?: boolean; } export const EditorFooter = memo(function EditorFooter({ @@ -165,6 +166,7 @@ export const EditorFooter = memo(function EditorFooter({ detectTimestamp, onErrorClick, refreshErrors, + hideRunQueryText, }: EditorFooterProps) { const [isPopoverOpen, setIsPopoverOpen] = useState(false); return ( @@ -235,27 +237,29 @@ export const EditorFooter = memo(function EditorFooter({ - - - - -

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

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

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

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

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

Some Title

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

Some Title

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

Some Title

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

Some Title

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

We hit an authentication error

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

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

We hit an authentication error

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

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

We hit an authentication error

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

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

We hit an authentication error

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

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

You do not have permission to access the requested page

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

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

You do not have permission to access the requested page

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

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

You do not have permission to access the requested page

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

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

You do not have permission to access the requested page

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

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

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

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

( + options: FleetAddVersionOpts, + handler: FleetHandler + ): FleetVersionedRoute; +} diff --git a/x-pack/plugins/fleet/tsconfig.json b/x-pack/plugins/fleet/tsconfig.json index e0d261d7b7e72..b3f8a96417f9a 100644 --- a/x-pack/plugins/fleet/tsconfig.json +++ b/x-pack/plugins/fleet/tsconfig.json @@ -97,9 +97,9 @@ "@kbn/core-http-router-server-internal", "@kbn/safer-lodash-set", "@kbn/shared-ux-file-types", - "@kbn/core-http-router-server-mocks", "@kbn/core-application-browser", "@kbn/core-saved-objects-base-server-internal", + "@kbn/core-http-common", "@kbn/dashboard-plugin", ] } diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts index 4c52547e67aef..6cf131939807c 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts @@ -19,6 +19,22 @@ export default function (providerContext: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const es = getService('es'); + const getPackage = async (pkgName: string) => { + const getPkgRes = await supertest + .get(`/api/fleet/epm/packages/${pkgName}`) + .set('kbn-xsrf', 'xxxx') + .expect(200); + return getPkgRes; + }; + const epmInstall = async (pkgName: string, pkgVersion: string) => { + const getPkgRes = await supertest + .post(`/api/fleet/epm/packages/${pkgName}/${pkgVersion}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) + .expect(200); + return getPkgRes; + }; + describe('fleet_agent_policies', () => { skipIfNoDockerRegistry(providerContext); @@ -89,7 +105,7 @@ export default function (providerContext: FtrProviderContext) { let packagePoliciesToDeleteIds: string[] = []; after(async () => { if (systemPkgVersion) { - await supertest.delete(`/api/fleet/epm/packages/system-${systemPkgVersion}`); + await supertest.delete(`/api/fleet/epm/packages/system/${systemPkgVersion}`); } if (packagePoliciesToDeleteIds.length > 0) { await kibanaServer.savedObjects.bulkDelete({ @@ -297,21 +313,14 @@ export default function (providerContext: FtrProviderContext) { .expect(409); }); - it('should allow to create policy with the system integration policy and increment correctly the name if there is more than 10 package policy', async () => { + it('should allow to create policy with the system integration policy and increment correctly the name if package policies are more than 10', async () => { // load a bunch of fake system integration policy const policyIds = new Array(10).fill(null).map((_, i) => `package-policy-test-${i}`); packagePoliciesToDeleteIds = packagePoliciesToDeleteIds.concat(policyIds); - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); systemPkgVersion = getPkRes.body.item.version; // we must first force install the system package to override package verification error on policy create - const installPromise = supertest - .post(`/api/fleet/epm/packages/system-${systemPkgVersion}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + const installPromise = await epmInstall('system', `${systemPkgVersion}`); await Promise.all([ installPromise, @@ -419,7 +428,7 @@ export default function (providerContext: FtrProviderContext) { await Promise.all(deletedPromises); await esArchiver.unload('x-pack/test/functional/es_archives/fleet/agents'); if (systemPkgVersion) { - await supertest.delete(`/api/fleet/epm/packages/system-${systemPkgVersion}`); + await supertest.delete(`/api/fleet/epm/packages/system/${systemPkgVersion}`); } if (packagePoliciesToDeleteIds.length > 0) { await kibanaServer.savedObjects.bulkDelete({ @@ -591,17 +600,10 @@ export default function (providerContext: FtrProviderContext) { const policyId = 'package-policy-test-'; packagePoliciesToDeleteIds.push(policyId); - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); systemPkgVersion = getPkRes.body.item.version; // we must first force install the system package to override package verification error on policy create - const installPromise = supertest - .post(`/api/fleet/epm/packages/system-${systemPkgVersion}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + const installPromise = await epmInstall('system', `${systemPkgVersion}`); await Promise.all([ installPromise, @@ -682,17 +684,10 @@ export default function (providerContext: FtrProviderContext) { it('should work with package policy with space in name', async () => { const policyId = 'package-policy-test-1'; packagePoliciesToDeleteIds.push(policyId); - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); systemPkgVersion = getPkRes.body.item.version; // we must first force install the system package to override package verification error on policy create - const installPromise = supertest - .post(`/api/fleet/epm/packages/system-${systemPkgVersion}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + const installPromise = await epmInstall('system', `${systemPkgVersion}`); await Promise.all([ installPromise, @@ -1192,17 +1187,10 @@ export default function (providerContext: FtrProviderContext) { }); setupFleetAndAgents(providerContext); before(async () => { - const getPkRes = await supertest - .get(`/api/fleet/epm/packages/system`) - .set('kbn-xsrf', 'xxxx') - .expect(200); + const getPkRes = await getPackage('system'); // we must first force install the system package to override package verification error on policy create - await supertest - .post(`/api/fleet/epm/packages/system-${getPkRes.body.item.version}`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await epmInstall('system', `${getPkRes.body.item.version}`); const { body: { item: createdPolicy }, diff --git a/x-pack/test/fleet_api_integration/apis/agents/list.ts b/x-pack/test/fleet_api_integration/apis/agents/list.ts index 328e4a240e77c..845a0b1a83659 100644 --- a/x-pack/test/fleet_api_integration/apis/agents/list.ts +++ b/x-pack/test/fleet_api_integration/apis/agents/list.ts @@ -216,6 +216,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return a status summary if getStatusSummary provided', async () => { const { body: apiResponse } = await supertest .get('/api/fleet/agents?getStatusSummary=true&perPage=0') + .set('kbn-xsrf', 'xxxx') .expect(200); expect(apiResponse.items).to.eql([]); diff --git a/x-pack/test/fleet_api_integration/apis/agents/status.ts b/x-pack/test/fleet_api_integration/apis/agents/status.ts index 498fbe7c42bce..b0879afc5ccb7 100644 --- a/x-pack/test/fleet_api_integration/apis/agents/status.ts +++ b/x-pack/test/fleet_api_integration/apis/agents/status.ts @@ -8,6 +8,8 @@ import expect from '@kbn/expect'; import { INGEST_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; + import { AGENTS_INDEX } from '@kbn/fleet-plugin/common'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { testUsers } from '../test_users'; @@ -230,7 +232,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('should work with deprecated api', async () => { - await supertest.get(`/api/fleet/agent-status`).expect(200); + await supertest + .get(`/api/fleet/agent-status`) + .set('kbn-xsrf', 'xxxx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200); }); it('should work with adequate package privileges', async () => { diff --git a/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts b/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts index d717c6e285c04..47c4d7ecd9f7b 100644 --- a/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts +++ b/x-pack/test/fleet_api_integration/apis/enrollment_api_keys/crud.ts @@ -7,6 +7,7 @@ import expect from '@kbn/expect'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { setupFleetAndAgents, getEsClientForAPIKey } from '../agents/services'; import { skipIfNoDockerRegistry } from '../../helpers'; @@ -324,6 +325,7 @@ export default function (providerContext: FtrProviderContext) { const { body: apiResponse } = await supertest .post(`/api/fleet/enrollment-api-keys`) .set('kbn-xsrf', 'xxx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) .send({ policy_id: 'policy1', }) @@ -332,11 +334,20 @@ export default function (providerContext: FtrProviderContext) { }); it('should get and delete with deprecated API', async () => { - await supertest.get(`/api/fleet/enrollment-api-keys`).expect(200); - await supertest.get(`/api/fleet/enrollment-api-keys/${ENROLLMENT_KEY_ID}`).expect(200); + await supertest + .get(`/api/fleet/enrollment-api-keys`) + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .set('kbn-xsrf', 'xxx') + .expect(200); + await supertest + .get(`/api/fleet/enrollment-api-keys/${ENROLLMENT_KEY_ID}`) + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .set('kbn-xsrf', 'xxx') + .expect(200); await supertest .delete(`/api/fleet/enrollment-api-keys/${keyId}`) + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) .set('kbn-xsrf', 'xxx') .expect(200); }); diff --git a/x-pack/test/fleet_api_integration/apis/epm/get.ts b/x-pack/test/fleet_api_integration/apis/epm/get.ts index fb15de6847952..2ca984ceb67dd 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/get.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/get.ts @@ -200,7 +200,10 @@ export default function (providerContext: FtrProviderContext) { it('returns package info in item field when calling without version', async function () { // this will install through the registry by default await installPackage(testPkgName, testPkgVersion); - const res = await supertest.get(`/api/fleet/epm/packages/${testPkgName}`).expect(200); + const res = await supertest + .get(`/api/fleet/epm/packages/${testPkgName}`) + .set('kbn-xsrf', 'xxxx') + .expect(200); const packageInfo = res.body.item; // the uploaded version will have this description expect(packageInfo.name).to.equal('apache'); diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts b/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts index f9d72c62e2738..7b300c271e304 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_prerelease.ts @@ -22,7 +22,6 @@ export default function (providerContext: FtrProviderContext) { await supertest.delete(`/api/fleet/epm/packages/${pkg}/${version}`).set('kbn-xsrf', 'xxxx'); }; - // Failing: See https://github.com/elastic/kibana/issues/150343 describe('installs package that has a prerelease version', async () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -70,13 +69,21 @@ export default function (providerContext: FtrProviderContext) { expect(response.body.items.find((item: any) => item.id.includes(gaVersion))); }); - it('should install the beta package when no version is provided and prerelease is true', async function () { + it('should install the beta package when prerelease is true', async function () { const response = await supertest - .post(`/api/fleet/epm/packages/${testPackage}?prerelease=true`) + .post(`/api/fleet/epm/packages/${testPackage}/${testPackageVersion}?prerelease=true`) .set('kbn-xsrf', 'xxxx') .send({ force: true }) // using force to ignore package verification error .expect(200); + expect(response.body.items.find((item: any) => item.id.includes(betaVersion))); + }); + it('should install the beta package when no version is provided and prerelease is true', async function () { + const response = await supertest + .post(`/api/fleet/epm/packages/${testPackage}/${testPackageVersion}?prerelease=true`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) // using force to ignore package verification error + .expect(200); expect(response.body.items.find((item: any) => item.id.includes(betaVersion))); }); diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/get.ts b/x-pack/test/fleet_api_integration/apis/package_policy/get.ts index ce0a7a1f219c6..6801c3908e658 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/get.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/get.ts @@ -24,6 +24,14 @@ export default function (providerContext: FtrProviderContext) { // because `this` has to point to the Mocha context // see https://mochajs.org/#arrow-functions + const deleteEndpointPackage = async () => { + await supertest + .delete(`/api/fleet/epm/packages/endpoint/8.6.1`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) + .expect(200); + }; + describe('Package Policy APIs', () => { skipIfNoDockerRegistry(providerContext); @@ -111,12 +119,7 @@ export default function (providerContext: FtrProviderContext) { .send({ packagePolicyIds: [packagePolicyId, endpointPackagePolicyId] }) .expect(200); - // uninstall endpoint package - await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await deleteEndpointPackage(); }); it('should succeed with a valid id', async function () { @@ -254,12 +257,7 @@ export default function (providerContext: FtrProviderContext) { .send({ packagePolicyIds: [packagePolicyId, endpointPackagePolicyId] }) .expect(200); - // uninstall endpoint package - await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await deleteEndpointPackage(); }); it('should succeed with valid ids', async function () { @@ -476,12 +474,7 @@ export default function (providerContext: FtrProviderContext) { .send({ packagePolicyIds: [endpointPackagePolicyId] }) .expect(200); - // uninstall endpoint package - await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) - .set('kbn-xsrf', 'xxxx') - .send({ force: true }) - .expect(200); + await deleteEndpointPackage(); }); it('should return 200 if the passed kuery is correct', async () => { diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts index 263b9ac88adac..a1e6fe5d5556f 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts @@ -33,7 +33,7 @@ export default function (providerContext: FtrProviderContext) { }; const getInstallationSavedObject = async (name: string, version: string) => { - const res = await supertest.get(`/api/fleet/epm/packages/${name}-${version}`).expect(200); + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); return res.body.item.savedObject.attributes; }; diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/update.ts b/x-pack/test/fleet_api_integration/apis/package_policy/update.ts index 15ad0a82b4359..865341abc5bcc 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/update.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/update.ts @@ -25,7 +25,7 @@ export default function (providerContext: FtrProviderContext) { }; const getInstallationSavedObject = async (name: string, version: string) => { - const res = await supertest.get(`/api/fleet/epm/packages/${name}-${version}`).expect(200); + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); return res.body.item.savedObject.attributes; }; @@ -229,11 +229,11 @@ export default function (providerContext: FtrProviderContext) { .send({ agentPolicyId }); // uninstall endpoint package await supertest - .delete(`/api/fleet/epm/packages/endpoint-8.6.1`) + .delete(`/api/fleet/epm/packages/endpoint/8.6.1`) .set('kbn-xsrf', 'xxxx') .expect(200); await supertest - .delete(`/api/fleet/epm/packages/input_package-1.0.0`) + .delete(`/api/fleet/epm/packages/input_package/1.0.0`) .set('kbn-xsrf', 'xxxx') .expect(200); }); diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts b/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts index 557d5a9b4d9b2..c5c3d6a67a829 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/upgrade.ts @@ -36,7 +36,7 @@ export default function (providerContext: FtrProviderContext) { } const getInstallationSavedObject = async (name: string, version: string) => { - const res = await supertest.get(`/api/fleet/epm/packages/${name}-${version}`).expect(200); + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); return res.body.item.savedObject.attributes; }; diff --git a/x-pack/test/fleet_api_integration/apis/service_tokens.ts b/x-pack/test/fleet_api_integration/apis/service_tokens.ts index bd13c3f5b8ca8..e1830a8ac7f97 100644 --- a/x-pack/test/fleet_api_integration/apis/service_tokens.ts +++ b/x-pack/test/fleet_api_integration/apis/service_tokens.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; import { FtrProviderContext } from '../../api_integration/ftr_provider_context'; export default function (providerContext: FtrProviderContext) { @@ -46,7 +47,11 @@ export default function (providerContext: FtrProviderContext) { }); it('should work with deprecated api', async () => { - await supertest.post(`/api/fleet/service-tokens`).set('kbn-xsrf', 'xxxx').expect(200); + await supertest + .post(`/api/fleet/service-tokens`) + .set('kbn-xsrf', 'xxxx') + .set('Elastic-Api-Version', `${API_VERSIONS.internal.v1}`) + .expect(200); }); }); } diff --git a/x-pack/test/functional/services/ml/test_resources.ts b/x-pack/test/functional/services/ml/test_resources.ts index bf5f6aed44789..a256c623adbe0 100644 --- a/x-pack/test/functional/services/ml/test_resources.ts +++ b/x-pack/test/functional/services/ml/test_resources.ts @@ -8,6 +8,7 @@ import expect from '@kbn/expect'; import { ProvidedType } from '@kbn/test'; import { JobType } from '@kbn/ml-plugin/common/types/saved_objects'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common/constants'; import { savedSearches, dashboards } from './test_resources_data'; import { getCommonRequestHeader } from './common_api'; import { MlApi } from './api'; @@ -567,7 +568,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(2 * 60 * 1000, async () => { const { body, status } = await supertest .post(`/api/fleet/setup`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); }); log.debug(` > Setup done`); @@ -581,7 +582,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(30 * 1000, async () => { const { body, status } = await supertest .post(`/api/fleet/epm/packages/${packageName}/${version}`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); }); @@ -595,7 +596,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(30 * 1000, async () => { const { body, status } = await supertest .delete(`/api/fleet/epm/packages/${packageName}/${version}`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); }); @@ -609,7 +610,7 @@ export function MachineLearningTestResourcesProvider( await retry.tryForTime(10 * 1000, async () => { const { body, status } = await supertest .get(`/api/fleet/epm/packages?experimental=true`) - .set(getCommonRequestHeader('1')); + .set(getCommonRequestHeader(`${API_VERSIONS.public.v1}`)); mlApi.assertResponseStatusCode(200, status, body); packageVersion = From 2c6b2f9ee5f7d153db97c9db1bdca30745cc5a80 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 18:54:15 +0100 Subject: [PATCH 48/84] skip flaky suite (#165643) --- .../rule_management/rules_table/rules_table_selection.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts index ae28214315a40..782e70dec8379 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts @@ -33,7 +33,8 @@ const RULE_2 = createRuleAssetSavedObject({ rule_id: 'rule_2', }); -describe('Rules table: selection', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165643 +describe.skip('Rules table: selection', { tags: ['@ess', '@serverless'] }, () => { before(() => { cleanKibana(); }); From 330cc8b215b0f61c91820d76a1ef35ac95fb1745 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 5 Sep 2023 13:57:48 -0400 Subject: [PATCH 49/84] skip failing test suite (#164017) --- .../api_integration/test_suites/common/alerting/rules.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts index bfce78384f601..64c8fda9d6089 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts @@ -35,7 +35,8 @@ export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); const esDeleteAllIndices = getService('esDeleteAllIndices'); - describe('Alerting rules', () => { + // Failing: See https://github.com/elastic/kibana/issues/164017 + describe.skip('Alerting rules', () => { const RULE_TYPE_ID = '.es-query'; const ALERT_ACTION_INDEX = 'alert-action-es-query'; let actionId: string; From 5a206e2c2e64fe8b7390b71c36c8d67302743473 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 18:58:43 +0100 Subject: [PATCH 50/84] chore(NA): reduce parallelism number on Serverless Security Cypress Tests (#165681) This PR reduces the parallel number of workers that will run the Serverless Security Cypress Tests as at least for now I don't think we need `16`. --- .buildkite/pipelines/pull_request/base.yml | 2 +- .buildkite/pipelines/serverless.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 522d2e34e5682..e36a1434bee88 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -140,7 +140,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 40 - parallelism: 16 + parallelism: 12 soft_fail: true retry: automatic: diff --git a/.buildkite/pipelines/serverless.yml b/.buildkite/pipelines/serverless.yml index 10d1090521adb..e7b5dbc299722 100644 --- a/.buildkite/pipelines/serverless.yml +++ b/.buildkite/pipelines/serverless.yml @@ -105,7 +105,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 40 - parallelism: 16 + parallelism: 12 retry: automatic: - exit_status: '*' From 22e288ead2f6fa03647e87ba874f9dd8cd1b67f8 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:02:54 -0400 Subject: [PATCH 51/84] skip failing test suite (#165730) --- .../common/examples/search_examples/search_example.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts index 0e5584d656c98..5638afc5b106d 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts @@ -15,7 +15,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const comboBox = getService('comboBox'); const toasts = getService('toasts'); - describe('Search example', () => { + // Failing: See https://github.com/elastic/kibana/issues/165730 + describe.skip('Search example', () => { describe('with bfetch', () => { testSearchExample(); }); From d44bf0a315e6c29dbaf2ff2de92660938547dede Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 19:41:09 +0100 Subject: [PATCH 52/84] skip flaky suite (#146223) --- test/functional/apps/discover/group1/_discover.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/discover/group1/_discover.ts b/test/functional/apps/discover/group1/_discover.ts index a3cf7b2d29fcf..286a30a6bb227 100644 --- a/test/functional/apps/discover/group1/_discover.ts +++ b/test/functional/apps/discover/group1/_discover.ts @@ -31,7 +31,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { defaultIndex: 'logstash-*', }; - describe('discover test', function describeIndexTests() { + // FLAKY: https://github.com/elastic/kibana/issues/146223 + describe.skip('discover test', function describeIndexTests() { before(async function () { log.debug('load kibana index with default index pattern'); await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); From ad43fc037ee3c755b55e8d39d258987ab6d14c4c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 19:42:55 +0100 Subject: [PATCH 53/84] skip flaky suite (#165461) --- .../apps/dashboard/group2/dashboard_lens_by_value.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts b/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts index 2604b942f7313..aec34ba0d5d9e 100644 --- a/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts +++ b/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts @@ -16,7 +16,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const dashboardPanelActions = getService('dashboardPanelActions'); const kibanaServer = getService('kibanaServer'); - describe('dashboard lens by value', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165461 + describe.skip('dashboard lens by value', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( From ccfb713ee4ae68d9ad04c9a0d1a7742e7255152b Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 5 Sep 2023 19:56:58 +0100 Subject: [PATCH 54/84] skip flaky suite (#165746) --- .../test_suites/common/index_management/index_templates.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts b/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts index 26feb519a39a8..1b1ee91fd0891 100644 --- a/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts +++ b/x-pack/test_serverless/functional/test_suites/common/index_management/index_templates.ts @@ -15,7 +15,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); const retry = getService('retry'); - describe('Index Templates', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165746 + describe.skip('Index Templates', function () { before(async () => { await security.testUser.setRoles(['index_management_user']); await pageObjects.common.navigateToApp('indexManagement'); From 33dcda7b7007bdc390455eb1f6879c73b3ce1c52 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 5 Sep 2023 12:18:28 -0700 Subject: [PATCH 55/84] [DOCS] Automate PagerDuty connector screenshots (#165413) ## Summary This PR automates two screenshots in https://www.elastic.co/guide/en/kibana/master/pagerduty-action-type.html --- .../action-types/pagerduty.asciidoc | 2 ++ .../connectors/images/pagerduty-connector.png | Bin 136276 -> 143862 bytes .../images/pagerduty-params-test.png | Bin 188743 -> 132427 bytes .../stack_connectors/connector_types.ts | 15 +++++++++++++++ 4 files changed, 17 insertions(+) diff --git a/docs/management/connectors/action-types/pagerduty.asciidoc b/docs/management/connectors/action-types/pagerduty.asciidoc index ed98e4259d0eb..a82a9639beee6 100644 --- a/docs/management/connectors/action-types/pagerduty.asciidoc +++ b/docs/management/connectors/action-types/pagerduty.asciidoc @@ -15,6 +15,7 @@ or as needed when you're creating a rule. For example: [role="screenshot"] image::management/connectors/images/pagerduty-connector.png[PagerDuty connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[pagerduty-connector-configuration]] @@ -63,6 +64,7 @@ as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/pagerduty-params-test.png[PagerDuty params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. PagerDuty actions have the following properties. diff --git a/docs/management/connectors/images/pagerduty-connector.png b/docs/management/connectors/images/pagerduty-connector.png index 2e5d240f42c11016d9ff962e7e3dbbf099973549..6613c1321f6b5cd90b88a05f7b05617d33938b16 100644 GIT binary patch literal 143862 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

$lG`>qN*HeB}Zun`r zUR0N~FG`8pJZT@GF6Yhui>0N1qi?3A2UnuVV7#S*JUjB5%snk50 zi)OBJPDkMRehTME>xQX&xf6)~Mcw*L_xg}@uX!AMW&P5O*7|5zuZ`oFf0Yk}#xcwXx@Xck1;9~aiyE0N8WF+{(;Fcv+u}a!B@rrOb)Je?7>Uv$NjMw5* z#Ek>yBYm0^`~8pvsyQ*|2s8IVl3l>+`r$g+mWSH?2`&Dvsiqo1dm~zW8h7)MkR)pr zEA~kiAOvb0pjex-Qk*_5_>&X6=^7YI)sIq#*Ht=?K8Gl->!&$f&9R-gQ&=1Pi&69y zU0-s6*V4fzA8Z>(+`&48hvu*4M~eGnn*=yd20-E)WK!zWsUI&7y@(an-|zIKoXt{c zImJG__aj4C?4ATQ!}irK?r0C3{g~BksEML{MLe7c7XXvTHLbclGX})*&d9+R0c(pv zZpw3#RtHORAK_Dg!tzs2w)W023AB>-Q4eVnd=6{!G~yd^aE1_07_Qz-YD;$YdP(nC zr(Gv5{S0m~k$0EA&6ua-_bp|U3RhoM7=b9Zzf*+t7-P*=>T)ukWRy$|C{bRXXUCb2 z9~^w=4+4q9Ca|6}pyjvsdiRCK?meu28LaFyK3Z#dPV^Z&WGXG+BlhTUN~ek> zg6JJW2eAyGqK*A6c=jf{KlE{>ESD#@(2tgKAk`~+FzI6^-Lg4oX0E{4+~{b@^8@|h zvZJcNk|(HM;02_*hhk!JPAoU*6FYc83Y%RibQc`9N&R@Y2*y!kwwiLdRk^5hTFT?n z`yNt|K+~8lYyYpsQm31E;PvAsiya-}w13fj2j6D4g@o=n@UtK6sa74NrU!*narH>$ zA!-Z03Dq!VR)j}7Ob+Iu4=(T&ZtY{2A8ZV=Bb@&-b-LKue^9o}y0y9r^c09|E3Wsu z8?oF}@ex&lC87Gt#3G?5A@U9BQaQPh0Hj&u;KuYC^t5tBY)bFB6EbeICl*F{@eNQ3 z`K^AYQf*UtRlEZN>r!U97s~d{<*1~ow5B976-mYQxy@f_aBhgb;bX>&Vj553p6fKD zp|Mm^M5%^^R9Okap;14$@rXSAp|2RCY=##rP8zOS&!SKM2;%bX-kbNLDz^WzO8QLf z22C0we|i_E!FMgT;;G6rtmA|c0;~v;XdRI`q=1=1sDEGD5){L)GsmFG<$2o6 z;dvveQ)8mWOiBdF*015E!chD&=Jqe?7eh0c^W-uS@`Ab zP)nMm66Zz=;4&Bz63_+I*O&)d&$y9O9OuHu)~s{9)){tKS!a0Q$+hQ;hs)Iau*5ho zu%%qF&x8r{?FCoo>;T*xcdIk*x-Tk18detFkRDDF3_phNKYx%Z1J5IXbv`^kL!Rj zNjuloN;$kP8szAMms4kNeOSzo30>8>Nz0u&xtiW5GX@kT`xBagXj=H_hK zVa!MV%HmZj8;!S?rTuHfrqdE0o6rQZWCak$eZaWd&X)2&W11%J6+`yit|3?l7;bun zq+GP8qkd2$9wSVR`EIVS#E3D^_P=Yblyd}vQg4kku)P0*Mt!V3m%2Vl7d`#-V8%4i z(N91^$0X3S%Ah{IRH{$AOaPN9dVixD_SJ_3cwDCsRE>&s1oI+s-b5+mqDZ?x`BWS( z9KTv_TU0h^Xcxywn=c$O-$^O{n{N&+4m@MtXqorom)#EKTOK+Da^quws7a9FJS^?! zw4V6kFJOYi)ADs`XRBd_JAo}4O@~W-{p^pFBXJ5qLDkp&Oi))xB)32U5f0{jn*e+5 z2n(S$uzoIPy-$vnN~o-N7Po<-f{36wU!f&>{AbS!&-afuO5%y@ zMh@M1si{|wrIfJ;TBadPky7MinuAVI@G<}e;cjk*ul}2n`;UKfb%7dldzr;0;s4e`vq3CnOM0cRQReZKNqP|4>!S+U<>Pg-ZZlWSNk$=;^7e817drE5Z|}+ z4%Zo2$CVc!7hWTkuZ|yXjU|-@%#T;{-GWrS8z=%RF5-%A9pDFI(-97DBW_&HY9wSQ zv~PZ84iP>7Q%74%`lHWvWVlkkp83+K=lax(*{0itj|F+W)5c}r7uuRsUECex)3;hI zLN~=70R0u@p5?T+Rd0H3vTK5`Th3WI!O6bsgdk)27*`KAl3j&kYptz>yQ=y^Hl2#P zFTU0?QfBp#-__dz!E6-E7vYdG?KJF97kCG116sRjJiWr!VukkI1XnY2aXl z;S0zZJ!;|~PD@`anj}q2tHnwgP(+%5?N&D%0{IrC!gD(U2bH=9=Bbq4zv}=QG-N-nZ|QkHErcd7j6hkvghRtYhga z#0pujm4PyqV@5x$XUpKm9OdP+^i?UUMT|W`^b!JBtudd)t%5}CbPNuC7ESybN#uSY;H;^cPhWe;^8pFXwY}3_0=;72C59O}TCu9eBG_0?67);Udp<=jJ#GPG_BPAGf+5_U zreUj@a$S9+jtEvps_IaO?}rMi=<><;CPFs*wSq%wujOB#cQi8d#URs`SL$|`?=#8= z7+57UcV|XDI+gwEv|BY0cF$ey7)&T9c9x=W4_TIzttNJ4A<7N&>iENlUfi!KX$+m; z`qSZw^t?HfOPjeVoG%|si5K#|2Qup{XLhbUlHupS%^b8$GLZow=hiDD5snOuhoFqh zyAAy+UB+o#5-CMcxRwuI?6$$Y(W&P_mxQ8H{0)A1$FTm>%AR`jLE+Pd?)v?M8$Por zpQfjuOlrzTeY~_6a?x7N_I3%O7V!8y!SS1LpMYe?;WEhKeg>~w@9VS~%xTQI9=#kQ zK>TzaCnIXgR#OYldFUMNbdgWxM9{UMV$saq9*oVY=_13f(?CDQ+(zI29F~Eb3TGr- zxxMMMUU=ALA;EvfFAgh$j=#Xq`T>nq*E1Khv3(YzAb84Yfc#GVUI+OBoAnQ6`gIvf) z@?9hs3~nJ-f2s~t>Y6{gK2X_8-{8{G)TdYTY3=gPm3r#ty{jenCVT49ks3J9p~|pg>zFU>~*3WuO~D9J^_)vSA0~Uiirt&Pf=lhDH_*-~%(X!Gaya z&}kUHTptF`WPTuk(_5>g@hh9FnQL>mv-$wfVi~)G~F-8wKPk{zMm& zE^HQVCUibeyPvqHonI7nncPBGDYxA=nm9Y|ug9=LY4H%)!l`rTiGxpk%Rln+iLdm5 zS3GYiJgyw2GL_o7LdDI$MN`6Y1b3EtLgVT@5ZwDd7i5B<)%tgA-|gb9_f5llg%xd< zM7xpa$^74aQnqO>Yjub(#TBw0>3R{z`QSjM56b}3$ttGcYDZf}xiW5|T(Zx(d>fnX ze00+U%{YUlwN$rMu~A)D*zh&TF&ilgSO86kMf%IA)U(v^Kgk|kG5OdPigq@ZZG$xa z08&XoSywr3LCOz{WYH817hs%b4rW8!bxsSCw2f@N=;+7&fu#pl0X9cDa6wk#%9k!k z30l*?RMVbQ*`E2H(_NDZ{UHU?QJlj#sgeA8XfFOcM~d5}Uu&|hPvmLXzoDn1UNP?B zpI@nL*8PMR;KMj8=VwM)66k{Ma+yAxW>qF8TKNcykRuQJR}nFFqbf@44!K^%%;R@2 zrJ}pk>GCyTa9H|w@vi<+jGKoDJl2K;7*QX+-df%JT|6JA9BDy_md^&_?_9jtTL z&wk>0T59nk1EoBEJjXOc5l+qrqlz)~v@$3AD#D*3KlP$XcYLz6gzcNCL4}5z=;8bj zJnlVbwdfnnn?%=Ny4egmfwU(81=+ec1Vm3bX=?8{f*^~bq%05N!0dkQ-k6T~P>&)Z zO6dUxNcRgWf>nEPc%L!3lx65c`guDe?E<52391Sro<~2yG3qsqc>Cw~kX)^BwLSw@ ztzMf?o!sK~6)Q)HK2U3HpFo){vEE#sj)2#pULbYEwFRDSlVHoY-#~g68pYftnFkIm zq05ZBLJ8X$vX#~qd~o+Ay+<96p@jw^4uGu^xTJN|iQBLq>3(;pFd|lPJ>LQ0EF1eufRWqc&LH$7)F4W-idUcvrMH1H0i!M!wsE zbUkXA49XDSfc`a{d5Tinix_L`!Mr^}^{`))$KwJiB(+R}li1noZ$lobcNLZVWaeIa zc;i6iJ~<-&)4|oF@>`s6ye*bJ?P`I`0`;o7j|CO?zKe8F61t?fTQ?^7&tRv5wYTS{ z&)VOE8z@iIQf>w%KuzT^dtbW=fAt%-1AS^`%FsI?OnLZLkWYq~=gh~I@Js0gaG|a zvjvv;n#f>W?OaA;(sb?F3`~N9yz7*EKfs+-QJOI5uORrFlu+k2D!Lx>#9%Lnv-zN;NE+OTx0C%{Jb zXT|%;r^qYdf(gs%O*!jY(*}Mx-GIAmR3KcukMNqSCVm+0+LyI;&%G^v5=X}-^snDq_GBTziQ)RbT0V?iOclUj&FutIDrdVae5-#OLK*BRC}?a}b!bR1% z_rg&b2?y@E9OTQy#7bA613{OKDx83?ne7hV3tpzY@tT!DjV@I6u9LrpMZF$4Pg3^Q z{|5KOU8(stlr^E^rBNeNm@E1U`g#m9$Bn>2dv6}d-c>>{5WJm)>&!5L7TQZA{OV?< z!vfCOGJz)V>FO@Vm!Q#d?EpD5qS9?D=ViIx|A)Qz4rjaV`^Q_YYN_f%OVNe4R+mvq zsvAXHwGykfMeI$I;zAc%v$nQ25i3E07_Gf(BnU!{Ac&O&k@)7i@8`Pi@xAZoe*XCW z@jH&+^N%CP@xhtT`QGRGe!pHb%DYt&NItfG{-*A;-t~c{!diI{&V0OGwggP=5%0U+ z!Agv*v>{KE14xs7)e-0@GyAcsopFOL2DynQes#37QV#yjqOu6-l~{ZWZJi!for27S ziQeR7q1SX5F?Bxc@{W0AO%mFhru<}wBKQwgN7NvL-Cx^}HZ z3Eof$IW7<0sOI1+W|UEqO-E=$aH(e>g9I(2#maMl!S%308o{&KG8&h`_J3}IBd}=K z{yZ-@=^MQE1G+D^77E^o*nR=^vz?DB572%pO|g`Vs|{pOn(Bvmez{<- zj2vE*=vh36gZqR$8Hf;}hsr;z@9i=eLJGZrWCQFH=0c5iZroG>E7!q*-x~TT-YMod zmF04+8-!NT?Pl@0@ePX0HC<_}<2V!Mc=SmbBf_aM&HwsnR3STOx1HAar&a(w;N3<$>S%YqndQ zb7#};H<%KNav??PDzwmY*mx)M!Txg%^%w;9)wV~?<{Pv}Je|6jq2mH4v0dJddg~!S z1D9ikT|T;u=-j zSi)bGn$yq;m0d1JZ=c0kM7FQBiuSV}a0_^hy}2AvL&fij;f~(1v7hi`1yVY~Ja*1; zt~kdoudV9w|H69Tf4J}(QchfU68Y}gFg!Y)cqkx!cXjJ6`&Y>1aE$xmboQM67SooM zm8Rh=APwL0;n(W-oE{diYk6WvD2>Kh%JP8w%X|>)(WafhZTYPa55%uAllxjV1ACTox4QJV+5qgG)$k@Vf_6eeK?TemIjV89f5N9`!uc!3%%u)61p!$! zn|@q}@;?ENm)np~xP{y>v5kh5Y~N;u_tiq?KCj5K%%r)1S7h>j7L%mRH!~CpYDcKL zs%#NLl0`aoPo}c&O7LPJvdF!IqX+C+GoWy|`F3Ap?Q%Pylwu-3PqIbpw{vFjT^Rg%^GQhlG}Uxl~tUI(s~ zG7rlP#haILJte5$lAld2v;8n2v~PUt<=dSHa0L@h+-R1hDEd+H410qP>dFpP8;ss> z&zcgili$n`q`STgNzZj5jdBL21Yez5R9<)xQRywwQp0u~y?$EJ@xj$@7!UA^06=g$ zy&ZSJWHR2bVc3>p4S#P|90tE4y&1Xeng}p^3ZSgD0-M%i$3mkr>a;cbs058A$DEP!y^FU#6(k1T!;4|u| z|8F}CdQ*jK)6hsT`?k@(!uW){6+GQW3pFZPVj>P&acD<=G{_?L)cPLf+X(eV_ylTx zEzCGX^>$?KZX%w(zOS5plYVtZ3-Kk0$!8jR!9|s?rtX`-zQ#6L>aLX$2X?_vHSi;& zgw9Ga-v)wLHaUZiK)zSw-?~7gZK{?jSGfxY1@>(Pc$&0KXAtZUbz-)b24O>%TLV>@ z;n{%k@L2!b;{NtVPpp(`itke+z=(r@NCNQuYG3QEQi1yDGM`>~{ zY%m?Vj1%%7D+bIp?FU??^td*(1zMyDow0@o=`|T)`?EvR`LG*i=o&Its!KJykh|-V zQ{?#QMP{(XkWf;lSruL+Q2kakPfF?V=6q5l_O-wcBd$`g0CY9TVqiv z`tSIY*_84RY+GeVU6k>|&iAtD>H~@TN5-&2v}q)@yK@yw^Msbri_kGo<1Rx6=@Ty@ zUm;bjnf$fa2jUtzJx;Y_Eu)O>519#A(ZnL-!Y!7tIlRj1H(U_5ZiiicXoT$0&7CzG z$jxlTKB!;Dreh=-CCsT>rvXMzQLekb*pIM&)ykWLd3>+7uTgp8$uj&yk{%<72`Bx zM?qn8F!gCAibH$!`Dpj zJzJr3;Rc^;HDlSkXWY`JhA~{C*=5aJC$*m5j<_+5el3Ia}_?s zk-%_2(D9jhjsdpSa14+z4jO+a%n=xhMB(IiA58cRC*wM6l0Hy#ci8ez!aZHOgC%H; z@%Ww(!pyOB;>m7fi6>_1Q|e)?!D<&l`rFfE(d=d?ie6y1qG(cv>&xwXx^hFwt` zg`7FLuL`*we8*d*xYQUq@LMGwTIBc&FjnP3QbN&~JpJi-w$zAMxsDNr6^+!3JT#F8 z58^pJR9vS-d|{fSFnlT6>5xC6C{O)EX-;a9e~VumOm+}In_he?KXxGB=$eCkZ-~5n zEo14cRS8Z>Vmsv?h{C@OGO$3}NzgZStOb?H5uLbJ7B@_dnJ?t{S zAQ7$ie*fpiNh&Y2J~{7uaiKd{@kmcEG~f8!*C)M8%oiy(D2eri#fHB3804hXC62|K z-C6wp1raI&#_!Kk^h`Ba82Oqr(4TB9-@1udMizdV>tP~<>nZu;KAmz)_=xJt+Ut^1 zmZpFRe3mB^di5qSMU~~?47|99ohvNeVNE!EWdL?`9Xv^ObqSX27BImwhj)Ssmw#52jL!43GMlnV6D5?XoajoFSpidTQI#)bUd2*Msq=Bdo75)V?Q zPf}c?Aqt$rU%-jZ%Ii9V`>Mz?>sn?!luvk%n#HQWamgfnHg*NbnylMKM@6Ov8WCqd zcQ)?x9=NRRSS=n(a)hV}t6U>ZMchpMk|v^!!3UJ(qyhRwkO_;MqeXk)<`$p%oE`r1 zYA~DJJ!ybSsF-n-`MHsXPYyH&pTgJ(r0WCn9%Nm_h-MH7?%OL&3x(cSEtF61w|~Ul zwnQ{cgHR7khyd&XOSdO#^SRt%?U!Z+My~&6*}>Sg;LM1bCw{{51{B*@0uo#!oH7TC z+Y;(B%C0!j)y_C<8m-sq2z8?D&dUj2+^w1soCTNR0P9!;{&wEXgF;1cTQ}(~@cl@# zq_2Nt^X_t-OGCA7lf3#D?wq2l!8-I_Se4SCLsz&SsO*-*!_i{LgrcVg`w)_Fr@R?{ zW!IND47h5rtWqjOxM)~P!r`U7aqstHFlixU=8KH}^6{GlWyrkLmI+w7+7q9!8o524 zbE~~(vB!Sfs!y`;iwolj6iA3q3#2>gc6hI49jKQZUiG82WWUlKlwKDhceMe_8lS@Izr>>zI8jf%-OzsobFX!)V#aQKEfS_ zGO}$u+kSd{7qO&3|KVjDb0%L*?s_0hlDRG6Q*P(ZVtO-o z-WgyPSk4f{r(}6cFo6%x6)#DQNPHw8gL8a;pR=`psRkhtyUCnlP|5XrDgu0L7ds9U zHG@8XG~Zhi-f2<#;Gx4yZ!oko#+;|FSN?X9=(n2L!e^KdExU>C(bgShq|4I$PWe4C z3+>0{4sS;aIe0UY%4up73cyQb7l^I=4yb+>HC<=FzP)(f+J*h-4-SSShl8IBr<&Kj z0=Z3Nz!}-Aef^f*0?D*>0Cv4bWBaKFY^5iM@};9p$}GW_ervWTrTwLhdVpn~4MwqN zF@{#_pxiD$_Dy%$)bgFY>78!+%qS21&CcUWcEoYT2X+EO>6q=z$18ZJ^Tt1|(4-CL zK>kxEmNmtsPq2{}U(}EK>oTEbHo;bf`IE`TWfDM`E}=i#Nyaz;I%{eW7wveXi2%Oy zgWG{LXm#i7L=mEi)FY3FM{2yOGYD0d=N!gS)O+=l{; zr}BvpRlr2>xVJTI|A!eFMgg#BjUiv6WB;K|a_7EtH9(ag^V_f2y&*Qv%5=)^iE+Ax^{TqXfPS6xZt5>SW=O-VS|W44Dz+sOrG%#t_Q?l+>`-FVO|~K|D2-iIASds68Ls{W zzOlx>Mv#&@JD@F5gPFBjGBL?`F7z4o;-jbfxDRtGoZ{WfZ4VJem_l)3yoI)k9!?br z^p~vUhrAb@3GCGM6!;G0Qqg2%l?B-sq@c?sFm?VbM`eHiqt&q9C1wBu$OoP*FnWEHfFf*;whHz_FV?h}x3gTTy}K?yh*KhC?l#+o7={%}(oEK0z7yH-#B(E5~9BJ2-^fW$*o{IPvZgWN#9z_@3mwu+e)`?Z|h1@AFcKc6wo@bZNu%>}V^e?5OFvGJ3s zudK1-gu8sjxK-o{5~NOLoSd|k=J>zs-Tf;{+tj7Xv3uihsCLNim|Vou933ByuL33V zPNlcYshvi)t(0ft#$qvE^b#MBw?g7xZELTT{TZLCA003!Yx0C-JDN6?|vV&9{Ff5KCEbO30k78TkOpe z`){%WihJAxXRJ$Edkln zO+?O@?p(|r4qs{+YDl9QbBM{cLp$Y74*`vJ27bpQFapUz5@kzVpp=tFSKe^EQ=5}4 zhG)!0Bd`}*lrAbSHz;DcrNzno8WqpEYTY zt6uWOr1$3L2a5Wun@c!tUe;w+b#N$=72yLDzv=iu1D=EyPg1}bw8mAJfDIAxLX69Ql2aCpWuz3-O9rLP&MzRtTGxhschc)v_aA_`C)fc z%2*|IX$(ocNmyXOH^=LF_l$B*UmN_v$uFeSy%Q+l$gHGv03?GZ*F@O$3rwD7<2nK3xUc;TYn7N8qW@=ZcG z4J!>_t6M3Vqgqv_`M`!~g;_Z}oRYAP&Gf-9#E|0XZcCJLZadbzd~f5m2*>maN(2kh z%XJ}v_kyd`6!S6w$H%vD`ySuTEe7XiXzwZEdY=Tk>@42WJ5mMhWOiY){DiXp<{+=x zHl^AWxrFx$P#FulOU_gjP-g2O_NHCRUSI@#rQP^*3j5L#uI%Dj=jt+B+g&!aO!>xR zQH_H}*7a<(6R9Ydb?aMrv%;jb>zAZNz9#L~km?Bhv-7A-a){#IWoenXqY8?6&jDVKO;pB|uKkqkO8eVj) zC_FcGm+#DPe4mFxiZ0t1MlL!j%x3RO!S5x^H_fJ0+{CJHqHUVt1S$2UFJ3Bg{ZdV% zUd!e839W161}lTW^|9=bREo>#w-#NFL$9UQ@QHk(T6I6|WRZlNnl#d5$dM6AY+X2C zLsieaE4x*+mOx#O1&^z)UGH|%tRczE>ENh%vm(L6yt&mK-xN0y5>tL#9kZoe<_SFJ z8Y#I1$HHeR3pV5gZeUaX1J<1XGeGyPSN)*%a`~lxDOhZh>>X#_)7V*E+!^c>sUCA= z*S2HVQMsU30*NP}JW`%&JGR~~G0*y2CG49#D|#a`7J<(2)#tXg>DAWD!l~Lmb*}Sb z0JvJRqd_@rr0j;e&dc+=>wZn#tnR}K<=@7MVeO+~(wEB^ZJY8d%H!sqOGBW@p+S&O z+j%(?IzmaGDqSeJ+?QH0$HEBuXb-f9nHMf98kvS!9;KUSZ@^()epFrMxw3H`IoHoRkGHjC}+uzS_ZDdAuvsrgeHCJ zx-#IZ+=^90zaQX*dAaZKQaSbW7)NVRBN<W><7vp3Ti4%9WWM=u znE&L)Bq(-&uqh~#mA4UEBU&LKrepLJoNyX8`l^*UpgC zi>mLl{N!gKBXeXzEzVh#o?>+bo!V0wA@e9h4OqFvR0&B=sOMfZM5v&_1!ASL7Y%CC$2^9 z)Zk{OyRUWq07Yh4I)VjP`&9YSRRd^8I=4UP)EMtAS|SzaJ9?d$si;gg8V-T^lRc$f z`bMPT1F#J9vPLmHbpvohu%Ql&D|HF*I|lnIkQZxbG5rCi4BL`W!eQvA>QS2o{{`j5A2)IeF{6fagHX3 zY$gIKG>*0zH5m4YO=={5HU?0*zV|RzdBw3y5HmI4N=u~7A>`IA9PiXN6%-Z?GGK|t zB%VwMoc6zQnxyZ~GXH#-?7givCJAmRC~=A0p-pdK`_g%;?ka+n?^6L|J{ZCxECu7} z_u$X6*DKh8R=E$Ve}jRvwbO0SxR-sn35yiexo|l}JGSAbi|MNNi$_8+-}i#KnzwIz zz;WtmXlGxgBZ9PYk7^$HHG9ljs{2QZ`WIk9^=C;^?BYlo4j7K@TUWNMQyxeuO)XSi zid^R@G>$w_;bSiz@yqXa)BsPr{BS5Qp<rY5hV9mm*JTTXT-YRY+>jV^R# zr*XH&x}4@&18eq#)iS^S&@S-zznY#jn5F-4+i&e%ra!IckwT>CXU;)lSW;2R>kKDD zEic?>F-hfRPcS zLXL0iHOkMrs0ezq54lDMTAo1?&=CCXBAVQ6pVg9ps)gni<|r=xxAnRdQtfsIbG^Dp zhgnDqWeh2Xh6wTeGJVpQAkC&bJtUmKuK9O2gIp|HmY(#E-P7yPB3OlG|4OEwfWTqv zPS3^xQX`3}&C*lYdKht(G2WSZG>bMf$CEd@UC!*L*ZS8le_vw*d)IF&gDa?E-)d*y znS)g{W1IVp9tpXp3iWLmXjSE2$s@TSm8zDosCO}!3=2MPmfv5G8(0m4vINM8`(YoB zZ-tQ+-ZGeI*ETmgPT-31m73cN$QC&I81>ZP0AAlr+pyBo1zPiGBfg|==F0NKyZrmR zM`*Sqi{95={pnD#g!oSMJ8yu;f~QY0ex<^uL+^o8w(i1~ZugM^TGRl0+6-P!g<>D; z^|Oy6s-GwBL?D!wH@=Ou*VAvgy3VZGhK^*o+zMj>b020uj_n#lIp(iNJERmE(pR?e zU4w_UQXLGG6z?oe8YdGfGHE#5d=+s4N=CEO&QPeW4&E}0X1;|W7fk{Y(4Xt>Nk9_Ck(a&dMLm$Ru$Zh7)O3Ci3P4Pe($Ji z(L6NKX|7!CZ?m~~I31xG3sUKo_hHu`GtGlED}xH~2h7TRB1|%GSgfT?brtsvXJbCh z1CRnj*Dh_GRUh}@vrgsiC{{t=dvc<_C+LMPv&sY*!SUpGq;v zv{f3=n6|T*Z%9^@jUt{J*QCfunS+H}!0kRW;X|1w`=EDR@~gz7t(i)1_uD@LJ8q*Q zDkJCnSB9RFLeUaN<&Cs1FsoHcn-7Jw0Voy;A|A{u>sL!@X7-B15_4YkdVYC^;J_6* zeSczJqZQC{i;S=wGF`u3{E~Y$?Q4f`oA{cB=a`jav4AhjhWvK-Z11k@>845cH(|RI zspch8O2}}Djf>WS9_5EAlr2sEWZAwtdt`vu6PtuUi=-B@f>IH z-`d>Vi6&{tf~#N zqnydk$zm;VSYWAeR@#@nBaJth+%*FyFNZ4CCG##~)E*-hePk0Ae~h?W4pTeJF!!6h zCO73jm#dBuPcp@~DLoM<15bO}8_fwDIX~Q0l(g+C{z%xD((Saa1sLkQdzYo6rF{vb zT)G+&Sg`01Gy;HK`wDLBs{1Lp7>Y9YUAj<#7@oLeTeY0OGdKV`D*pml(8X_fF|0{p z#rH{@f3JYTyLI_N2st{8$$H9E zJJXE_t)nbump+9Y21ROvt{=IbSaN0L-WX3r`!}^toVchR#5l3ygJGR;KZpl)nJOQx z|0irf@IJ1|{EqA4Hxarq;^xU(FwHNctL?W-(ROzw;c^+#wRMlBMwLw2n=ab*SxQt0 z<}k=8V_B>3+NGn%uDS~{OteNU#$swvPg1ZCik39sBH03+V;jo@G+?}*m0;#_l>#bj z+7e)XPNIi+rSQ29`_qD+M7MsRH3zsg(V6i2!5j@Fm=wL^nqRZtBqcpJ&35o4M^5K* z*GVbJUJ;zNWc0@xZw1=E5f5~E*UY+xvDZN^ybS!zj1%W^S;$;E4OC2SaD1_AG=5el z>?Ko5Wti>nvZn1?!s%Ds(!Pmiu-rgS+0h{*_=-wTKoagp3Qo#9?!}maZBN)Yj9{A1 zENv$){v6U*0a__9n+gu%!19Q9z2~-rNb>0%gvG}NuNg6HQQSjKkCa)U9spd?Y}t*k zyLNXepptO;+OoiH{|o1Pe?G&-I**N^yjER<6b6R8XVMA60RmaFGW3${Y--q7WxJD* zdu~RSI{~QMyMtG9)vFV$C? zQ`EudUUIc;dce+B{}V{zbrtBB!EX;e3l@DN$6|x7+Lzy^4Qu<4Fw$mS%4?tcd_p!0 zs73qQ2m*FT=Q{!;J;^d1xrVq!{oNGM3++C@ZMDk!>Wl!}1z^&br6}OlF5OAh<*}Kt zsq%ul8%>`o-^qT<;;?m^a%{we0v@+bJutgKfttD{qcEGdmi4A^IYWE_E`s!BKgK$J zw>wcrB85Zi_sr5PuRAV9c-vRsd-n1fvZLubJO-(|h7@**cMV#q&+xjxnscDhTYs>b z!Suu6yHA(};OkD{28B(p#57JSSNQ&9OdUonHCbHZ)1#}+cDWL`1&ZC^RmChr|0l*X zG{ELiz*fiLk0`z-l(3Eh+$PzV-_&Pi_~FVlT?`fZcZ)8S*j>;Q56ZNO@Fs@F@hA>0!VlUv2|F6b!2`U%1ZC|_ksdd@*yD6ZI;M^5 zxe+TpWjWCL)6hLncv%dr5_eNy3Xc1EInBETH=D4%uLWYwRcCo$YcNh=mG+Es&?-`PWWSeFA~*J=2p4Aj>` zk+Neww6Gc#aQ%4zP)OziG>n3s7jR!(!f+icqi*X1A9d2XDa<`~l zMm(#y6ig#+Y`<*zsCe$0zvfThEXX%815d)q!TVMaE}le>qD95xq6E2$E1J7H$9q_= zNhgA6J+51lrA zVI6Kk0b*Lb3@vwiP9-fK14fF`&23P=RgT7VnE&S3S7Fsfjbc~k*BtFecV`Txpu4AC z71RZ23Q`2=CY3(3$S6H$6}uP~Y79`=R=*bD1|p9SrRB-C#3RU;NFDL?5B0^XY~g7{ z+h;)Svx=U@k>f$IYKrVqxhjXDvqO054}7xVf}<*n1&T`Fk93KuNXD_h2IG2Y=g{ge zc36(J*_viQK~qLuopBL*2OZOEk$1!gpQjk94)*Di`9I?8BGS*G)e#Bu=#K@4bgS+fuAXx|}xLfuaj9h&MDRDjVWm^OA?&TN_!&N@620FD$d1kc39NL#uiQ zd)Sl!|8=sSL=+f)F?znBj-8RspvY{%#?+M-!{Z^Z7*H#5Yvmdocl|8ro>|J=nw{m?tGjO#`+}Nj> zrQIU{_Qdz~2LLug>YP=cQuz^=rF~h;0c^jmPkl99hQr2WR#}R##vj-O!H*BUaJ?_{ z9CZ4Xx->;JltaMMbb38aqY5|oDgV06T#M72;b|VZm!7NN`fKVJ1#{^!Qz7G3{EC)Y z;pU!q8Lti1zZp`uNDdV~Kji`0xyq5Op^CHR@p1e|I6$|(Ty>xHjGmK&Wy1Ft`9vAT zJ4hOaNC-vt^YD_RuLP_sS>+t0rCu%gW;~d88u;|K%0cg$`C8l82V6o8ZZ1a$3%%eE z7_Ju|O2A8z@AJ=XN6QfP`1X&49>IliBPFV=tV$#9;JXJ=PA5}$*2n#So+WGQt=udf zat$WLJ`|3BT>&YH(4_BiPeguqwC&+8w4f(ZBGd#vYkOc;zAt-JP$MZZIcfuLoSs>n zt`DTNuiGf3U;87muHtnqZohS&tvCs%Tgq}45WE{Ne?$?-kJZ|j%06zb)LAUXK7L!t z`Pa`jkNHybq8m=n_o*wf{eDio-npHJI&DJKODK9CLF}FrErHHjyS5W`1RH{fac1hW zHs0~*qIanjB}>!iZf#~ME#luXnzIwOzfm?1SrilD=?T3n#{Nr3d;x(z5GkKDc{xLR zKpHaJb?35v%KbMs3nQ3K-$F43AK3Q3a&(3`cI|QLajk~=%77m0DOMXiO#>W6czyf~ zd;aSeEXOc?bZg0F^_eL1O4627B`$S-uKHWri5oMl&a746^{wNlAijpa-*;DfBq>A}1i9DP(xl(-x($LO~m2 z0siC;#qnDD+;NLVcXBDXos}pyPgl+G(J<*Hz@3NHXHF0f6B32@A;tFIFnZQwdO_`g z?C_c`F}cjqxPE0}@zC#qc_-uKtBmw4#!7Z}`?$d{HDgue4WHh!Z^Yo|jR+a8=x-B_ zIuwBj5@JNjZ$&+XJ9%;Zr+Nb1{Y~I+eQOR=jowSq)7Q)g3Gl#k?yr%<+~sI$&P4rU zev4FxZHtfGL$hJ)@*%E5$2+!ZOC#HP2kx?Pq@~JW))BrVo#R;wF9h&Xr$P)&qhvt( zE9zlsE%a0=m8*d%Y!^TyA=O}ITbqJhX3q4jHLLtlex4oWih#J`&njr-ydQ-QTfHp= zJt`|(n?54<%!mEWUZ~V#+Y{@=;)<+yys^va-CHdDc?QxC5_7UAk z3V6@r$T7Wn3*XO7$E_O1+J)&LOT(;X6-GIR5s@Om=+}O!hMao06N*FKmm?DDkbc=5WD?t>ohluFq)?b+@AYrt$< zN7R|$rZ(LP!a@93$z-JHWX+wUL3%(MNxyUnJj|+U77| z1bpaAT}079d#tfQ{M6n3kDPD$)S?pwGw@T5Aw6H7+eQWMu7&jI?5ee-0G>m+WW-T-ZIL22Tdd)YToOVgq>wXuvv#&b8-=eWY%osMr= z`i!iJXWgZWcd1M1wXpm7sQqy^Hhde@2#oC}>uBns!gfZmOoR$*|7Hu~5QgBt z@dW6IlJyMw>>Y8JozvY?b0rZ(K#()3o{}(T4Qi|Hd#7!%Oul%`dptx@D%G9;nfI)8CMyJb;onBe2)R z`{UJdjovJVTacKKvw9{e-UqilF0u9Sy&}?$Wy<>Q#Kr3kI2L8yZ*G|fosC+Dhi}6? zS`wAI)1(G`MylFXiG1Eh7hdDEM0Zt}L?AszdIvGezPXnv?(sH^lg9k<*ED;0M`woK z57CcbVDmrW0J1uhj5s(fZR6x_jb3@54 zXXVPuj4{iRoB5V~7q8tI>LxZ|Pc=!?1*clW3{Yub(ljH$miX_g98P@sh)W zwjjG=gCF0#mHVNC4+~pmbc&Z| zHT!g{B6%O$X1cYzXdh$(?R1=)nkZe!Et-vI8omM!jvm@>{36yOR3qnFmJC2IC`uY5J@HwZ59$~l*zUC_uH-_o z-M8Dv?^euo;lw6Y^jRJ2zQi(pELq33_kpx`Vn<6HOR|h|0tTgZX}z{ctanmHsrJOT zWVI_4XNEW4rEH8mOr4ufIMmITWII;$m(0%@zwqG(V^&8U8cbNey!ar(Ez1F8d8CD2 za`?Z3)f<;!{M*Uui2PQg;@N~xB*<6zO3jX~wT z5l&bbUWxxuaPk!^Kt(rm{RL7)LB`M>Teqb5PJM6S=6YAm%`N9~qb;04K)5WwJz%1T zu|(Cf#2GQyC0k~MCd?F+Pv7_}?BvmME~GB$?Cy?3QsQo+%dLka3mvZiNccSA zCYaYf;k;$}zPKTm zd9$3`<5<9C|8ID&2~K%8MtcXS%qy2M^|Tz>FSN_yH%1tWe`UbC#Cpip;23I#AFTH?_P z`Ln!k#e`94N5Wspl#j};)Ti*-GU=%k4IbI(WB&w7aWqeZgNrq2-;;dojYzO#hwsUb z_uLD4-BqV_p74LZSy9`6WX)4TmbR7_8!KD}T{4JXk|pS7s#*&ag!^z7>J{s-`>%yA zmYC{vg!6We!`jZy|5Q5X;PlTd?B_4vaZ`#JDdG#hBzUT~G=Cb*%-Z4(>$`o;BHV%4 zZoOR*14Mnj*<@4L$wmG!cc}?0-9`jB$N0z+T9$xF+J>ipY3IoR#-@9BsC6wtAw91`-qHb%k!m+1c7xc?Hu(bSn! z|9RE(XE{2|)mp^$ANTsKO2@Uo$nd}YasLhn>Tdr>Q||w$3U}NRtp8p<|F>{|fBNP% z2kiIY*>c{0{rK-*kfVSt|8Y~!{?8Tg_mrgJzkS!g3gsz^D=rlQv`mQlkE^S2l=arp zf2#q1JosOw`M2Bt|8=F=^S@r}pZ(D9R`UPSYt{UyW9-?ZkgauJ^TqGx|GysW-@4lW z$I2LtDSh%ZFR5n~XSus(WBKySA_152%0IMKjmuE>sZOGVF&6!uP<-L7yL&fjayz_v zyphYaMCP8*QujwOCcQnq<~CX6`48;t9~U?&t}g{}$h-G4>4w*UrpG*zf;Tz^FQV5D9z z4N~r?bWHiC__w2-lUk=_+e4XaG6|npx;CH#p_}YKpw)+U*|4O^QyLv2O`P1LM z(%)qZ9LMpF?>^Kmfv4t&ugJZlZ+?5ttz@k(clN3%1^aQQC9nQ&ckQV$PaDyHP>etS zLjmyYc4)c3zagZa!wr4*w>x$gi#+yZ`^CehwukTT2`&&asgS8HFmCvF%+bN0Prlin zaCXtue9{=>xc`;8m8<5Wv2;2{SsL%VZ|l)nDQ+dQO^Z!k+s%Jt-%kg*o=K$26*=uq z;PfM$<92GSHhyYy0)2jZ`Q=%zXL9w`!h_g|&cBv3{~S^8DDraN9xVbfQRF)Kz3R@S zKH$fu&`0S0R|c;=6_gmF)erw=au!^`fky_>nv3@S>wWpV-9F06xcC2SP5rxXbLW3E z?ti(_obCPpTgLrAPM*9klthW(-i0*YO~QI)7me4L?kcs9&?wn@W2${9gEB7&=~;mH z;@MD)PvPp3Y{*1Z=h$_q`#V_>&Ik_~xg-aw_-K))+VQM5K&R)3n089M`@yqECAq3i zIUI4bvRa_JyM50S+7lkU&vs8S>Vr+}aUA}U4I$9P`*vEQ-32$V3I)x>673)+b~ zpAVlg&eO9dxP_i@dNp8#_nylnDJ#hufZ>BbMoabQR7h2i@8qhc?93$hT}UbSX{sK) zj_5g;`!J;JfQvQGoL2K)ymG9f(=Nme_?BaP<0`);<>X2w@elbAHiJXM z4lMmZ``m%>H6LN=tfZjD#O;L~>Wygbvm0aDF*+2|nEOW|{1YDbz{b5>oxh1z{}i~Z zFZa*U>X5CWgJ(2Wds5kuW|BgxZW}s|sR}t4?pwWjX*jWw?-)Pg-wjX|!Vu z?|{BvkNZq>0cVnhU#kUu1iJq)Y_M&pQ1F`{^tm7!6kcv9pDdN<>IzshZo0}|D*E2R z!N0U_c5HD#+k)W>~u0y=9{{qb;mir$| z;K?(50DfKs$nWDEX03rQjof` zi2Q{5IyRC%)`9VxuyyRi=6Rk47=N}v6j`iMKyiIk3<$m1yu^jU{+Ze~8x&)*le|e#os?edKd)wZ=PD-`_RQ`#>SyGJh)vaT$if3~mo%nRD@w8SgBfLypVE56Ip`mZ@ z%;W{!>;0BiMPpP$&1%+BhIV# z7AFUp1!TL;B$2FGDbzW(K;_XwFZ4S0><*QD{DoNFO*xH+OO~3`(u7o+3XZ5-{77+M zpJ-kdMqH4$Z#$$M#e)avE>zM5WjmiBDbFOqO>5Yq_Uox6lJ22)=KH|Bz%7OXyq`Dh z?3fqiONe5@*kUqMdTaSb2&UbY=LE!wR)!mJWpa{mP!{j$`p)VM!~{SjuxaQ?=ze_6fC)bV3ty6 zf(Xo@t(AD|bgv2p$G)c16W+7^RS(kq7lh14A>mP~_uOzzqi|weY{Ts)uiW%=UJ9>l z9b@T)R&TB|+a2lat@_s^h6{zm=ii;sv919xt=NV6ug-*j9qQ!n;N6mxu!B*>cdEwp z`{j1(aALlMN?FDOl_y?J4r-gPyPZ4h1kmZp7d@=~+ETF-A4*9Ne`=Nt&Am?+ul4%@ zEO8o3GoN#JrGLjf7_A~+KY87huX?puzHrO!@z|#-cybtp3$Uw8%kmVDW|)s0%ooSQ zgsx10(u2>lvf&>*1@1`;xAIfA{n@TTOvF|%^gGzz8Hd4tzCL$LtA||hK=*T+8toe5 zOXRbc)wHA{Dp$g+MLa>#)}|*_OVt}@5U-l_vUrKs5JtuoUxEWnz$hRG&4|>^d zO1L>6Oov-RuzbGi`FCXD1Xu4*WS;Avh@Ej2Z&~THykyK$∾QgqU^?q#r!UJ(fh& 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 literal 136276 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 Y$f8?<-`%Hv0{>mPsQ*j8=B)?+3#hf~y8r+H literal 188743 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� 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 z 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 IWb)?!0R7Gw=>Px# diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts index f4907a1df0969..90fe6e7749840 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts @@ -171,5 +171,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await commonScreenshots.takeScreenshot('webhook-params-test', screenshotDirectories); await testSubjects.click('euiFlyoutCloseButton'); }); + + it('pagerduty connector screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('pagerduty'); + await testSubjects.setValue('nameInput', 'PagerDuty test connector'); + await testSubjects.setValue('pagerdutyApiUrlInput', 'https://dev-test.pagerduty.com/'); + await testSubjects.setValue('pagerdutyRoutingKeyInput', 'testkey'); + await commonScreenshots.takeScreenshot('pagerduty-connector', screenshotDirectories); + await testSubjects.click('create-connector-flyout-save-test-btn'); + await testSubjects.click('toastCloseButton'); + await testSubjects.setValue('eventActionSelect', 'trigger'); + await commonScreenshots.takeScreenshot('pagerduty-params-test', screenshotDirectories); + await testSubjects.click('euiFlyoutCloseButton'); + }); }); } From 772bc0c598ad7ae217e668e012b57bd7942e08db Mon Sep 17 00:00:00 2001 From: Coen Warmer Date: Tue, 5 Sep 2023 21:48:03 +0200 Subject: [PATCH 56/84] Enable "Event Generating Elements Should Be Instrumented" ESLint rule for more O11y Apps (#165647) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .eslintrc.js | 10 +++++++--- ...heck_node_for_existing_data_test_subj_prop.ts | 2 +- ...ating_elements_should_be_instrumented.test.ts | 3 ++- ...generating_elements_should_be_instrumented.ts | 3 ++- .../components/app/help_popover/help_popover.tsx | 1 + .../app/onboarding/agent_config_table.tsx | 1 + .../app/onboarding/instructions/otel_agent.tsx | 1 + .../settings/agent_configurations/list/index.tsx | 2 ++ .../create_agent_key/agent_key_callout.tsx | 1 + .../runtime_attachment/discovery_rule.tsx | 2 ++ .../components/shared/popover_tooltip/index.tsx | 1 + .../shared/span_links/span_links_table.tsx | 1 + .../config_agent/opentelemetry_instructions.tsx | 1 + .../url_search/selectable_url_list.tsx | 1 + .../series_editor/columns/series_actions.tsx | 1 + .../series_editor/columns/series_name.tsx | 1 + .../alerting/inventory/components/expression.tsx | 3 +++ .../alerting/inventory/components/metric.tsx | 1 + .../alerting/inventory/components/node_type.tsx | 1 + .../components/expression_editor/criterion.tsx | 1 + .../metric_anomaly/components/node_type.tsx | 1 + .../components/severity_threshold.tsx | 1 + .../custom_equation/metric_row_controls.tsx | 1 + .../components/expression_row.tsx | 2 ++ .../basic_table/row_expansion_button.tsx | 1 + .../components/logging/log_highlights_menu.tsx | 3 +++ .../public/containers/react_query_provider.tsx | 1 + .../log_entry_rate/sections/anomalies/table.tsx | 2 ++ .../anomalies_table/anomalies_table.tsx | 1 + .../anomalies_table/pagination.tsx | 2 ++ .../components/node_details/overlay.tsx | 7 ++++++- .../node_details/tabs/properties/table.tsx | 1 + .../waffle/metric_control/metrics_edit_mode.tsx | 2 ++ .../components/metadata_details.tsx | 1 + .../components/closable_popover_title.tsx | 1 + .../custom_equation/metric_row_controls.tsx | 1 + .../threshold/components/expression_row.tsx | 1 + .../pages/alerts/components/alert_actions.tsx | 1 + .../ux/core_web_vitals/web_core_vitals_title.tsx | 2 ++ .../custom_metric/metric_indicator.tsx | 1 + .../pages/slos/components/slo_list_item.tsx | 1 + .../public/functions/lens.tsx | 2 ++ .../app/custom_logs/wizard/api_key_banner.tsx | 1 + .../app/custom_logs/wizard/back_button.tsx | 1 + .../app/custom_logs/wizard/configure_logs.tsx | 16 +++++++++++++++- .../custom_logs/wizard/install_elastic_agent.tsx | 6 +++++- .../app/custom_logs/wizard/select_logs.tsx | 7 ++++++- .../public/components/app/home/index.tsx | 1 + .../app/system_logs/install_elastic_agent.tsx | 6 +++++- .../shared/install_elastic_agent_steps.tsx | 1 + .../components/shared/troubleshooting_link.tsx | 1 + .../profiling/public/components/check_setup.tsx | 2 ++ .../components/flamegraph/flamegraph_tooltip.tsx | 7 ++++++- .../missing_symbols_callout.tsx | 9 ++++++++- .../public/components/license_prompt/index.tsx | 6 +++++- .../components/normalization_menu/index.tsx | 4 ++++ .../primary_and_comparison_search_bar.tsx | 1 + .../profiling_app_page_template/index.tsx | 2 ++ .../components/stack_frame_summary/index.tsx | 2 +- .../profiling/public/components/subchart.tsx | 6 +++--- .../public/components/topn_functions/index.tsx | 1 + .../public/views/add_data_view/index.tsx | 7 +++++++ .../public/views/delete_data_view/index.tsx | 1 + .../public/views/stack_traces_view/index.tsx | 1 + .../distinct_probabilistic_values_warning.tsx | 1 + .../public/views/storage_explorer/summary.tsx | 2 ++ .../components/certificates/fingerprint_col.tsx | 1 + .../common/links/step_details_link.tsx | 1 + .../components/common/links/view_alerts.tsx | 7 ++++++- .../components/common/links/view_errors.tsx | 1 + .../monitor_test_result/browser_steps_list.tsx | 1 + .../monitor_add_edit/fields/key_value_field.tsx | 1 + .../monitor_selector/monitor_selector.tsx | 1 + .../management/monitor_list_table/columns.tsx | 1 + .../overview/overview/actions_popover.tsx | 1 + .../overview/grid_by_group/grid_group_item.tsx | 1 + .../overview/overview/metric_item_icon.tsx | 7 ++++++- .../settings/global_params/params_text.tsx | 1 + .../waterfall_marker/waterfall_marker_icon.tsx | 1 + .../reset_percentile_zoom.tsx | 1 + 80 files changed, 172 insertions(+), 20 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 5b5ef73ed3806..6657ba3cb1f01 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -909,11 +909,15 @@ module.exports = { { files: [ 'x-pack/plugins/apm/**/*.{js,mjs,ts,tsx}', - 'x-pack/plugins/observability/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/exploratory_view/**/*.{js,mjs,ts,tsx}', - 'x-pack/plugins/ux/**/*.{js,mjs,ts,tsx}', - 'x-pack/plugins/synthetics/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/infra/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability_ai_assistant/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability_onboarding/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability_shared/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/profiling/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/synthetics/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/ux/**/*.{js,mjs,ts,tsx}', ], rules: { '@kbn/telemetry/event_generating_elements_should_be_instrumented': 'error', diff --git a/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts b/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts index b739dc5116c1c..ef0e32c1d2755 100644 --- a/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts +++ b/packages/kbn-eslint-plugin-telemetry/helpers/check_node_for_existing_data_test_subj_prop.ts @@ -37,7 +37,7 @@ export function checkNodeForExistingDataTestSubjProp( const variable = getScope().variables.find((v) => v.name === name); // the variable definition of the spreaded variable return variable && variable.defs.length > 0 - ? variable.defs[0].node.init.properties.find((property: TSESTree.Property) => { + ? variable.defs[0].node.init?.properties.find((property: TSESTree.Property) => { if ('value' in property.key) { return property.key.value === 'data-test-subj'; } diff --git a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts index c8829f05efd21..f08cfa26cbc90 100644 --- a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts +++ b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.test.ts @@ -63,7 +63,8 @@ for (const [name, tester] of [tsTester, babelTester]) { ], output: `<${element} data-test-subj="Value${element .replace('Eui', '') - .replace('Empty', '')}">Value`, + .replace('Empty', '') + .replace('Icon', '')}">Value`, })), } ); diff --git a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts index d2069d2845e59..7242ff1645f5e 100644 --- a/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts +++ b/packages/kbn-eslint-plugin-telemetry/rules/event_generating_elements_should_be_instrumented.ts @@ -17,6 +17,7 @@ import { getFunctionName } from '../helpers/get_function_name'; export const EVENT_GENERATING_ELEMENTS = [ 'EuiButton', 'EuiButtonEmpty', + 'EuiButtonIcon', 'EuiLink', 'EuiFieldText', 'EuiFieldSearch', @@ -74,7 +75,7 @@ export const EventGeneratingElementsShouldBeInstrumented: Rule.RuleModule = { const intent = getIntentFromNode(parent); // 4. The element name that generates the events - const element = name.replace('Eui', '').replace('Empty', ''); + const element = name.replace('Eui', '').replace('Empty', '').replace('Icon', ''); const suggestion = `${appName}${componentName}${intent}${element}`; // 'o11yHeaderActionsSubmitButton' diff --git a/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx b/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx index 3a972b44f9a41..c883376cac4e1 100644 --- a/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx +++ b/x-pack/plugins/apm/public/components/app/help_popover/help_popover.tsx @@ -51,6 +51,7 @@ export function HelpPopoverButton({ return ( {value && ( {value && ( ( ( setConfigToBeDeleted(config)} diff --git a/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx b/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx index 7f5d83f5beb1a..535bd2ed6b4f0 100644 --- a/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx +++ b/x-pack/plugins/apm/public/components/app/settings/agent_keys/create_agent_key/agent_key_callout.tsx @@ -58,6 +58,7 @@ export function AgentKeyCallOut({ name, token }: Props) { {(copy) => ( { @@ -108,6 +109,7 @@ export function DiscoveryRule({ { diff --git a/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx b/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx index 4e119c52c8046..df3330a12c590 100644 --- a/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/popover_tooltip/index.tsx @@ -28,6 +28,7 @@ export function PopoverTooltip({ closePopover={() => setIsPopoverOpen(false)} button={ ) => { setIsPopoverOpen(!isPopoverOpen); diff --git a/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx b/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx index f223cf0036114..167ce52572dc8 100644 --- a/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx +++ b/x-pack/plugins/apm/public/components/shared/span_links/span_links_table.tsx @@ -142,6 +142,7 @@ export function SpanLinksTable({ items }: Props) { { diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx index 2ea2a993816b7..0b105d0550143 100644 --- a/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx +++ b/x-pack/plugins/apm/public/tutorial/config_agent/opentelemetry_instructions.tsx @@ -83,6 +83,7 @@ export function OpenTelemetryInstructions({ {value && ( closePopover()} aria-label={i18n.translate('xpack.exploratoryView.search.url.close', { diff --git a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx index a2e78fb36c41f..fec7360b253f2 100644 --- a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx +++ b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/series_actions.tsx @@ -72,6 +72,7 @@ export function SeriesActions({ seriesId, series, seriesConfig, onEditClick }: P const popoverButton = ( setIsEditingEnabled(!isEditingEnabled)} iconType="pencil" aria-label={i18n.translate('xpack.exploratoryView.expView.seriesEditor.editName', { diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx index f06335145877d..340c00b9f48cc 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx @@ -578,6 +578,7 @@ export const ExpressionRow: React.FC = (props) => { = (props) => { /> = (props) => { {canDelete && ( {children} {children} = ({ {canDelete && ( {children} {children} = (props) => { /> = (props) => { {canDelete && ( ({ return ( = ({ = ({ = ({ {page} {page} - + diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx index 197e0ae1cb2a1..01b047f2e3664 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/properties/table.tsx @@ -65,6 +65,7 @@ export const Table = (props: Props) => { )} > onEdit(metric)} aria-label={i18n.translate( @@ -55,6 +56,7 @@ export const MetricsEditMode = withTheme( onDelete(metric)} diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx index edd760bc17f64..e1596f52aa3c3 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/metadata_details.tsx @@ -142,6 +142,7 @@ export const MetadataDetails = (props: Props) => { {filteredFields.length > NUMBER_OF_COLUMNS ? ( {children} = (props) => { {canDelete && ( setIsPopoverOpen(true)} color={'text'} @@ -110,6 +111,7 @@ export function WebCoreVitalsTitle({ isOpen={isBrowserPopoverOpen} button={ setIsBrowserPopoverOpen(true)} color={'text'} diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx index f451d5d98007c..a333a353f97d9 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx @@ -213,6 +213,7 @@ export function MetricIndicator({ type, indexFields, isLoadingIndex }: MetricInd { lens.navigateToPrefilledEditor(lensEmbeddableInput); @@ -101,6 +102,7 @@ function Lens({ { setIsSaveModalOpen(() => true); diff --git a/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx index c55f554fc4845..b0d6b5f9e6c26 100644 --- a/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/api_key_banner.tsx @@ -93,6 +93,7 @@ export function ApiKeyBanner({ {(copy) => ( void }) { return ( , 0 && ( removeLogFilePath(index)} @@ -265,7 +268,11 @@ export function ConfigureLogs() { gutterSize="xs" > - + {i18n.translate( 'xpack.observability_onboarding.configureLogs.logFile.addRow', { @@ -313,6 +320,7 @@ export function ConfigureLogs() { } > setCustomConfigurations(event.target.value) @@ -514,6 +526,7 @@ export function ConfigureLogs() { error={integrationNameError} > , - + {i18n.translate( 'xpack.observability_onboarding.steps.inspect', { defaultMessage: 'Inspect' } @@ -242,6 +245,7 @@ export function InstallElasticAgent() { + {i18n.translate('xpack.observability_onboarding.steps.back', { defaultMessage: 'Back', })} @@ -183,6 +187,7 @@ export function SelectLogs() { { diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx b/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx index 6dcb343b222cb..13aec2ff31c06 100644 --- a/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx @@ -334,6 +334,7 @@ export function Home() { + {i18n.translate( 'xpack.observability_onboarding.systemLogs.back', { defaultMessage: 'Back' } diff --git a/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx b/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx index 282591e0a1487..2d5a42f7c287e 100644 --- a/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/shared/install_elastic_agent_steps.tsx @@ -221,6 +221,7 @@ export function InstallElasticAgentSteps({ values={{ hostRequirementsLink: ( diff --git a/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx b/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx index 5b6a1588d643c..71ab94a9bade8 100644 --- a/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/shared/troubleshooting_link.tsx @@ -13,6 +13,7 @@ export function TroubleshootingLink() { return ( @@ -152,6 +153,7 @@ export function CheckSetup({ children }: { children: React.ReactElement }) { }, button: ( { event.preventDefault(); diff --git a/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx b/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx index ae37ebf65c9f0..7a3b661cdac6d 100644 --- a/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx +++ b/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx @@ -160,7 +160,12 @@ export function FlameGraphTooltip({ style={{ background: theme.euiTheme.border.color }} /> - + {i18n.translate('xpack.profiling.flameGraphTooltip.showMoreButton', { defaultMessage: `Show more information`, diff --git a/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx b/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx index 1f9d40d23a648..ac2c2e7a2407b 100644 --- a/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx +++ b/x-pack/plugins/profiling/public/components/frame_information_window/missing_symbols_callout.tsx @@ -41,6 +41,7 @@ export function MissingSymbolsCallout({ frameType }: Props) { values={{ readMore: ( @@ -54,6 +55,7 @@ export function MissingSymbolsCallout({ frameType }: Props) { />

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

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

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

config_properties_index - Connector request properties for an index connector Up

Defines properties for connectors when type is .index.
-
executionTimeField (optional)
String Specifies a field that will contain the time the alert condition was detected.
+
executionTimeField (optional)
String A field that indicates when the document was indexed.
index
String The Elasticsearch index to be written to.
refresh (optional)
Boolean The refresh policy for the write request, which affects when changes are made visible to search. Refer to the refresh setting for Elasticsearch document APIs.
diff --git a/docs/management/connectors/action-types/index.asciidoc b/docs/management/connectors/action-types/index.asciidoc index 87c7494df23ea..5a09ab2d23c5f 100644 --- a/docs/management/connectors/action-types/index.asciidoc +++ b/docs/management/connectors/action-types/index.asciidoc @@ -3,13 +3,13 @@ ++++ Index ++++ +:frontmatter-description: Add a connector that can add documents to {es} indices. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] -An index connector indexes a document into {es}. -You can create index connectors in {kib} or by using the -<>. Alternatively, you can use the <>. -If you are running {kib} on-prem, you can also create more preconfigured index -connectors. +An index connector indexes a document into {es}. [float] [[define-index-ui]] @@ -26,72 +26,14 @@ image::management/connectors/images/index-connector.png[Index connector] [[index-connector-configuration]] ==== Connector configuration -Index connectors must have a name and an {es} index. You can optionally set the time field, which contains the -details about when each alert condition was detected. - -[float] -[[preconfigured-index-configuration]] -=== Create preconfigured connectors - -If you are running {kib} on-prem, you can define connectors by -adding `xpack.actions.preconfigured` settings to your `kibana.yml` file. -For example: - -[source,text] --- -xpack.actions.preconfigured: - my-index: - name: preconfigured-index-connector-type - actionTypeId: .index - config: - index: .kibana - executionTimeField: my-field --- - -For more information, go to <>. - -[float] -[[preconfigured-connector-alert-history]] -==== Preconfigured alert history {es} index connector - -preview::[] - -{kib} offers a preconfigured index connector to facilitate indexing active alert -data into {es}. - -To use this connector, set -<> to `true`. - -When you subsequently create rules, you can use the -`Alert history Elasticsearch index (preconfigured)` connector. - -[role="screenshot"] -image::images/pre-configured-alert-history-connector.png[Select pre-configured alert history connectors] - -Documents are indexed using a preconfigured schema that captures the -<> available for the rule. -By default, these documents are indexed into the `kibana-alert-history-default` -index, but you can specify a different index. Index names must start with -`kibana-alert-history-` to take advantage of the preconfigured alert history -index template. - -[IMPORTANT] -==== -* To write documents to the preconfigured index, you must have `all` or `write` -privileges to the `kibana-alert-history-*` indices. Refer to -<> for more information. -* The `kibana-alert-history-*` indices are not configured to use ILM so they must -be maintained manually. If the index size grows large, consider using the -{ref}/docs-delete-by-query.html[delete by query] API to clean up older documents -in the index. -==== +Index connectors must have a name and an {es} index. +You can optionally choose a field that indicates when the document was indexed. [float] [[index-action-configuration]] === Test connectors -You can test connectors with the <> or -as you're creating or editing the connector in {kib}. For example: +You can test connectors as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/index-params-test.png[Index params test] diff --git a/docs/management/connectors/images/pre-configured-alert-history-connector.png b/docs/management/connectors/images/pre-configured-alert-history-connector.png index 98cfbd0f39f7b2ce3060564ac344f7ab4864008b..dd72a96a761c9d5f98914cf2d69a771d24cf7ec0 100644 GIT binary patch literal 152201 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 Qy#xG_mQ;{{iyM9TKe2p;f&c&j literal 163742 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�yg&^PN`S)CH+tK}wCdGGzWw2#{V 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 T5;*HgfJ;~N_6>}>E$aUObD(5r diff --git a/docs/management/connectors/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc index ceaf771a58f9e..443fda6cba218 100644 --- a/docs/management/connectors/pre-configured-connectors.asciidoc +++ b/docs/management/connectors/pre-configured-connectors.asciidoc @@ -57,36 +57,80 @@ Sensitive properties, such as passwords, can also be stored in the <>. ============================================== +[float] +[[managing-pre-configured-connectors]] +=== View preconfigured connectors + +When you open the main menu, click *{stack-manage-app} > {connectors-ui}*. +Preconfigured connectors appear regardless of which space you are in. +They are tagged as “preconfigured”, and you cannot delete them. + +[role="screenshot"] +image::images/preconfigured-connectors-managing.png[Connectors managing tab with pre-configured] + +Clicking a preconfigured connector shows the description, but not the configuration. + [float] [[build-in-preconfigured-connectors]] === Built-in preconfigured connectors {kib} provides the following built-in preconfigured connectors: -* <> +* <> * <> [float] -[[managing-pre-configured-connectors]] -=== View preconfigured connectors +[[preconfigured-connector-alert-history]] +==== Preconfigured alert history {es} index connector -When you open the main menu, click *{stack-manage-app} > {connectors-ui}*. -Preconfigured connectors appear regardless of which space you are -in. They are tagged as “preconfigured”, and you cannot delete them. +preview::[] + +{kib} offers a preconfigured index connector to facilitate indexing active alert data into {es}. +To use this connector, set <> to `true`. + +When you subsequently create rules, you can use the `Alert history Elasticsearch index (preconfigured)` connector. [role="screenshot"] -image::images/preconfigured-connectors-managing.png[Connectors managing tab with pre-configured] +image::images/pre-configured-alert-history-connector.png[Creating a rule action that uses the pre-configured alert history connector] -Clicking a preconfigured connector shows the description, but not the -configuration. +Documents are indexed using a preconfigured schema that captures the <> available for the rule. +By default, these documents are indexed into the `kibana-alert-history-default` index, but you can specify a different index. +Index names must start with `kibana-alert-history-` to take advantage of the preconfigured alert history index template. + +[IMPORTANT] +==== +* To write documents to the preconfigured index, you must have `all` or `write` privileges to the `kibana-alert-history-*` indices. +* The `kibana-alert-history-*` indices are not configured to use ILM so they must be maintained manually. If the index size grows large, consider using the {ref}/docs-delete-by-query.html[delete by query] API to clean up older documents in the index. +==== [float] === Examples +* <> * <> * <> * <> + +[float] +[[preconfigured-index-configuration]] +==== Index connectors + +The following example creates a <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-index: + name: preconfigured-index-connector-type + actionTypeId: .index + config: + index: .kibana <1> + executionTimeField: my-field <2> +-- +<1> The {es} index to be written to. +<2> A field that indicates when the document was indexed. + [float] [[preconfigured-opsgenie-configuration]] ==== {opsgenie} connectors diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 9ab4058d35e30..c7a43932fa1f8 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -252,6 +252,9 @@ Specifies configuration details that are specific to the type of preconfigured c The type of preconfigured connector. For example: `.email`, `.index`, `.opsgenie`, `.server-log`, `.resilient`, `.slack`, and `.webhook`. +`xpack.actions.preconfigured..config`:: +The configuration details, which are specific to the type of preconfigured connector. + `xpack.actions.preconfigured..config.apiUrl`:: A configuration URL that varies by connector: + @@ -261,6 +264,12 @@ A configuration URL that varies by connector: NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. -- +`xpack.actions.preconfigured..config.executionTimeField`:: +For an <>, a field that indicates when the document was indexed. + +`xpack.actions.preconfigured..config.index`:: +For an <>, specifies the {es} index. + `xpack.actions.preconfigured..name`:: The name of the preconfigured connector. diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index a8d63137fa0a9..147b26fc6e03a 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -552,7 +552,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { maintenanceWindows: `${KIBANA_DOCS}maintenance-windows.html`, pagerDutyAction: `${KIBANA_DOCS}pagerduty-action-type.html`, preconfiguredConnectors: `${KIBANA_DOCS}pre-configured-connectors.html`, - preconfiguredAlertHistoryConnector: `${KIBANA_DOCS}index-action-type.html#preconfigured-connector-alert-history`, + preconfiguredAlertHistoryConnector: `${KIBANA_DOCS}pre-configured-connectors.html#preconfigured-connector-alert-history`, serviceNowAction: `${KIBANA_DOCS}servicenow-action-type.html#configuring-servicenow`, serviceNowSIRAction: `${KIBANA_DOCS}servicenow-sir-action-type.html`, setupPrerequisites: `${KIBANA_DOCS}alerting-setup.html#alerting-prerequisites`, diff --git a/x-pack/plugins/actions/docs/openapi/bundled.json b/x-pack/plugins/actions/docs/openapi/bundled.json index 67191da3842d6..ebd18fad973a3 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.json +++ b/x-pack/plugins/actions/docs/openapi/bundled.json @@ -1659,7 +1659,7 @@ "type": "object", "properties": { "executionTimeField": { - "description": "Specifies a field that will contain the time the alert condition was detected.", + "description": "A field that indicates when the document was indexed.", "default": null, "type": "string", "nullable": true diff --git a/x-pack/plugins/actions/docs/openapi/bundled.yaml b/x-pack/plugins/actions/docs/openapi/bundled.yaml index 5da86f4563a6c..39a6bea27385f 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.yaml +++ b/x-pack/plugins/actions/docs/openapi/bundled.yaml @@ -1028,7 +1028,7 @@ components: type: object properties: executionTimeField: - description: Specifies a field that will contain the time the alert condition was detected. + description: A field that indicates when the document was indexed. default: null type: string nullable: true diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml index c82f775fe15dc..6c335b166d20a 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml @@ -5,7 +5,7 @@ description: Defines properties for connectors when type is `.index`. type: object properties: executionTimeField: - description: Specifies a field that will contain the time the alert condition was detected. + description: A field that indicates when the document was indexed. default: null type: string nullable: true From 24cbba299787c9d3a5108fe2e2c6cc9f4a73b362 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 04:24:59 +0100 Subject: [PATCH 65/84] skip flaky serverless test --- .../functional/test_suites/common/index_management/indices.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts b/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts index 02b6acdfbfa56..b4473f0ba16a5 100644 --- a/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts +++ b/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts @@ -15,7 +15,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); const retry = getService('retry'); - describe('Indices', function () { + // Flaky on serverless + describe.skip('Indices', function () { before(async () => { await security.testUser.setRoles(['index_management_user']); await pageObjects.common.navigateToApp('indexManagement'); From c9958485facc282294916508b2c5b766555c3205 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 6 Sep 2023 01:04:20 -0400 Subject: [PATCH 66/84] [api-docs] 2023-09-06 Daily api_docs build (#165794) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/452 --- api_docs/actions.devdocs.json | 32 + api_docs/actions.mdx | 4 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_chat.mdx | 2 +- api_docs/cloud_chat_provider.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 4 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 556 +----------------- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.devdocs.json | 28 + api_docs/kbn_search_api_panels.mdx | 4 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.devdocs.json | 56 ++ api_docs/kbn_slo_schema.mdx | 4 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.devdocs.json | 144 +++++ api_docs/kbn_text_based_editor.mdx | 4 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 8 - api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/log_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 64 +- api_docs/observability.mdx | 4 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 20 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.devdocs.json | 194 +++++- api_docs/stack_alerts.mdx | 7 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.devdocs.json | 14 + api_docs/text_based_languages.mdx | 4 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 61 ++ api_docs/triggers_actions_ui.mdx | 4 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 581 files changed, 1202 insertions(+), 1136 deletions(-) diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index ab2fd467cd958..68e7723fc7fa1 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -3509,6 +3509,38 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.setEnabledConnectorTypes", + "type": "Function", + "tags": [], + "label": "setEnabledConnectorTypes", + "description": [], + "signature": [ + "(connectorTypes: string[]) => void" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.setEnabledConnectorTypes.$1", + "type": "Array", + "tags": [], + "label": "connectorTypes", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "lifecycle": "setup", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 1675e5db1912c..0985f86300e69 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 267 | 0 | 261 | 30 | +| 269 | 0 | 263 | 30 | ## Client diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 17d00954ff5e6..4db3eb7532c53 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index e69040bbcb687..85d9b71699e77 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 74220f3e48d63..319891bcf513d 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 1f3e0da71d41a..a895f490187fb 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 7e0cb19b76349..2373d1d20cfac 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 7c9e072b32a5a..5a2e02e21714f 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index b095e025ebb25..71690f87c1a92 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index b35d2c259da58..cc1fe5f9fa748 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 391741661db72..f8d7b2a27d369 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 34f1b185e06bc..1af3539ef5ac9 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 80664fabad87d..d3d61657ed676 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 73b5ef4c2517e..01f2089596b6a 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index 8b0f6a65ddd8e..be0fb6438525b 100644 --- a/api_docs/cloud_chat.mdx +++ b/api_docs/cloud_chat.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat title: "cloudChat" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChat plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_chat_provider.mdx b/api_docs/cloud_chat_provider.mdx index 89e27b560261f..88d1e38aa0e5a 100644 --- a/api_docs/cloud_chat_provider.mdx +++ b/api_docs/cloud_chat_provider.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChatProvider title: "cloudChatProvider" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChatProvider plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChatProvider'] --- import cloudChatProviderObj from './cloud_chat_provider.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 5410157a3a4e8..b6124e08cd350 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 765d3226f9c3a..4e21c123a96e8 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index e0b54f328ba2c..8efe7de4747d1 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 113f43f209db5..4c8df64fa2cfc 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 6318a4faa542c..4940ef352585c 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 9886b7a3ea00b..3237478bf66c9 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index a5dd74b6330d1..2cb7a44d97fd0 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 66ba3a87e78bb..d13956de9f217 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 91b1eb51f287b..12a480db48c7d 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index a45b5025b2fe9..74994c4829bec 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 70949b17f4987..46531c9a02904 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 62d0861bbbf19..310e48213af7a 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index fde4b2f40f862..08230c72660ac 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index d2fa815d40409..a29d62bd9c5ae 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index c10490b5d7a9a..187c9712e4b69 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 6e41bcc12d78a..07264a9d936a1 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 0d85b10f37cbd..9e13e90657c1c 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index dec5ec2987ed8..4fa0316ec8e5a 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index a01b818334271..10632b2d4896b 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index b09904070bf9a..195314fc734f8 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -921,7 +921,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | | | [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=title) | - | | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | -| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [workspace_top_nav_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx#:~:text=toMountPoint), [workspace_top_nav_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint) | - | +| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint) | - | | | [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [source_picker.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/source_picker.tsx#:~:text=includeFields) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index bbdf4234fb74b..a325fd6f43f55 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 6b0064c8f0858..de965350e87ad 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index a63ae77760646..c74856cd3ff5e 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 675890ffa1ac8..9f6ff44667e3a 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 90e742bda6198..97310dfc057fe 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index ace6dbb2a4c7d..ec0bdf9631439 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index be41e8d5bc699..06a56b891b64e 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 8fd457f066ffe..ec718fa5655d2 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index cf6cd38a5251c..4f83486d558e2 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 07418305cdc71..5499ef93aa543 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index f5aaa1ac5bd5c..0f19677a6dad2 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index d72d41002cf5d..2d036d98c176a 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index edabbf7f2b416..28d0b86a754bf 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index d977e9d3c6444..872e71e7d9514 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index cf353aeb1663c..2ebc1a0477ab0 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 4dc1d165e75fb..dbcfa79c17407 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index bd676f00bd162..92cc5b1de1d4f 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index e07f5ea5cd63f..3088aaeb30bfe 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 38013982ab985..6069e11e72648 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 0e8902fbf0a0f..a99de7d753807 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index fcae81f5883cf..db6de17efd135 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 039b050b32bc6..8e515e738c6df 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 9f2f3434acb56..773380b5de18f 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 8f9d323b53023..0d0470eb67888 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index f3e7d5eeaee3c..105172011496c 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 214d3d21153e2..1101379011fb9 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 7f245d3889e1f..054d4560a99b0 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index ce5cf4cc0939f..74a4cd4d131bf 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index db13ee18b015e..fbfd9a1d0855f 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index bc8dff8530b8e..176f7897ba0aa 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 7cb2ca900ab10..d9b7d3b411174 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 54c4bb33663b7..3eb1600270481 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index fe86c6e0074a2..dd194c513358c 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 58bf0969ecb00..02687c281e11c 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 53425f7e23d24..eb73dfcd24143 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index a1230a39ce3f2..ea77ddbecac91 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 9915ed0e2802a..689e76b0b9cad 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 586539ca0d0aa..99620afbd13a1 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index c394ca0f93615..942abb35cb86f 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 25a6849dd773c..d9904dab581e3 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 0cccce355c006..90c41da824f8e 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 5b47285b9edcd..b889647d6b02a 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index c3c4259afdfb1..33964bc6de443 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 9d13f55b01c3d..874707881804d 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 6e51456817f54..05a81b1a8feef 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 9bb30d89b5db3..677382c6e0405 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index c60de50828f02..8a6ccbef94e04 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 45459e55d57d2..c29ef9f2d3687 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 64b3d4ae9600c..20c1b38ed8419 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 0387bc14aa30c..2e4bcf1093c08 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index a2dfb1d49ac93..5f117aad37f87 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index c36b7b83b967c..7bbdd9182c6a8 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 053d4313a1174..91b41b353c85e 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 5b8013b126b1a..b5f1c3fde5c2e 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index c2055ef8d02bc..df1585a9557ba 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index df61103a09941..fdd2bd041f9fc 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index fb844e6b7c754..9025efdcccbee 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 30c1a22a8ec4a..22ba77889cc08 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 09007f8b0e82e..2145de70fd218 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index a04a564cde49c..19469c8e8373b 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index ce523adf57985..e064ff507b39b 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 9f4d642a9f4ef..c817f89501300 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 82da938a2e3b9..cc6c2e7c69890 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index b14c9ededd480..71e1f390d6646 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index e49db93b653a5..6dcb11df62f92 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 6b8ed504dc92d..6cd8345f78503 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index a5c29e677ec23..723bb8a4741b9 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 50523b6543892..c24fd85553e1a 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 30878509c9908..f92216a33e2c4 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 001c90e047fae..aa3b7bac022d5 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 909659dcf4b32..83331cb9c1a73 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mocks.mdx b/api_docs/kbn_code_editor_mocks.mdx index 4d1b33ff13923..5f1dc03899307 100644 --- a/api_docs/kbn_code_editor_mocks.mdx +++ b/api_docs/kbn_code_editor_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mocks title: "@kbn/code-editor-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mocks'] --- import kbnCodeEditorMocksObj from './kbn_code_editor_mocks.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 2d3190c184aa0..27a106cc7a8e8 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index a044b568a4c6d..bc12eabd449a3 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 7dff56ea557ef..8b9f1735d0551 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index d98cbfcac9f03..f0e644b3f6a72 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 571943ac43efc..ca6e85734b249 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index f840d96fb96a8..a2e394b5ea713 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 80dc326e0b499..c0f56347084ff 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 59ee0aee26e27..2ddb0a46a82c6 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index da3749b332c70..71e1743ff2a9f 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index abf01e9b87809..b8a5f7f52d98c 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index eeafd6d571c92..97a38610e99ef 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 56a4f9835d002..55f676eea5f44 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index d62cfc6e67a36..09a7677e1b56a 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index c734b69e04e11..54e73f3583b24 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index af02ffe0dc431..f852dd94d67a4 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 0c91163570254..fda9e4147f3d7 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 2b4ca8a154b87..7b7bd2ff59c42 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 839b32626a245..253bd423024a6 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 498d5d98e4a90..dc7cb08859ada 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 53cde53b4ed52..b43365fa7cf9d 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 211b46e09eabd..2989abbfb45b1 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 14b282a273f22..4bbc9f2727889 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 315c7acf87a17..3057b026516fb 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 9b9547190aa86..a41a066e3116d 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 99e3e0ed02fa2..b1c4d5c02c3fe 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 4e1e2c7844df3..2cec1dd239207 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 647817f602e86..c0047306b8f83 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 5a469f8fb6cc0..5cfa7b3df9daf 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index fc98432fd11db..ddc641e1eee49 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 707a34374771c..199ea676a211b 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index ebfd9644f1ffa..87cc2be55db43 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 86c1b2a59a51c..faed4a14018dc 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 941f7eeab85a6..60d510d551c91 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index ec369f63898dd..b878d1a7ab151 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index e392692c7a0ce..5e2fc1372babd 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 8871af521c930..8947bc93d11a1 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 6b56be8c38b51..b9b47c43d59eb 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index e667a125a4268..fbd85c0ed6b47 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 9127767aba5b2..f02e9dcb86806 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 8cf713c6da2f1..d42cc7ed4822e 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index f1ef685c162ad..e72aa5b4728de 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 324b3291c428b..89bc353e5baf8 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index bd3bb18d01281..00d1054a0a915 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index f72e86ef83440..0a266520ad02f 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 4d968a10b1371..5befa6f5952ca 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index aadb7ee12c9f5..f0b40dbdb50ad 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 5891024b67a45..8fd99fbc6eee7 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index f5369679076f2..0c10b629b805f 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index a4628267a3b23..d9111ff5f70fe 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index af7d968100a5a..84ffe2a552c1e 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 6dffcd5bf011d..2c3f8173e7951 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 9f3b157a0e7ad..d00a1502a7330 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 7196d5b59d0b4..ac9c6838058a5 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index dbc1eaec1fb49..cd0f5dfbc331c 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index c353870e9bd1c..5c9ba89d1d3cc 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 1a5426df061ed..8ddec293e6234 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index ea6fd0531228d..e41cd33e69f2e 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index bca77c3503b45..d2b49ab6107b0 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 376f67dce7275..f91003ff0eb4e 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index ea1da3f4749f4..a6e016cf61aeb 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index bf0e09898be90..b37e85685210c 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 5775b5d5f9b73..6c2ff683c7bae 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 9a5c8dc842acb..b64ba2f04dd64 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 24b454a40a72b..a8828523b867c 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 2323310976cdf..8493514402cb1 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index efa9880e343cd..5c69f0bf3be8c 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 688cb85dc67d1..797af39591fed 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index ed462f0b7103e..676aa7b03ec77 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 9c9a2f63eab66..afc3e7d2c0f20 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index f740c651d8dcf..1dc638f47b08e 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 2307f7280d904..e1fc914d02688 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 897affe7c09b8..af32e68b59eb9 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index d4fdd95134136..b2d9f76b852a1 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 87346e93af629..d36a9beb010a9 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index c8dcdc45a54a4..623ad50e66332 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index ef1491370a696..22c60891dfd63 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index f85ebe7a68529..8cd5969d03905 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 018b03c72899f..1972bc47648ab 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 646cf9fd1bb02..cdf7045703aef 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3643,10 +3643,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/internal/find_tags.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/guide_state_routes.ts" @@ -4111,6 +4107,10 @@ "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts" }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/mapping.ts" @@ -4767,206 +4767,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/data_streams/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -5527,18 +5327,6 @@ "plugin": "cloudChat", "path": "x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, { "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/routes/api/get_route.test.ts" @@ -5727,14 +5515,6 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/test/helpers/router_mock.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/anonymous_access/get_capabilities.test.ts" @@ -6429,10 +6209,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/internal/bulk_delete.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts" @@ -7361,186 +7137,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/preconfiguration/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/preconfiguration/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/health_check/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/message_signing_service/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -8431,10 +8027,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/update_rule.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/plugin_state_routes.ts" @@ -8763,58 +8355,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -8939,10 +8479,6 @@ "plugin": "cases", "path": "x-pack/plugins/cases/server/routes/api/register_routes.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/update.test.ts" @@ -9153,10 +8689,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/bulk_disable_rules.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts" @@ -9201,14 +8733,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -9527,10 +9051,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/tags/delete_tag.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts" @@ -9775,54 +9295,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -13649,6 +13121,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/json_schema.ts" @@ -14425,6 +13901,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts" @@ -14761,6 +14241,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_usage_stats.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/annotations.ts" @@ -15401,6 +14885,10 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/patch_list_route.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts" @@ -15545,6 +15033,10 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/delete_list_route.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/annotations.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index d75b9c88f0d8c..9c3496ef068f3 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 17ec295e2b28a..9ea6c1275a4b1 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index af7530ebe2780..064a29285937d 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 8c8bf1891f9f1..528a58fcd9afa 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index b28afa660b41c..fdb0954f4e478 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index e26626cf1aa43..4528e9b4a1544 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 1dde8083861cc..776c8c619f977 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 4c96d38b98734..6a06e4503c60c 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index c95da94e81dd9..ce6c84a1bd946 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 313d1a1cbc7ce..adca2cad222a8 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index b270138d4cde2..e1023f069e005 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index bfad413d0dbae..58676fb7f6427 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index a3d274221d1f7..b1d24176b8cb8 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index b96e16ddd9e4e..559e1fa99ab74 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 4ea507f43b8d8..58cfd92adec97 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index e663c9a363275..a534b7d888b56 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index c1e5800d3fc35..026bf2a562778 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 377505265a597..c1d0e4b35eb36 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 08e6c40d3b799..e837d8eb13ab7 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 374fd7a4c3600..4e6036af67658 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 789f56c123186..c5886d6d47910 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 9ce1103581bb2..95a75ad4c18ce 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index f65dc13cd22a7..380282b4554c9 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index d9393f985758f..f78d7428e9be1 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 2a7dcbd5d1af9..30ff706492b45 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 8701f13ca30dc..d974a7a67c19f 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 8d37a662156d1..9e2e896b4df6c 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 4cc7d28317be7..c665b4838b3fe 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 48905d30f9cfe..61ccc1bb4249c 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index afca185707beb..c26140dc1a4f2 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index f6a66c5963efc..4abe76f9aa06d 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 147187be6169d..8ee27b4b6d659 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 831b0fa16040c..d39dbc30f0e99 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 13f3e351a4e1b..79796c21f1a30 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index cee4243d41ec9..287e9f8b1253a 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index d0e79df85e348..d2084acdedc68 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 0efde46e225c8..a04f2da24f043 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index b9b84c8887fc5..7a0c4e4360ba8 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 7a04d07f67c12..f6950ead9c384 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 8b8849d1e1a78..63c27b4dd965f 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index bde0ba3320d89..a4b85da878aa8 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index c5f0137d455e2..cabbdecb8810e 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index b09d5759718c2..fede8551955b7 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 71ec48a5a4eb3..d5a3a3a0cadd7 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 985a16b0261ea..f8899741c8460 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index c3e93e7242086..1a90b731a4887 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 5389c790c3889..64389307dc138 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 24d6094fecad2..0f8a33bebb2e9 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 3348a66f9503c..dd9f7170f150b 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 00ec9085ed5b0..90e9ac5bd716d 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 46cca04b8c670..a1817a6a07a17 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 15a10088397da..39c4cf7af65a6 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index f11d1ea3fd27b..e54de71bfcbc2 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index b38bf406d436f..3ff296d3868fc 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index dcc9f8b8c8e94..f6960165a3be9 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index d87aa7fa00c18..f19151f739d6f 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 0243585e35df1..25f1f95e6a02e 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 089cd4f11e138..c937a174fb823 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 0d93a2c9924c8..6e626b240d86f 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 038594c4e6f50..4fd533bb4bd96 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 8de8c4fc312c4..9f52c18dfbf58 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 14872988849f1..9d8cb3332c731 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 0707f752b2a6c..94fd11c66372d 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 35c63747efecb..dda2c0825eaa3 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index b13279c38b32f..a19249d60f01d 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 5740bf4cbada0..c966bb6c9d67a 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 3126e14f0581c..b587cc553b72a 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index d2910acd94f73..1e629acc9f8dc 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index caca10c2fd48f..3bb3db62ea820 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 96d43fb283968..4555f0c0cd81e 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 52d1fb852d224..c165846077470 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index e256f3ba6d69e..a91080213c357 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index c883b482a9c69..9867d7595e2d6 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 513db41d2f316..49a95f55c685f 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 38cfbeb018997..4f4a82e3edb6b 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index cfe6994c0bbf7..9cc0c2c5ccd1b 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 0bacde75c8ed3..c8480d7b9aebd 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index f1671013301da..c3b16d9766a8d 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 3f0b161976b96..6c6d03f53fba5 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 696ae1d316070..75dc24f2e5847 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 6461a930f9926..86303d6f9925b 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 11e95f64326de..7585ebcdc8491 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 2fff03abb2438..0ea42f83373ff 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 3d8450614de08..fe1bd0e1c356e 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 8a4e30bc7f65e..c29d4fa88fcb8 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index bbc16de105137..c0f46d66768c2 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index f2235fdee4dee..69d4bc3d102b6 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index c14fe4df54dc4..50e5bd19b4768 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index cd44c94dbb706..3c831c1d0ee89 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 1244ed0c0da4c..78a73de5d1867 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 76ecfb8d270ca..a6105789f0523 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 8a115eeed4cf6..766b8051ca37a 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index bda8d0b6b8ab1..cb1ffb4254106 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 023e5b73ca23d..b047cb06b1511 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 247745c07f508..9219e6753b699 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index bb3308665a207..44e124a7514ad 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 315988ced942c..f75e59835c071 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 8777eb2ca54ef..0180e463d2d72 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 387d6797cd5a5..840bef3ce72ef 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index efaffaf33ca7c..176cd083cf18e 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index ef7beaef0f6a9..0ac9edfdd54fc 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 763e602b18868..b20c3bdd080da 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 918307a7aea1f..113cd6a82a2b5 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 8889c66a849e1..d6bc349a21507 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 787be9b13f6ff..56d8fec5c0828 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index d0134b6dd43c5..b9d6443d12d88 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 1ee3655894d70..53a748f72b7e0 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 32a41d70a9325..e10d05ddd78de 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index a276ef5f584e8..a670edb9d3018 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index bd3a9ef6ceb82..23edb0ca7fe72 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index ae8ce838528bd..c95007904924d 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index 31679eb5a4ee6..58903a3c81abd 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 6af12ec235d93..10bad964f02e3 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 057d553c9c272..bebee29d1038a 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 2626b9b5e3793..5d064f79a07bd 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 9ce008af48794..a9952ec8ee4af 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index a8ab926401b82..0e57d7bc1d6bd 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 34abd1a51f0fd..eec6a2e640015 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index ca7517756e605..7196f80f9f763 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 7899f9650cd30..46a0a1ea92a11 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index fdd6e0c7f3fc3..4269e7ed98e83 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index fc83a934bf7e1..e0b8669cdc1dd 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 0788687a910fe..9bc0c96297a67 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 8af6fb11bde12..e9b8161b5dc7d 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index c99be713b8d90..bbd8695bcee88 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index b911c6e1e1952..568548ff4aa6f 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index b5bda95c806cb..fa5768753b039 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index e3d7321f12ea1..419f938af074e 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 65b0ac1dd0ecd..c1bfcd5bb2818 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx index a68e429f6013e..6c563f87fe9c4 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_generate_csv_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types title: "@kbn/generate-csv-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] --- import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index df6dcbf68a99c..9d8254b6d4c5f 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 7fe9a26ba9dd7..ccc8ed8e145b8 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index f64d1c6af5206..cd799193dec7a 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 8676c7107d4dd..80c18b02ac5d9 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index a0f2a90b37a14..fccf61bb0964f 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 8024bad81452e..b7f726363dba7 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 79f69a5cc71a0..4eee0d1ff683e 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index cc4337a22a137..4884deac439ee 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 81ae937e1aabc..d77d54b054703 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 903ff74457bd2..89ce0ace7f38c 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 2d1f2dd1b4f3e..94444ebdea104 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index d3f8fb3e152da..bdd68dda0749d 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 3b5fe7bcd0bb7..b1b983d226fc9 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index eea14a63ba6ba..4f0bc0218e945 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 5c11668ffa71e..5dd173d676d19 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index f4b3cbee7bc65..b37f26feca8fb 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 277d89eeb2666..f5ee3dc45859c 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 3121954ab3512..80ec92818f67d 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 6d1e806fffcf2..4d9107defc8a9 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index ffb235143b227..dabeeff20ae91 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 6dac7d9151945..cb57687c88b52 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index c13b36d6a01b5..e26a3332382d8 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 0643d300555bb..10cb7f1612594 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 8bcf6ef9da913..4d78f021e9b8e 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 268c13ee40c21..25b8eddaed820 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index cda3b46c2c802..a486f91c6ce80 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index d4c39692829a9..1f573f178aa48 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index edb82b7d856a9..9aae44e563071 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 9ee3a48b1ed90..b61bae7f686c0 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index d4fcdeafed66b..d028bcdd292c2 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 8e0369f66c66b..46160457cfb40 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 0a44b471adea8..b49d37521dfc5 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 1a8bff8e80c51..f36efa6260bed 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index f376e5de94cbd..e67965622abf2 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 5a614d4f7e906..2293abb378091 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index cc1cd6b7c29c3..76d18ea443e22 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 88af0e128fe6d..b63ebb802ae4b 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 5004023259bfa..0e95c8df6db6c 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 8ab31c0810681..09f3f34afa52f 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index de7246615f050..c2686005a1b47 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 300345dc19e9f..e364f70c184f4 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 65e39c56c54cf..e7fe7ad9957c3 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 5989125209f3c..096a5f9b29ae8 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 8c2fe6d0f842b..7208fd4f27840 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index b87966a18bcc8..cb41d872a670c 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 54cb3c3ed4458..93bb955960964 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 032e218c58780..4c283c282c8db 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 7aed7a647acd3..a9c038be9f5c2 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index e1d4a47d80bc5..463ab406fd55f 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 7e85861952f55..bda7e1b72a441 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 3fb6a56259ba7..b8f82ea078ebd 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index ab04f163b40df..bb6ff9ee4a617 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index b3d04d8b790ae..c84308de8a868 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 5680da729406a..066a71a3ae5cc 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 6e12225151607..5f2f2e6c06ab9 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 0c622fb705406..26eda92de104d 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 149efa170d300..d4bc0aa7aeb60 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 70d41bb5964de..d960522fa72fd 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 037d30c889f87..da88dd664e8ff 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 58fbeeee2d187..eecec8d83ceec 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 959e2a057f24c..c82f905d9cae0 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 7613d4be794d4..987e08f19e998 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 0323e7ebc62b4..56a9cf9e42403 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index cf70a70947460..6c1db92f4085f 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index d04209a9f3568..a16b44419d80c 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index c2e009a4b77fb..3fb309c33bca7 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 31eb94cd3909e..9b7f9cae664f2 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 0ea939bbde996..425b657af6cfc 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index bd5a2b4bf7477..8215af139a97c 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index ece34b24df02d..d56d17b99edbb 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index dcec40e3a89da..ba5d06f60e55a 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index ef9900034a6d5..0ce562174ec43 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 0393965e2ebb2..a3b3283db157c 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 3605f1aba2368..65c3223d3705c 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.devdocs.json b/api_docs/kbn_search_api_panels.devdocs.json index 8c1ce9f259ef6..e493e1db46fd8 100644 --- a/api_docs/kbn_search_api_panels.devdocs.json +++ b/api_docs/kbn_search_api_panels.devdocs.json @@ -926,6 +926,34 @@ "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-api-panels", + "id": "def-common.LanguageDefinitionSnippetArguments.ingestPipeline", + "type": "string", + "tags": [], + "label": "ingestPipeline", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-api-panels/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-api-panels", + "id": "def-common.LanguageDefinitionSnippetArguments.extraIngestDocumentValues", + "type": "Object", + "tags": [], + "label": "extraIngestDocumentValues", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "packages/kbn-search-api-panels/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 23d87424f2b07..f928c35ff17e3 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 65 | 0 | 65 | 0 | +| 67 | 0 | 67 | 0 | ## Common diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index a7f3a7c301a2f..b61b3acebc30b 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index feff9a8532c37..52f9bf0331d66 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 43b8698ec5add..21a9a0d4229eb 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 0edc300b7fbb8..8535e3c2ceb45 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 303b370aed662..0989d2c61bc6c 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 0e8e3606673c7..618fce3049404 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 39fd4b1f96d01..b59feab2155c5 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index e1881be0c8187..9b6e5f38500a4 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 1c4796084d273..de06ac2178b85 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 057fd8ddd0154..8dc2abd94a379 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index bcab35e3734e8..b0b4e63b53415 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 6188b4f538622..98e145e6c291a 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index ee9589bd9fdab..be1b7c054f509 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 55ab104bac818..f8c8e1d9bce9e 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 16df8b1d3143c..9fd2114f82497 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 9d02dbe8bf408..4674d7f39cc79 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 47fd8f9a4d494..812a2357c9c1c 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 5c0ca05384879..f23fad4563b05 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 806945c74d6ef..2684bdf0d61e2 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 67c024298e1af..4aa83b1b2a28a 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index ae9982c0af157..fb5c6248a7aa4 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index f9802c7fe0576..272b283e3809f 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 6dc1d8f5b2b13..6cfe959f3b6a8 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 1b4eefb68fc5f..fc08e81a4f1d4 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index e106cb033c5c2..e75c15121e929 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index f9ad4f267548f..a15223e4a5b18 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 8f8629d869e68..45f677c9b03a8 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 82f04c8c1f8f3..d7e66c2dfcafb 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index e4ec0a2a0470d..2a7a12643f66c 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index 332ee7b559786..6d03355f6bb90 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index b342b28412dd3..5000f6af0f8f1 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index ea0dee0f20096..78930ef11a46c 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index bed943cf01244..2fb5ef4f4d1ab 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 298b26586d47f..c401fc4ae57cc 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index f8e4d0340abe9..2f49e7214e438 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index a9cfd49bd9006..932e071d8c4e3 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 571aa579476e0..1e6a87987a4f2 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index d320a6fe79159..195ca50f84803 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 7a01e2db59806..56aae935b33b6 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 05b8167d72a32..be3191df40254 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 7fe50b1e6efa5..cbafafdf15054 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 341baae0eddc6..ca5b614f31f5e 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index b5bdafbe3406e..e93ae95420c38 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index bd9f0e5e054b5..e700985ce82b4 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index bdb21965fe310..f04034c8db728 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index f8166ef3df380..221bc0e89d69b 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 034c8d773754d..9304bde1efab8 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 47ecb7343d741..76c8f65bf9a38 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index c5369259e7b4d..c51b4524362ff 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index b9d0e9b498902..ead37eb00cd9d 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 2bd6c3050ac8f..5138e162e33f4 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 35e91bb002744..7239a015c29f4 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index c1cf40e7bc764..fa8bd59e552a6 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 86fa9e7c1891f..ff4e2959c6d3e 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 3c8e084113bee..4f737aa135efc 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 28f32b9dc5257..96f74da39a60e 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 997a796e86d22..88245cb24a015 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index f470445bd947b..39f5d7cd276e7 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 33873f09e4810..96fc64390daf1 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 274db8e8bfa85..beb8813a7170f 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 9a775023878d6..6df2460db09a5 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index aed9adc9f36ba..7d9bdd1d9570d 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 07c8ac15e2ccb..0f5fb94765341 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 129749e6731df..6912120abed7c 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index d36240ef6c53e..68926ed3daf26 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index cf78e32a622ed..7e9cb4fc44597 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index d3a1875b6ce61..e3919b804ff70 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.devdocs.json b/api_docs/kbn_slo_schema.devdocs.json index 02eec6e3a39cb..0666cd886ffa9 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -628,6 +628,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.DeleteSLOInstancesInput", + "type": "Type", + "tags": [], + "label": "DeleteSLOInstancesInput", + "description": [], + "signature": [ + "{ list: { sloId: string; instanceId: string; }[]; }" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.DeleteSLOInstancesParams", + "type": "Type", + "tags": [], + "label": "DeleteSLOInstancesParams", + "description": [], + "signature": [ + "{ list: { sloId: string; instanceId: string; }[]; }" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.FetchHistoricalSummaryParams", @@ -2079,6 +2109,32 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.deleteSLOInstancesParamsSchema", + "type": "Object", + "tags": [], + "label": "deleteSLOInstancesParamsSchema", + "description": [], + "signature": [ + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }>" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.deleteSLOParamsSchema", diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 0839df57edc00..a3231fcbe7b8c 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 132 | 0 | 129 | 0 | +| 135 | 0 | 132 | 0 | ## Common diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 407b4ab1645d0..625a1baf66680 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 8a7b3d8d10eba..67f61e7309c88 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 8af618fd3428f..9488d28e11bbe 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index dbffcc85a47b8..837b297215919 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 6b1ecb4fc1a93..163e9fad938f4 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index f25b8eca3b096..9d077f5729f64 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 5077de40d935f..f7448b3c6e089 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 43372f3125e20..e5765ce453870 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.devdocs.json b/api_docs/kbn_text_based_editor.devdocs.json index e0ba49c3e1b0e..252a6537ae639 100644 --- a/api_docs/kbn_text_based_editor.devdocs.json +++ b/api_docs/kbn_text_based_editor.devdocs.json @@ -3,6 +3,136 @@ "client": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL", + "type": "Function", + "tags": [], + "label": "fetchFieldsFromESQL", + "description": [], + "signature": [ + "(query: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + ", expressions: ", + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + }, + ", time: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined) => Promise<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + " | undefined>" + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$1", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + } + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$2", + "type": "Object", + "tags": [], + "label": "expressions", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + } + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$3", + "type": "Object", + "tags": [], + "label": "time", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/text-based-editor", "id": "def-public.TextBasedLanguagesEditor", @@ -272,6 +402,20 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 9e04bda94e0e3..64e7ed9a883be 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 17 | 0 | 16 | 0 | +| 22 | 0 | 21 | 0 | ## Client diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 871c6c2b8e718..2e4e64028de10 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index be3c8e29d5516..e8f536396cd3c 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 46f8c19cf89ec..b32fffce5ce5f 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index d8b53fc2d669f..6af725a802219 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index a08cefa0974a5..175f75d1c9c72 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 68e956c6a9fd7..cf4823a41b994 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 91091dbb7a330..30d39fbab123b 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 40c628ad3325c..86f54f4a13e60 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index f22127f77ae44..861b929e842e1 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 1e294e99efaba..931a77d995dd5 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index b8c701132cb88..5fa41d11ace3c 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index ed3eb341e30b8..bd6a2a9fea7ae 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index fabeb02cc299a..2266479569fb7 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 9e9cb5759dee2..85666acc83ea4 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 7b5a3ae2edbf2..d6cf87ff8567d 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 0dc5954a37433..5cc15cfbba8a8 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index aa2fb5154468f..8958468bc9f2d 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 9fa0c25531795..148fbff039e18 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 3133e29cbacf4..242e917a38c35 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -3726,14 +3726,6 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx" }, - { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx" - }, - { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/application.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 72e61b9db565c..6bfcbb46328e6 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 91d17d9fcde72..5163dcb316e50 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index eeb74883b2962..bb869216c84f1 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 7640d66033c05..b11450706ba43 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 51aee902356a6..0b7294a36838d 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 6d5783871cdc4..c84037bdb1fdc 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 8514ee21fcd37..e210d8a6bfe13 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 7d88a913416d4..3271d5e1f245c 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 88da234919d93..befcc70437a54 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 6a569ad488335..ffa98ecee1830 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 506e3bdaa1684..b98088ff6fca4 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 415d96478e799..7ccc3846ad0d1 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index a76d920efbd05..0f06b54ce9df8 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 87679e97ee10f..9550b03ca8ef3 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 2f9c10a8d601f..9f00d4a1b3112 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 1f3f4c9e84b3c..ff84af9508421 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 58358d769e1c8..f1420e4cfa2f3 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 5c0fda7795ffc..ea0effc9fea3a 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 4b84d2688576b..859779de519dc 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 844c63784a8e7..cdec51c565667 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 24d66a3f94a94..009e122a6a378 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -155,9 +155,7 @@ "label": "AlertSummary", "description": [], "signature": [ - "({ alertSummaryFields }: ", - "AlertSummaryProps", - ") => JSX.Element" + "({ alertSummaryFields }: AlertSummaryProps) => JSX.Element" ], "path": "x-pack/plugins/observability/public/pages/alert_details/components/alert_summary.tsx", "deprecated": false, @@ -418,9 +416,7 @@ "label": "DatePicker", "description": [], "signature": [ - "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: ", - "DatePickerProps", - ") => JSX.Element" + "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: DatePickerProps) => JSX.Element" ], "path": "x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx", "deprecated": false, @@ -9231,6 +9227,34 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, + "; \"POST /api/observability/slos/_delete_instances 2023-10-31\": { endpoint: \"POST /api/observability/slos/_delete_instances 2023-10-31\"; params?: ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }> | undefined; handler: ({}: ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteHandlerResources", + "text": "ObservabilityRouteHandlerResources" + }, + " & { params: { body: { list: { sloId: string; instanceId: string; }[]; }; }; }) => Promise; } & ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteCreateOptions", + "text": "ObservabilityRouteCreateOptions" + }, "; \"DELETE /api/observability/slos/{id} 2023-10-31\": { endpoint: \"DELETE /api/observability/slos/{id} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", @@ -10937,6 +10961,34 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, + "; \"POST /api/observability/slos/_delete_instances 2023-10-31\": { endpoint: \"POST /api/observability/slos/_delete_instances 2023-10-31\"; params?: ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }> | undefined; handler: ({}: ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteHandlerResources", + "text": "ObservabilityRouteHandlerResources" + }, + " & { params: { body: { list: { sloId: string; instanceId: string; }[]; }; }; }) => Promise; } & ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteCreateOptions", + "text": "ObservabilityRouteCreateOptions" + }, "; \"DELETE /api/observability/slos/{id} 2023-10-31\": { endpoint: \"DELETE /api/observability/slos/{id} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 4f5365797c3b2..d10fd512c30be 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 542 | 2 | 533 | 16 | +| 542 | 2 | 533 | 14 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 31e4264930aee..e3520b084ccac 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 939e6d954a9b7..ccc3104347e34 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 040d247a44432..e544473677fd3 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index b9a92bd0e15a9..58b1aeeb72c30 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 8c9256f9f511c..f8a0a349a4ea1 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,13 +21,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 72503 | 223 | 61894 | 1513 | +| 72529 | 223 | 61920 | 1511 | ## Plugin Directory | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 267 | 0 | 261 | 30 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 269 | 0 | 263 | 30 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 17 | 1 | 15 | 2 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 61 | 1 | 3 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 790 | 1 | 759 | 49 | @@ -135,7 +135,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 542 | 2 | 533 | 16 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 542 | 2 | 533 | 14 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 42 | 0 | 39 | 7 | | observabilityLogExplorer | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin exposes and registers observability log consumption features. | 0 | 0 | 0 | 0 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 14 | 0 | 14 | 0 | @@ -170,7 +170,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 119 | 0 | 60 | 10 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 22 | 1 | 22 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 253 | 0 | 65 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 14 | 0 | 14 | 3 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 24 | 0 | 24 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 4 | 0 | 4 | 1 | | synthetics | [@elastic/uptime](https://github.com/orgs/elastic/teams/uptime) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 96 | 0 | 53 | 6 | @@ -178,12 +178,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 26 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 19 | 0 | 19 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 20 | 0 | 20 | 0 | | | [@elastic/protections-experience](https://github.com/orgs/elastic/teams/protections-experience) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 5 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 257 | 1 | 213 | 22 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 573 | 1 | 547 | 51 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 576 | 1 | 550 | 51 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 145 | 0 | 103 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 206 | 0 | 140 | 9 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 13 | 0 | 10 | 3 | @@ -526,7 +526,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 107 | 0 | 104 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 65 | 0 | 65 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 67 | 0 | 67 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 16 | 0 | 8 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 50 | 0 | 47 | 0 | @@ -594,7 +594,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 3 | 0 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 132 | 0 | 129 | 0 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 135 | 0 | 132 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 102 | 2 | 65 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 | @@ -603,7 +603,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 289 | 4 | 242 | 12 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 137 | 5 | 105 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 17 | 0 | 16 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 22 | 0 | 21 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 72 | 0 | 55 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 86 | 0 | 86 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 17307c56df40b..8baaad3c6c961 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index c733c69c88c29..bfbb359943027 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 7dfef9cbc7f5d..be115e09b2ccf 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 46f7029e4c437..cfbfdbe19c2d7 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 652db20d467be..6ceb583f5e701 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index f05dfff64c6eb..19e06683b4eac 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 04ca4e478bd01..912d13f8bbe28 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index deb21fb5af459..e015e177cbba5 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index a389e8c341df1..92c55394f4209 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 51f2eac47f7ee..142c9ae875e69 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index cc16ca5a190d2..f61d87c732506 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 6e99575f34bea..b517eca82a928 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 32fbb58ee3493..abc9de3307deb 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index f606643f4009d..61bc012db63a9 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index fffd6ea49de6f..dbb975cc061ed 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index ffd1930565da5..b4bd667da42a4 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 3950548c880fb..bde9ff25f6e97 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 56c700c517970..ed2dae2824bab 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 98f2cb7869788..d07f98a7332b0 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index fe15bc4706c25..d715d1010ba65 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 0528a3c42d91c..d78f273a7755b 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index ca487148446ab..93287788f8645 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 2382a958e93a4..684d74bc88e77 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 0c2b0290e9db7..e1b29a4b77478 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 6385220853e90..0117b9138ccee 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 7d25378cd6f0e..c93a024b3b41b 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 54715a2f5bf55..9f61d5283f5e5 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.devdocs.json b/api_docs/stack_alerts.devdocs.json index 65ec1191d667f..cced9a721c32e 100644 --- a/api_docs/stack_alerts.devdocs.json +++ b/api_docs/stack_alerts.devdocs.json @@ -210,9 +210,201 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument", + "type": "Function", + "tags": [], + "label": "rowToDocument", + "description": [], + "signature": [ + "(columns: EsqlResultColumn[], row: EsqlResultRow) => EsqlDocument" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument.$1", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "EsqlResultColumn[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument.$2", + "type": "Array", + "tags": [], + "label": "row", + "description": [], + "signature": [ + "EsqlResultRow" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.toEsQueryHits", + "type": "Function", + "tags": [], + "label": "toEsQueryHits", + "description": [], + "signature": [ + "(results: ", + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + }, + ") => { hits: EsqlHit[]; total: number; }" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.toEsQueryHits.$1", + "type": "Object", + "tags": [], + "label": "results", + "description": [], + "signature": [ + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.transformDatatableToEsqlTable", + "type": "Function", + "tags": [], + "label": "transformDatatableToEsqlTable", + "description": [], + "signature": [ + "(results: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ") => ", + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.transformDatatableToEsqlTable.$1", + "type": "Object", + "tags": [], + "label": "results", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable", + "type": "Interface", + "tags": [], + "label": "EsqlTable", + "description": [], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "EsqlResultColumn[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable.values", + "type": "Array", + "tags": [], + "label": "values", + "description": [], + "signature": [ + "EsqlResultRow[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], - "interfaces": [], "enums": [], "misc": [ { diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 546ab4089308b..598ea05dd18d8 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 14 | 0 | 14 | 3 | +| 24 | 0 | 24 | 3 | ## Client @@ -44,6 +44,9 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o ### Functions +### Interfaces + + ### Consts, variables and types diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index cfe538fc4b18e..cacc8c975df10 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index c110a53377d03..f3a1b5c7e0e57 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 7bfe57d68a2d1..0d92ce6df2bc2 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 40acb98da6933..4e74bf052b9cb 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 0df30daa7aa12..5eff47d932a72 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 7a11b41d310d4..384f4633571aa 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.devdocs.json b/api_docs/text_based_languages.devdocs.json index 85e21f93ca908..c44e1664a3fe1 100644 --- a/api_docs/text_based_languages.devdocs.json +++ b/api_docs/text_based_languages.devdocs.json @@ -279,6 +279,20 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "textBasedLanguages", + "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 0742546f60027..30272f75bfcf6 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 19 | 0 | 19 | 0 | +| 20 | 0 | 20 | 0 | ## Client diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index c7145498c1a5c..1d77c0df3a97c 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index bbc1eb06c8e39..23ceb4fe61e6a 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index e5d3181a1d8d6..bab5d6c094c68 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index 9d84568f429d3..a153daf2744a9 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -803,6 +803,47 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.getTimeOptions", + "type": "Function", + "tags": [], + "label": "getTimeOptions", + "description": [], + "signature": [ + "(unitSize: number) => { text: string; value: ", + { + "pluginId": "triggersActionsUi", + "scope": "public", + "docId": "kibTriggersActionsUiPluginApi", + "section": "def-public.TIME_UNITS", + "text": "TIME_UNITS" + }, + "; }[]" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/get_time_options.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.getTimeOptions.$1", + "type": "number", + "tags": [], + "label": "unitSize", + "description": [], + "signature": [ + "number" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/get_time_options.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "triggersActionsUi", "id": "def-public.getTimeUnitLabel", @@ -5688,6 +5729,26 @@ "path": "x-pack/plugins/triggers_actions_ui/public/application/app.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.TriggersAndActionsUiServices.expressions", + "type": "Object", + "tags": [], + "label": "expressions", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + } + ], + "path": "x-pack/plugins/triggers_actions_ui/public/application/app.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 51693988db001..5f23ec23ba53d 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 573 | 1 | 547 | 51 | +| 576 | 1 | 550 | 51 | ## Client diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index a60e9a0225c50..891ed57dca705 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 8acfb4007dac3..fa0e10091834f 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 603f48d60f203..39bdf05d8be5e 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 7b1d9e1b20dad..8ae211ab4a1fe 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index fd7beddabd867..3eea6ef3a5403 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index a72a03bf4fac3..d66fa6a04e945 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 62c01dfb2cc5f..3987d3bcc9316 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 11d978023890f..5f956a0d5b10e 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 960eb658ca681..aaf47c8abd982 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 15e9fd60eafed..993e491bb3987 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 59c3f306ced16..493ba55128160 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 0010c70cfdbde..7ab3f9c575f7b 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 6173477d3c7a5..377532248eac0 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index fc76ac9c6fc64..e0318e12ac9df 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index ce5bbdddd2e36..a2ad41cc88773 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index c44173caff05c..c6cad2abd1b16 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index d61f09f713d1b..2359fb1e3d51d 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index bde589e42f805..a73a33c6af0ce 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 78696e8ff2b7d..f5e16234f7811 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index a98046d0fe69a..91ba1aeb857f8 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index bc11233812a61..cb7ba41730b13 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-09-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From e315c9c17598b983edba3cf251679598908f8d9b Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 6 Sep 2023 07:16:29 +0200 Subject: [PATCH 67/84] [Defend Workflows] Artifact Rollout Note field (#164838) This PR is a second part of Artifact Rollout Epic (https://github.com/elastic/security-team/issues/3593) and it introduces **Note** field as described in https://github.com/elastic/security-team/issues/7238 ticket. Changes: 1. Added a new SO, `policy-settings-protection-updates-note` which holds non indexable `note` field of type **text** and reference to package policy 2. Added `getPackagePolicyDeleteCallback` that cleans up SO on package policy deletion 3. Exposed an API to interact with the SO (POST, GET) with POST method accepting both creation and update if SO exists. 4. Integrated UI with API with `react-query` hooks. Flow https://github.com/elastic/kibana/assets/29123534/359d59bd-1bde-417a-9449-467d08e81809 Read only access ![Screenshot 2023-08-29 at 13 11 58](https://github.com/elastic/kibana/assets/29123534/36df0b40-6012-45a8-aa7d-c2fa0527e594) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../current_mappings.json | 16 +- .../group2/check_registered_types.test.ts | 1 + .../group3/type_registrations.test.ts | 1 + .../group5/dot_kibana_split.test.ts | 1 + .../src/security/kibana_sub_features.ts | 5 +- .../protection_updates_note_schema.ts | 23 +++ .../common/endpoint/constants.ts | 1 + .../cypress/e2e/endpoint/policy_details.cy.ts | 68 ++++++- .../cypress/tasks/endpoint_policy.ts | 12 ++ .../hooks/use_get_protection_updates_note.ts | 42 ++++ .../hooks/use_post_protection_updates_note.ts | 47 +++++ .../protection_updates_layout.tsx | 86 +++++++- .../endpoint/endpoint_app_context_services.ts | 11 +- .../saved_object_mappings.ts | 28 +++ .../server/endpoint/mocks.ts | 1 + .../protection_updates_note/handlers.test.ts | 191 ++++++++++++++++++ .../protection_updates_note/handlers.ts | 126 ++++++++++++ .../routes/protection_updates_note/index.ts | 63 ++++++ .../fleet_integration.test.ts | 25 ++- .../fleet_integration/fleet_integration.ts | 10 +- .../remove_protection_updates_note.ts | 33 +++ .../security_solution/server/plugin.ts | 3 + .../security_solution/server/saved_objects.ts | 2 + 23 files changed, 780 insertions(+), 16 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/lib/protection_updates_note/saved_object_mappings.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts create mode 100644 x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index c2e1b05850689..4e0e5a1028fa1 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -616,6 +616,10 @@ } } }, + "apm-indices": { + "dynamic": false, + "properties": {} + }, "tag": { "properties": { "name": { @@ -2987,6 +2991,14 @@ } } }, + "policy-settings-protection-updates-note": { + "properties": { + "note": { + "type": "text", + "index": false + } + } + }, "infrastructure-ui-source": { "dynamic": false, "properties": {} @@ -3031,10 +3043,6 @@ } } }, - "apm-indices": { - "dynamic": false, - "properties": {} - }, "apm-telemetry": { "dynamic": false, "properties": {} diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts index 6bea2a8d7f2e2..43890b88dbdb5 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts @@ -125,6 +125,7 @@ describe('checking migration metadata changes on all registered SO types', () => "osquery-pack": "6ab4358ca4304a12dcfc1777c8135b75cffb4397", "osquery-pack-asset": "b14101d3172c4b60eb5404696881ce5275c84152", "osquery-saved-query": "44f1161e165defe3f9b6ad643c68c542a765fcdb", + "policy-settings-protection-updates-note": "33924bb246f9e5bcb876109cc83e3c7a28308352", "query": "21cbbaa09abb679078145ce90087b1e88b7eae95", "risk-engine-configuration": "b105d4a3c6adce40708d729d12e5ef3c8fbd9508", "rules-settings": "892a2918ebaeba809a612b8d97cec0b07c800b5f", diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts index 3235c6cfa057e..61294c22a160e 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts @@ -96,6 +96,7 @@ const previouslyRegisteredTypes = [ 'osquery-saved-query', 'osquery-usage-metric', 'osquery-manager-usage-metric', + 'policy-settings-protection-updates-note', 'query', 'rules-settings', 'sample-data-telemetry', diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts index 32ac61f0d2711..6581541e70244 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts @@ -245,6 +245,7 @@ describe('split .kibana index into multiple system indices', () => { "osquery-pack", "osquery-pack-asset", "osquery-saved-query", + "policy-settings-protection-updates-note", "query", "risk-engine-configuration", "rules-settings", diff --git a/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts b/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts index 86cbf89f26a6f..d9a090f1313f0 100644 --- a/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts +++ b/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import type { SubFeatureConfig } from '@kbn/features-plugin/common'; import { EXCEPTION_LIST_NAMESPACE_AGNOSTIC } from '@kbn/securitysolution-list-constants'; import { AppFeaturesPrivilegeId, AppFeaturesPrivileges } from '../app_features_privileges'; + import { SecuritySubFeatureId } from '../app_features_keys'; import { APP_ID } from '../constants'; import type { SecurityFeatureParams } from './types'; @@ -320,7 +321,7 @@ const policyManagementSubFeature: SubFeatureConfig = { includeIn: 'none', name: 'All', savedObject: { - all: [], + all: ['policy-settings-protection-updates-note'], read: [], }, ui: ['writePolicyManagement', 'readPolicyManagement'], @@ -332,7 +333,7 @@ const policyManagementSubFeature: SubFeatureConfig = { name: 'Read', savedObject: { all: [], - read: [], + read: ['policy-settings-protection-updates-note'], }, ui: ['readPolicyManagement'], }, diff --git a/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts new file mode 100644 index 0000000000000..1207d3d2418fa --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +export const GetProtectionUpdatesNoteSchema = { + params: schema.object({ + package_policy_id: schema.string(), + }), +}; + +export const CreateUpdateProtectionUpdatesNoteSchema = { + body: schema.object({ + note: schema.string(), + }), + params: schema.object({ + package_policy_id: schema.string(), + }), +}; diff --git a/x-pack/plugins/security_solution/common/endpoint/constants.ts b/x-pack/plugins/security_solution/common/endpoint/constants.ts index 19c77f230eea5..6f2d4832e5727 100644 --- a/x-pack/plugins/security_solution/common/endpoint/constants.ts +++ b/x-pack/plugins/security_solution/common/endpoint/constants.ts @@ -63,6 +63,7 @@ export const METADATA_TRANSFORMS_STATUS_ROUTE = `${BASE_ENDPOINT_ROUTE}/metadata export const BASE_POLICY_RESPONSE_ROUTE = `${BASE_ENDPOINT_ROUTE}/policy_response`; export const BASE_POLICY_ROUTE = `${BASE_ENDPOINT_ROUTE}/policy`; export const AGENT_POLICY_SUMMARY_ROUTE = `${BASE_POLICY_ROUTE}/summaries`; +export const PROTECTION_UPDATES_NOTE_ROUTE = `${BASE_ENDPOINT_ROUTE}/protection_updates_note/{package_policy_id}`; /** Suggestions routes */ export const SUGGESTIONS_ROUTE = `${BASE_ENDPOINT_ROUTE}/suggestions/{suggestion_type}`; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts index 6e63264f63e2e..577164ff4d893 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts @@ -9,7 +9,10 @@ import moment from 'moment/moment'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import type { PolicyData } from '../../../../../common/endpoint/types'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; -import { setCustomProtectionUpdatesManifestVersion } from '../../tasks/endpoint_policy'; +import { + setCustomProtectionUpdatesManifestVersion, + setCustomProtectionUpdatesNote, +} from '../../tasks/endpoint_policy'; import { login, ROLE } from '../../tasks/login'; import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; @@ -17,6 +20,8 @@ describe('Policy Details', () => { describe('Protection updates', () => { const loadProtectionUpdatesUrl = (policyId: string) => loadPage(`/app/security/administration/policy/${policyId}/protectionUpdates`); + const testNote = 'test note'; + const updatedTestNote = 'updated test note'; describe('Renders and saves protection updates', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; @@ -59,13 +64,18 @@ describe('Policy Details', () => { cy.getByTestSubj('protection-updates-version-to-deploy-picker').within(() => { cy.get('input').should('have.value', formattedToday); }); + cy.getByTestSubj('protection-updates-manifest-name-note-title'); + cy.getByTestSubj('protection-updates-manifest-note'); cy.getByTestSubj('policyDetailsSaveButton'); }); it('should successfully update the manifest version to custom date', () => { loadProtectionUpdatesUrl(policy.id); cy.getByTestSubj('protection-updates-manifest-switch').click(); + cy.getByTestSubj('protection-updates-manifest-note').type(testNote); + cy.intercept('PUT', `/api/fleet/package_policies/${policy.id}`).as('policy'); + cy.intercept('POST', `/api/endpoint/protection_updates_note/*`).as('note'); cy.getByTestSubj('policyDetailsSaveButton').click(); cy.wait('@policy').then(({ request, response }) => { expect(request.body.inputs[0].config.policy.value.global_manifest_version).to.equal( @@ -73,8 +83,15 @@ describe('Policy Details', () => { ); expect(response?.statusCode).to.equal(200); }); + + cy.wait('@note').then(({ request, response }) => { + expect(request.body.note).to.equal(testNote); + expect(response?.statusCode).to.equal(200); + }); + cy.getByTestSubj('protectionUpdatesSuccessfulMessage'); cy.getByTestSubj('protection-updates-deployed-version').contains(formattedToday); + cy.getByTestSubj('protection-updates-manifest-note').contains(testNote); }); }); @@ -122,6 +139,50 @@ describe('Policy Details', () => { }); }); + describe('Renders and saves protection updates with custom note', () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; + + const twoMonthsAgo = moment().subtract(2, 'months').format('YYYY-MM-DD'); + + beforeEach(() => { + login(); + disableExpandableFlyoutAdvancedSettings(); + }); + + before(() => { + getEndpointIntegrationVersion().then((version) => { + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; + setCustomProtectionUpdatesManifestVersion(policy.id, twoMonthsAgo); + setCustomProtectionUpdatesNote(policy.id, testNote); + }); + }); + }); + + after(() => { + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } + }); + + it('should update note on save', () => { + loadProtectionUpdatesUrl(policy.id); + cy.getByTestSubj('protection-updates-manifest-note').contains(testNote); + cy.getByTestSubj('protection-updates-manifest-note').clear().type(updatedTestNote); + + cy.intercept('POST', `/api/endpoint/protection_updates_note/*`).as('note_updated'); + cy.getByTestSubj('policyDetailsSaveButton').click(); + cy.wait('@note_updated').then(({ request, response }) => { + expect(request.body.note).to.equal(updatedTestNote); + expect(response?.statusCode).to.equal(200); + }); + cy.getByTestSubj('protectionUpdatesSuccessfulMessage'); + cy.getByTestSubj('protection-updates-manifest-note').contains(updatedTestNote); + }); + }); + describe('Renders read only protection updates for user without write permissions', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; @@ -138,6 +199,7 @@ describe('Policy Details', () => { indexedPolicy = data; policy = indexedPolicy.integrationPolicies[0]; setCustomProtectionUpdatesManifestVersion(policy.id, twoMonthsAgo.format('YYYY-MM-DD')); + setCustomProtectionUpdatesNote(policy.id, testNote); }); }); }); @@ -162,6 +224,10 @@ describe('Policy Details', () => { cy.getByTestSubj('protection-updates-manifest-name-version-to-deploy-title'); cy.getByTestSubj('protection-updates-version-to-deploy-view-mode'); cy.getByTestSubj('protection-updates-version-to-deploy-picker').should('not.exist'); + + cy.getByTestSubj('protection-updates-manifest-name-note-title'); + cy.getByTestSubj('protection-updates-manifest-note').should('not.exist'); + cy.getByTestSubj('protection-updates-manifest-note-view-mode').contains(testNote); cy.getByTestSubj('policyDetailsSaveButton').should('be.disabled'); }); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts index f597e9ae4e225..9353cdf9ed822 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts @@ -94,3 +94,15 @@ export const setCustomProtectionUpdatesManifestVersion = ( }); }); }; + +export const setCustomProtectionUpdatesNote = ( + endpointPolicyId: string, + note: string +): Cypress.Chainable> => { + return request<{ note: string }>({ + method: 'POST', + url: `/api/endpoint/protection_updates_note/${endpointPolicyId}`, + body: { note }, + headers: { 'Elastic-Api-Version': '2023-10-31' }, + }); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts new file mode 100644 index 0000000000000..0ac3db09b35a2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from '@tanstack/react-query'; +import { resolvePathVariables } from '../../../../../../common/utils/resolve_path_variables'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../../../../common/endpoint/constants'; +import { useKibana } from '../../../../../../common/lib/kibana'; + +export const getProtectionUpdatesNoteQueryKey = (packagePolicyId: string) => + `protection-updates-note-${packagePolicyId}`; + +interface UseProtectionUpdatesNote { + packagePolicyId: string; +} + +interface NoteResponse { + note: string; +} + +export const useGetProtectionUpdatesNote = ({ packagePolicyId }: UseProtectionUpdatesNote) => { + const { http } = useKibana().services; + + return useQuery<{ data: NoteResponse }, unknown, NoteResponse>( + [getProtectionUpdatesNoteQueryKey(packagePolicyId)], + () => + http.get( + resolvePathVariables(PROTECTION_UPDATES_NOTE_ROUTE, { package_policy_id: packagePolicyId }), + { + version: '2023-10-31', + } + ), + { + keepPreviousData: true, + enabled: !!packagePolicyId, + retry: false, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts new file mode 100644 index 0000000000000..16b6ee66f07ca --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { getProtectionUpdatesNoteQueryKey } from './use_get_protection_updates_note'; +import { useKibana } from '../../../../../../common/lib/kibana'; +import { resolvePathVariables } from '../../../../../../common/utils/resolve_path_variables'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../../../../common/endpoint/constants'; + +interface ProtectionUpdatesNoteParams { + packagePolicyId: string; +} + +interface NoteResponse { + note: string; +} + +export const useCreateProtectionUpdatesNote = ({ + packagePolicyId, +}: ProtectionUpdatesNoteParams) => { + const { http } = useKibana().services; + const queryClient = useQueryClient(); + + return useMutation< + { data: NoteResponse }, + { body: { error: string; message: string } }, + NoteResponse + >( + (payload) => + http.post( + resolvePathVariables(PROTECTION_UPDATES_NOTE_ROUTE, { policy_id: packagePolicyId }), + { + version: '2023-10-31', + body: JSON.stringify(payload), + } + ), + { + onSuccess: () => { + queryClient.invalidateQueries([getProtectionUpdatesNoteQueryKey(packagePolicyId)]); + }, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx index 09439918dfde0..499be2cf31284 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx @@ -13,14 +13,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, + EuiIconTip, EuiPanel, EuiShowFor, EuiSpacer, EuiSwitch, EuiText, + EuiTextArea, EuiTitle, } from '@elastic/eui'; -import React, { useCallback, useContext, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; import { ThemeContext } from 'styled-components'; import { i18n } from '@kbn/i18n'; @@ -28,6 +30,8 @@ import { FormattedMessage } from '@kbn/i18n-react'; import type { Moment } from 'moment'; import moment from 'moment'; import { cloneDeep } from 'lodash'; +import { useCreateProtectionUpdatesNote } from './hooks/use_post_protection_updates_note'; +import { useGetProtectionUpdatesNote } from './hooks/use_get_protection_updates_note'; import { useUserPrivileges } from '../../../../../common/components/user_privileges'; import { useToasts } from '../../../../../common/lib/kibana'; import { useUpdateEndpointPolicy } from '../../../../hooks/policy/use_update_endpoint_policy'; @@ -67,6 +71,20 @@ export const ProtectionUpdatesLayout = React.memo( const today = moment(); const [selectedDate, setSelectedDate] = useState(today); + const { data: fetchedNote, isLoading: getNoteInProgress } = useGetProtectionUpdatesNote({ + packagePolicyId: _policy.id, + }); + const { isLoading: createNoteInProgress, mutate: createNote } = useCreateProtectionUpdatesNote({ + packagePolicyId: _policy.id, + }); + const [note, setNote] = useState(''); + + useEffect(() => { + if (fetchedNote && !getNoteInProgress) { + setNote(fetchedNote.note); + } + }, [fetchedNote, getNoteInProgress]); + const automaticUpdatesEnabled = manifestVersion === 'latest'; const internalDateFormat = 'YYYY-MM-DD'; const displayDateFormat = 'MMMM DD, YYYY'; @@ -119,8 +137,27 @@ export const ProtectionUpdatesLayout = React.memo( text: err.message, }); }); + if ((!fetchedNote && note !== '') || (fetchedNote && note !== fetchedNote.note)) { + createNote( + { note }, + { + onError: (error) => { + toasts.addDanger({ + 'data-test-subj': 'protectionUpdatesNoteUpdateFailureMessage', + title: i18n.translate( + 'xpack.securitySolution.endpoint.protectionUpdates.noteUpdateErrorTitle', + { + defaultMessage: 'Note update failed!', + } + ), + text: error.body.message, + }); + }, + } + ); + } }, - [dispatch, policy, sendPolicyUpdate, toasts] + [policy, sendPolicyUpdate, fetchedNote, note, toasts, dispatch, createNote] ); const toggleAutomaticUpdates = useCallback( @@ -260,16 +297,57 @@ export const ProtectionUpdatesLayout = React.memo( )} - + {deployedVersion === 'latest' ? 'latest' : formattedDate} + {renderVersionToDeployPicker()} + + +
+ {i18n.translate('xpack.securitySolution.endpoint.protectionUpdates.note.label', { + defaultMessage: 'Note', + })} +
+
+ + + + } + /> +
+ + {canWritePolicyManagement ? ( + setNote(e.target.value)} + fullWidth={true} + rows={3} + placeholder={i18n.translate( + 'xpack.securitySolution.endpoint.protectionUpdates.note.placeholder', + { + defaultMessage: 'Add relevant information about update here', + } + )} + data-test-subj={'protection-updates-manifest-note'} + /> + ) : ( + {note} + )} + ( {canWritePolicyManagement ? ( fleetActionsClientMock), esClient: elasticsearchClientMock.createElasticsearchClient(), appFeaturesService, + savedObjectsClient: savedObjectsClientMock.create(), }; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts new file mode 100644 index 0000000000000..029d652953861 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts @@ -0,0 +1,191 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EndpointAppContextService } from '../../endpoint_app_context_services'; +import type { KibanaResponseFactory, SavedObjectsClientContract } from '@kbn/core/server'; + +import { + createMockEndpointAppContextServiceSetupContract, + createMockEndpointAppContextServiceStartContract, + createRouteHandlerContext, +} from '../../mocks'; +import type { ScopedClusterClientMock } from '@kbn/core/server/mocks'; +import { + elasticsearchServiceMock, + httpServerMock, + savedObjectsClientMock, +} from '@kbn/core/server/mocks'; +import { getProtectionUpdatesNoteHandler, postProtectionUpdatesNoteHandler } from './handlers'; +import { requestContextMock } from '../../../lib/detection_engine/routes/__mocks__'; + +const mockedSOSuccessfulFindResponse = { + total: 1, + saved_objects: [ + { + id: 'id', + type: 'type', + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + attributes: { note: 'note' }, + score: 1, + }, + ], + page: 1, + per_page: 10, +}; + +const mockedSOSuccessfulFindResponseEmpty = { + total: 0, + saved_objects: [], + page: 1, + per_page: 10, +}; + +const createMockedSOSuccessfulCreateResponse = (note: string) => ({ + id: 'id', + type: 'type', + references: [], + attributes: { note }, +}); + +const mockedSOSuccessfulUpdateResponse = [ + 'policy-settings-protection-updates-note', + 'id', + { note: 'note2' }, + { + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + refresh: 'wait_for', + }, +]; + +describe('test protection updates note handler', () => { + let endpointAppContextService: EndpointAppContextService; + let mockSavedObjectClient: jest.Mocked; + let mockResponse: jest.Mocked; + let mockScopedClient: ScopedClusterClientMock; + + describe('test protection updates note handler', () => { + beforeEach(() => { + mockScopedClient = elasticsearchServiceMock.createScopedClusterClient(); + mockSavedObjectClient = savedObjectsClientMock.create(); + mockResponse = httpServerMock.createResponseFactory(); + endpointAppContextService = new EndpointAppContextService(); + endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); + endpointAppContextService.start(createMockEndpointAppContextServiceStartContract()); + }); + + afterEach(() => endpointAppContextService.stop()); + + it('should create a new note if one does not exist', async () => { + const protectionUpdatesNoteHandler = postProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + body: { note: 'note' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponseEmpty); + + mockSavedObjectClient.create.mockResolvedValueOnce( + createMockedSOSuccessfulCreateResponse('note') + ); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + expect(mockSavedObjectClient.create).toBeCalledWith( + 'policy-settings-protection-updates-note', + { note: 'note' }, + { + references: [{ id: undefined, name: 'package_policy', type: 'ingest-package-policies' }], + refresh: 'wait_for', + } + ); + }); + + it('should update an existing note on post if one exists', async () => { + const protectionUpdatesNoteHandler = postProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + body: { note: 'note2' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponse); + + mockSavedObjectClient.update.mockResolvedValueOnce( + createMockedSOSuccessfulCreateResponse('note2') + ); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + expect(mockSavedObjectClient.update).toBeCalledWith(...mockedSOSuccessfulUpdateResponse); + }); + + it('should return the note if one exists', async () => { + const protectionUpdatesNoteHandler = getProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponse); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + const result = mockResponse.ok.mock.calls[0][0]?.body as { note: string }; + expect(result.note).toEqual('note'); + }); + + it('should return notFound if no note exists', async () => { + const protectionUpdatesNoteHandler = getProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponseEmpty); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.notFound).toBeCalled(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts new file mode 100644 index 0000000000000..e1677451ff577 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + RequestHandler, + SavedObjectReference, + SavedObjectsClientContract, +} from '@kbn/core/server'; +import type { TypeOf } from '@kbn/config-schema'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import { protectionUpdatesNoteSavedObjectType } from '../../lib/protection_updates_note/saved_object_mappings'; +import type { + CreateUpdateProtectionUpdatesNoteSchema, + GetProtectionUpdatesNoteSchema, +} from '../../../../common/api/endpoint/protection_updates_note/protection_updates_note_schema'; + +const getProtectionNote = async (SOClient: SavedObjectsClientContract, packagePolicyId: string) => { + return SOClient.find<{ note: string }>({ + type: protectionUpdatesNoteSavedObjectType, + hasReference: { type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, id: packagePolicyId }, + }); +}; + +const updateProtectionNote = async ( + SOClient: SavedObjectsClientContract, + noteId: string, + note: string, + references: SavedObjectReference[] +) => { + return SOClient.update( + protectionUpdatesNoteSavedObjectType, + noteId, + { + note, + }, + { + references, + refresh: 'wait_for', + } + ); +}; + +const createProtectionNote = async ( + SOClient: SavedObjectsClientContract, + note: string, + references: SavedObjectReference[] +) => { + return SOClient.create( + protectionUpdatesNoteSavedObjectType, + { + note, + }, + { + references, + refresh: 'wait_for', + } + ); +}; + +export const postProtectionUpdatesNoteHandler = function (): RequestHandler< + TypeOf, + undefined, + TypeOf +> { + return async (context, request, response) => { + const SOClient = (await context.core).savedObjects.client; + const { package_policy_id: packagePolicyId } = request.params; + const { note } = request.body; + + const soClientResponse = await getProtectionNote(SOClient, packagePolicyId); + + if (soClientResponse.saved_objects[0]) { + const { references } = soClientResponse.saved_objects[0]; + + const updatedNoteSO = await updateProtectionNote( + SOClient, + soClientResponse.saved_objects[0].id, + note, + references + ); + + const { attributes } = updatedNoteSO; + + return response.ok({ body: attributes }); + } + + const references: SavedObjectReference[] = [ + { + id: packagePolicyId, + name: 'package_policy', + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + }, + ]; + + const noteSO = await createProtectionNote(SOClient, note, references); + + const { attributes } = noteSO; + + return response.ok({ body: attributes }); + }; +}; + +export const getProtectionUpdatesNoteHandler = function (): RequestHandler< + TypeOf, + undefined, + undefined +> { + return async (context, request, response) => { + const SOClient = (await context.core).savedObjects.client; + const { package_policy_id: packagePolicyId } = request.params; + + const soClientResponse = await getProtectionNote(SOClient, packagePolicyId); + + if (!soClientResponse.saved_objects[0] || !soClientResponse.saved_objects[0].attributes) { + return response.notFound({ body: { message: 'No note found for this policy' } }); + } + + const { attributes } = soClientResponse.saved_objects[0]; + + return response.ok({ body: attributes }); + }; +}; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts new file mode 100644 index 0000000000000..4d398bbe14e6e --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { IRouter } from '@kbn/core/server'; +import { getProtectionUpdatesNoteHandler, postProtectionUpdatesNoteHandler } from './handlers'; +import { + GetProtectionUpdatesNoteSchema, + CreateUpdateProtectionUpdatesNoteSchema, +} from '../../../../common/api/endpoint/protection_updates_note/protection_updates_note_schema'; +import { withEndpointAuthz } from '../with_endpoint_authz'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../common/endpoint/constants'; +import type { EndpointAppContext } from '../../types'; + +export function registerProtectionUpdatesNoteRoutes( + router: IRouter, + endpointAppContext: EndpointAppContext +) { + const logger = endpointAppContext.logFactory.get('protectionUpdatesNote'); + + router.versioned + .post({ + access: 'public', + path: PROTECTION_UPDATES_NOTE_ROUTE, + options: { authRequired: true, tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: CreateUpdateProtectionUpdatesNoteSchema, + }, + }, + withEndpointAuthz( + { all: ['canWritePolicyManagement'] }, + logger, + postProtectionUpdatesNoteHandler() + ) + ); + + router.versioned + .get({ + access: 'public', + path: PROTECTION_UPDATES_NOTE_ROUTE, + options: { authRequired: true, tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: GetProtectionUpdatesNoteSchema, + }, + }, + withEndpointAuthz( + { all: ['canReadPolicyManagement'] }, + logger, + getProtectionUpdatesNoteHandler() + ) + ); +} diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts index e2ce386337a85..43292c8436fdc 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts @@ -615,7 +615,7 @@ describe('ingest_integration tests ', () => { const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; const invokeDeleteCallback = async (): Promise => { - const callback = getPackagePolicyDeleteCallback(exceptionListClient); + const callback = getPackagePolicyDeleteCallback(exceptionListClient, soClient); await callback(deletePackagePolicyMock(), soClient, esClient); }; @@ -640,6 +640,27 @@ describe('ingest_integration tests ', () => { }); it('removes policy from artifact', async () => { + soClient.find.mockResolvedValueOnce({ + total: 1, + saved_objects: [ + { + id: 'id', + type: 'type', + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + attributes: { note: 'note' }, + score: 1, + }, + ], + page: 1, + per_page: 10, + }); + await invokeDeleteCallback(); expect(exceptionListClient.findExceptionListsItem).toHaveBeenCalledWith({ @@ -660,6 +681,8 @@ describe('ingest_integration tests ', () => { osTypes: fakeArtifact.os_types, tags: [], }); + + expect(soClient.delete).toBeCalledWith('policy-settings-protection-updates-note', 'id'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts index 554417eee480d..c2775f3f4794a 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { Logger, ElasticsearchClient } from '@kbn/core/server'; +import type { Logger, ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; import type { ExceptionListClient } from '@kbn/lists-plugin/server'; import type { PluginStartContract as AlertsStartContract } from '@kbn/alerting-plugin/server'; import type { @@ -44,6 +44,7 @@ import type { AnyPolicyCreateConfig } from './types'; import { ENDPOINT_INTEGRATION_CONFIG_KEY } from './constants'; import { createEventFilters } from './handlers/create_event_filters'; import type { AppFeaturesService } from '../lib/app_features_service/app_features_service'; +import { removeProtectionUpdatesNote } from './handlers/remove_protection_updates_note'; const isEndpointPackagePolicy = ( packagePolicy: T @@ -280,7 +281,8 @@ export const getPackagePolicyPostCreateCallback = ( }; export const getPackagePolicyDeleteCallback = ( - exceptionsClient: ExceptionListClient | undefined + exceptionsClient: ExceptionListClient | undefined, + savedObjectsClient: SavedObjectsClientContract | undefined ): PostPackagePolicyPostDeleteCallback => { return async (deletePackagePolicy): Promise => { if (!exceptionsClient) { @@ -290,8 +292,12 @@ export const getPackagePolicyDeleteCallback = ( for (const policy of deletePackagePolicy) { if (isEndpointPackagePolicy(policy)) { policiesToRemove.push(removePolicyFromArtifacts(exceptionsClient, policy)); + if (savedObjectsClient) { + policiesToRemove.push(removeProtectionUpdatesNote(savedObjectsClient, policy)); + } } } + await Promise.all(policiesToRemove); }; }; diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts new file mode 100644 index 0000000000000..9106eba06e780 --- /dev/null +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PostPackagePolicyPostDeleteCallback } from '@kbn/fleet-plugin/server'; +import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import pMap from 'p-map'; +import { protectionUpdatesNoteSavedObjectType } from '../../endpoint/lib/protection_updates_note/saved_object_mappings'; + +export const removeProtectionUpdatesNote = async ( + soClient: SavedObjectsClientContract, + policy: Parameters[0][0] +) => { + if (policy.id) { + const foundProtectionUpdatesNotes = await soClient.find({ + type: protectionUpdatesNoteSavedObjectType, + hasReference: { + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + id: policy.id, + }, + }); + await pMap( + foundProtectionUpdatesNotes.saved_objects, + (protectionUpdatesNote: { id: string }) => { + soClient.delete(protectionUpdatesNoteSavedObjectType, protectionUpdatesNote.id); + } + ); + } +}; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 65d66e4fde644..8d3bef07d19e1 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -98,6 +98,7 @@ import { import { AppFeaturesService } from './lib/app_features_service/app_features_service'; import { registerRiskScoringTask } from './lib/risk_engine/tasks/risk_scoring_task'; +import { registerProtectionUpdatesNoteRoutes } from './endpoint/routes/protection_updates_note'; export type { SetupPlugins, StartPlugins, PluginSetup, PluginStart } from './plugin_contract'; @@ -317,6 +318,7 @@ export class Plugin implements ISecuritySolutionPlugin { ); registerLimitedConcurrencyRoutes(core); registerPolicyRoutes(router, this.endpointContext); + registerProtectionUpdatesNoteRoutes(router, this.endpointContext); registerActionRoutes( router, this.endpointContext, @@ -533,6 +535,7 @@ export class Plugin implements ISecuritySolutionPlugin { createFleetActionsClient, esClient: core.elasticsearch.client.asInternalUser, appFeaturesService, + savedObjectsClient, }); this.telemetryReceiver.start( diff --git a/x-pack/plugins/security_solution/server/saved_objects.ts b/x-pack/plugins/security_solution/server/saved_objects.ts index 096b46528e76f..3f91bcf149ac6 100644 --- a/x-pack/plugins/security_solution/server/saved_objects.ts +++ b/x-pack/plugins/security_solution/server/saved_objects.ts @@ -7,6 +7,7 @@ import type { CoreSetup } from '@kbn/core/server'; +import { protectionUpdatesNoteType } from './endpoint/lib/protection_updates_note/saved_object_mappings'; import { noteType, pinnedEventType, timelineType } from './lib/timeline/saved_object_mappings'; // eslint-disable-next-line no-restricted-imports import { legacyType as legacyRuleActionsType } from './lib/detection_engine/rule_actions_legacy'; @@ -24,6 +25,7 @@ const types = [ manifestType, signalsMigrationType, riskEngineConfigurationType, + protectionUpdatesNoteType, ]; export const savedObjectTypes = types.map((type) => type.name); From 4fc0369713f8abbe8686e182daee8d36a79e7844 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 6 Sep 2023 09:03:48 +0300 Subject: [PATCH 68/84] [ES|QL] Adds initial telemetry events (#165693) ## Summary Adds initial counters for ES|QL 1. When the Try ES|QL option in dataview picker is clicked 2. When a Lens chart with text based languages is rendered --- .../public/dataview_picker/change_dataview.tsx | 8 ++++++-- .../datasources/text_based/text_based_languages.tsx | 8 +++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx index 7d04fd5fa3621..4c4a81371e052 100644 --- a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx +++ b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx @@ -27,6 +27,7 @@ import { EuiButtonEmpty, EuiToolTip, } from '@elastic/eui'; +import { METRIC_TYPE } from '@kbn/analytics'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { AggregateQuery, getLanguageDisplayName } from '@kbn/es-query'; import type { DataView } from '@kbn/data-views-plugin/public'; @@ -92,7 +93,9 @@ export function ChangeDataView({ const [selectedDataViewId, setSelectedDataViewId] = useState(currentDataViewId); const kibana = useKibana(); - const { application, data, storage, dataViews, dataViewEditor } = kibana.services; + const { application, data, storage, dataViews, dataViewEditor, appName, usageCollection } = + kibana.services; + const reportUiCounter = usageCollection?.reportUiCounter.bind(usageCollection, appName); const styles = changeDataViewStyles({ fullWidth: trigger.fullWidth }); const [isTextLangTransitionModalDismissed, setIsTextLangTransitionModalDismissed] = useState(() => Boolean(storage.get(TEXT_LANG_TRANSITION_MODAL_KEY)) @@ -366,8 +369,9 @@ export function ChangeDataView({ (q: AggregateQuery) => { onTextLangQuerySubmit?.(q); setPopoverIsOpen(false); + reportUiCounter?.(METRIC_TYPE.CLICK, `esql:unified_search_clicked`); }, - [onTextLangQuerySubmit] + [onTextLangQuerySubmit, reportUiCounter] ); const cleanup = useCallback( diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx index e2dc541e77e2d..a76e2edd623b0 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { CoreStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; -import type { AggregateQuery } from '@kbn/es-query'; +import { AggregateQuery, isOfAggregateQueryType, getAggregateQueryMode } from '@kbn/es-query'; import type { SavedObjectReference } from '@kbn/core/public'; import { EuiFormRow } from '@elastic/eui'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; @@ -371,6 +371,12 @@ export function getTextBasedDatasource({ }, getRenderEventCounters(state: TextBasedPrivateState): string[] { + const context = state?.initialContext; + if (context && 'query' in context && context.query && isOfAggregateQueryType(context.query)) { + const language = getAggregateQueryMode(context.query); + // it will eventually log render_lens_esql_chart + return [`${language}_chart`]; + } return []; }, From 0f3209cc50fc624e7d1d35e3b8e13725aaf5fc85 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 6 Sep 2023 09:21:46 +0200 Subject: [PATCH 69/84] [AggConfigs] Consider root level filters buckets correctly when building other terms bucket (#165656) ## Summary Fixes #165487 This PR fixes the `Other` bucket problem when the filter is used at root level with a nested `terms` agg. This is visible when using the `Split metric by` in Lens in a table visualization. Used the `sum` to easily compare the results: Screenshot 2023-09-05 at 11 12 46 Now introducing a basic `*` Filter as `split metric by`: Screenshot 2023-09-05 at 11 12 52 And with a more complex filter (1098 + 564 = 1662): Screenshot 2023-09-05 at 11 12 36 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Stratoula Kalafateli --- .../_terms_other_bucket_helper.test.ts | 113 ++++++++++++++++++ .../buckets/_terms_other_bucket_helper.ts | 6 +- 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts index 981ff3664fbec..b68893847ed64 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts @@ -545,6 +545,119 @@ describe('Terms Agg Other bucket helper', () => { expect(agg).toEqual(false); }); + + test('returns true when nested filter agg has buckets', () => { + const aggConfigs = getAggConfigs([ + { + id: '0', + type: BUCKET_TYPES.FILTERS, + params: [ + { + input: { + language: 'kuery', + query: '', + }, + label: '', + }, + ], + }, + ...nestedTerm.aggs, + ]); + + const nestedTermResponseWithRootFilter = wrapResponse({ + '0': { + buckets: { + '*': { + '1': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { + '2': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { key: 'ios', doc_count: 2850 }, + { key: 'win xp', doc_count: 2830 }, + { key: '__missing__', doc_count: 1430 }, + ], + }, + key: 'US-with-dash', + doc_count: 2850, + }, + { + '2': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { key: 'ios', doc_count: 1850 }, + { key: 'win xp', doc_count: 1830 }, + { key: '__missing__', doc_count: 130 }, + ], + }, + key: 'IN-with-dash', + doc_count: 2830, + }, + ], + }, + doc_count: 1148, + }, + }, + }, + }); + + const otherAggConfig = buildOtherBucketAgg( + aggConfigs, + aggConfigs.aggs[2] as IBucketAggConfig, + enrichResponseWithSampling(nestedTermResponseWithRootFilter) + ); + + expect(otherAggConfig).toBeDefined(); + if (otherAggConfig) { + const expectedResponse = { + 'other-filter': { + aggs: undefined, + filters: { + filters: { + [`${SEP}*${SEP}IN-with-dash`]: { + bool: { + must: [], + filter: [ + { bool: { filter: [], must: [], must_not: [], should: [] } }, + { match_phrase: { 'geo.src': 'IN-with-dash' } }, + { exists: { field: 'machine.os.raw' } }, + ], + should: [], + must_not: [ + { match_phrase: { 'machine.os.raw': 'ios' } }, + { match_phrase: { 'machine.os.raw': 'win xp' } }, + ], + }, + }, + [`${SEP}*${SEP}US-with-dash`]: { + bool: { + must: [], + filter: [ + { bool: { filter: [], must: [], must_not: [], should: [] } }, + { match_phrase: { 'geo.src': 'US-with-dash' } }, + { exists: { field: 'machine.os.raw' } }, + ], + should: [], + must_not: [ + { match_phrase: { 'machine.os.raw': 'ios' } }, + { match_phrase: { 'machine.os.raw': 'win xp' } }, + ], + }, + }, + }, + }, + }, + }; + const resp = otherAggConfig(); + const topAgg = !isSamplingEnabled(probability) ? resp : resp.sampling!.aggs; + expect(topAgg).toEqual(expectedResponse); + } + }); }); describe(`mergeOtherBucketAggResponse${getTitlePostfix()}`, () => { diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts index 9737883733266..924564744962f 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts @@ -206,7 +206,11 @@ export const buildOtherBucketAgg = ( ) => { // make sure there are actually results for the buckets const agg = aggregations[aggId]; - if (!agg || !agg.buckets.length) { + if ( + !agg || + // buckets can be either an array or an object in case there's also a filter at the same level + (Array.isArray(agg.buckets) ? !agg.buckets.length : !Object.values(agg.buckets).length) + ) { noAggBucketResults = true; return; } From 1b0c095ad3d6bf814a928898346cfd6483777794 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 6 Sep 2023 10:44:30 +0300 Subject: [PATCH 70/84] ES|QL wrap with pipes (#165598) ## Summary Atm the wrap button is not very useful on the extended mode of the ES|QL editor. We would like to give the user the ability to wrap/unwrap based on the pipes. ![esql](https://github.com/elastic/kibana/assets/17003240/6db92dea-69b1-4344-b67e-a44759e8b2e6) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../kbn-text-based-editor/src/helpers.test.ts | 25 ++++++++++++++++- packages/kbn-text-based-editor/src/helpers.ts | 8 ++++++ .../src/text_based_languages_editor.tsx | 27 +++++++++++++++---- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/packages/kbn-text-based-editor/src/helpers.test.ts b/packages/kbn-text-based-editor/src/helpers.test.ts index 74c2387fde2fa..5f1546ccc138e 100644 --- a/packages/kbn-text-based-editor/src/helpers.test.ts +++ b/packages/kbn-text-based-editor/src/helpers.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { parseErrors, parseWarning, getInlineEditorText } from './helpers'; +import { parseErrors, parseWarning, getInlineEditorText, getWrappedInPipesCode } from './helpers'; describe('helpers', function () { describe('parseErrors', function () { @@ -136,4 +136,27 @@ describe('helpers', function () { ); }); }); + + describe('getWrappedInPipesCode', function () { + it('should return the code wrapped', function () { + const code = getWrappedInPipesCode('FROM index1 | keep field1, field2 | order field1', false); + expect(code).toEqual('FROM index1\n| keep field1, field2\n| order field1'); + }); + + it('should return the code unwrapped', function () { + const code = getWrappedInPipesCode( + 'FROM index1 \n| keep field1, field2 \n| order field1', + true + ); + expect(code).toEqual('FROM index1 | keep field1, field2 | order field1'); + }); + + it('should return the code unwrapped and trimmed', function () { + const code = getWrappedInPipesCode( + 'FROM index1 \n| keep field1, field2 \n| order field1', + true + ); + expect(code).toEqual('FROM index1 | keep field1, field2 | order field1'); + }); + }); }); diff --git a/packages/kbn-text-based-editor/src/helpers.ts b/packages/kbn-text-based-editor/src/helpers.ts index ca5e3d2fca663..fd7c9c2f9406d 100644 --- a/packages/kbn-text-based-editor/src/helpers.ts +++ b/packages/kbn-text-based-editor/src/helpers.ts @@ -158,3 +158,11 @@ export const getDocumentationSections = async (language: string) => { export const getInlineEditorText = (queryString: string, isMultiLine: boolean) => { return isMultiLine ? queryString.replace(/\r?\n|\r/g, ' ').replace(/ +/g, ' ') : queryString; }; + +export const getWrappedInPipesCode = (code: string, isWrapped: boolean): string => { + const pipes = code?.split('|'); + const codeNoLines = pipes?.map((pipe) => { + return pipe.replaceAll('\n', '').trim(); + }); + return codeNoLines.join(isWrapped ? ' | ' : '\n| '); +}; diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index 3aada71f81ab0..d8b8530f7cd37 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -55,6 +55,7 @@ import { getInlineEditorText, getDocumentationSections, MonacoError, + getWrappedInPipesCode, } from './helpers'; import { EditorFooter } from './editor_footer'; import { ResizableButton } from './resizable_button'; @@ -138,7 +139,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [showLineNumbers, setShowLineNumbers] = useState(isCodeEditorExpanded); const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); - const [isWordWrapped, setIsWordWrapped] = useState(true); + const [isWordWrapped, setIsWordWrapped] = useState(false); const [editorErrors, setEditorErrors] = useState([]); const [editorWarning, setEditorWarning] = useState([]); @@ -359,6 +360,16 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [calculateVisibleCode, code, isCompactFocused, queryString]); + useEffect(() => { + if (isCodeEditorExpanded && !isWordWrapped) { + const pipes = code?.split('|'); + const pipesWithNewLine = code?.split('\n|'); + if (pipes?.length === pipesWithNewLine?.length) { + setIsWordWrapped(true); + } + } + }, [code, isCodeEditorExpanded, isWordWrapped]); + const onResize = ({ width }: { width: number }) => { calculateVisibleCode(width); if (editor1.current) { @@ -369,6 +380,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const onQueryUpdate = useCallback( (value: string) => { setCode(value); + setIsWordWrapped(false); onTextLangQueryChange({ [language]: value } as AggregateQuery); }, [language, onTextLangQueryChange] @@ -509,13 +521,13 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ ? i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel', { - defaultMessage: 'Disable word wrap', + defaultMessage: 'Disable wrap with pipes', } ) : i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel', { - defaultMessage: 'Enable word wrap', + defaultMessage: 'Wrap with pipes', } ) } @@ -529,13 +541,13 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ ? i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel', { - defaultMessage: 'Disable word wrap', + defaultMessage: 'Disable wrap with pipes', } ) : i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel', { - defaultMessage: 'Enable word wrap', + defaultMessage: 'Wrap with pipes', } ) } @@ -545,6 +557,11 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ wordWrap: isWordWrapped ? 'off' : 'on', }); setIsWordWrapped(!isWordWrapped); + const updatedCode = getWrappedInPipesCode(code, isWordWrapped); + if (code !== updatedCode) { + setCode(updatedCode); + onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); + } }} /> From 55936a83a1ea953c25e16595342461b41986cb71 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 10:46:13 +0200 Subject: [PATCH 71/84] [Log Explorer] Fix broken data grid on columns update (#165679) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes #165558 The issue was caused by a particular condition caused by the overridden `data` service that the plugin injects in the Discover App. Reverse engineering from the blank screen when updating the columns: 1. The `DiscoverHistogramLayout` is rendered conditionally only [when a `searchSessionId` exists](https://github.com/elastic/kibana/blob/main/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.tsx#L47). 2. The `searchSessionId` is initialized with a default value and exists until [the `data.search.session.clear()` function is invoked](https://github.com/elastic/kibana/blob/main/src/plugins/discover/public/application/main/discover_main_app.tsx#L82). 3. Being this effect cleanup callback is invoked when `data.search.session` changes in its reference, the issue is caused by the [injected service](https://github.com/elastic/kibana/blob/main/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx#L52-L62). 4. The root cause is that each time a property is read from the proxied `data` service, new nested Proxies are created, triggering the useEffect cleanup function since the new Proxy has a new reference. The implemented solution adds an enhanced version of `createPropertyGetProxy` that keeps the created proxy as a singleton, storing the original value in a cache by a passed key. --------- Co-authored-by: Marco Antonio Ghiani --- .../components/log_explorer/log_explorer.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx index 10bd9039751f1..fa76cadeb727b 100644 --- a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx +++ b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx @@ -6,7 +6,7 @@ */ import { ScopedHistory } from '@kbn/core-application-browser'; -import { DataPublicPluginStart, ISearchStart, ISessionService } from '@kbn/data-plugin/public'; +import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DiscoverStart } from '@kbn/discover-plugin/public'; import React from 'react'; import { @@ -50,13 +50,17 @@ export const createLogExplorer = ({ * are no-ops. */ const createDataServiceProxy = (data: DataPublicPluginStart) => { + const noOpEnableStorage = () => {}; + + const sessionServiceProxy = createPropertyGetProxy(data.search.session, { + enableStorage: () => noOpEnableStorage, + }); + + const searchServiceProxy = createPropertyGetProxy(data.search, { + session: () => sessionServiceProxy, + }); + return createPropertyGetProxy(data, { - search: (searchService: ISearchStart) => - createPropertyGetProxy(searchService, { - session: (sessionService: ISessionService) => - createPropertyGetProxy(sessionService, { - enableStorage: () => () => {}, - }), - }), + search: () => searchServiceProxy, }); }; From 1c7ac5d5de0f7f14c0e23bc87bd89119b5a126df Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 12:30:29 +0200 Subject: [PATCH 72/84] [Log Explorer] Add Discover fallback link (#165464) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes #165220 This PR introduces a new fallback link from the Log Explorer application to Discover. To correctly retrieve the details required to correctly navigate to Discover with the used data view and filters, the LogExplorer component accepts now a new `state$` behaviour subject as a property that can be used to notify the consumers of any change from the internal state. https://github.com/elastic/kibana/assets/34506779/c8176ef2-7a3b-4c7e-860a-450ba677412a ## 🧪 Test suite ``` ↳ Observability Log Explorer ↳ Header menu ↳ should inject the app header menu on the top navbar ↳ Discover fallback link ↳ should render a button link ↳ should navigate to discover keeping the current columns/filters/query/time/data view ``` --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/discover/public/index.ts | 1 + .../plugins/log_explorer/common/constants.ts | 1 + .../common/datasets/models/dataset.ts | 2 + .../components/log_explorer/log_explorer.tsx | 21 +++- .../customizations/log_explorer_profile.tsx | 44 +++++++- x-pack/plugins/log_explorer/public/index.ts | 1 + .../common/constants.ts | 8 ++ .../common/translations.ts | 7 ++ .../observability_log_explorer/kibana.jsonc | 3 +- .../observability_log_explorer.tsx | 68 +++++++----- .../components/log_explorer_top_nav_menu.tsx | 105 ++++++++++++++++++ .../public/plugin.ts | 3 +- .../public/routes/main/main_route.tsx | 25 +++-- .../public/types.ts | 2 + .../public/utils/breadcrumbs.tsx | 10 +- .../observability_log_explorer/tsconfig.json | 2 + .../observability_log_explorer/header_menu.ts | 76 +++++++++++++ .../apps/observability_log_explorer/index.ts | 1 + .../observability_log_explorer.ts | 29 +++++ .../observability_log_explorer/header_menu.ts | 76 +++++++++++++ .../observability_log_explorer/index.ts | 1 + 21 files changed, 432 insertions(+), 54 deletions(-) create mode 100644 x-pack/plugins/observability_log_explorer/common/constants.ts create mode 100644 x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx create mode 100644 x-pack/test/functional/apps/observability_log_explorer/header_menu.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts diff --git a/src/plugins/discover/public/index.ts b/src/plugins/discover/public/index.ts index 5af7c2bf1142a..ca3c58a4d2899 100644 --- a/src/plugins/discover/public/index.ts +++ b/src/plugins/discover/public/index.ts @@ -15,6 +15,7 @@ export function plugin(initializerContext: PluginInitializerContext) { } export type { ISearchEmbeddable, SearchInput } from './embeddable'; +export type { DiscoverAppState } from './application/main/services/discover_app_state_container'; export type { DiscoverStateContainer } from './application/main/services/discover_state'; export type { DiscoverContainerProps } from './components/discover_container'; export type { diff --git a/x-pack/plugins/log_explorer/common/constants.ts b/x-pack/plugins/log_explorer/common/constants.ts index 37f56942f332a..fc1c572ebae26 100644 --- a/x-pack/plugins/log_explorer/common/constants.ts +++ b/x-pack/plugins/log_explorer/common/constants.ts @@ -8,4 +8,5 @@ export const LOG_EXPLORER_PROFILE_ID = 'log-explorer'; // Fields constants +export const TIMESTAMP_FIELD = '@timestamp'; export const MESSAGE_FIELD = 'message'; diff --git a/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts b/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts index 68119fb6015b1..974a9fd4ca37f 100644 --- a/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts +++ b/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts @@ -8,6 +8,7 @@ import { IconType } from '@elastic/eui'; import { DataViewSpec } from '@kbn/data-views-plugin/common'; import { IndexPattern } from '@kbn/io-ts-utils'; +import { TIMESTAMP_FIELD } from '../../constants'; import { DatasetId, DatasetType, IntegrationType } from '../types'; type IntegrationBase = Pick; @@ -53,6 +54,7 @@ export class Dataset { return { id: this.id, name: this.getFullTitle(), + timeFieldName: TIMESTAMP_FIELD, title: this.name as string, }; } diff --git a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx index fa76cadeb727b..6a945afa19ab2 100644 --- a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx +++ b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx @@ -5,22 +5,30 @@ * 2.0. */ +import React, { useMemo } from 'react'; import { ScopedHistory } from '@kbn/core-application-browser'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import { DiscoverStart } from '@kbn/discover-plugin/public'; -import React from 'react'; +import { DiscoverAppState, DiscoverStart } from '@kbn/discover-plugin/public'; +import type { BehaviorSubject } from 'rxjs'; import { createLogExplorerProfileCustomizations, CreateLogExplorerProfileCustomizationsDeps, } from '../../customizations/log_explorer_profile'; import { createPropertyGetProxy } from '../../utils/proxies'; +import { LogExplorerProfileContext } from '../../state_machines/log_explorer_profile'; export interface CreateLogExplorerArgs extends CreateLogExplorerProfileCustomizationsDeps { discover: DiscoverStart; } +export interface LogExplorerStateContainer { + appState?: DiscoverAppState; + logExplorerState?: Partial; +} + export interface LogExplorerProps { scopedHistory: ScopedHistory; + state$?: BehaviorSubject; } export const createLogExplorer = ({ @@ -28,13 +36,16 @@ export const createLogExplorer = ({ data, discover: { DiscoverContainer }, }: CreateLogExplorerArgs) => { - const logExplorerCustomizations = [createLogExplorerProfileCustomizations({ core, data })]; - const overrideServices = { data: createDataServiceProxy(data), }; - return ({ scopedHistory }: LogExplorerProps) => { + return ({ scopedHistory, state$ }: LogExplorerProps) => { + const logExplorerCustomizations = useMemo( + () => [createLogExplorerProfileCustomizations({ core, data, state$ })], + [state$] + ); + return ( import('./custom_dataset_selector')); const LazyCustomDatasetFilters = dynamic(() => import('./custom_dataset_filters')); @@ -17,10 +20,11 @@ const LazyCustomDatasetFilters = dynamic(() => import('./custom_dataset_filters' export interface CreateLogExplorerProfileCustomizationsDeps { core: CoreStart; data: DataPublicPluginStart; + state$?: BehaviorSubject; } export const createLogExplorerProfileCustomizations = - ({ core, data }: CreateLogExplorerProfileCustomizationsDeps): CustomizationCallback => + ({ core, data, state$ }: CreateLogExplorerProfileCustomizationsDeps): CustomizationCallback => async ({ customizations, stateContainer }) => { // Lazy load dependencies const datasetServiceModuleLoadable = import('../services/datasets'); @@ -38,13 +42,26 @@ export const createLogExplorerProfileCustomizations = toasts: core.notifications.toasts, }); - // /** * Wait for the machine to be fully initialized to set the restored selection * create the DataView and set it in the stateContainer from Discover */ await waitForState(logExplorerProfileStateService, 'initialized'); + /** + * Subscribe the state$ BehaviorSubject when the consumer app wants to react to state changes. + * It emits a combined state of: + * - log explorer state machine context + * - appState from the discover stateContainer + */ + let stateSubscription: Subscription; + if (state$) { + stateSubscription = createStateUpdater({ + logExplorerProfileStateService, + stateContainer, + }).subscribe(state$); + } + /** * Replace the DataViewPicker with a custom `DatasetSelector` to pick integrations streams * Prepend the search bar with custom filter control groups depending on the selected dataset @@ -76,4 +93,25 @@ export const createLogExplorerProfileCustomizations = saveItem: { disabled: true }, }, }); + + return () => { + if (stateSubscription) { + stateSubscription.unsubscribe(); + } + }; }; + +const createStateUpdater = ({ + logExplorerProfileStateService, + stateContainer, +}: { + logExplorerProfileStateService: LogExplorerProfileStateService; + stateContainer: DiscoverStateContainer; +}) => { + return combineLatest([from(logExplorerProfileStateService), stateContainer.appState.state$]).pipe( + map(([logExplorerState, appState]) => ({ + logExplorerState: logExplorerState.context, + appState, + })) + ); +}; diff --git a/x-pack/plugins/log_explorer/public/index.ts b/x-pack/plugins/log_explorer/public/index.ts index c145f6fd88864..00750926517e6 100644 --- a/x-pack/plugins/log_explorer/public/index.ts +++ b/x-pack/plugins/log_explorer/public/index.ts @@ -9,6 +9,7 @@ import type { PluginInitializerContext } from '@kbn/core/public'; import type { LogExplorerConfig } from '../common/plugin_config'; import { LogExplorerPlugin } from './plugin'; export type { LogExplorerPluginSetup, LogExplorerPluginStart } from './types'; +export type { LogExplorerStateContainer } from './components/log_explorer'; export function plugin(context: PluginInitializerContext) { return new LogExplorerPlugin(context); diff --git a/x-pack/plugins/observability_log_explorer/common/constants.ts b/x-pack/plugins/observability_log_explorer/common/constants.ts new file mode 100644 index 0000000000000..90cd311f05940 --- /dev/null +++ b/x-pack/plugins/observability_log_explorer/common/constants.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const OBSERVABILITY_LOG_EXPLORER_APP_ID = 'observability-log-explorer'; diff --git a/x-pack/plugins/observability_log_explorer/common/translations.ts b/x-pack/plugins/observability_log_explorer/common/translations.ts index 5ec1940fa8dff..2abf660538260 100644 --- a/x-pack/plugins/observability_log_explorer/common/translations.ts +++ b/x-pack/plugins/observability_log_explorer/common/translations.ts @@ -21,3 +21,10 @@ export const betaBadgeDescription = i18n.translate( defaultMessage: 'This application is in beta and therefore subject to change.', } ); + +export const discoverLinkTitle = i18n.translate( + 'xpack.observabilityLogExplorer.discoverLinkTitle', + { + defaultMessage: 'Discover', + } +); diff --git a/x-pack/plugins/observability_log_explorer/kibana.jsonc b/x-pack/plugins/observability_log_explorer/kibana.jsonc index 35121b578c39c..529f879a56386 100644 --- a/x-pack/plugins/observability_log_explorer/kibana.jsonc +++ b/x-pack/plugins/observability_log_explorer/kibana.jsonc @@ -13,12 +13,13 @@ ], "requiredPlugins": [ "data", + "discover", "logExplorer", "observabilityShared" ], "optionalPlugins": [ "serverless" ], - "requiredBundles": [] + "requiredBundles": ["kibanaReact"] } } diff --git a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx index 7d6863e4eb45a..999ebdd3095bf 100644 --- a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx +++ b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx @@ -5,28 +5,29 @@ * 2.0. */ -import { AppMountParameters, CoreStart, ScopedHistory } from '@kbn/core/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; import React from 'react'; import ReactDOM from 'react-dom'; import { ObservablityLogExplorerMainRoute } from '../routes/main'; import { ObservabilityLogExplorerPluginStart, ObservabilityLogExplorerStartDeps } from '../types'; +import { useKibanaContextForPluginProvider } from '../utils/use_kibana'; export const renderObservabilityLogExplorer = ( core: CoreStart, pluginsStart: ObservabilityLogExplorerStartDeps, ownPluginStart: ObservabilityLogExplorerPluginStart, - { element, history }: AppMountParameters + appParams: AppMountParameters ) => { ReactDOM.render( , - element + appParams.element ); return () => { @@ -34,40 +35,51 @@ export const renderObservabilityLogExplorer = ( // observable in the search session service pluginsStart.data.search.session.clear(); - ReactDOM.unmountComponentAtNode(element); + ReactDOM.unmountComponentAtNode(appParams.element); }; }; export interface ObservabilityLogExplorerAppProps { + appParams: AppMountParameters; core: CoreStart; plugins: ObservabilityLogExplorerStartDeps; pluginStart: ObservabilityLogExplorerPluginStart; - history: ScopedHistory; } export const ObservabilityLogExplorerApp = ({ + appParams, core, - plugins: { logExplorer, observabilityShared, serverless }, + plugins, pluginStart, - history, -}: ObservabilityLogExplorerAppProps) => ( - - - - ( - { + const { logExplorer, observabilityShared, serverless } = plugins; + const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider( + core, + plugins, + pluginStart + ); + + return ( + + + + + ( + + )} /> - )} - /> - - - -); + + + + + ); +}; diff --git a/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx new file mode 100644 index 0000000000000..0e8ec200da871 --- /dev/null +++ b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import deepEqual from 'fast-deep-equal'; +import useObservable from 'react-use/lib/useObservable'; +import { type BehaviorSubject, distinctUntilChanged } from 'rxjs'; +import { HeaderMenuPortal } from '@kbn/observability-shared-plugin/public'; +import { AppMountParameters } from '@kbn/core-application-browser'; +import { + EuiBetaBadge, + EuiHeaderLink, + EuiHeaderLinks, + EuiHeaderSection, + EuiHeaderSectionItem, + useEuiTheme, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { LogExplorerStateContainer } from '@kbn/log-explorer-plugin/public'; +import { useKibanaContextForPlugin } from '../utils/use_kibana'; +import { betaBadgeDescription, betaBadgeTitle, discoverLinkTitle } from '../../common/translations'; + +interface LogExplorerTopNavMenuProps { + setHeaderActionMenu: AppMountParameters['setHeaderActionMenu']; + state$: BehaviorSubject; + theme$: AppMountParameters['theme$']; +} + +export const LogExplorerTopNavMenu = ({ + setHeaderActionMenu, + state$, + theme$, +}: LogExplorerTopNavMenuProps) => { + const { euiTheme } = useEuiTheme(); + + return ( + + + + + + + + + + + ); +}; + +const DiscoverLink = React.memo( + ({ state$ }: { state$: BehaviorSubject }) => { + const { + services: { discover }, + } = useKibanaContextForPlugin(); + + const { appState, logExplorerState } = useObservable( + state$.pipe( + distinctUntilChanged((prev, curr) => { + if (!prev.appState || !curr.appState) return false; + return deepEqual( + [ + prev.appState.columns, + prev.appState.filters, + prev.appState.index, + prev.appState.query, + ], + [curr.appState.columns, curr.appState.filters, curr.appState.index, curr.appState.query] + ); + }) + ), + { appState: {}, logExplorerState: {} } + ); + + const discoverLinkParams = { + columns: appState?.columns, + filters: appState?.filters, + query: appState?.query, + dataViewSpec: logExplorerState?.datasetSelection?.selection.dataset.toDataviewSpec(), + }; + + return ( + discover.locator?.navigate(discoverLinkParams)} + color="primary" + iconType="discoverApp" + data-test-subj="logExplorerDiscoverFallbackLink" + > + {discoverLinkTitle} + + ); + } +); diff --git a/x-pack/plugins/observability_log_explorer/public/plugin.ts b/x-pack/plugins/observability_log_explorer/public/plugin.ts index 6afb62235ba15..8ca79e4ec7be4 100644 --- a/x-pack/plugins/observability_log_explorer/public/plugin.ts +++ b/x-pack/plugins/observability_log_explorer/public/plugin.ts @@ -14,6 +14,7 @@ import { PluginInitializerContext, } from '@kbn/core/public'; import { type ObservabilityLogExplorerConfig } from '../common/plugin_config'; +import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '../common/constants'; import { logExplorerAppTitle } from '../common/translations'; import { renderObservabilityLogExplorer } from './applications/observability_log_explorer'; import type { @@ -37,7 +38,7 @@ export class ObservabilityLogExplorerPlugin _pluginsSetup: ObservabilityLogExplorerSetupDeps ) { core.application.register({ - id: 'observability-log-explorer', + id: OBSERVABILITY_LOG_EXPLORER_APP_ID, title: logExplorerAppTitle, category: DEFAULT_APP_CATEGORIES.observability, euiIconType: 'logoLogging', diff --git a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx index 5e9b22fb1ad5d..7b224da830433 100644 --- a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx +++ b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx @@ -5,34 +5,45 @@ * 2.0. */ -import { CoreStart, ScopedHistory } from '@kbn/core/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; -import React from 'react'; +import React, { useState } from 'react'; +import { BehaviorSubject } from 'rxjs'; +import { LogExplorerTopNavMenu } from '../../components/log_explorer_top_nav_menu'; import { ObservabilityLogExplorerPageTemplate } from '../../components/page_template'; import { noBreadcrumbs, useBreadcrumbs } from '../../utils/breadcrumbs'; export interface ObservablityLogExplorerMainRouteProps { + appParams: AppMountParameters; core: CoreStart; - history: ScopedHistory; logExplorer: LogExplorerPluginStart; observabilityShared: ObservabilitySharedPluginStart; serverless?: ServerlessPluginStart; } export const ObservablityLogExplorerMainRoute = ({ + appParams: { history, setHeaderActionMenu, theme$ }, core, - history, logExplorer, observabilityShared, serverless, }: ObservablityLogExplorerMainRouteProps) => { useBreadcrumbs(noBreadcrumbs, core.chrome, serverless); + const [state$] = useState(() => new BehaviorSubject({})); + return ( - - - + <> + + + + + ); }; diff --git a/x-pack/plugins/observability_log_explorer/public/types.ts b/x-pack/plugins/observability_log_explorer/public/types.ts index f5e6526c502d9..e52ece9ca1624 100644 --- a/x-pack/plugins/observability_log_explorer/public/types.ts +++ b/x-pack/plugins/observability_log_explorer/public/types.ts @@ -6,6 +6,7 @@ */ import { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import { DiscoverStart } from '@kbn/discover-plugin/public'; import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; @@ -22,6 +23,7 @@ export interface ObservabilityLogExplorerSetupDeps { export interface ObservabilityLogExplorerStartDeps { data: DataPublicPluginStart; + discover: DiscoverStart; logExplorer: LogExplorerPluginStart; observabilityShared: ObservabilitySharedPluginStart; serverless?: ServerlessPluginStart; diff --git a/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx b/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx index a8b575d5341dc..c1eaca45b7855 100644 --- a/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx +++ b/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx @@ -9,11 +9,7 @@ import { EuiBreadcrumb } from '@elastic/eui'; import type { ChromeStart } from '@kbn/core-chrome-browser'; import type { ServerlessPluginStart } from '@kbn/serverless/public'; import { useEffect } from 'react'; -import { - betaBadgeDescription, - betaBadgeTitle, - logExplorerAppTitle, -} from '../../common/translations'; +import { logExplorerAppTitle } from '../../common/translations'; export const useBreadcrumbs = ( breadcrumbs: EuiBreadcrumb[], @@ -40,10 +36,6 @@ export function setBreadcrumbs( ...breadcrumbs, ]); } - chromeService.setBadge({ - text: betaBadgeTitle, - tooltip: betaBadgeDescription, - }); } export const noBreadcrumbs: EuiBreadcrumb[] = []; diff --git a/x-pack/plugins/observability_log_explorer/tsconfig.json b/x-pack/plugins/observability_log_explorer/tsconfig.json index 5f94d15d30fea..ae9660b421359 100644 --- a/x-pack/plugins/observability_log_explorer/tsconfig.json +++ b/x-pack/plugins/observability_log_explorer/tsconfig.json @@ -22,6 +22,8 @@ "@kbn/serverless", "@kbn/core-chrome-browser", "@kbn/config-schema", + "@kbn/core-application-browser", + "@kbn/discover-plugin", ], "exclude": [ "target/**/*" diff --git a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts new file mode 100644 index 0000000000000..0831bec27b7ed --- /dev/null +++ b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + + describe('Header menu', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.load( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + await PageObjects.observabilityLogExplorer.navigateTo(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + }); + + it('should inject the app header menu on the top navbar', async () => { + const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + expect(await headerMenu.isDisplayed()).to.be(true); + }); + + describe('Discover fallback link', () => { + it('should render a button link ', async () => { + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + expect(await discoverLink.isDisplayed()).to.be(true); + }); + + it('should navigate to discover keeping the current columns/filters/query/time/data view', async () => { + // Set timerange to specific values to match data and retrieve config + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + const timeConfig = await PageObjects.timePicker.getTimeConfig(); + + // Set query bar value + await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + discoverLink.click(); + + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await retry.try(async () => { + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.eql( + 'All log datasets' + ); + }); + + await retry.try(async () => { + expect(await PageObjects.discover.getColumnHeaders()).to.eql(['@timestamp', 'message']); + }); + + await retry.try(async () => { + expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); + }); + + await retry.try(async () => { + expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + }); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/observability_log_explorer/index.ts b/x-pack/test/functional/apps/observability_log_explorer/index.ts index 90a52663e34ce..aec38a6bb8308 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/index.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./dataset_selection_state')); loadTestFile(require.resolve('./dataset_selector')); loadTestFile(require.resolve('./filter_controls')); + loadTestFile(require.resolve('./header_menu')); }); } diff --git a/x-pack/test/functional/page_objects/observability_log_explorer.ts b/x-pack/test/functional/page_objects/observability_log_explorer.ts index 33e85e06a16a9..7e4b83083ace0 100644 --- a/x-pack/test/functional/page_objects/observability_log_explorer.ts +++ b/x-pack/test/functional/page_objects/observability_log_explorer.ts @@ -314,5 +314,34 @@ export function ObservabilityLogExplorerPageObject({ expect(await promptTitle.getVisibleText()).to.be('No data streams found'); }, + + getHeaderMenu() { + return testSubjects.find('logExplorerHeaderMenu'); + }, + + getDiscoverFallbackLink() { + return testSubjects.find('logExplorerDiscoverFallbackLink'); + }, + + // Query Bar + getQueryBar() { + return testSubjects.find('queryInput'); + }, + + async getQueryBarValue() { + const queryBar = await testSubjects.find('queryInput'); + return queryBar.getAttribute('value'); + }, + + async typeInQueryBar(query: string) { + const queryBar = await this.getQueryBar(); + await queryBar.clearValueWithKeyboard(); + return queryBar.type(query); + }, + + async submitQuery(query: string) { + await this.typeInQueryBar(query); + await testSubjects.click('querySubmitButton'); + }, }; } diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts new file mode 100644 index 0000000000000..038e28a442c24 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + + describe('Header menu', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.load( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + await PageObjects.observabilityLogExplorer.navigateTo(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + }); + + it('should inject the app header menu on the top navbar', async () => { + const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + expect(await headerMenu.isDisplayed()).to.be(true); + }); + + describe('Discover fallback link', () => { + it('should render a button link ', async () => { + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + expect(await discoverLink.isDisplayed()).to.be(true); + }); + + it('should navigate to discover keeping the current columns/filters/query/time/data view', async () => { + // Set timerange to specific values to match data and retrieve config + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + const timeConfig = await PageObjects.timePicker.getTimeConfig(); + + // Set query bar value + await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + discoverLink.click(); + + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await retry.try(async () => { + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.eql( + 'All log datasets' + ); + }); + + await retry.try(async () => { + expect(await PageObjects.discover.getColumnHeaders()).to.eql(['@timestamp', 'message']); + }); + + await retry.try(async () => { + expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); + }); + + await retry.try(async () => { + expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts index b0555b4447d27..77f89dad01f77 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./dataset_selection_state')); loadTestFile(require.resolve('./dataset_selector')); loadTestFile(require.resolve('./filter_controls')); + loadTestFile(require.resolve('./header_menu')); }); } From 9d5bb89b7cd3738482b9ea3247cd88077375ed3b Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Wed, 6 Sep 2023 12:52:28 +0200 Subject: [PATCH 73/84] [Logs onboarding] Adding Elastic-Api-Version to cy command (#165814) --- .../observability_onboarding/e2e/cypress/support/commands.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts index ea321f48a0bae..ddceaf3325bfa 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts @@ -119,6 +119,7 @@ Cypress.Commands.add('deleteIntegration', (integrationName: string) => { }, headers: { 'kbn-xsrf': 'e2e_test', + 'Elastic-Api-Version': '1', }, auth: { user: 'editor', pass: 'changeme' }, }); From 015b910de2e9048c63eb2c7cbaa83dcdbcddd4c4 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 6 Sep 2023 13:22:43 +0200 Subject: [PATCH 74/84] [Ops] Run kibana quality gate suites (#165346) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Sets up quality gate triggering in Kibana. The tests are mostly triggering external pipelines and relying on their results. Here's an example run: https://buildkite.com/elastic/kibana-tests/builds/28#job-018a69a6-c860-405e-ab2b-bce2aed07df3 According to [this doc](https://docs.google.com/document/d/15rx2Z-soL20An0nBUcXX0o_HHf1OU_IgrHXgz20NndI/edit) many of the quality gates are really required for the QA->Staging promotion step. Most of the tests are in the QA stage: - [fleet smoke tests](https://buildkite.com/elastic/fleet-smoke-tests) - ~~[QAF RAC load tests](https://buildkite.com/elastic/appex-qa-rac-alert-load)~~ Removed, see https://github.com/elastic/kibana/pull/165346#discussion_r1316822164 - [QAF serverless tests](https://buildkite.com/elastic/appex-qa-kibana-serverless-ftr-tests) - [control plane QA smoke tests](https://buildkite.com/elastic/ess-k8s-qa-e2e-tests-daily) - [security solution tests](.buildkite/scripts/pipelines/security_solution_quality_gate/pipeline.sh) + manual check for confirming manual tests - Manual confirmation 👍 Staging has: - [control plane staging smoke tests](https://buildkite.com/elastic/ess-k8s-staging-e2e-tests) - Manual confirmation 👍 Production has: - [control plane production smoke tests](https://buildkite.com/elastic/ess-k8s-production-e2e-tests) - Manual confirmation 👍 ### Quirks - ~~`SKIP_KIBANA_HOOKS=1` needs to be set from the triggering job~~ Split into https://github.com/elastic/kibana/pull/165597 - The pipeline can only be tested from the non-fork, `elastic/kibana` repo's branches (because buildkite doesn't see forks' branches) - Soft fails added, to not block the release pipeline in case we still need to adjust/work on some unstable tests Reference: https://docs.google.com/document/d/15rx2Z-soL20An0nBUcXX0o_HHf1OU_IgrHXgz20NndI/edit Depends on: #165009 Closes: https://github.com/elastic/kibana-operations/issues/10 --------- Co-authored-by: Tiago Costa Co-authored-by: Thomas Watson --- .../quality-gates/pipeline.kibana-tests.yaml | 2 +- .../pipeline.tests-production.yaml | 19 ++----- .../quality-gates/pipeline.tests-qa.yaml | 49 ++++++++++++------- .../quality-gates/pipeline.tests-staging.yaml | 17 ++----- 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml index 0acdb66f8d5f2..467df501bc9ca 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml @@ -18,7 +18,7 @@ steps: - label: ":pipeline::grey_question::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" env: QG_PIPELINE_LOCATION: ".buildkite/pipelines/quality-gates" - command: "make -C /agent run-environment-tests" + command: "make -C /agent run-environment-tests" # will trigger https://buildkite.com/elastic/kibana-tests agents: image: "docker.elastic.co/ci-agent-images/quality-gate-seedling:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index 1c30a7f734df4..32878e2fc09cd 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -3,27 +3,18 @@ # A failure in this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Observability specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-production-e2e-tests" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-production-e2e-tests" # https://buildkite.com/elastic/ess-k8s-production-e2e-tests build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-us-east-1 - NAME_PREFIX: ci_test_${SERVICE}-promotion_ + NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-production.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml index e03e986f65833..e7fbf640cf565 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -3,37 +3,48 @@ # this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::kibana::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Kibana specific tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":pipeline::kibana::seedling: Trigger Kibana Serverless Tests for ${ENVIRONMENT}" + trigger: appex-qa-kibana-serverless-ftr-tests # https://buildkite.com/elastic/appex-qa-kibana-serverless-ftr-tests + soft_fail: true # Remove this before release or when tests stabilize + build: + env: + ENVIRONMENT: ${ENVIRONMENT} + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":pipeline::fleet::seedling: Trigger Fleet Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Fleet specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - group: ":female-detective: Security Solution Tests" + key: "security" + steps: + - label: ":pipeline::female-detective::seedling: Trigger Security Solution quality gate script" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/pipeline.sh - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":judge::seedling: Trigger Manual Tests Phase" + command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" + env: + TEAM_CHANNEL: "#kibana-mission-control" + agents: + image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" - - label: ":pipeline::lock::seedling: Trigger Control Plane Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Control Plane specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":pipeline::ship::seedling: Trigger Fleet serverless smoke tests for ${ENVIRONMENT}" + trigger: fleet-smoke-tests # https://buildkite.com/elastic/fleet-smoke-tests + soft_fail: true # Remove this before release + build: + env: + ENVIRONMENT: ${ENVIRONMENT} + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-qa-e2e-tests-daily" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-qa-e2e-tests-daily" # https://buildkite.com/elastic/ess-k8s-qa-e2e-tests-daily build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-eu-west-1 NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml index 83bfd0d27e34c..a376ff2ff1884 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml @@ -3,27 +3,18 @@ # this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Observability specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-staging-e2e-tests" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-staging-e2e-tests" # https://buildkite.com/elastic/ess-k8s-staging-e2e-tests build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-us-east-1 NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-staging.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" From a00e5e378800d0eda047b59228a48b816541e132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:29:42 +0100 Subject: [PATCH 75/84] [Profiling] fix bug when APM integration is no available (#165809) We've identified a buggy scenario when a user has a cluster prior 8.5 and wants to upgrade to >8.9. In this case, Profiling looks after the `elastic-cloud-apm` integration to see if Profiling had been enabled previously. But for the versions before 8.5 this integration did not exist under this name causing the set up to crash. I fixed the issue by catching the exception and returning that profiling is not enabled on the apm server, as it's not installed. Before: ``` Error: Saved object [ingest-package-policies/elastic-cloud-apm] not found at Function.createGenericNotFoundError (saved_objects_error_helpers.ts:258:28) at performGet (get.ts:80:36) at processTicksAndRejections (node:internal/process/task_queues:95:5) at SavedObjectsRepository.get (repository.ts:370:12) at SavedObjectsClient.get (saved_objects_client.ts:119:12) at PackagePolicyClientImpl.get (package_policy.ts:495:29) at validateProfilingInApmPackagePolicy (fleet_policies.ts:193:23) at async Promise.all (index 5) at setup.ts:99:31 at Router.handle (router.ts:212:30) at handler (router.ts:162:13) at exports.Manager.execute (/Users/caue.marcondes/elastic/other_kibana/node_modules/@hapi/hapi/lib ``` After: ``` { "has_setup": false, "has_data": false, "pre_8_9_1_data": false } ``` --------- Co-authored-by: Francesco Gualazzi --- .../server/lib/setup/fleet_policies.ts | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts b/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts index 8ffe13695cddb..ccba170b5fed9 100644 --- a/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts +++ b/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts @@ -189,17 +189,23 @@ export async function validateProfilingInApmPackagePolicy({ soClient, packagePolicyClient, }: ProfilingSetupOptions): Promise { - const apmPolicy = await getApmPolicy({ packagePolicyClient, soClient }); - - return { - policies: { - apm: { - profilingEnabled: !!( - apmPolicy && apmPolicy?.inputs[0].config?.['apm-server'].value?.profiling - ), + try { + const apmPolicy = await getApmPolicy({ packagePolicyClient, soClient }); + return { + policies: { + apm: { + profilingEnabled: !!( + apmPolicy && apmPolicy?.inputs[0].config?.['apm-server'].value?.profiling + ), + }, }, - }, - }; + }; + } catch (e) { + // In case apm integration is not available ignore the error and return as profiling is not enabled on the integration + return { + policies: { apm: { profilingEnabled: false } }, + }; + } } export async function removeProfilingFromApmPackagePolicy({ From 14876726f4f6edd57672644a322e55cd3d2afd6a Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Wed, 6 Sep 2023 13:30:51 +0200 Subject: [PATCH 76/84] [Infra UI] Normalise network and Disk rates for Hosts across time ranges (#165680) Closes #164152 ## Summary This PR normalizes the disk and network charts per second. The charts changed: Disk IOPS (read/write) diskiops Network (rx/tx) network Disk Throughput (read/write) diskth ## Testing 1. Go to hosts view and check network and disk charts (they should be normalized per second) 2. Open the host flyout and check network and disk charts (they should be normalized per second) https://github.com/elastic/kibana/assets/14139027/087cd044-b6cc-4612-8fca-391a96848365 --- .../common/visualizations/lens/formulas/host/disk_read_iops.ts | 1 + .../visualizations/lens/formulas/host/disk_read_throughput.ts | 1 + .../common/visualizations/lens/formulas/host/disk_write_iops.ts | 1 + .../visualizations/lens/formulas/host/disk_write_throughput.ts | 1 + .../infra/public/common/visualizations/lens/formulas/host/rx.ts | 1 + .../infra/public/common/visualizations/lens/formulas/host/tx.ts | 1 + 6 files changed, 6 insertions(+) diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts index 9b3f22164aacc..7af4e67339565 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts @@ -16,4 +16,5 @@ export const diskIORead: FormulaValueConfig = { decimals: 0, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts index 5043fb7f94fe1..f3f35cb54940f 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts @@ -16,4 +16,5 @@ export const diskReadThroughput: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts index 2831957ccb230..b3a8e62200c15 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts @@ -16,4 +16,5 @@ export const diskIOWrite: FormulaValueConfig = { decimals: 0, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts index 9f0f0937bff37..1ba401d011479 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts @@ -16,4 +16,5 @@ export const diskWriteThroughput: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts index 92162fad6010f..25f03ff811e76 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts @@ -17,4 +17,5 @@ export const rx: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts index 2b196103619a7..42608398e255e 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts @@ -17,4 +17,5 @@ export const tx: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; From ba5a0496751c9008146dbec434212eea1a2d33f5 Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Wed, 6 Sep 2023 13:34:19 +0200 Subject: [PATCH 77/84] Fix flaky getSummarizedAlerts unit tests (#165801) Resolves: #165755, #163192, #165754, #165753, #165752, #165751, #165750, #165749, #165748, #163194, #163193, #163192 This PR fixes above flaky tests by fixing the `kibana.alert.start` filter in getExpectedQueryByTimeRange fixture --- .../alerting/server/alerts_client/alerts_client.test.ts | 4 ---- .../alerting/server/alerts_client/alerts_client_fixtures.ts | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts index 78b2e41431c22..2c0e6e0cbf03c 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts @@ -1363,10 +1363,6 @@ describe('Alerts Client', () => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/163192 - // FLAKY: https://github.com/elastic/kibana/issues/163193 - // FLAKY: https://github.com/elastic/kibana/issues/163194 - // FLAKY: https://github.com/elastic/kibana/issues/163195 describe('getSummarizedAlerts', () => { beforeEach(() => { clusterClient.search.mockReturnValue({ diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts index aa513588b83f8..4395df7217419 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts @@ -72,8 +72,8 @@ export const getParamsByTimeQuery: GetSummarizedAlertsParams = { ruleId: 'ruleId', spaceId: 'default', excludedAlertInstanceIds: [], - end: new Date(), - start: new Date(), + end: new Date('2023-09-06T00:01:00.000'), + start: new Date('2023-09-06T00:00:00.000'), }; export const getExpectedQueryByExecutionUuid = ({ @@ -258,7 +258,7 @@ export const getExpectedQueryByTimeRange = ({ { range: { 'kibana.alert.start': { - lt: end, + lt: start, }, }, }, From 782ab866b5e7eb59e0dd13419a4f92c0aab4149e Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Wed, 6 Sep 2023 07:38:44 -0400 Subject: [PATCH 78/84] [Security Solution] Unskip failing tests in Policy and Metadata (#165242) ## Summary Unskip tests that were skipped during a package release that was rolled back. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../management/cypress/e2e/mocked_data/policy_response.cy.ts | 3 +-- .../test/security_solution_endpoint_api_int/apis/metadata.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts index c8949b8c09077..cb846a62317fb 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts @@ -61,8 +61,7 @@ describe.skip('Endpoint Policy Response', () => { login(); }); - // TODO failing test skipped https://github.com/elastic/kibana/issues/162428 - describe.skip('from Fleet Agent Details page', () => { + describe('from Fleet Agent Details page', () => { it('should display policy response with errors', () => { navigateToFleetAgentDetails(endpointMetadata.agent.id); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts index 4eb92d2dee08b..b92a26e785127 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts @@ -44,8 +44,7 @@ export default function ({ getService }: FtrProviderContext) { const endpointTestResources = getService('endpointTestResources'); describe('test metadata apis', () => { - // FLAKY: https://github.com/elastic/kibana/issues/151854 - describe.skip('list endpoints GET route', () => { + describe('list endpoints GET route', () => { const numberOfHostsInFixture = 2; let agent1Timestamp: number; let agent2Timestamp: number; From b335c3abbcd776a5d9d6b4e042e2165478cc42ae Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Wed, 6 Sep 2023 14:33:05 +0200 Subject: [PATCH 79/84] [Search] Extract connectors to package (#165590) ## Summary This moves connectors functions to a shared package so Serverless Search and Enterprise Search can both use it. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + .i18nrc.json | 34 ++- config/serverless.es.yml | 7 +- package.json | 1 + packages/kbn-search-connectors/README.md | 3 + .../kbn-search-connectors}/connectors.ts | 53 ++-- packages/kbn-search-connectors/index.ts | 19 ++ packages/kbn-search-connectors/jest.config.js | 13 + packages/kbn-search-connectors/kibana.jsonc | 5 + .../lib/cancel_syncs.test.ts | 34 ++- .../kbn-search-connectors/lib/cancel_syncs.ts | 19 +- .../lib/create_connector.ts | 40 +++ .../lib}/create_connector_document.test.ts | 111 +------- .../lib}/create_connector_document.ts | 45 +--- .../lib}/delete_connector.test.ts | 24 +- .../lib/delete_connector.ts | 21 ++ .../lib/fetch_connector_index_names.ts | 29 ++ .../lib}/fetch_connectors.test.ts | 62 ++--- .../lib}/fetch_connectors.ts | 48 ++-- .../lib}/fetch_sync_jobs.test.ts | 26 +- .../lib}/fetch_sync_jobs.ts | 23 +- packages/kbn-search-connectors/lib/index.ts | 23 ++ .../lib/start_sync.test.ts | 242 +++++++++++++++++ .../kbn-search-connectors/lib/start_sync.ts | 91 +++++++ .../update_connector_configuration.test.ts | 26 +- .../lib}/update_connector_configuration.ts | 26 +- .../update_connector_name_and_description.ts | 21 +- .../lib}/update_connector_scheduling.test.ts | 36 ++- .../lib}/update_connector_scheduling.ts | 21 +- .../lib}/update_connector_service_type.ts | 21 +- .../lib/update_connector_status.ts | 41 +++ .../lib/update_filtering.ts | 18 +- .../lib/update_filtering_draft.ts | 18 +- .../lib/update_native.ts | 28 ++ packages/kbn-search-connectors/package.json | 6 + packages/kbn-search-connectors/tsconfig.json | 23 ++ .../types/connectors.ts | 5 +- packages/kbn-search-connectors/types/index.ts | 12 + .../types}/native_connectors.ts | 248 ++++++++---------- .../types/optimistic_concurrency.ts | 13 + .../kbn-search-connectors/types/pagination.ts | 22 ++ .../utils/fetch_with_pagination.test.ts | 125 +++++++++ .../utils/fetch_with_pagination.ts | 61 +++++ .../utils/identify_exceptions.test.ts | 82 ++++++ .../utils/identify_exceptions.ts | 50 ++++ packages/kbn-search-connectors/utils/index.ts | 9 + .../utils/is_category_entry.ts | 29 ++ .../utils/is_not_nullish.ts | 11 + tsconfig.base.json | 2 + .../common/connectors/is_category_entry.ts | 5 +- .../enterprise_search/common/constants.ts | 3 +- .../enterprise_search/common/types/crawler.ts | 2 +- .../enterprise_search/common/types/indices.ts | 3 +- .../__mocks__/pipeline.mock.ts | 2 +- .../__mocks__/search_indices.mock.ts | 7 +- .../__mocks__/sync_job.mock.ts | 8 +- .../__mocks__/view_index.mock.ts | 6 +- .../connector/fetch_sync_jobs_api_logic.ts | 3 +- .../get_default_pipeline_api_logic.ts | 2 +- ...pdate_connector_configuration_api_logic.ts | 3 +- .../update_connector_filtering_api_logic.ts | 3 +- ...ate_connector_filtering_draft_api_logic.ts | 3 +- ...onnector_name_and_description_api_logic.ts | 3 +- .../update_connector_scheduling_api_logic.ts | 3 +- .../update_default_pipeline_api_logic.ts | 2 +- .../connector/update_pipeline_api_logic.ts | 3 +- .../fetch_index_pipeline_parameters.ts | 3 +- .../components/curl_request/curl_request.tsx | 3 +- .../connector/connector_configuration.tsx | 3 +- .../connector_configuration_field.tsx | 3 +- .../connector_configuration_form_items.tsx | 2 +- .../connector_configuration_logic.test.ts | 2 +- .../connector_configuration_logic.ts | 5 +- .../connector_name_and_description_logic.ts | 3 +- .../connector/connector_scheduling.tsx | 2 +- .../connector_cron_editor.tsx | 3 +- .../connector_scheduling/full_content.tsx | 2 +- .../connector_scheduling_logic.test.ts | 2 +- .../connector/connector_scheduling_logic.ts | 3 +- .../search_index/connector/constants.ts | 2 +- .../native_connector_configuration_config.tsx | 2 +- .../sync_rules/connector_filtering_logic.tsx | 7 +- .../sync_rules/edit_sync_rules_flyout.tsx | 3 +- .../sync_rules/editable_basic_rules_table.tsx | 7 +- .../sync_rules/sync_rules_callouts.tsx | 2 +- .../search_index/connector/types.ts | 2 +- .../automatic_crawl_scheduler_logic.ts | 2 +- ...custom_settings_flyout_crawl_scheduler.tsx | 3 +- ...ustom_settings_flyout_multi_crawl_logic.ts | 3 +- .../crawler_configuration_logic.ts | 3 +- .../search_index/index_view_logic.test.ts | 2 +- .../search_index/index_view_logic.ts | 8 +- .../components/search_index/overview.logic.ts | 3 +- .../default_pipeline_item.tsx | 3 +- .../ingest_pipeline_flyout.tsx | 3 +- .../pipelines/pipeline_settings_form.tsx | 3 +- .../search_index/pipelines/pipelines_logic.ts | 3 +- .../sync_jobs/events_panel.test.tsx | 2 +- .../search_index/sync_jobs/events_panel.tsx | 3 +- .../sync_jobs/filtering_panel.test.tsx | 6 +- .../sync_jobs/filtering_panel.tsx | 2 +- .../search_index/sync_jobs/pipeline_panel.tsx | 2 +- .../sync_jobs/sync_callouts.test.tsx | 2 +- .../search_index/sync_jobs/sync_callouts.tsx | 3 +- .../sync_jobs/sync_jobs_history_table.tsx | 3 +- .../sync_jobs/sync_jobs_view_logic.test.ts | 7 +- .../sync_jobs/sync_jobs_view_logic.ts | 3 +- .../search_indices/indices_logic.test.ts | 3 +- .../search_indices/indices_table.tsx | 2 +- .../components/settings/settings_logic.ts | 3 +- .../filtering_rules_table.tsx | 6 +- .../utils/filtering_rule_helpers.ts | 2 +- .../utils/has_configured_configuration.ts | 3 +- .../utils/indices.test.ts | 3 +- .../utils/indices.ts | 3 +- .../utils/sync_status_to_text.test.ts | 2 +- .../utils/sync_status_to_text.ts | 2 +- .../enterprise_search_cron_editor.tsx | 2 +- .../server/api/connectors_service.ts | 54 ---- .../plugins/enterprise_search/server/index.ts | 6 +- .../lib/connectors/add_connector.test.ts | 234 ++++------------- .../server/lib/connectors/add_connector.ts | 87 +++--- .../server/lib/connectors/delete_connector.ts | 22 -- .../connectors/fetch_connector_index_names.ts | 28 -- .../lib/connectors/put_update_native.ts | 27 -- .../server/lib/connectors/start_sync.test.ts | 52 ++-- .../server/lib/connectors/start_sync.ts | 59 ++--- .../lib/connectors/update_connector_status.ts | 40 --- .../fetch_crawler_multiple_schedules.ts | 3 +- .../server/lib/crawler/fetch_crawlers.ts | 3 +- .../server/lib/crawler/post_connector.test.ts | 3 +- .../server/lib/crawler/post_connector.ts | 7 +- .../lib/crawler/put_html_extraction.test.ts | 3 +- .../server/lib/crawler/put_html_extraction.ts | 3 +- .../server/lib/indices/fetch_index.test.ts | 30 +-- .../server/lib/indices/fetch_index.ts | 13 +- .../lib/indices/generate_api_key.test.ts | 2 +- .../server/lib/indices/generate_api_key.ts | 4 +- .../lib/pipelines/get_default_pipeline.ts | 4 +- .../lib/pipelines/get_index_pipeline.ts | 12 +- .../lib/pipelines/revert_custom_pipeline.ts | 6 +- .../lib/pipelines/update_default_pipeline.ts | 3 +- .../server/lib/pipelines/update_pipeline.ts | 4 +- .../server/lib/stats/get_sync_jobs.ts | 9 +- .../enterprise_search/server/plugin.ts | 33 +-- .../routes/enterprise_search/connectors.ts | 67 +++-- .../enterprise_search/crawler/crawler.ts | 26 +- .../routes/enterprise_search/indices.ts | 20 +- .../server/utils/search_result_provider.ts | 6 +- .../plugins/enterprise_search/tsconfig.json | 3 +- x-pack/plugins/serverless_search/kibana.jsonc | 11 +- .../components/connectors_overview.tsx | 3 +- .../application/components/overview.tsx | 2 +- .../serverless_search/server/plugin.ts | 9 +- .../server/routes/connectors_routes.ts | 15 +- .../plugins/serverless_search/server/types.ts | 2 - .../plugins/serverless_search/tsconfig.json | 2 +- .../translations/translations/fr-FR.json | 205 +++++---------- .../translations/translations/ja-JP.json | 205 +++++---------- .../translations/translations/zh-CN.json | 205 +++++---------- yarn.lock | 4 + 161 files changed, 2016 insertions(+), 1670 deletions(-) create mode 100644 packages/kbn-search-connectors/README.md rename {x-pack/plugins/enterprise_search/common/connectors => packages/kbn-search-connectors}/connectors.ts (70%) create mode 100644 packages/kbn-search-connectors/index.ts create mode 100644 packages/kbn-search-connectors/jest.config.js create mode 100644 packages/kbn-search-connectors/kibana.jsonc rename x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts => packages/kbn-search-connectors/lib/cancel_syncs.test.ts (67%) rename x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts => packages/kbn-search-connectors/lib/cancel_syncs.ts (76%) create mode 100644 packages/kbn-search-connectors/lib/create_connector.ts rename {x-pack/plugins/enterprise_search/server/utils => packages/kbn-search-connectors/lib}/create_connector_document.test.ts (50%) rename {x-pack/plugins/enterprise_search/server/utils => packages/kbn-search-connectors/lib}/create_connector_document.ts (71%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/delete_connector.test.ts (54%) create mode 100644 packages/kbn-search-connectors/lib/delete_connector.ts create mode 100644 packages/kbn-search-connectors/lib/fetch_connector_index_names.ts rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_connectors.test.ts (70%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_connectors.ts (55%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_sync_jobs.test.ts (82%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_sync_jobs.ts (71%) create mode 100644 packages/kbn-search-connectors/lib/index.ts create mode 100644 packages/kbn-search-connectors/lib/start_sync.test.ts create mode 100644 packages/kbn-search-connectors/lib/start_sync.ts rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_configuration.test.ts (69%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_configuration.ts (71%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_name_and_description.ts (52%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_scheduling.test.ts (76%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_scheduling.ts (50%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_service_type.ts (51%) create mode 100644 packages/kbn-search-connectors/lib/update_connector_status.ts rename x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts => packages/kbn-search-connectors/lib/update_filtering.ts (80%) rename x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts => packages/kbn-search-connectors/lib/update_filtering_draft.ts (80%) create mode 100644 packages/kbn-search-connectors/lib/update_native.ts create mode 100644 packages/kbn-search-connectors/package.json create mode 100644 packages/kbn-search-connectors/tsconfig.json rename {x-pack/plugins/enterprise_search/common => packages/kbn-search-connectors}/types/connectors.ts (97%) create mode 100644 packages/kbn-search-connectors/types/index.ts rename {x-pack/plugins/enterprise_search/common/connectors => packages/kbn-search-connectors/types}/native_connectors.ts (83%) create mode 100644 packages/kbn-search-connectors/types/optimistic_concurrency.ts create mode 100644 packages/kbn-search-connectors/types/pagination.ts create mode 100644 packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts create mode 100644 packages/kbn-search-connectors/utils/fetch_with_pagination.ts create mode 100644 packages/kbn-search-connectors/utils/identify_exceptions.test.ts create mode 100644 packages/kbn-search-connectors/utils/identify_exceptions.ts create mode 100644 packages/kbn-search-connectors/utils/index.ts create mode 100644 packages/kbn-search-connectors/utils/is_category_entry.ts create mode 100644 packages/kbn-search-connectors/utils/is_not_nullish.ts delete mode 100644 x-pack/plugins/enterprise_search/server/api/connectors_service.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cd4fe15e8827c..b88935d43b3c1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -596,6 +596,7 @@ src/plugins/screenshot_mode @elastic/appex-sharedux x-pack/examples/screenshotting_example @elastic/appex-sharedux x-pack/plugins/screenshotting @elastic/kibana-reporting-services packages/kbn-search-api-panels @elastic/enterprise-search-frontend +packages/kbn-search-connectors @elastic/enterprise-search-frontend examples/search_examples @elastic/kibana-data-discovery packages/kbn-search-response-warnings @elastic/kibana-data-discovery x-pack/plugins/searchprofiler @elastic/platform-deployment-management diff --git a/.i18nrc.json b/.i18nrc.json index eb098a7011a15..373f28219a8cb 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -6,12 +6,17 @@ "apmOss": "src/plugins/apm_oss", "autocomplete": "packages/kbn-securitysolution-autocomplete/src", "bfetch": "src/plugins/bfetch", - "cases": ["packages/kbn-cases-components"], + "cases": [ + "packages/kbn-cases-components" + ], "cellActions": "packages/kbn-cell-actions", "charts": "src/plugins/charts", "console": "src/plugins/console", "contentManagement": "packages/content-management", - "core": ["src/core", "packages/core"], + "core": [ + "src/core", + "packages/core" + ], "customIntegrations": "src/plugins/custom_integrations", "dashboard": "src/plugins/dashboard", "domDragDrop": "packages/kbn-dom-drag-drop", @@ -21,7 +26,10 @@ "dataViews": "src/plugins/data_views", "defaultNavigation": "packages/default-nav", "devTools": "src/plugins/dev_tools", - "discover": ["src/plugins/discover", "packages/kbn-discover-utils"], + "discover": [ + "src/plugins/discover", + "packages/kbn-discover-utils" + ], "savedSearch": "src/plugins/saved_search", "embeddableApi": "src/plugins/embeddable", "embeddableExamples": "examples/embeddable_examples", @@ -89,6 +97,7 @@ "savedObjects": "src/plugins/saved_objects", "savedObjectsFinder": "src/plugins/saved_objects_finder", "savedObjectsManagement": "src/plugins/saved_objects_management", + "searchConnectors": "packages/kbn-search-connectors", "server": "src/legacy/server", "share": "src/plugins/share", "sharedUXPackages": "packages/shared-ux", @@ -100,9 +109,17 @@ "languageDocumentationPopover": "packages/kbn-language-documentation-popover/src", "textBasedLanguages": "src/plugins/text_based_languages", "statusPage": "src/legacy/core_plugins/status_page", - "telemetry": ["src/plugins/telemetry", "src/plugins/telemetry_management_section"], - "timelion": ["src/plugins/vis_types/timelion"], - "uiActions": ["src/plugins/ui_actions", "packages/kbn-ui-actions-browser"], + "telemetry": [ + "src/plugins/telemetry", + "src/plugins/telemetry_management_section" + ], + "timelion": [ + "src/plugins/vis_types/timelion" + ], + "uiActions": [ + "src/plugins/ui_actions", + "packages/kbn-ui-actions-browser" + ], "uiActionsEnhanced": "src/plugins/ui_actions_enhanced", "uiActionsExamples": "examples/ui_action_examples", "usageCollection": "src/plugins/usage_collection", @@ -122,7 +139,10 @@ "visTypeXy": "src/plugins/vis_types/xy", "visualizations": "src/plugins/visualizations", "visualizationUiComponents": "packages/kbn-visualization-ui-components", - "unifiedDocViewer": ["src/plugins/unified_doc_viewer", "packages/kbn-unified-doc-viewer"], + "unifiedDocViewer": [ + "src/plugins/unified_doc_viewer", + "packages/kbn-unified-doc-viewer" + ], "unifiedSearch": "src/plugins/unified_search", "unifiedFieldList": "packages/kbn-unified-field-list", "unifiedHistogram": "src/plugins/unified_histogram", diff --git a/config/serverless.es.yml b/config/serverless.es.yml index 7a1da782855bd..fe5575c5fee1e 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -9,12 +9,7 @@ xpack.observability.enabled: false xpack.securitySolution.enabled: false xpack.serverless.observability.enabled: false xpack.uptime.enabled: false -enterpriseSearch.enabled: true -enterpriseSearch.canDeployEntSearch: false -enterpriseSearch.hasConnectors: true -enterpriseSearch.hasNativeConnectors: false -enterpriseSearch.hasWebCrawler: false -enterpriseSearch.ui.enabled: false +enterpriseSearch.enabled: false monitoring.ui.enabled: false xpack.fleet.enabled: false diff --git a/package.json b/package.json index 80d1b5b6faf59..20507f57e6134 100644 --- a/package.json +++ b/package.json @@ -602,6 +602,7 @@ "@kbn/screenshotting-example-plugin": "link:x-pack/examples/screenshotting_example", "@kbn/screenshotting-plugin": "link:x-pack/plugins/screenshotting", "@kbn/search-api-panels": "link:packages/kbn-search-api-panels", + "@kbn/search-connectors": "link:packages/kbn-search-connectors", "@kbn/search-examples-plugin": "link:examples/search_examples", "@kbn/search-response-warnings": "link:packages/kbn-search-response-warnings", "@kbn/searchprofiler-plugin": "link:x-pack/plugins/searchprofiler", diff --git a/packages/kbn-search-connectors/README.md b/packages/kbn-search-connectors/README.md new file mode 100644 index 0000000000000..5233a782a964f --- /dev/null +++ b/packages/kbn-search-connectors/README.md @@ -0,0 +1,3 @@ +# @kbn/search-connectors + +Empty package generated by @kbn/generate diff --git a/x-pack/plugins/enterprise_search/common/connectors/connectors.ts b/packages/kbn-search-connectors/connectors.ts similarity index 70% rename from x-pack/plugins/enterprise_search/common/connectors/connectors.ts rename to packages/kbn-search-connectors/connectors.ts index 1fc6c6e7f5c77..119de69a0c5c0 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/connectors.ts +++ b/packages/kbn-search-connectors/connectors.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { i18n } from '@kbn/i18n'; @@ -17,13 +18,17 @@ export interface ConnectorServerSideDefinition { serviceType: string; } +/* The consumer should host these icons and transform the iconPath into something usable + * Enterprise Search and Serverless Search do this right now + */ + export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { iconPath: 'azure_blob_storage.svg', isBeta: true, isNative: true, keywords: ['cloud', 'azure', 'blob', 's3', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.azureBlob.name', { defaultMessage: 'Azure Blob Storage', }), serviceType: 'azure_blob_storage', @@ -33,7 +38,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['confluence', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.confluence.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.confluence.name', { defaultMessage: 'Confluence Cloud & Server', }), serviceType: 'confluence', @@ -44,7 +49,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['dropbox', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.dropbox.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.dropbox.name', { defaultMessage: 'Dropbox', }), serviceType: 'dropbox', @@ -54,7 +59,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['jira', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.jira.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.jira.name', { defaultMessage: 'Jira Cloud & Server', }), serviceType: 'jira', @@ -64,7 +69,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['github', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.github.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.github.name', { defaultMessage: 'GitHub & GitHub Enterprise Server', }), serviceType: 'github', @@ -74,7 +79,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['google', 'cloud', 'blob', 's3', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.googleCloud.name', { defaultMessage: 'Google Cloud Storage', }), serviceType: 'google_cloud_storage', @@ -84,7 +89,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['google', 'drive', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.googleDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.googleDrive.name', { defaultMessage: 'Google Drive', }), serviceType: 'google_drive', @@ -94,7 +99,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['mongo', 'mongodb', 'database', 'nosql', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.mongodb.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.mongodb.name', { defaultMessage: 'MongoDB', }), serviceType: 'mongodb', @@ -104,7 +109,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['mysql', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.mysql.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.mysql.name', { defaultMessage: 'MySQL', }), serviceType: 'mysql', @@ -114,7 +119,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: true, keywords: ['mssql', 'microsoft', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.microsoftSQL.name', { defaultMessage: 'Microsoft SQL', }), serviceType: 'mssql', @@ -124,7 +129,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['network', 'drive', 'file', 'directory', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.networkDrive.name', { defaultMessage: 'Network drive', }), serviceType: 'network_drive', @@ -134,7 +139,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: true, keywords: ['postgresql', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.postgresql.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.postgresql.name', { defaultMessage: 'PostgreSQL', }), serviceType: 'postgresql', @@ -145,7 +150,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: false, keywords: ['salesforce', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.salesforce.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.salesforce.name', { defaultMessage: 'Salesforce', }), serviceType: 'salesforce', @@ -156,7 +161,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['servicenow', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.serviceNow.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.serviceNow.name', { defaultMessage: 'ServiceNow', }), serviceType: 'servicenow', @@ -167,7 +172,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['sharepoint', 'office365', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.sharepoint_online.name', { defaultMessage: 'Sharepoint Online', }), serviceType: 'sharepoint_online', @@ -178,7 +183,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: true, keywords: ['google', 'gmail', 'connector', 'mail'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.gmail.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.gmail.name', { defaultMessage: 'Gmail', }), serviceType: 'gmail', @@ -188,7 +193,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['oracle', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.oracle.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.oracle.name', { defaultMessage: 'Oracle', }), serviceType: 'oracle', @@ -198,7 +203,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['network', 'drive', 'file', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.oneDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.oneDrive.name', { defaultMessage: 'OneDrive', }), serviceType: 'onedrive', @@ -208,7 +213,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['s3', 'cloud', 'amazon', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.s3.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.s3.name', { defaultMessage: 'S3', }), serviceType: 's3', @@ -219,7 +224,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: true, keywords: ['slack', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.slack.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.slack.name', { defaultMessage: 'Slack', }), serviceType: 'slack', @@ -230,7 +235,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: false, keywords: ['sharepoint', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.sharepointServer.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.sharepointServer.name', { defaultMessage: 'Sharepoint Server', }), serviceType: 'sharepoint_server', @@ -240,7 +245,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['custom', 'connector', 'code'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.customConnector.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.customConnector.name', { defaultMessage: 'Customized connector', }), serviceType: '', diff --git a/packages/kbn-search-connectors/index.ts b/packages/kbn-search-connectors/index.ts new file mode 100644 index 0000000000000..f232081031fb6 --- /dev/null +++ b/packages/kbn-search-connectors/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const CONNECTORS_INDEX = '.elastic-connectors'; +export const CURRENT_CONNECTORS_INDEX = '.elastic-connectors-v1'; +export const CONNECTORS_JOBS_INDEX = '.elastic-connectors-sync-jobs'; +export const CURRENT_CONNECTORS_JOB_INDEX = '.elastic-connectors-sync-jobs-v1'; +export const CONNECTORS_VERSION = 1; +export const CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX = '.search-acl-filter-'; + +export * from './connectors'; +export * from './lib'; +export * from './types'; +export * from './utils'; diff --git a/packages/kbn-search-connectors/jest.config.js b/packages/kbn-search-connectors/jest.config.js new file mode 100644 index 0000000000000..99c132b768bfe --- /dev/null +++ b/packages/kbn-search-connectors/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['/packages/kbn-search-connectors'], +}; diff --git a/packages/kbn-search-connectors/kibana.jsonc b/packages/kbn-search-connectors/kibana.jsonc new file mode 100644 index 0000000000000..4c1162ed0300b --- /dev/null +++ b/packages/kbn-search-connectors/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/search-connectors", + "owner": "@elastic/enterprise-search-frontend" +} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts b/packages/kbn-search-connectors/lib/cancel_syncs.test.ts similarity index 67% rename from x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts rename to packages/kbn-search-connectors/lib/cancel_syncs.test.ts index 0c528b6b8290e..05c2f5fcd529d 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts +++ b/packages/kbn-search-connectors/lib/cancel_syncs.test.ts @@ -1,24 +1,22 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; -import { SyncStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '..'; +import { SyncStatus } from '../types/connectors'; -import { cancelSyncs } from './post_cancel_syncs'; +import { cancelSyncs } from './cancel_syncs'; -describe('addConnector lib function', () => { +describe('cancelSync lib function', () => { const mockClient = { - asCurrentUser: { - update: jest.fn(), - updateByQuery: jest.fn(), - }, - asInternalUser: {}, + update: jest.fn(), + updateByQuery: jest.fn(), }; beforeEach(() => { @@ -28,13 +26,13 @@ describe('addConnector lib function', () => { }); it('should call updateByQuery to cancel syncs', async () => { - mockClient.asCurrentUser.updateByQuery.mockImplementation(() => ({ _id: 'fakeId' })); + mockClient.updateByQuery.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - cancelSyncs(mockClient as unknown as IScopedClusterClient, 'connectorId') + cancelSyncs(mockClient as unknown as ElasticsearchClient, 'connectorId') ).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledTimes(2); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledWith({ + expect(mockClient.updateByQuery).toHaveBeenCalledTimes(2); + expect(mockClient.updateByQuery).toHaveBeenCalledWith({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -60,7 +58,7 @@ ctx._source['canceled_at'] = '${new Date(Date.now()).toISOString()}'; ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledWith({ + expect(mockClient.updateByQuery).toHaveBeenCalledWith({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -84,7 +82,7 @@ ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, ctx._source['cancelation_requested_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await expect(mockClient.asCurrentUser.update).toHaveBeenCalledWith({ + await expect(mockClient.update).toHaveBeenCalledWith({ doc: { last_sync_status: SyncStatus.CANCELED, sync_now: false }, id: 'connectorId', index: CONNECTORS_INDEX, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts b/packages/kbn-search-connectors/lib/cancel_syncs.ts similarity index 76% rename from x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts rename to packages/kbn-search-connectors/lib/cancel_syncs.ts index ef5327d4db374..2a331e19d4cb7 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts +++ b/packages/kbn-search-connectors/lib/cancel_syncs.ts @@ -1,20 +1,21 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; -import { SyncStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '..'; +import { SyncStatus } from '../types/connectors'; export const cancelSyncs = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string ): Promise => { - await client.asCurrentUser.updateByQuery({ + await client.updateByQuery({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -40,7 +41,7 @@ ctx._source['canceled_at'] = '${new Date(Date.now()).toISOString()}'; ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await client.asCurrentUser.updateByQuery({ + await client.updateByQuery({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -64,7 +65,7 @@ ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, ctx._source['cancelation_requested_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await client.asCurrentUser.update({ + await client.update({ doc: { last_sync_status: SyncStatus.CANCELED, sync_now: false }, id: connectorId, index: CONNECTORS_INDEX, diff --git a/packages/kbn-search-connectors/lib/create_connector.ts b/packages/kbn-search-connectors/lib/create_connector.ts new file mode 100644 index 0000000000000..d4ff1230727c8 --- /dev/null +++ b/packages/kbn-search-connectors/lib/create_connector.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; +import { CURRENT_CONNECTORS_INDEX } from '..'; + +import { Connector, ConnectorConfiguration, IngestPipelineParams } from '../types/connectors'; +import { createConnectorDocument } from './create_connector_document'; + +export const createConnector = async ( + client: ElasticsearchClient, + input: { + configuration?: ConnectorConfiguration; + features?: Connector['features']; + indexName: string | null; + isNative: boolean; + language: string | null; + name?: string; + pipeline: IngestPipelineParams; + serviceType?: string | null; + } +): Promise => { + const document = createConnectorDocument({ + ...input, + serviceType: input.serviceType || null, + }); + + const result = await client.index({ + document, + index: CURRENT_CONNECTORS_INDEX, + refresh: 'wait_for', + }); + + return { ...document, id: result._id }; +}; diff --git a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts b/packages/kbn-search-connectors/lib/create_connector_document.test.ts similarity index 50% rename from x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts rename to packages/kbn-search-connectors/lib/create_connector_document.test.ts index 458d223ce24b4..aa1c54c3c90ea 100644 --- a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts +++ b/packages/kbn-search-connectors/lib/create_connector_document.test.ts @@ -1,11 +1,12 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { ConnectorStatus } from '../../common/types/connectors'; +import { ConnectorStatus } from '../types/connectors'; import { createConnectorDocument } from './create_connector_document'; @@ -16,6 +17,7 @@ describe('createConnectorDocument', () => { indexName: 'indexName', isNative: false, language: 'fr', + name: 'indexName-name', pipeline: { extract_binary_content: true, name: 'ent-search-generic-ingestion', @@ -94,108 +96,7 @@ describe('createConnectorDocument', () => { last_sync_scheduled_at: null, last_sync_status: null, last_synced: null, - name: 'indexName', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, - }); - }); - it('should remove search- from name', () => { - expect( - createConnectorDocument({ - indexName: 'search-indexName', - isNative: false, - language: 'fr', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - serviceType: null, - }) - ).toEqual({ - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'search-indexName', - is_native: false, - language: 'fr', - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'indexName', + name: 'indexName-name', pipeline: { extract_binary_content: true, name: 'ent-search-generic-ingestion', diff --git a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts b/packages/kbn-search-connectors/lib/create_connector_document.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts rename to packages/kbn-search-connectors/lib/create_connector_document.ts index 8b3883eac5be9..c5654e9a2436a 100644 --- a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts +++ b/packages/kbn-search-connectors/lib/create_connector_document.ts @@ -1,24 +1,25 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { NATIVE_CONNECTOR_DEFINITIONS } from '../../common/connectors/native_connectors'; -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../common/constants'; - import { + Connector, + ConnectorConfiguration, ConnectorDocument, ConnectorStatus, FilteringPolicy, FilteringRuleRule, FilteringValidationState, IngestPipelineParams, -} from '../../common/types/connectors'; -import { stripSearchPrefix } from '../../common/utils/strip_search_prefix'; +} from '../types/connectors'; export function createConnectorDocument({ + configuration, + features, indexName, isNative, name, @@ -26,6 +27,8 @@ export function createConnectorDocument({ serviceType, language, }: { + configuration?: ConnectorConfiguration; + features?: Connector['features']; indexName: string | null; isNative: boolean; language: string | null; @@ -34,35 +37,14 @@ export function createConnectorDocument({ serviceType: string | null; }): ConnectorDocument { const currentTimestamp = new Date().toISOString(); - const nativeConnector = - isNative && serviceType ? NATIVE_CONNECTOR_DEFINITIONS[serviceType] : undefined; - - if ( - isNative && - serviceType && - !nativeConnector && - serviceType !== ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE - ) { - throw new Error(`Could not find connector definition for service type ${serviceType}`); - } - - const nativeFields = nativeConnector - ? { - configuration: nativeConnector.configuration, - features: nativeConnector.features, - name: nativeConnector.name, - service_type: serviceType, - status: ConnectorStatus.NEEDS_CONFIGURATION, - } - : {}; return { api_key_id: null, - configuration: {}, + configuration: configuration || {}, custom_scheduling: {}, description: null, error: null, - features: null, + features: features || null, filtering: [ { active: { @@ -126,7 +108,7 @@ export function createConnectorDocument({ last_sync_scheduled_at: null, last_sync_status: null, last_synced: null, - name: name || stripSearchPrefix(indexName ?? ''), + name: name ?? '', pipeline, scheduling: { access_control: { enabled: false, interval: '0 0 0 * * ?' }, @@ -136,6 +118,5 @@ export function createConnectorDocument({ service_type: serviceType || null, status: ConnectorStatus.CREATED, sync_now: false, - ...nativeFields, }; } diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts b/packages/kbn-search-connectors/lib/delete_connector.test.ts similarity index 54% rename from x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts rename to packages/kbn-search-connectors/lib/delete_connector.test.ts index 0ce9e53632835..55dfdcbeae92b 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts +++ b/packages/kbn-search-connectors/lib/delete_connector.test.ts @@ -1,27 +1,25 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { deleteConnectorById } from './delete_connector'; -jest.mock('./post_cancel_syncs', () => ({ +jest.mock('./cancel_syncs', () => ({ cancelSyncs: jest.fn(), })); -import { cancelSyncs } from './post_cancel_syncs'; +import { cancelSyncs } from './cancel_syncs'; describe('deleteConnector lib function', () => { const mockClient = { - asCurrentUser: { - delete: jest.fn(), - }, - asInternalUser: {}, + delete: jest.fn(), }; beforeEach(() => { @@ -30,11 +28,11 @@ describe('deleteConnector lib function', () => { }); it('should delete connector and cancel syncs', async () => { - mockClient.asCurrentUser.delete.mockImplementation(() => true); + mockClient.delete.mockImplementation(() => true); - await deleteConnectorById(mockClient as unknown as IScopedClusterClient, 'connectorId'); + await deleteConnectorById(mockClient as unknown as ElasticsearchClient, 'connectorId'); expect(cancelSyncs as jest.Mock).toHaveBeenCalledWith(mockClient, 'connectorId'); - expect(mockClient.asCurrentUser.delete).toHaveBeenCalledWith({ + expect(mockClient.delete).toHaveBeenCalledWith({ id: 'connectorId', index: CONNECTORS_INDEX, refresh: 'wait_for', diff --git a/packages/kbn-search-connectors/lib/delete_connector.ts b/packages/kbn-search-connectors/lib/delete_connector.ts new file mode 100644 index 0000000000000..c64edfd3d906a --- /dev/null +++ b/packages/kbn-search-connectors/lib/delete_connector.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { CONNECTORS_INDEX } from '..'; +import { cancelSyncs } from './cancel_syncs'; + +export const deleteConnectorById = async (client: ElasticsearchClient, id: string) => { + // timeout function to mitigate race condition with external connector running job and recreating index + const timeout = async () => { + const promise = new Promise((resolve) => setTimeout(resolve, 500)); + return promise; + }; + await Promise.all([cancelSyncs(client, id), timeout]); + return await client.delete({ id, index: CONNECTORS_INDEX, refresh: 'wait_for' }); +}; diff --git a/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts b/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts new file mode 100644 index 0000000000000..bed99173c859b --- /dev/null +++ b/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX } from '..'; +import { isIndexNotFoundException } from '../utils/identify_exceptions'; + +export async function fetchConnectorIndexNames(client: ElasticsearchClient): Promise { + try { + const result = await client.search({ + _source: false, + fields: [{ field: 'index_name' }], + index: CONNECTORS_INDEX, + size: 10000, + }); + return (result?.hits.hits ?? []).map((field) => field.fields?.index_name[0] ?? ''); + } catch (error) { + if (isIndexNotFoundException(error)) { + return []; + } + throw error; + } +} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts b/packages/kbn-search-connectors/lib/fetch_connectors.test.ts similarity index 70% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts rename to packages/kbn-search-connectors/lib/fetch_connectors.test.ts index 4196aad469d65..e1bb872710594 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts +++ b/packages/kbn-search-connectors/lib/fetch_connectors.test.ts @@ -1,11 +1,12 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById, fetchConnectorByIndexName, fetchConnectors } from './fetch_connectors'; @@ -31,11 +32,8 @@ const otherError = { describe('fetchConnectors lib', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - search: jest.fn(), - }, - asInternalUser: {}, + get: jest.fn(), + search: jest.fn(), }; beforeEach(() => { @@ -43,7 +41,7 @@ describe('fetchConnectors lib', () => { }); describe('fetch connector by id', () => { it('should fetch connector by id', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => + mockClient.get.mockImplementationOnce(() => Promise.resolve({ _id: 'connectorId', _primary_term: 'primaryTerm', @@ -56,23 +54,23 @@ describe('fetchConnectors lib', () => { seqNo: 5, value: { id: 'connectorId', source: 'source' }, }); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); }); it('should return undefined on index not found error', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); + mockClient.get.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectorById(mockClient as any, 'id')).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.get.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectorById(mockClient as any, 'id')).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); @@ -80,17 +78,17 @@ describe('fetchConnectors lib', () => { }); describe('fetch connector by name', () => { it('should fetch connector by index name', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: [{ _id: 'connectorId', _source: { source: 'source' } }] } }) ); - mockClient.asCurrentUser.get.mockImplementationOnce(() => + mockClient.get.mockImplementationOnce(() => Promise.resolve({ _id: 'connectorId', _source: { source: 'source' } }) ); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).resolves.toEqual({ id: 'connectorId', source: 'source', }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -100,11 +98,9 @@ describe('fetchConnectors lib', () => { }); }); it('should return undefined on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => - Promise.reject(indexNotFoundError) - ); + mockClient.search.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -114,9 +110,9 @@ describe('fetchConnectors lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.search.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -128,7 +124,7 @@ describe('fetchConnectors lib', () => { }); describe('fetch connectors', () => { it('should fetch connectors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: [{ _id: 'connectorId', _source: { source: 'source' } }] } }) ); await expect(fetchConnectors(mockClient as any)).resolves.toEqual([ @@ -137,7 +133,7 @@ describe('fetchConnectors lib', () => { source: 'source', }, ]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, @@ -153,7 +149,7 @@ describe('fetchConnectors lib', () => { let count = 0; - mockClient.asCurrentUser.search.mockImplementation(() => { + mockClient.search.mockImplementation(() => { count += 1; if (count === 3) { return Promise.resolve({ hits: { hits: [] } }); @@ -164,20 +160,18 @@ describe('fetchConnectors lib', () => { ...resultHits, ...resultHits, ]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, size: 1000, }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledTimes(3); + expect(mockClient.search).toHaveBeenCalledTimes(3); }); it('should return empty array on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => - Promise.reject(indexNotFoundError) - ); + mockClient.search.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectors(mockClient as any)).resolves.toEqual([]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, @@ -185,9 +179,9 @@ describe('fetchConnectors lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.search.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectors(mockClient as any)).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts b/packages/kbn-search-connectors/lib/fetch_connectors.ts similarity index 55% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts rename to packages/kbn-search-connectors/lib/fetch_connectors.ts index c1d8b834d0e15..7d9463228c0a9 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts +++ b/packages/kbn-search-connectors/lib/fetch_connectors.ts @@ -1,25 +1,27 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; -import { IScopedClusterClient } from '@kbn/core/server'; +import { QueryDslQueryContainer, SearchHit } from '@elastic/elasticsearch/lib/api/types'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector, ConnectorDocument } from '../../../common/types/connectors'; -import { OptimisticConcurrency } from '../../../common/types/util_types'; -import { isIndexNotFoundException } from '../../utils/identify_exceptions'; -import { fetchAll } from '../fetch_all'; +import { OptimisticConcurrency } from '../types/optimistic_concurrency'; +import { Connector, ConnectorDocument } from '../types/connectors'; + +import { isIndexNotFoundException } from '../utils/identify_exceptions'; +import { CONNECTORS_INDEX } from '..'; +import { isNotNullish } from '../utils/is_not_nullish'; export const fetchConnectorById = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string ): Promise | undefined> => { try { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); @@ -39,11 +41,11 @@ export const fetchConnectorById = async ( }; export const fetchConnectorByIndexName = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, indexName: string ): Promise => { try { - const connectorResult = await client.asCurrentUser.search({ + const connectorResult = await client.search({ index: CONNECTORS_INDEX, query: { term: { index_name: indexName } }, }); @@ -62,7 +64,7 @@ export const fetchConnectorByIndexName = async ( }; export const fetchConnectors = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, indexNames?: string[] ): Promise => { const query: QueryDslQueryContainer = indexNames @@ -70,7 +72,23 @@ export const fetchConnectors = async ( : { match_all: {} }; try { - return await fetchAll(client, CONNECTORS_INDEX, query); + let hits: Array> = []; + let accumulator: Array> = []; + + do { + const connectorResult = await client.search({ + from: accumulator.length, + index: CONNECTORS_INDEX, + query, + size: 1000, + }); + hits = connectorResult.hits.hits; + accumulator = accumulator.concat(hits); + } while (hits.length >= 1000); + + return accumulator + .map(({ _source, _id }) => (_source ? { ..._source, id: _id } : undefined)) + .filter(isNotNullish); } catch (error) { if (isIndexNotFoundException(error)) { return []; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts b/packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts similarity index 82% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts rename to packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts index 651849e803c41..debfedbcfeb67 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts +++ b/packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts @@ -1,19 +1,17 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { fetchSyncJobsByConnectorId } from './fetch_sync_jobs'; describe('fetchSyncJobs lib', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - search: jest.fn(), - }, - asInternalUser: {}, + get: jest.fn(), + search: jest.fn(), }; beforeEach(() => { @@ -21,7 +19,7 @@ describe('fetchSyncJobs lib', () => { }); describe('fetch sync jobs by connector id', () => { it('should fetch sync jobs by connector id', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: ['result1', 'result2'] }, total: 2 }) ); await expect(fetchSyncJobsByConnectorId(mockClient as any, 'id', 0, 10)).resolves.toEqual({ @@ -35,7 +33,7 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { @@ -63,10 +61,10 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).not.toHaveBeenCalled(); + expect(mockClient.search).not.toHaveBeenCalled(); }); it('should return empty array on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.reject({ meta: { body: { @@ -88,7 +86,7 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { @@ -105,7 +103,7 @@ describe('fetchSyncJobs lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.reject({ meta: { body: { @@ -125,7 +123,7 @@ describe('fetchSyncJobs lib', () => { }, }, }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts b/packages/kbn-search-connectors/lib/fetch_sync_jobs.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts rename to packages/kbn-search-connectors/lib/fetch_sync_jobs.ts index 43f373712f753..1a56103702d83 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts +++ b/packages/kbn-search-connectors/lib/fetch_sync_jobs.ts @@ -1,19 +1,20 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_JOBS_INDEX } from '../..'; -import { ConnectorSyncJob, SyncJobType } from '../../../common/types/connectors'; -import { Paginate } from '../../../common/types/pagination'; -import { isNotNullish } from '../../../common/utils/is_not_nullish'; +import { CONNECTORS_JOBS_INDEX } from '..'; +import { ConnectorSyncJob, SyncJobType } from '../types/connectors'; +import { Paginate } from '../types/pagination'; +import { isNotNullish } from '../utils/is_not_nullish'; -import { fetchWithPagination } from '../../utils/fetch_with_pagination'; -import { isIndexNotFoundException } from '../../utils/identify_exceptions'; +import { fetchWithPagination } from '../utils/fetch_with_pagination'; +import { isIndexNotFoundException } from '../utils/identify_exceptions'; const defaultResult: Paginate = { _meta: { @@ -28,7 +29,7 @@ const defaultResult: Paginate = { }; export const fetchSyncJobsByConnectorId = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, from: number, size: number, @@ -63,7 +64,7 @@ export const fetchSyncJobsByConnectorId = async ( }; const result = await fetchWithPagination( async () => - await client.asCurrentUser.search({ + await client.search({ from, index: CONNECTORS_JOBS_INDEX, query, diff --git a/packages/kbn-search-connectors/lib/index.ts b/packages/kbn-search-connectors/lib/index.ts new file mode 100644 index 0000000000000..4fd4706268327 --- /dev/null +++ b/packages/kbn-search-connectors/lib/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './cancel_syncs'; +export * from './create_connector'; +export * from './create_connector_document'; +export * from './delete_connector'; +export * from './fetch_connectors'; +export * from './fetch_sync_jobs'; +export * from './update_filtering'; +export * from './update_filtering_draft'; +export * from './update_native'; +export * from './start_sync'; +export * from './update_connector_configuration'; +export * from './update_connector_name_and_description'; +export * from './update_connector_scheduling'; +export * from './update_connector_service_type'; +export * from './update_connector_status'; diff --git a/packages/kbn-search-connectors/lib/start_sync.test.ts b/packages/kbn-search-connectors/lib/start_sync.test.ts new file mode 100644 index 0000000000000..c32b82bc7ba7f --- /dev/null +++ b/packages/kbn-search-connectors/lib/start_sync.test.ts @@ -0,0 +1,242 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; +import { SyncJobType, SyncStatus, TriggerMethod } from '../types/connectors'; +import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '..'; + +import { startConnectorSync } from './start_sync'; + +describe('startSync lib function', () => { + const mockClient = { + get: jest.fn(), + index: jest.fn(), + update: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should start a full sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + index_name: 'index_name', + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.FULL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.FULL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); + + it('should not create index if there is no connector', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({}); + }); + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.FULL, + }) + ).rejects.toEqual(new Error('resource_not_found')); + expect(mockClient.index).not.toHaveBeenCalled(); + }); + + it('should start an incremental sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + filtering: [], + index_name: 'index_name', + language: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.INCREMENTAL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.INCREMENTAL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); + + it('should start an access control sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + index_name: 'search-index_name', + language: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + targetIndexName: '.search-acl-filter-index_name', + jobType: SyncJobType.ACCESS_CONTROL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}index_name`, + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.ACCESS_CONTROL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); +}); diff --git a/packages/kbn-search-connectors/lib/start_sync.ts b/packages/kbn-search-connectors/lib/start_sync.ts new file mode 100644 index 0000000000000..878901953e6a1 --- /dev/null +++ b/packages/kbn-search-connectors/lib/start_sync.ts @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; +import { + ConnectorConfiguration, + ConnectorDocument, + SyncJobType, + SyncStatus, + TriggerMethod, +} from '../types/connectors'; +import { isConfigEntry } from '../utils/is_category_entry'; + +export const startConnectorSync = async ( + client: ElasticsearchClient, + { + connectorId, + jobType, + targetIndexName, + }: { + connectorId: string; + jobType?: SyncJobType; + targetIndexName?: string; + } +) => { + const connectorResult = await client.get({ + id: connectorId, + index: CONNECTORS_INDEX, + }); + const connector = connectorResult._source; + if (connector) { + const configuration = Object.entries(connector.configuration).reduce( + (acc, [key, configEntry]) => { + if (isConfigEntry(configEntry)) { + acc[key] = configEntry; + } + return acc; + }, + {} as ConnectorConfiguration + ); + const { + filtering, + index_name: connectorIndexName, + language, + pipeline, + service_type: serviceType, + } = connector; + + const now = new Date().toISOString(); + + return await client.index({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration, + filtering: filtering ? filtering[0]?.active ?? null : null, + id: connectorId, + index_name: targetIndexName || connectorIndexName, + language, + pipeline: pipeline ?? null, + service_type: serviceType, + }, + created_at: now, + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: jobType, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + } else { + throw new Error('resource_not_found'); + } +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts b/packages/kbn-search-connectors/lib/update_connector_configuration.test.ts similarity index 69% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts rename to packages/kbn-search-connectors/lib/update_connector_configuration.test.ts index 0b7e328e9ebb4..fd1e014037863 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts +++ b/packages/kbn-search-connectors/lib/update_connector_configuration.test.ts @@ -1,26 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; - -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById } from './fetch_connectors'; +import { ConnectorStatus } from '../types/connectors'; + import { updateConnectorConfiguration } from './update_connector_configuration'; jest.mock('./fetch_connectors', () => ({ fetchConnectorById: jest.fn() })); describe('updateConnectorConfiguration lib function', () => { const mockClient = { - asCurrentUser: { - update: jest.fn(), - }, - asInternalUser: {}, + update: jest.fn(), }; beforeEach(() => { @@ -38,11 +36,11 @@ describe('updateConnectorConfiguration lib function', () => { it('should update configuration', async () => { await expect( - updateConnectorConfiguration(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorConfiguration(mockClient as unknown as ElasticsearchClient, 'connectorId', { test: 'newValue', }) ).resolves.toEqual({ test: { label: 'haha', value: 'newValue' } }); - expect(mockClient.asCurrentUser.update).toHaveBeenCalledWith({ + expect(mockClient.update).toHaveBeenCalledWith({ doc: { configuration: { test: { label: 'haha', value: 'newValue' } }, status: ConnectorStatus.CONFIGURED, @@ -58,10 +56,10 @@ describe('updateConnectorConfiguration lib function', () => { (fetchConnectorById as jest.Mock).mockImplementation(() => undefined); await expect( - updateConnectorConfiguration(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorConfiguration(mockClient as unknown as ElasticsearchClient, 'connectorId', { test: 'newValue', }) ).rejects.toEqual(new Error('Could not find connector')); - expect(mockClient.asCurrentUser.update).not.toHaveBeenCalled(); + expect(mockClient.update).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts b/packages/kbn-search-connectors/lib/update_connector_configuration.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts rename to packages/kbn-search-connectors/lib/update_connector_configuration.ts index 7c68a0a08dee7..dfb43af53db44 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts +++ b/packages/kbn-search-connectors/lib/update_connector_configuration.ts @@ -1,28 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; - -import { isConfigEntry } from '../../../common/connectors/is_category_entry'; -import { - ConnectorConfiguration, - ConnectorDocument, - ConnectorStatus, -} from '../../../common/types/connectors'; -import { isNotNullish } from '../../../common/utils/is_not_nullish'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById } from './fetch_connectors'; +import { ConnectorConfiguration, ConnectorDocument, ConnectorStatus } from '../types/connectors'; +import { isConfigEntry } from '../utils/is_category_entry'; +import { isNotNullish } from '../utils/is_not_nullish'; export const updateConnectorConfiguration = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, configuration: Record ) => { @@ -49,7 +45,7 @@ export const updateConnectorConfiguration = async ( const { key, ...config } = curr; return { ...prev, [curr.key]: config }; }, {}); - await client.asCurrentUser.update({ + await client.update({ doc: { configuration: updatedConfig, status }, id: connectorId, if_primary_term: connectorResult?.primaryTerm, @@ -59,7 +55,7 @@ export const updateConnectorConfiguration = async ( return updatedConfig; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.configuration.error', { + i18n.translate('searchConnectors.server.connectors.configuration.error', { defaultMessage: 'Could not find connector', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts b/packages/kbn-search-connectors/lib/update_connector_name_and_description.ts similarity index 52% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts rename to packages/kbn-search-connectors/lib/update_connector_name_and_description.ts index caca94ee2713a..6323387c4259f 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts +++ b/packages/kbn-search-connectors/lib/update_connector_name_and_description.ts @@ -1,38 +1,39 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { Connector, ConnectorDocument } from '../../../common/types/connectors'; +import { Connector, ConnectorDocument } from '../types/connectors'; export const updateConnectorNameAndDescription = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, connectorUpdates: Partial> ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, ...connectorUpdates }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { + i18n.translate('searchConnectors.server.connectors.serviceType.error', { defaultMessage: 'Could not find document', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts b/packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts similarity index 76% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts rename to packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts index c314e101624fb..618522831118d 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts +++ b/packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts @@ -1,26 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { updateConnectorScheduling } from './update_connector_scheduling'; describe('addConnector lib function', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - index: jest.fn(), - indices: { - refresh: jest.fn(), - }, + get: jest.fn(), + index: jest.fn(), + indices: { + refresh: jest.fn(), }, - asInternalUser: {}, }; beforeEach(() => { @@ -28,7 +26,7 @@ describe('addConnector lib function', () => { }); it('should update connector scheduling', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.get.mockImplementationOnce(() => { return Promise.resolve({ _source: { api_key_id: null, @@ -57,10 +55,10 @@ describe('addConnector lib function', () => { index: CONNECTORS_INDEX, }); }); - mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - updateConnectorScheduling(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorScheduling(mockClient as unknown as ElasticsearchClient, 'connectorId', { access_control: { enabled: false, interval: '* * * * *' }, full: { enabled: true, @@ -69,7 +67,7 @@ describe('addConnector lib function', () => { incremental: { enabled: false, interval: '* * * * *' }, }) ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ + expect(mockClient.index).toHaveBeenCalledWith({ document: { api_key_id: null, configuration: {}, @@ -97,17 +95,17 @@ describe('addConnector lib function', () => { id: 'connectorId', index: CONNECTORS_INDEX, }); - expect(mockClient.asCurrentUser.indices.refresh).toHaveBeenCalledWith({ + expect(mockClient.indices.refresh).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, }); }); it('should not index document if there is no connector', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.get.mockImplementationOnce(() => { return Promise.resolve({}); }); await expect( - updateConnectorScheduling(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorScheduling(mockClient as unknown as ElasticsearchClient, 'connectorId', { access_control: { enabled: false, interval: '* * * * *' }, full: { enabled: true, @@ -116,6 +114,6 @@ describe('addConnector lib function', () => { incremental: { enabled: false, interval: '* * * * *' }, }) ).rejects.toEqual(new Error('Could not find document')); - expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); + expect(mockClient.index).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts b/packages/kbn-search-connectors/lib/update_connector_scheduling.ts similarity index 50% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts rename to packages/kbn-search-connectors/lib/update_connector_scheduling.ts index b6da7f138421d..a0693dc3cd6f6 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts +++ b/packages/kbn-search-connectors/lib/update_connector_scheduling.ts @@ -1,38 +1,39 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { ConnectorDocument, SchedulingConfiguraton } from '../../../common/types/connectors'; +import { ConnectorDocument, SchedulingConfiguraton } from '../types/connectors'; export const updateConnectorScheduling = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, scheduling: SchedulingConfiguraton ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, scheduling }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.scheduling.error', { + i18n.translate('searchConnectors.server.connectors.scheduling.error', { defaultMessage: 'Could not find document', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts b/packages/kbn-search-connectors/lib/update_connector_service_type.ts similarity index 51% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts rename to packages/kbn-search-connectors/lib/update_connector_service_type.ts index a88950c48e99f..27732e17c8c2a 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts +++ b/packages/kbn-search-connectors/lib/update_connector_service_type.ts @@ -1,38 +1,39 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { ConnectorDocument } from '../../../common/types/connectors'; +import { ConnectorDocument } from '../types/connectors'; export const updateConnectorServiceType = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, serviceType: string ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, service_type: serviceType }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { + i18n.translate('searchConnectors.server.connectors.serviceType.error', { defaultMessage: 'Could not find document', }) ); diff --git a/packages/kbn-search-connectors/lib/update_connector_status.ts b/packages/kbn-search-connectors/lib/update_connector_status.ts new file mode 100644 index 0000000000000..42ba9adb4f9e0 --- /dev/null +++ b/packages/kbn-search-connectors/lib/update_connector_status.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; +import { i18n } from '@kbn/i18n'; + +import { CONNECTORS_INDEX } from '..'; + +import { ConnectorDocument, ConnectorStatus } from '../types/connectors'; + +export const updateConnectorStatus = async ( + client: ElasticsearchClient, + connectorId: string, + status: ConnectorStatus +) => { + const connectorResult = await client.get({ + id: connectorId, + index: CONNECTORS_INDEX, + }); + const connector = connectorResult._source; + if (connector) { + const result = await client.index({ + document: { ...connector, status }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); + return result; + } else { + throw new Error( + i18n.translate('searchConnectors.server.connectors.serviceType.error', { + defaultMessage: 'Could not find document', + }) + ); + } +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts b/packages/kbn-search-connectors/lib/update_filtering.ts similarity index 80% rename from x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts rename to packages/kbn-search-connectors/lib/update_filtering.ts index 4c0e3c2b2e541..5d32639f23396 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts +++ b/packages/kbn-search-connectors/lib/update_filtering.ts @@ -1,24 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; +import { fetchConnectorById } from './fetch_connectors'; import { Connector, FilteringRule, FilteringRules, FilteringValidationState, -} from '../../../common/types/connectors'; - -import { fetchConnectorById } from './fetch_connectors'; +} from '../types/connectors'; export const updateFiltering = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, { advancedSnippet, @@ -55,7 +55,7 @@ export const updateFiltering = async ( }, }; - const result = await client.asCurrentUser.update({ + const result = await client.update({ doc: { ...connector, filtering: [{ ...connector.filtering[0], active, draft: active }] }, id: connectorId, if_primary_term: primaryTerm, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts b/packages/kbn-search-connectors/lib/update_filtering_draft.ts similarity index 80% rename from x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts rename to packages/kbn-search-connectors/lib/update_filtering_draft.ts index cf82d79008d09..deb6eabd66e23 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts +++ b/packages/kbn-search-connectors/lib/update_filtering_draft.ts @@ -1,24 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; +import { fetchConnectorById } from './fetch_connectors'; import { Connector, FilteringRule, FilteringRules, FilteringValidationState, -} from '../../../common/types/connectors'; - -import { fetchConnectorById } from './fetch_connectors'; +} from '../types/connectors'; export const updateFilteringDraft = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, { advancedSnippet, @@ -55,7 +55,7 @@ export const updateFilteringDraft = async ( } const { value: connector, seqNo, primaryTerm } = connectorResult; - const result = await client.asCurrentUser.update({ + const result = await client.update({ doc: { ...connector, filtering: [{ ...connector.filtering[0], draft }] }, id: connectorId, if_primary_term: primaryTerm, diff --git a/packages/kbn-search-connectors/lib/update_native.ts b/packages/kbn-search-connectors/lib/update_native.ts new file mode 100644 index 0000000000000..dff5042961088 --- /dev/null +++ b/packages/kbn-search-connectors/lib/update_native.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; + +import { CONNECTORS_INDEX } from '..'; +import { Connector } from '../types/connectors'; + +export const putUpdateNative = async ( + client: ElasticsearchClient, + connectorId: string, + isNative: boolean +) => { + const result = await client.update({ + doc: { + is_native: isNative, + }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + + return result; +}; diff --git a/packages/kbn-search-connectors/package.json b/packages/kbn-search-connectors/package.json new file mode 100644 index 0000000000000..d2fb29822e269 --- /dev/null +++ b/packages/kbn-search-connectors/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/search-connectors", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-search-connectors/tsconfig.json b/packages/kbn-search-connectors/tsconfig.json new file mode 100644 index 0000000000000..a8c8d3c9840a6 --- /dev/null +++ b/packages/kbn-search-connectors/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/core", + "@kbn/core-elasticsearch-server", + ] +} diff --git a/x-pack/plugins/enterprise_search/common/types/connectors.ts b/packages/kbn-search-connectors/types/connectors.ts similarity index 97% rename from x-pack/plugins/enterprise_search/common/types/connectors.ts rename to packages/kbn-search-connectors/types/connectors.ts index 6354c058b222f..8f649c15f348f 100644 --- a/x-pack/plugins/enterprise_search/common/types/connectors.ts +++ b/packages/kbn-search-connectors/types/connectors.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ export interface SelectOption { diff --git a/packages/kbn-search-connectors/types/index.ts b/packages/kbn-search-connectors/types/index.ts new file mode 100644 index 0000000000000..f7ef8e3b4d941 --- /dev/null +++ b/packages/kbn-search-connectors/types/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './connectors'; +export * from './native_connectors'; +export * from './optimistic_concurrency'; +export * from './pagination'; diff --git a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts b/packages/kbn-search-connectors/types/native_connectors.ts similarity index 83% rename from x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts rename to packages/kbn-search-connectors/types/native_connectors.ts index b12c23e26351a..0e767b4bdd345 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts +++ b/packages/kbn-search-connectors/types/native_connectors.ts @@ -1,59 +1,60 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { i18n } from '@kbn/i18n'; -import { DisplayType, FeatureName, FieldType, NativeConnector } from '../types/connectors'; +import { DisplayType, FeatureName, FieldType, NativeConnector } from './connectors'; -const USERNAME_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.usernameLabel', { +const USERNAME_LABEL = i18n.translate('searchConnectors.nativeConnectors.usernameLabel', { defaultMessage: 'Username', }); -const PASSWORD_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.passwordLabel', { +const PASSWORD_LABEL = i18n.translate('searchConnectors.nativeConnectors.passwordLabel', { defaultMessage: 'Password', }); -const ENABLE_SSL_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.enableSSL.label', { +const ENABLE_SSL_LABEL = i18n.translate('searchConnectors.nativeConnectors.enableSSL.label', { defaultMessage: 'Enable SSL', }); const SSL_CERTIFICATE_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.sslCertificate.label', + 'searchConnectors.nativeConnectors.sslCertificate.label', { defaultMessage: 'SSL certificate', } ); const RETRIES_PER_REQUEST_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.retriesPerRequest.label', + 'searchConnectors.nativeConnectors.retriesPerRequest.label', { defaultMessage: 'Retries per request', } ); const ADVANCED_RULES_IGNORED_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.advancedRulesIgnored.label', + 'searchConnectors.nativeConnectors.advancedRulesIgnored.label', { defaultMessage: 'This configurable field is ignored when Advanced Sync Rules are used.', } ); const MAX_CONCURRENT_DOWNLOADS_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.nativeConnectors.maximumConcurrentLabel', + 'searchConnectors.nativeConnectors.nativeConnectors.maximumConcurrentLabel', { defaultMessage: 'Maximum concurrent downloads', } ); -const DATABASE_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.databaseLabel', { +const DATABASE_LABEL = i18n.translate('searchConnectors.nativeConnectors.databaseLabel', { defaultMessage: 'Database', }); -const PORT_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.portLabel', { +const PORT_LABEL = i18n.translate('searchConnectors.nativeConnectors.portLabel', { defaultMessage: 'Port', }); @@ -65,7 +66,7 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record { + primaryTerm: number | undefined; + seqNo: number | undefined; + value: T; +} diff --git a/packages/kbn-search-connectors/types/pagination.ts b/packages/kbn-search-connectors/types/pagination.ts new file mode 100644 index 0000000000000..65f397105013b --- /dev/null +++ b/packages/kbn-search-connectors/types/pagination.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export interface Page { + from: number; // current page index, 0-based + has_more_hits_than_total?: boolean; + size: number; // size per page + total: number; // total number of hits +} +export interface Meta { + page: Page; +} + +export interface Paginate { + _meta: Meta; + data: T[]; +} diff --git a/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts b/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts new file mode 100644 index 0000000000000..9fa0831955840 --- /dev/null +++ b/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts @@ -0,0 +1,125 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; + +import { fetchWithPagination } from './fetch_with_pagination'; + +describe('fetchWithPagination util', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('fetchWithPagination', () => { + it('should fetch mock data with pagination', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: ['result1', 'result2'], total: 2 }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 2, + }, + }, + data: ['result1', 'result2'], + }); + }); + it('should return empty result if size is 0', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: [], total: 0 }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 0)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data: [], + }); + }); + it('should handle total as an object correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { + hits: [], + total: { + relation: 'lte', + value: 555, + }, + }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 555, + }, + }, + data: [], + }); + }); + + it('should handle undefined total correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { + hits: [], + total: undefined, + }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data: [], + }); + }); + + it('should handle has_more_hits_than_total correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: ['result1', 'result2'], total: { relation: 'gte', value: 10000 } }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 50, 10)).resolves.toEqual({ + _meta: { + page: { + from: 50, + has_more_hits_than_total: true, + size: 10, + total: 10000, + }, + }, + data: ['result1', 'result2'], + }); + }); + }); +}); diff --git a/packages/kbn-search-connectors/utils/fetch_with_pagination.ts b/packages/kbn-search-connectors/utils/fetch_with_pagination.ts new file mode 100644 index 0000000000000..fd6c6a5232374 --- /dev/null +++ b/packages/kbn-search-connectors/utils/fetch_with_pagination.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { SearchHit, SearchResponse, SearchTotalHits } from '@elastic/elasticsearch/lib/api/types'; + +import { Paginate } from '../types/pagination'; + +const defaultResult = (data: T[]) => ({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data, +}); + +export const fetchWithPagination = async ( + fetchFunction: () => Promise>, + from: number, + size: number +): Promise>> => { + if (size === 0) { + return defaultResult>([]); + } + const result = await fetchFunction(); + const total = totalToPaginateTotal(result.hits.total); + return { + _meta: { + page: { + from, + size, + ...total, + }, + }, + data: result.hits.hits, + }; +}; + +function totalToPaginateTotal(input: number | SearchTotalHits | undefined): { + has_more_hits_than_total: boolean; + total: number; +} { + if (typeof input === 'number') { + return { has_more_hits_than_total: false, total: input }; + } + + return input + ? { + has_more_hits_than_total: input.relation === 'gte' ? true : false, + total: input.value, + } + : { has_more_hits_than_total: false, total: 0 }; +} diff --git a/packages/kbn-search-connectors/utils/identify_exceptions.test.ts b/packages/kbn-search-connectors/utils/identify_exceptions.test.ts new file mode 100644 index 0000000000000..321b0310353bb --- /dev/null +++ b/packages/kbn-search-connectors/utils/identify_exceptions.test.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { isIndexNotFoundException, isResourceAlreadyExistsException } from './identify_exceptions'; + +describe('IdentifyExceptions', () => { + describe('IsIndexNotFoundException', () => { + it('should return true for index not found exception', () => { + const error = { + meta: { + body: { + error: { + type: 'index_not_found_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isIndexNotFoundException(error as any)).toEqual(true); + }); + it('should return false for other exception', () => { + const error = { + meta: { + body: { + error: { + type: 'other_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isIndexNotFoundException(error as any)).toEqual(false); + }); + it('should return false for other object', () => { + expect(isIndexNotFoundException({} as any)).toEqual(false); + }); + }); + describe('isResourceAlreadyExistsError', () => { + it('should return true for resource already exists exception', () => { + const error = { + meta: { + body: { + error: { + type: 'resource_already_exists_exception', + }, + status: 400, + }, + name: 'ResponseError', + statusCode: 400, + }, + }; + expect(isResourceAlreadyExistsException(error as any)).toEqual(true); + }); + it('should return false for other exception', () => { + const error = { + meta: { + body: { + error: { + type: 'other_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isResourceAlreadyExistsException(error as any)).toEqual(false); + }); + it('should return false for other object', () => { + expect(isResourceAlreadyExistsException({} as any)).toEqual(false); + }); + }); +}); diff --git a/packages/kbn-search-connectors/utils/identify_exceptions.ts b/packages/kbn-search-connectors/utils/identify_exceptions.ts new file mode 100644 index 0000000000000..0bc395710d8f5 --- /dev/null +++ b/packages/kbn-search-connectors/utils/identify_exceptions.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export interface ElasticsearchResponseError { + meta?: { + body?: { + error?: { + type: string; + }; + }; + statusCode?: number; + }; + name: 'ResponseError'; +} + +const MISSING_ALIAS_ERROR = new RegExp(/^alias \[.+\] missing/); + +export const isIndexNotFoundException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'index_not_found_exception'; + +export const isResourceAlreadyExistsException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'resource_already_exists_exception'; + +export const isResourceNotFoundException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'resource_not_found_exception'; + +export const isUnauthorizedException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 403; + +export const isNotFoundException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 404; + +export const isIllegalArgumentException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'illegal_argument_exception'; + +export const isVersionConflictEngineException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'version_conflict_engine_exception'; + +export const isInvalidSearchApplicationNameException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'invalid_alias_name_exception'; + +export const isMissingAliasException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 404 && + typeof error.meta?.body?.error === 'string' && + MISSING_ALIAS_ERROR.test(error.meta?.body?.error); diff --git a/packages/kbn-search-connectors/utils/index.ts b/packages/kbn-search-connectors/utils/index.ts new file mode 100644 index 0000000000000..ae2bbe2a818aa --- /dev/null +++ b/packages/kbn-search-connectors/utils/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './is_category_entry'; diff --git a/packages/kbn-search-connectors/utils/is_category_entry.ts b/packages/kbn-search-connectors/utils/is_category_entry.ts new file mode 100644 index 0000000000000..fb72db52944df --- /dev/null +++ b/packages/kbn-search-connectors/utils/is_category_entry.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ConnectorConfigProperties, ConnectorConfigCategoryProperties } from '../types/connectors'; + +export function isCategoryEntry( + input: + | ConnectorConfigProperties + | ConnectorConfigCategoryProperties + | { label: string; value: boolean } + | null +): input is ConnectorConfigCategoryProperties { + return (input as ConnectorConfigCategoryProperties)?.type === 'category'; +} + +export function isConfigEntry( + input: + | ConnectorConfigProperties + | ConnectorConfigCategoryProperties + | { label: string; value: boolean } + | null +): input is ConnectorConfigProperties { + return (input as ConnectorConfigCategoryProperties).type !== 'category'; +} diff --git a/packages/kbn-search-connectors/utils/is_not_nullish.ts b/packages/kbn-search-connectors/utils/is_not_nullish.ts new file mode 100644 index 0000000000000..88b39b70d4ec8 --- /dev/null +++ b/packages/kbn-search-connectors/utils/is_not_nullish.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export function isNotNullish(value: T | null | undefined): value is T { + return value !== null && value !== undefined; +} diff --git a/tsconfig.base.json b/tsconfig.base.json index afbbdcfe7601b..e5808369793ae 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1186,6 +1186,8 @@ "@kbn/screenshotting-plugin/*": ["x-pack/plugins/screenshotting/*"], "@kbn/search-api-panels": ["packages/kbn-search-api-panels"], "@kbn/search-api-panels/*": ["packages/kbn-search-api-panels/*"], + "@kbn/search-connectors": ["packages/kbn-search-connectors"], + "@kbn/search-connectors/*": ["packages/kbn-search-connectors/*"], "@kbn/search-examples-plugin": ["examples/search_examples"], "@kbn/search-examples-plugin/*": ["examples/search_examples/*"], "@kbn/search-response-warnings": ["packages/kbn-search-response-warnings"], diff --git a/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts b/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts index 455bd6799e096..75344e1a0b912 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts +++ b/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts @@ -5,7 +5,10 @@ * 2.0. */ -import { ConnectorConfigProperties, ConnectorConfigCategoryProperties } from '../types/connectors'; +import { + ConnectorConfigProperties, + ConnectorConfigCategoryProperties, +} from '@kbn/search-connectors'; export function isCategoryEntry( input: diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index 8c8ace6fd434f..9bbaadc4c2b83 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -7,8 +7,9 @@ import { i18n } from '@kbn/i18n'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { ProductFeatures } from './types'; -import { IngestPipelineParams } from './types/connectors'; export const SEARCH_PRODUCT_NAME = i18n.translate('xpack.enterpriseSearch.search.productName', { defaultMessage: 'Search', diff --git a/x-pack/plugins/enterprise_search/common/types/crawler.ts b/x-pack/plugins/enterprise_search/common/types/crawler.ts index 678a99fa448d6..60043444524aa 100644 --- a/x-pack/plugins/enterprise_search/common/types/crawler.ts +++ b/x-pack/plugins/enterprise_search/common/types/crawler.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorStatus, SyncStatus } from './connectors'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; // See SharedTogo::Crawler::Status for details on how these are generated export enum CrawlerStatus { diff --git a/x-pack/plugins/enterprise_search/common/types/indices.ts b/x-pack/plugins/enterprise_search/common/types/indices.ts index b9e822e5168fd..57807ae98248a 100644 --- a/x-pack/plugins/enterprise_search/common/types/indices.ts +++ b/x-pack/plugins/enterprise_search/common/types/indices.ts @@ -12,7 +12,8 @@ import { Uuid, } from '@elastic/elasticsearch/lib/api/types'; -import { Connector } from './connectors'; +import { Connector } from '@kbn/search-connectors'; + import { Crawler } from './crawler'; export interface AlwaysShowPattern { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts index 55b21f2e4c753..2817716873c7e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; export const mockPipelineState: IngestPipelineParams = { extract_binary_content: true, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts index 4f92ffa6a7830..d8ebc499400f9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts @@ -5,8 +5,6 @@ * 2.0. */ -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; - import { ConnectorStatus, DisplayType, @@ -15,7 +13,10 @@ import { FilteringRuleRule, FilteringValidationState, SyncStatus, -} from '../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; + import { ElasticsearchIndexWithIngestion } from '../../../../common/types/indices'; export const indices: ElasticsearchIndexWithIngestion[] = [ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts index db4d1870fba90..d19407961e039 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts @@ -7,12 +7,8 @@ import moment from 'moment'; -import { - ConnectorSyncJob, - TriggerMethod, - SyncStatus, - SyncJobType, -} from '../../../../common/types/connectors'; +import { ConnectorSyncJob, TriggerMethod, SyncStatus, SyncJobType } from '@kbn/search-connectors'; + import { SyncJobView } from '../components/search_index/sync_jobs/sync_jobs_view_logic'; export const syncJob: ConnectorSyncJob = { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts index f10ca7cfba3b0..c548225ef78ac 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts @@ -5,8 +5,6 @@ * 2.0. */ -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; - import { ConnectorStatus, DisplayType, @@ -15,7 +13,9 @@ import { FilteringRuleRule, FilteringValidationState, SyncStatus, -} from '../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; import { ApiViewIndex, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts index 7452c2b7d1600..e7485d6645ce4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { ConnectorSyncJob } from '../../../../../common/types/connectors'; +import { ConnectorSyncJob } from '@kbn/search-connectors'; + import { Paginate } from '../../../../../common/types/pagination'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts index eddc2f2ced2d5..288a9d17d179f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts index 72510ea9fc1d3..5721addbc034f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { ConnectorConfiguration } from '../../../../../common/types/connectors'; +import { ConnectorConfiguration } from '@kbn/search-connectors'; + import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts index 023d06b8f957b..00d300c32e058 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts index f380af36e849e..245899192726a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts index 88d2c19a59eb0..2fc296d31c247 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { Connector } from '../../../../../common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts index c2ffaa647614f..00dce404e322d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { SchedulingConfiguraton } from '../../../../../common/types/connectors'; +import { SchedulingConfiguraton } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts index 81cfeadf8e39a..61b127d7ddc11 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts index 496b50fce7444..f9ec661fa8df2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts index 901a40e5c9e23..94be9aade7801 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx index a645a60fb67fb..3061ba03e4556 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx @@ -9,7 +9,8 @@ import React from 'react'; import { EuiCodeBlock } from '@elastic/eui'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { useCloudDetails } from '../../../../../shared/cloud_details/cloud_details'; interface CurlRequestParams { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx index 0667451d8e761..90777ddfdb963 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx @@ -26,7 +26,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ConnectorStatus } from '../../../../../../common/types/connectors'; +import { ConnectorStatus } from '@kbn/search-connectors'; + import { BetaConnectorCallout } from '../../../../shared/beta/beta_connector_callout'; import { useCloudDetails } from '../../../../shared/cloud_details/cloud_details'; import { docLinks } from '../../../../shared/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx index a5c7a5b217353..2408d58e4c5f2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx @@ -25,8 +25,9 @@ import { import { i18n } from '@kbn/i18n'; +import { DisplayType } from '@kbn/search-connectors'; + import { Status } from '../../../../../../common/types/api'; -import { DisplayType } from '../../../../../../common/types/connectors'; import { LicensingLogic } from '../../../../shared/licensing'; import { ConnectorConfigurationApiLogic } from '../../../api/connector/update_connector_configuration_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx index 68907850bd7a8..2aa2236b51e89 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx @@ -11,7 +11,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiIcon, EuiPanel, EuiToolTip } import { i18n } from '@kbn/i18n'; -import { DisplayType } from '../../../../../../common/types/connectors'; +import { DisplayType } from '@kbn/search-connectors'; import { ConnectorConfigurationField } from './connector_configuration_field'; import { ConfigEntryView } from './connector_configuration_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts index d38a58c8940d7..60cc58c1db395 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts @@ -8,7 +8,7 @@ import { LogicMounter } from '../../../../__mocks__/kea_logic'; import { connectorIndex } from '../../../__mocks__/view_index.mock'; -import { ConnectorStatus, DisplayType, FieldType } from '../../../../../../common/types/connectors'; +import { ConnectorStatus, DisplayType, FieldType } from '@kbn/search-connectors'; import { ConnectorConfigurationApiLogic } from '../../../api/connector/update_connector_configuration_api_logic'; import { CachedFetchIndexApiLogic } from '../../../api/index/cached_fetch_index_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts index fd13c0d55236c..9f82f4b539344 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts @@ -9,14 +9,15 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; -import { isCategoryEntry } from '../../../../../../common/connectors/is_category_entry'; import { ConnectorConfigProperties, ConnectorConfiguration, ConnectorStatus, Dependency, FieldType, -} from '../../../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { isCategoryEntry } from '../../../../../../common/connectors/is_category_entry'; import { isNotNullish } from '../../../../../../common/utils/is_not_nullish'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts index a2869f5a90963..f6cc74d20eb19 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { Connector } from '../../../../../../../common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; + import { Actions } from '../../../../../shared/api_logic/create_api_logic'; import { ConnectorNameAndDescriptionApiLogic, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx index 927f26e195f34..5ade2c11a8b55 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx @@ -23,7 +23,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ConnectorStatus, SyncJobType } from '../../../../../../common/types/connectors'; +import { ConnectorStatus, SyncJobType } from '@kbn/search-connectors'; import { generateEncodedPath } from '../../../../shared/encode_path_params'; import { KibanaLogic } from '../../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx index 9c38bdea220ca..c15a2ddefa5d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx @@ -13,8 +13,9 @@ import { EuiFlexItem, EuiFlexGroup, EuiButton, EuiButtonEmpty } from '@elastic/e import { i18n } from '@kbn/i18n'; +import { ConnectorScheduling, SyncJobType } from '@kbn/search-connectors'; + import { Status } from '../../../../../../../common/types/api'; -import { ConnectorScheduling, SyncJobType } from '../../../../../../../common/types/connectors'; import { CronEditor } from '../../../../../shared/cron_editor'; import { Frequency } from '../../../../../shared/cron_editor/types'; import { UpdateConnectorSchedulingApiLogic } from '../../../../api/connector/update_connector_scheduling_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx index 3fbe4ef8859f2..2031fc1154dec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx @@ -23,7 +23,7 @@ import { import { i18n } from '@kbn/i18n'; -import { SyncJobType } from '../../../../../../../common/types/connectors'; +import { SyncJobType } from '@kbn/search-connectors'; import { ConnectorViewIndex, CrawlerViewIndex } from '../../../../types'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts index 636035aa2ac83..c00392b24b3e3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts @@ -7,7 +7,7 @@ import { LogicMounter } from '../../../../__mocks__/kea_logic'; -import { SyncJobType } from '../../../../../../common/types/connectors'; +import { SyncJobType } from '@kbn/search-connectors'; import { ConnectorSchedulingLogic } from './connector_scheduling_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts index fdab8b7c59aef..5688b879b0d28 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling, SyncJobType } from '../../../../../../common/types/connectors'; +import { ConnectorScheduling, SyncJobType } from '@kbn/search-connectors'; + import { Actions } from '../../../../shared/api_logic/create_api_logic'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts index 64b4dad084d96..16ec910581086 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts @@ -7,7 +7,7 @@ import dedent from 'dedent'; -import { CONNECTOR_DEFINITIONS } from '../../../../../../common/connectors/connectors'; +import { CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; import { docLinks } from '../../../../shared/doc_links'; import { CONNECTOR_ICONS } from '../../../../shared/icons/connector_icons'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx index 53a6166ad34e5..0c4fa42a3fedb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx @@ -11,7 +11,7 @@ import { EuiSpacer, EuiLink, EuiText, EuiFlexGroup, EuiFlexItem, EuiCallOut } fr import { i18n } from '@kbn/i18n'; -import { ConnectorStatus } from '../../../../../../../common/types/connectors'; +import { ConnectorStatus } from '@kbn/search-connectors'; import { docLinks } from '../../../../../shared/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx index 13db854fa79e9..4dfea2cde5895 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx @@ -9,8 +9,6 @@ import { kea, MakeLogicType } from 'kea'; import { isEqual } from 'lodash'; -import { Status } from '../../../../../../../common/types/api'; - import { FilteringConfig, FilteringPolicy, @@ -18,7 +16,10 @@ import { FilteringRuleRule, FilteringValidation, FilteringValidationState, -} from '../../../../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { Status } from '../../../../../../../common/types/api'; + import { Actions } from '../../../../../shared/api_logic/create_api_logic'; import { clearFlashMessages } from '../../../../../shared/flash_messages'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx index e675b7a149d3b..779c3ec9e8bee 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx @@ -23,7 +23,8 @@ import { import { i18n } from '@kbn/i18n'; -import { FilteringValidation } from '../../../../../../../common/types/connectors'; +import { FilteringValidation } from '@kbn/search-connectors'; + import { BetaCallOut } from '../../../../../shared/beta/beta_callout'; import { AdvancedSyncRules } from './advanced_sync_rules'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx index b153c6b345431..5e56d34043a04 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx @@ -23,11 +23,8 @@ import { import { i18n } from '@kbn/i18n'; -import { - FilteringPolicy, - FilteringRule, - FilteringRuleRule, -} from '../../../../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRule, FilteringRuleRule } from '@kbn/search-connectors'; + import { docLinks } from '../../../../../shared/doc_links'; import { InlineEditableTable } from '../../../../../shared/tables/inline_editable_table/inline_editable_table'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx index fe28ea499964e..16c85e24c5a3a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx @@ -11,7 +11,7 @@ import { EuiButton, EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } f import { i18n } from '@kbn/i18n'; -import { FilteringValidationState } from '../../../../../../../common/types/connectors'; +import { FilteringValidationState } from '@kbn/search-connectors'; interface FilteringStatusCalloutsProps { applyDraft: () => void; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts index a09a37ad1e93b..bab243892a146 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorServerSideDefinition } from '../../../../../../common/connectors/connectors'; +import { ConnectorServerSideDefinition } from '@kbn/search-connectors'; export interface ConnectorClientSideDefinition { docsUrl?: string; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts index 12d00d64c1056..d7e64f9ea1550 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts @@ -7,7 +7,7 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; import { CrawlerIndex } from '../../../../../../../common/types/indices'; import { Actions } from '../../../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx index 53daad3dc6d80..7cda2cb4702e3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx @@ -22,7 +22,8 @@ import { import { i18n } from '@kbn/i18n'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; + import { CrawlerIndex } from '../../../../../../../common/types/indices'; import { EnterpriseSearchCronEditor } from '../../../../../shared/cron_editor/enterprise_search_cron_editor'; import { docLinks } from '../../../../../shared/doc_links/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts index aa98f838a8e18..1266c143ba51f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; + import { CrawlerCustomSchedulesServer } from '../../../../../../../common/types/crawler'; import { CrawlerIndex } from '../../../../../../../common/types/indices'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts index 9298ca3b32585..2bf7d4646d8d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts @@ -7,8 +7,9 @@ import { kea, MakeLogicType } from 'kea'; +import { Connector } from '@kbn/search-connectors'; + import { Status } from '../../../../../../../common/types/api'; -import { Connector } from '../../../../../../../common/types/connectors'; import { UpdateHtmlExtractionActions, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts index 4bdcf6270f19e..65f61fd0d48ad 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts @@ -12,11 +12,11 @@ import { } from '../../../__mocks__/kea_logic'; import { apiIndex, connectorIndex, crawlerIndex } from '../../__mocks__/view_index.mock'; +import { SyncStatus } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { Status } from '../../../../../common/types/api'; -import { SyncStatus } from '../../../../../common/types/connectors'; import { StartSyncApiLogic } from '../../api/connector/start_sync_api_logic'; import { CachedFetchIndexApiLogic } from '../../api/index/cached_fetch_index_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts index 7605910777dcc..f939b3b3dea63 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts @@ -9,13 +9,9 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; +import { Connector, FeatureName, IngestPipelineParams, SyncStatus } from '@kbn/search-connectors'; + import { Status } from '../../../../../common/types/api'; -import { - Connector, - FeatureName, - IngestPipelineParams, - SyncStatus, -} from '../../../../../common/types/connectors'; import { Actions } from '../../../shared/api_logic/create_api_logic'; import { flashSuccessToast } from '../../../shared/flash_messages'; import { KibanaLogic } from '../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts index dbe0610b4a855..ced2cc0d98099 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts @@ -7,9 +7,10 @@ import { kea, MakeLogicType } from 'kea'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../common/constants'; import { Status } from '../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; import { KibanaLogic } from '../../../shared/kibana'; import { GenerateApiKeyLogic } from '../../api/generate_api_key/generate_api_key_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx index 087ceda6a8d9d..a0e9e0949bc0c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx @@ -18,7 +18,8 @@ import { import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { ElasticsearchIndexWithIngestion } from '../../../../../../../common/types/indices'; import { isApiIndex } from '../../../../utils/indices'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx index 1dcffe443855e..e5e3d2a030615 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx @@ -28,7 +28,8 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { docLinks } from '../../../../../shared/doc_links'; import { CurlRequest } from '../../components/curl_request/curl_request'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx index 96566f60972ab..140d88a6e9740 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx @@ -10,7 +10,8 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { SettingsCheckableCard } from '../../shared/settings_checkable_card/settings_checkable_card'; interface PipelineSettingsFormProps { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts index bf71dc215243f..ccb86f1a7ecb2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts @@ -11,10 +11,11 @@ import { IngestPipeline } from '@elastic/elasticsearch/lib/api/types'; import { i18n } from '@kbn/i18n'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../../common/constants'; import { HttpError } from '../../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; import { ElasticsearchIndexWithIngestion } from '../../../../../../common/types/indices'; import { InferencePipeline } from '../../../../../../common/types/pipelines'; import { Actions } from '../../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx index 85c65f78a93f6..907072a720210 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TriggerMethod } from '../../../../../../common/types/connectors'; +import { TriggerMethod } from '@kbn/search-connectors'; import { SyncJobEventsPanel } from './events_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx index 00c67249523c3..04134c791a229 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx @@ -13,7 +13,8 @@ import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { TriggerMethod } from '../../../../../../common/types/connectors'; +import { TriggerMethod } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { FlyoutPanel } from './flyout_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx index 007a3b60b7900..14a46c8373ad9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx @@ -9,11 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { - FilteringPolicy, - FilteringRule, - FilteringRuleRule, -} from '../../../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRule, FilteringRuleRule } from '@kbn/search-connectors'; import { FilteringPanel } from './filtering_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx index f5807525dbabe..8f5dee105df4e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx @@ -11,7 +11,7 @@ import { EuiCodeBlock, EuiPanel, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; import { FilteringRulesTable } from '../../shared/filtering_rules_table/filtering_rules_table'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx index 191961ad0b21b..f0a3d3945df71 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx @@ -11,7 +11,7 @@ import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { FlyoutPanel } from './flyout_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx index 03e0e4b17e51a..f57b45dee7abc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx @@ -11,7 +11,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { SyncStatus, TriggerMethod } from '../../../../../../common/types/connectors'; +import { SyncStatus, TriggerMethod } from '@kbn/search-connectors'; import { SyncJobCallouts } from './sync_callouts'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx index 461132980c66b..7c8a26617f2a8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx @@ -13,7 +13,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { SyncStatus, TriggerMethod } from '../../../../../../common/types/connectors'; +import { SyncStatus, TriggerMethod } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { durationToText } from '../../../utils/duration_to_text'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx index 84fd9a30436d3..c659320614c6c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx @@ -13,7 +13,8 @@ import { EuiBadge, EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { SyncJobType, SyncStatus } from '../../../../../../common/types/connectors'; +import { SyncJobType, SyncStatus } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { pageToPagination } from '../../../../shared/pagination/page_to_pagination'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts index d5f21cc46b273..7ccc28de37772 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts @@ -9,16 +9,11 @@ import { LogicMounter, mockFlashMessageHelpers } from '../../../../__mocks__/kea import moment from 'moment'; +import { ConnectorSyncJob, SyncJobType, SyncStatus, TriggerMethod } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { HttpError, Status } from '../../../../../../common/types/api'; -import { - ConnectorSyncJob, - SyncJobType, - SyncStatus, - TriggerMethod, -} from '../../../../../../common/types/connectors'; import { FetchSyncJobsApiLogic } from '../../../api/connector/fetch_sync_jobs_api_logic'; import { IndexViewLogic } from '../index_view_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts index cd17eb9a931d6..900b3a8360728 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts @@ -9,9 +9,10 @@ import { kea, MakeLogicType } from 'kea'; import moment from 'moment'; +import { ConnectorSyncJob } from '@kbn/search-connectors'; + import { Status } from '../../../../../../common/types/api'; -import { ConnectorSyncJob } from '../../../../../../common/types/connectors'; import { Page, Paginate } from '../../../../../../common/types/pagination'; import { Actions } from '../../../../shared/api_logic/create_api_logic'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts index 8455b563b4022..de14705f2b234 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts @@ -11,12 +11,11 @@ import { connectorIndex, elasticsearchViewIndices } from '../../__mocks__/view_i import moment from 'moment'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { HttpError, Status } from '../../../../../common/types/api'; -import { ConnectorStatus, SyncStatus } from '../../../../../common/types/connectors'; - import { FetchIndicesAPILogic } from '../../api/index/fetch_indices_api_logic'; import { IngestionMethod, IngestionStatus } from '../../types'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx index aee36cda0b348..244e4a48eca54 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx @@ -19,7 +19,7 @@ import { import { i18n } from '@kbn/i18n'; -import { NATIVE_CONNECTOR_DEFINITIONS } from '../../../../../common/connectors/native_connectors'; +import { NATIVE_CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; import { Meta } from '../../../../../common/types/pagination'; import { healthColorsMap } from '../../../shared/constants/health_colors'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts index 240ca8e43c15b..43ccf6f47ca39 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts @@ -9,10 +9,11 @@ import { kea, MakeLogicType } from 'kea'; import { isDeepEqual } from 'react-use/lib/util'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../common/constants'; import { Status } from '../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; import { Actions } from '../../../shared/api_logic/create_api_logic'; import { KibanaLogic } from '../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx index fc31f7892261d..763664329b19c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx @@ -11,11 +11,7 @@ import { EuiBasicTable, EuiBasicTableColumn, EuiCode } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { - FilteringRule, - FilteringPolicy, - FilteringRuleRule, -} from '../../../../../../common/types/connectors'; +import { FilteringRule, FilteringPolicy, FilteringRuleRule } from '@kbn/search-connectors'; import { filteringPolicyToText, filteringRuleToText } from '../../../utils/filtering_rule_helpers'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts index 44d832a0ef51d..b04dd1b37bf4a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { FilteringPolicy, FilteringRuleRule } from '../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRuleRule } from '@kbn/search-connectors'; const filteringRuleStringMap: Record = { [FilteringRuleRule.CONTAINS]: i18n.translate( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts index b9cadd80181b8..6b6d8a53b2c30 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts @@ -5,8 +5,9 @@ * 2.0. */ +import { ConnectorConfiguration } from '@kbn/search-connectors'; + import { isConfigEntry } from '../../../../common/connectors/is_category_entry'; -import { ConnectorConfiguration } from '../../../../common/types/connectors'; export const hasConfiguredConfiguration = (configuration: ConnectorConfiguration) => { return !Object.entries(configuration).find( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts index e5e4273555b55..13e3482064ff6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts @@ -9,7 +9,8 @@ import { connectorIndex, crawlerIndex, apiIndex } from '../__mocks__/view_index. import moment from 'moment'; -import { ConnectorStatus, SyncStatus } from '../../../../common/types/connectors'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; + import { IngestionMethod, IngestionStatus } from '../types'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts index e420ab0cf8dcf..2323b1b22cf5f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts @@ -9,8 +9,9 @@ import moment from 'moment'; import { i18n } from '@kbn/i18n'; +import { SyncStatus, ConnectorStatus } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; -import { SyncStatus, ConnectorStatus } from '../../../../common/types/connectors'; import { ConnectorIndex, CrawlerIndex, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts index 4272eaf11641e..5f11fabe1bc48 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SyncStatus } from '../../../../common/types/connectors'; +import { SyncStatus } from '@kbn/search-connectors'; import { syncStatusToColor, syncStatusToText } from './sync_status_to_text'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts index 6868fba40e59f..83b3245999dfc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { SyncJobType, SyncStatus } from '../../../../common/types/connectors'; +import { SyncJobType, SyncStatus } from '@kbn/search-connectors'; export function syncStatusToText(status: SyncStatus): string { switch (status) { diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx index 7b915f08c5df9..f31b26cd76e85 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx @@ -9,7 +9,7 @@ import React, { useState } from 'react'; import { Frequency } from '@kbn/es-ui-shared-plugin/public/components/cron_editor/types'; -import { ConnectorScheduling } from '../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; import { CronEditor } from './cron_editor'; diff --git a/x-pack/plugins/enterprise_search/server/api/connectors_service.ts b/x-pack/plugins/enterprise_search/server/api/connectors_service.ts deleted file mode 100644 index f13f02cb50796..0000000000000 --- a/x-pack/plugins/enterprise_search/server/api/connectors_service.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IClusterClient } from '@kbn/core-elasticsearch-server'; -import { HttpServiceStart, KibanaRequest } from '@kbn/core-http-server'; - -import { CONNECTOR_DEFINITIONS } from '../../common/connectors/connectors'; - -import { Connector, IngestPipelineParams } from '../../common/types/connectors'; - -import { addConnector } from '../lib/connectors/add_connector'; -import { fetchConnectors } from '../lib/connectors/fetch_connectors'; - -export class ConnectorsService { - private readonly clusterClient: IClusterClient; - private readonly http: HttpServiceStart; - - constructor({ clusterClient, http }: { clusterClient: IClusterClient; http: HttpServiceStart }) { - this.clusterClient = clusterClient; - this.http = http; - } - - async createConnector( - request: KibanaRequest, - input: { - indexName: string | null; - isNative: boolean; - language: string | null; - pipeline?: IngestPipelineParams | null; - serviceType: string | null; - } - ): Promise { - return await addConnector(this.clusterClient.asScoped(request), input); - } - - getConnectorTypes() { - return CONNECTOR_DEFINITIONS.map((connector) => ({ - ...connector, - iconPath: connector.iconPath - ? this.http.basePath.prepend( - `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` - ) - : 'logoEnterpriseSearch', - })); - } - - async getConnectors(request: KibanaRequest): Promise { - return await fetchConnectors(this.clusterClient.asScoped(request)); - } -} diff --git a/x-pack/plugins/enterprise_search/server/index.ts b/x-pack/plugins/enterprise_search/server/index.ts index e7df036ada1a4..a82d6f18a3b26 100644 --- a/x-pack/plugins/enterprise_search/server/index.ts +++ b/x-pack/plugins/enterprise_search/server/index.ts @@ -52,11 +52,7 @@ export const config: PluginConfigDescriptor = { }, schema: configSchema, }; -export const CONNECTORS_INDEX = '.elastic-connectors'; -export const CURRENT_CONNECTORS_INDEX = '.elastic-connectors-v1'; -export const CONNECTORS_JOBS_INDEX = '.elastic-connectors-sync-jobs'; -export const CURRENT_CONNECTORS_JOB_INDEX = '.elastic-connectors-sync-jobs-v1'; -export const CONNECTORS_VERSION = 1; + export const CRAWLERS_INDEX = '.ent-search-actastic-crawler2_configurations_v2'; export type EnterpriseSearchPluginStart = PluginStart; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts index fe18dbccda2d8..cd15faf6b90c1 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts @@ -7,19 +7,24 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { + createConnector, + fetchConnectorByIndexName, + deleteConnectorById, +} from '@kbn/search-connectors'; + import { ErrorCode } from '../../../common/types/error_codes'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { textAnalysisSettings } from '../indices/text_analysis'; import { addConnector } from './add_connector'; -import { deleteConnectorById } from './delete_connector'; -import { fetchConnectorByIndexName } from './fetch_connectors'; -jest.mock('./fetch_connectors', () => ({ fetchConnectorByIndexName: jest.fn() })); -jest.mock('./delete_connector', () => ({ deleteConnectorById: jest.fn() })); +jest.mock('@kbn/search-connectors', () => ({ + createConnector: jest.fn(), + deleteConnectorById: jest.fn(), + fetchConnectorByIndexName: jest.fn(), +})); jest.mock('../crawler/fetch_crawlers', () => ({ fetchCrawlerByIndexName: jest.fn() })); describe('addConnector lib function', () => { @@ -57,6 +62,10 @@ describe('addConnector lib function', () => { it('should add connector', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -69,95 +78,17 @@ describe('addConnector lib function', () => { language: 'fr', }) ).resolves.toEqual(expect.objectContaining({ id: 'fakeId', index_name: 'index_name' })); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'index_name', - is_native: false, - language: 'fr', - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'index_name', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, + expect(createConnector).toHaveBeenCalledWith(mockClient.asCurrentUser, { + indexName: 'index_name', + isNative: false, + language: 'fr', + name: 'index_name', + pipeline: { + extract_binary_content: true, + name: 'ent-search-generic-ingestion', + reduce_whitespace: true, + run_ml_inference: false, }, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', }); expect(mockClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'index_name', @@ -168,6 +99,10 @@ describe('addConnector lib function', () => { it('should reject if index already exists', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => true); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -202,6 +137,10 @@ describe('addConnector lib function', () => { it('should reject if crawler already exists', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => true); @@ -215,6 +154,7 @@ describe('addConnector lib function', () => { }) ).rejects.toEqual(new Error(ErrorCode.CRAWLER_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); + expect(createConnector).not.toHaveBeenCalled(); }); it('should reject with index already exists if connector and index already exist', async () => { @@ -232,10 +172,15 @@ describe('addConnector lib function', () => { }) ).rejects.toEqual(new Error(ErrorCode.INDEX_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); + expect(createConnector).not.toHaveBeenCalled(); }); it('should replace connector if deleteExistingConnector flag is true', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => ({ id: 'connectorId' })); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -249,96 +194,19 @@ describe('addConnector lib function', () => { language: null, }) ).resolves.toEqual(expect.objectContaining({ id: 'fakeId', index_name: 'index_name' })); - expect(deleteConnectorById).toHaveBeenCalledWith(mockClient, 'connectorId'); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'index_name', - is_native: true, - language: null, - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'index_name', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, + expect(deleteConnectorById).toHaveBeenCalledWith(mockClient.asCurrentUser, 'connectorId'); + expect(createConnector).toHaveBeenCalledWith(mockClient.asCurrentUser, { + deleteExistingConnector: true, + indexName: 'index_name', + isNative: true, + language: null, + name: 'index_name', + pipeline: { + extract_binary_content: true, + name: 'ent-search-generic-ingestion', + reduce_whitespace: true, + run_ml_inference: false, }, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', }); expect(mockClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'index_name', diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts index 891a3e14a2a62..623b2f21c2c05 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts @@ -7,30 +7,35 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; import { + createConnector, Connector, - ConnectorDocument, - IngestPipelineParams, -} from '../../../common/types/connectors'; + deleteConnectorById, + ConnectorStatus, +} from '@kbn/search-connectors'; + +import { fetchConnectorByIndexName, NATIVE_CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; + import { ErrorCode } from '../../../common/types/error_codes'; -import { createConnectorDocument } from '../../utils/create_connector_document'; +import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { createIndex } from '../indices/create_index'; import { getDefaultPipeline } from '../pipelines/get_default_pipeline'; -import { deleteConnectorById } from './delete_connector'; - -import { fetchConnectorByIndexName } from './fetch_connectors'; - -const createConnector = async ( - document: ConnectorDocument, +export const addConnector = async ( client: IScopedClusterClient, - language: string | null, - deleteExisting: boolean + input: { + deleteExistingConnector?: boolean; + indexName: string | null; + isNative: boolean; + language: string | null; + serviceType?: string | null; + } ): Promise => { - const index = document.index_name; + const index = input.indexName; if (index) { const indexExists = await client.asCurrentUser.indices.exists({ index }); if (indexExists) { @@ -39,10 +44,10 @@ const createConnector = async ( } } - const connector = await fetchConnectorByIndexName(client, index); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, index); if (connector) { - if (deleteExisting) { - await deleteConnectorById(client, connector.id); + if (input.deleteExistingConnector) { + await deleteConnectorById(client.asCurrentUser, connector.id); } else { throw new Error(ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS); } @@ -52,35 +57,35 @@ const createConnector = async ( if (crawler) { throw new Error(ErrorCode.CRAWLER_ALREADY_EXISTS); } - await createIndex(client, index, language, false); + await createIndex(client, index, input.language, false); } - const result = await client.asCurrentUser.index({ - document, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', - }); - return { ...document, id: result._id }; -}; + const nativeConnector = + input.isNative && input.serviceType + ? NATIVE_CONNECTOR_DEFINITIONS[input.serviceType] + : undefined; -export const addConnector = async ( - client: IScopedClusterClient, - input: { - deleteExistingConnector?: boolean; - indexName: string | null; - isNative: boolean; - language: string | null; - pipeline?: IngestPipelineParams | null; - serviceType?: string | null; + if ( + input.isNative && + input.serviceType && + !nativeConnector && + input.serviceType !== ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE + ) { + throw new Error(`Could not find connector definition for service type ${input.serviceType}`); } -): Promise => { - const pipeline = input.pipeline || (await getDefaultPipeline(client)); - const document = createConnectorDocument({ + const nativeFields = nativeConnector + ? { + configuration: nativeConnector.configuration, + features: nativeConnector.features, + status: ConnectorStatus.NEEDS_CONFIGURATION, + } + : {}; + + return await createConnector(client.asCurrentUser, { ...input, - pipeline, - serviceType: input.serviceType || null, + name: stripSearchPrefix(input.indexName || ''), + ...nativeFields, + pipeline: await getDefaultPipeline(client), }); - - return await createConnector(document, client, input.language, !!input.deleteExistingConnector); }; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts deleted file mode 100644 index cd935f32c2c15..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; - -import { CONNECTORS_INDEX } from '../..'; - -import { cancelSyncs } from './post_cancel_syncs'; - -export const deleteConnectorById = async (client: IScopedClusterClient, id: string) => { - // timeout function to mitigate race condition with external connector running job and recreating index - const timeout = async () => { - const promise = new Promise((resolve) => setTimeout(resolve, 500)); - return promise; - }; - await Promise.all([cancelSyncs(client, id), timeout]); - return await client.asCurrentUser.delete({ id, index: CONNECTORS_INDEX, refresh: 'wait_for' }); -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts deleted file mode 100644 index 7d087f8e74c75..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; -import { isIndexNotFoundException } from '@kbn/core-saved-objects-migration-server-internal'; - -import { CONNECTORS_INDEX } from '../..'; - -export async function fetchConnectorIndexNames(client: IScopedClusterClient): Promise { - try { - const result = await client.asCurrentUser.search({ - _source: false, - fields: [{ field: 'index_name' }], - index: CONNECTORS_INDEX, - size: 10000, - }); - return (result?.hits.hits ?? []).map((field) => field.fields?.index_name[0] ?? ''); - } catch (error) { - if (isIndexNotFoundException(error)) { - return []; - } - throw error; - } -} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts deleted file mode 100644 index 6b3039974f8a4..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; - -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; - -export const putUpdateNative = async ( - client: IScopedClusterClient, - connectorId: string, - isNative: boolean -) => { - const result = await client.asCurrentUser.update({ - doc: { - is_native: isNative, - }, - id: connectorId, - index: CONNECTORS_INDEX, - }); - - return result; -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts index 90d82c82aca93..6498d3f4d1a03 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts @@ -6,15 +6,19 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; +import { + CONNECTORS_INDEX, + SyncJobType, + SyncStatus, + TriggerMethod, + CURRENT_CONNECTORS_JOB_INDEX, +} from '@kbn/search-connectors'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '../..'; import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '../../../common/constants'; -import { SyncJobType, SyncStatus, TriggerMethod } from '../../../common/types/connectors'; - import { ErrorCode } from '../../../common/types/error_codes'; -import { startConnectorSync } from './start_sync'; +import { startSync } from './start_sync'; describe('startSync lib function', () => { const mockClient = { @@ -31,7 +35,7 @@ describe('startSync lib function', () => { }); it('should start a full sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -61,11 +65,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).resolves.toEqual({ _id: 'fakeId' }); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ document: { @@ -98,8 +98,8 @@ describe('startSync lib function', () => { index: CURRENT_CONNECTORS_JOB_INDEX, }); }); - it('should start a full sync with service type, pipeline and nextSyncConfig', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + it('should start a full sync with service type, pipeline', async () => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _source: { api_key_id: null, @@ -126,12 +126,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL, - 'syncConfig' - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).resolves.toEqual({ _id: 'fakeId' }); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ document: { @@ -141,7 +136,6 @@ describe('startSync lib function', () => { connector: { configuration: { config: { label: 'label', value: 'haha' }, - nextSyncConfig: { label: 'nextSyncConfig', value: 'syncConfig' }, }, filtering: 'filtering', id: 'connectorId', @@ -169,21 +163,17 @@ describe('startSync lib function', () => { }); it('should not create index if there is no connector', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({}); }); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).rejects.toEqual(new Error(ErrorCode.RESOURCE_NOT_FOUND)); expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); }); it('should set sync_now for crawler and not index a sync job', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _primary_term: 1, _seq_no: 10, @@ -212,7 +202,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.update.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL, @@ -236,7 +226,7 @@ describe('startSync lib function', () => { }); it('should start an incremental sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -265,7 +255,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.INCREMENTAL @@ -304,7 +294,7 @@ describe('startSync lib function', () => { }); it('should start an access control sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -332,7 +322,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.ACCESS_CONTROL diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts index faac79a29c0a7..808fd2fc0d40e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts @@ -7,7 +7,14 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '../..'; +import { + ConnectorConfiguration, + ConnectorDocument, + SyncJobType, + CONNECTORS_INDEX, + startConnectorSync, +} from '@kbn/search-connectors'; + import { isConfigEntry } from '../../../common/connectors/is_category_entry'; import { @@ -15,21 +22,14 @@ import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, } from '../../../common/constants'; -import { - ConnectorConfiguration, - ConnectorDocument, - SyncJobType, - SyncStatus, - TriggerMethod, -} from '../../../common/types/connectors'; import { ErrorCode } from '../../../common/types/error_codes'; import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; -export const startConnectorSync = async ( +export const startSync = async ( client: IScopedClusterClient, connectorId: string, jobType: SyncJobType, - nextSyncConfig?: string + nextSyncConfig?: string // only processed for elastic-crawler service types ) => { const connectorResult = await client.asCurrentUser.get({ id: connectorId, @@ -49,9 +49,7 @@ export const startConnectorSync = async ( nextSyncConfig: { label: 'nextSyncConfig', value: nextSyncConfig }, } : config; - const { filtering, index_name, language, pipeline, service_type } = connector; - - const now = new Date().toISOString(); + const { index_name } = connector; if (connector.service_type === ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE) { return await client.asCurrentUser.update({ @@ -70,37 +68,12 @@ export const startConnectorSync = async ( const targetIndexName = jobType === SyncJobType.ACCESS_CONTROL ? `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}${indexNameWithoutSearchPrefix}` - : index_name; + : index_name ?? undefined; - return await client.asCurrentUser.index({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration, - filtering: filtering ? filtering[0]?.active ?? null : null, - id: connectorId, - index_name: targetIndexName, - language, - pipeline: pipeline ?? null, - service_type, - }, - created_at: now, - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: jobType, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, + return await startConnectorSync(client.asCurrentUser, { + connectorId, + jobType, + targetIndexName, }); } else { throw new Error(ErrorCode.RESOURCE_NOT_FOUND); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts deleted file mode 100644 index caf8bbc7c7ce9..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; -import { i18n } from '@kbn/i18n'; - -import { CONNECTORS_INDEX } from '../..'; - -import { ConnectorDocument, ConnectorStatus } from '../../../common/types/connectors'; - -export const updateConnectorStatus = async ( - client: IScopedClusterClient, - connectorId: string, - status: ConnectorStatus -) => { - const connectorResult = await client.asCurrentUser.get({ - id: connectorId, - index: CONNECTORS_INDEX, - }); - const connector = connectorResult._source; - if (connector) { - const result = await client.asCurrentUser.index({ - document: { ...connector, status }, - id: connectorId, - index: CONNECTORS_INDEX, - }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); - return result; - } else { - throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { - defaultMessage: 'Could not find document', - }) - ); - } -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts index 666921a950a8c..d367e02ed6ab1 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts @@ -7,8 +7,9 @@ import { IScopedClusterClient } from '@kbn/core/server'; +import { Connector } from '@kbn/search-connectors'; + import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; const CUSTOM_SCHEDULING = 'custom_scheduling'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts index 9f6890fb9b8ab..b4766cf0d9d4b 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts @@ -7,9 +7,8 @@ import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { IScopedClusterClient } from '@kbn/core/server'; +import { Connector, CONNECTORS_INDEX } from '@kbn/search-connectors'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; import { Crawler, CrawlRequest } from '../../../common/types/crawler'; import { fetchAll } from '../fetch_all'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts index 8c6ad6cbb6a84..7a8f5edd80330 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, ConnectorStatus } from '@kbn/search-connectors'; import { recreateConnectorDocument } from './post_connector'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts index 17bf6945d0d82..292e07809b7bd 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts @@ -7,12 +7,10 @@ import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { createConnectorDocument, CONNECTORS_INDEX, ConnectorStatus } from '@kbn/search-connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { ConnectorStatus } from '../../../common/types/connectors'; - -import { createConnectorDocument } from '../../utils/create_connector_document'; +import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; export const recreateConnectorDocument = async ( client: IScopedClusterClient, @@ -23,6 +21,7 @@ export const recreateConnectorDocument = async ( isNative: false, // The search index has already been created so we don't need the language, which we can't retrieve anymore anyway language: '', + name: stripSearchPrefix(indexName), pipeline: null, serviceType: ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, }); diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts index 9789be5e40cb1..9e5c62a3d9464 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; +import { Connector, CONNECTORS_INDEX } from '@kbn/search-connectors'; import { updateHtmlExtraction } from './put_html_extraction'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts index 908f8c27b5a0c..f040f7af85d00 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, Connector } from '@kbn/search-connectors'; export async function updateHtmlExtraction( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts index de04b0bed2d47..3db722c0f58b2 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts @@ -8,15 +8,24 @@ import { ByteSizeValue } from '@kbn/config-schema'; import { IScopedClusterClient } from '@kbn/core/server'; +import { fetchConnectorByIndexName } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { SyncStatus } from '../../../common/types/connectors'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { fetchIndex } from './fetch_index'; -jest.mock('../connectors/fetch_connectors', () => ({ +jest.mock('@kbn/search-connectors', () => ({ + SyncStatus: { + CANCELED: 'canceled', + CANCELING: 'canceling', + COMPLETED: 'completed', + ERROR: 'error', + IN_PROGRESS: 'in_progress', + PENDING: 'pending', + SUSPENDED: 'suspended', + }, fetchConnectorByIndexName: jest.fn(), })); @@ -35,10 +44,7 @@ describe('fetchIndex lib function', () => { }, search: jest.fn().mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.IN_PROGRESS } }, - { _source: { status: SyncStatus.PENDING } }, - ], + hits: [{ _source: { status: 'in_progress' } }, { _source: { status: 'pending' } }], }, }), }, @@ -111,10 +117,7 @@ describe('fetchIndex lib function', () => { it('should return data and stats for index and connector if connector is present', async () => { mockClient.asCurrentUser.search.mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.CANCELED } }, - { _source: { status: SyncStatus.PENDING } }, - ], + hits: [{ _source: { status: 'canceled' } }, { _source: { status: 'pending' } }], }, }); mockClient.asCurrentUser.indices.get.mockImplementation(() => @@ -169,10 +172,7 @@ describe('fetchIndex lib function', () => { mockClient.asCurrentUser.count.mockReturnValue({ count: 0 }); mockClient.asCurrentUser.search.mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.IN_PROGRESS } }, - { _source: { status: SyncStatus.COMPLETED } }, - ], + hits: [{ _source: { status: 'in_progress' } }, { _source: { status: 'completed' } }], }, }); mockClient.asCurrentUser.indices.get.mockImplementation(() => diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts index 4233f8abbeff1..41875daad3717 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts @@ -7,13 +7,18 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_JOBS_INDEX } from '../..'; +import {} from '../..'; + +import { + CONNECTORS_JOBS_INDEX, + ConnectorSyncJobDocument, + fetchConnectorByIndexName, + SyncStatus, +} from '@kbn/search-connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { ConnectorSyncJobDocument, SyncStatus } from '../../../common/types/connectors'; import { ElasticsearchIndexWithIngestion } from '../../../common/types/indices'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { mapIndexStats } from './utils/map_index_stats'; @@ -69,7 +74,7 @@ export const fetchIndex = async ( } const indexStats = indices[index]; - const connector = await fetchConnectorByIndexName(client, index); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, index); const hasInProgressSyncsResult = connector ? await hasInProgressSyncs(client, connector.id) : { inProgress: false, pending: false }; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts index 00188b37d334a..a28450108290a 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts @@ -7,7 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '@kbn/search-connectors'; import { generateApiKey } from './generate_api_key'; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts index f29dc327dfecc..d256bc6a91d88 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts @@ -7,8 +7,8 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorDocument } from '../../../common/types/connectors'; +import { ConnectorDocument, CONNECTORS_INDEX } from '@kbn/search-connectors'; + import { toAlphanumeric } from '../../../common/utils/to_alphanumeric'; export const generateApiKey = async (client: IScopedClusterClient, indexName: string) => { diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts index c13ee2571b82b..66619b99ef96e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts @@ -7,11 +7,11 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; +import { CURRENT_CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../common/constants'; import { DefaultConnectorsPipelineMeta } from '../../../common/constants'; -import { IngestPipelineParams } from '../../../common/types/connectors'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; export const getDefaultPipeline = async ( diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts index 45813a109de76..54a916898740e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts @@ -6,9 +6,7 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; - -import { IngestPipelineParams } from '../../../common/types/connectors'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; +import { IngestPipelineParams, fetchConnectorByIndexName } from '@kbn/search-connectors'; import { getDefaultPipeline } from './get_default_pipeline'; @@ -20,7 +18,7 @@ export const getIndexPipelineParameters = async ( // we want to throw the error if getDefaultPipeline() fails so we're not catching it on purpose const [defaultPipeline, connector, customPipelineResp] = await Promise.all([ getDefaultPipeline(client), - fetchConnectorByIndexName(client, indexName), + fetchConnectorByIndexName(client.asCurrentUser, indexName), client.asCurrentUser.ingest .getPipeline({ id: `${indexName}`, @@ -30,11 +28,7 @@ export const getIndexPipelineParameters = async ( if (connector && connector.pipeline) { return connector.pipeline; } - let pipelineName = defaultPipeline.name; - - if (customPipelineResp && customPipelineResp[indexName]) { - pipelineName = indexName; - } + const pipelineName = customPipelineResp?.[indexName] ? indexName : defaultPipeline.name; return { ...defaultPipeline, diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts index 60a9e5cfcf97d..297456b9c00e7 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts @@ -7,16 +7,14 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; - -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; +import { CONNECTORS_INDEX, fetchConnectorByIndexName } from '@kbn/search-connectors'; import { deleteIndexPipelines } from './delete_pipelines'; import { getDefaultPipeline } from './get_default_pipeline'; export const revertCustomPipeline = async (client: IScopedClusterClient, indexName: string) => { - const connector = await fetchConnectorByIndexName(client, indexName); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, indexName); if (connector) { const pipeline = await getDefaultPipeline(client); await client.asCurrentUser.update({ diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts index 060c0edc88316..73e7e85f53d32 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts @@ -7,10 +7,9 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; +import { CURRENT_CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; import { DefaultConnectorsPipelineMeta } from '../../../common/constants'; -import { IngestPipelineParams } from '../../../common/types/connectors'; export const updateDefaultPipeline = async ( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts index 1acc91f7e2684..f8a9ef82453cb 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts @@ -7,9 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; - -import { IngestPipelineParams } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; export const updateConnectorPipeline = async ( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts index a19315507bf4c..0cf096bcd9d53 100644 --- a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts +++ b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts @@ -9,10 +9,15 @@ import moment from 'moment'; import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; +import { + CONNECTORS_INDEX, + CONNECTORS_JOBS_INDEX, + ConnectorStatus, + SyncStatus, +} from '@kbn/search-connectors'; + import { SyncJobsStats } from '../../../common/stats'; -import { ConnectorStatus, SyncStatus } from '../../../common/types/connectors'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; export const fetchSyncJobsStats = async (client: IScopedClusterClient): Promise => { diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index ed6ef8f3886bf..154a7192d35f0 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -15,8 +15,6 @@ import { IRouter, KibanaRequest, DEFAULT_APP_CATEGORIES, - IClusterClient, - CoreStart, } from '@kbn/core/server'; import { CustomIntegrationsPluginSetup } from '@kbn/custom-integrations-plugin/server'; import { DataPluginStart } from '@kbn/data-plugin/server/plugin'; @@ -51,7 +49,6 @@ import { databaseSearchGuideConfig, } from '../common/guided_onboarding/search_guide_config'; -import { ConnectorsService } from './api/connectors_service'; import { registerTelemetryUsageCollector as registerASTelemetryUsageCollector } from './collectors/app_search/telemetry'; import { registerTelemetryUsageCollector as registerESTelemetryUsageCollector } from './collectors/enterprise_search/telemetry'; import { registerTelemetryUsageCollector as registerWSTelemetryUsageCollector } from './collectors/workplace_search/telemetry'; @@ -103,10 +100,6 @@ interface PluginsStart { spaces?: SpacesPluginStart; } -export interface EnterpriseSearchPluginStart { - connectorsService: ConnectorsService; -} - export interface RouteDependencies { config: ConfigType; enterpriseSearchRequestHandler: IEnterpriseSearchRequestHandler; @@ -116,14 +109,12 @@ export interface RouteDependencies { router: IRouter; } -export class EnterpriseSearchPlugin implements Plugin { +export class EnterpriseSearchPlugin implements Plugin { private readonly config: ConfigType; private readonly logger: Logger; - private clusterClient?: IClusterClient; /** * Exposed services */ - private connectorsService?: ConnectorsService; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); @@ -259,7 +250,6 @@ export class EnterpriseSearchPlugin implements Plugin { - this.clusterClient = coreStart.elasticsearch.client; savedObjectsStarted = coreStart.savedObjects; if (usageCollection) { @@ -322,26 +312,7 @@ export class EnterpriseSearchPlugin implements Plugin({ - connectorsService: this.connectorsService, - }); - } + public start() {} public stop() {} } diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index 923009c05d098..fea646d9d726e 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -6,8 +6,18 @@ */ import { schema } from '@kbn/config-schema'; - import { i18n } from '@kbn/i18n'; +import { + fetchSyncJobsByConnectorId, + putUpdateNative, + updateConnectorConfiguration, + updateConnectorNameAndDescription, + updateConnectorScheduling, + updateConnectorServiceType, + updateConnectorStatus, + updateFiltering, + updateFilteringDraft, +} from '@kbn/search-connectors'; import { ConnectorStatus, @@ -15,21 +25,12 @@ import { FilteringRule, FilteringRuleRule, SyncJobType, -} from '../../../common/types/connectors'; +} from '@kbn/search-connectors'; +import { cancelSyncs } from '@kbn/search-connectors/lib/cancel_syncs'; import { ErrorCode } from '../../../common/types/error_codes'; import { addConnector } from '../../lib/connectors/add_connector'; -import { fetchSyncJobsByConnectorId } from '../../lib/connectors/fetch_sync_jobs'; -import { cancelSyncs } from '../../lib/connectors/post_cancel_syncs'; -import { updateFiltering } from '../../lib/connectors/put_update_filtering'; -import { updateFilteringDraft } from '../../lib/connectors/put_update_filtering_draft'; -import { putUpdateNative } from '../../lib/connectors/put_update_native'; -import { startConnectorSync } from '../../lib/connectors/start_sync'; -import { updateConnectorConfiguration } from '../../lib/connectors/update_connector_configuration'; -import { updateConnectorNameAndDescription } from '../../lib/connectors/update_connector_name_and_description'; -import { updateConnectorScheduling } from '../../lib/connectors/update_connector_scheduling'; -import { updateConnectorServiceType } from '../../lib/connectors/update_connector_service_type'; -import { updateConnectorStatus } from '../../lib/connectors/update_connector_status'; +import { startSync } from '../../lib/connectors/start_sync'; import { getDefaultPipeline } from '../../lib/pipelines/get_default_pipeline'; import { updateDefaultPipeline } from '../../lib/pipelines/update_default_pipeline'; import { updateConnectorPipeline } from '../../lib/pipelines/update_pipeline'; @@ -98,7 +99,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await cancelSyncs(client, request.params.connectorId); + await cancelSyncs(client.asCurrentUser, request.params.connectorId); return response.ok(); }) ); @@ -119,7 +120,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const configuration = await updateConnectorConfiguration( - client, + client.asCurrentUser, request.params.connectorId, request.body ); @@ -143,7 +144,11 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await updateConnectorScheduling(client, request.params.connectorId, request.body); + await updateConnectorScheduling( + client.asCurrentUser, + request.params.connectorId, + request.body + ); return response.ok(); }) ); @@ -162,7 +167,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync( + await startSync( client, request.params.connectorId, SyncJobType.FULL, @@ -183,7 +188,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync(client, request.params.connectorId, SyncJobType.INCREMENTAL); + await startSync(client, request.params.connectorId, SyncJobType.INCREMENTAL); return response.ok(); }) ); @@ -199,7 +204,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync(client, request.params.connectorId, SyncJobType.ACCESS_CONTROL); + await startSync(client, request.params.connectorId, SyncJobType.ACCESS_CONTROL); return response.ok(); }) ); @@ -221,7 +226,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await fetchSyncJobsByConnectorId( - client, + client.asCurrentUser, request.params.connectorId, request.query.from, request.query.size, @@ -298,7 +303,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await updateConnectorServiceType( - client, + client.asCurrentUser, request.params.connectorId, request.body.serviceType ); @@ -319,7 +324,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await updateConnectorStatus( - client, + client.asCurrentUser, request.params.connectorId, request.body.status as ConnectorStatus ); @@ -343,10 +348,14 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const { name, description } = request.body; - const result = await updateConnectorNameAndDescription(client, request.params.connectorId, { - description, - name, - }); + const result = await updateConnectorNameAndDescription( + client.asCurrentUser, + request.params.connectorId, + { + description, + name, + } + ); return response.ok({ body: result }); }) ); @@ -383,7 +392,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const { connectorId } = request.params; const { advanced_snippet, filtering_rules } = request.body; - const result = await updateFilteringDraft(client, connectorId, { + const result = await updateFilteringDraft(client.asCurrentUser, connectorId, { advancedSnippet: advanced_snippet, // Have to cast here because our API schema validator doesn't know how to deal with enums // We're relying on the schema in the validator above to flag if something goes wrong @@ -425,7 +434,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const { connectorId } = request.params; const { advanced_snippet, filtering_rules } = request.body; - const result = await updateFiltering(client, connectorId, { + const result = await updateFiltering(client.asCurrentUser, connectorId, { advancedSnippet: advanced_snippet, // Have to cast here because our API schema validator doesn't know how to deal with enums // We're relying on the schema in the validator above to flag if something goes wrong @@ -450,7 +459,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const connectorId = decodeURIComponent(request.params.connectorId); const { is_native } = request.body; - const result = await putUpdateNative(client, connectorId, is_native); + const result = await putUpdateNative(client.asCurrentUser, connectorId, is_native); return result ? response.ok({ body: result }) : response.conflict(); }) ); diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts index c5c45806e560f..18a1c5aa8bca6 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts @@ -9,12 +9,12 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; +import { deleteConnectorById, fetchConnectorByIndexName } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; import { ErrorCode } from '../../../../common/types/error_codes'; import { addConnector } from '../../../lib/connectors/add_connector'; -import { deleteConnectorById } from '../../../lib/connectors/delete_connector'; -import { fetchConnectorByIndexName } from '../../../lib/connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../../../lib/crawler/fetch_crawlers'; import { recreateConnectorDocument } from '../../../lib/crawler/post_connector'; import { updateHtmlExtraction } from '../../../lib/crawler/put_html_extraction'; @@ -83,7 +83,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }); } - const connector = await fetchConnectorByIndexName(client, request.body.index_name); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (connector) { return createError({ errorCode: ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS, @@ -110,9 +113,12 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { return res; } catch (error) { // clean up connector index if it was created - const createdConnector = await fetchConnectorByIndexName(client, request.body.index_name); + const createdConnector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (createdConnector) { - await deleteConnectorById(client, createdConnector.id); + await deleteConnectorById(client.asCurrentUser, createdConnector.id); if (createdConnector.index_name) { await deleteIndex(client, createdConnector.index_name); } @@ -410,7 +416,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - const connector = await fetchConnectorByIndexName(client, request.params.indexName); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.params.indexName + ); if ( connector && connector.service_type === ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE @@ -444,7 +453,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - const connector = await fetchConnectorByIndexName(client, request.params.indexName); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.params.indexName + ); if (connector) { return createError({ errorCode: ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS, diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts index 25342217e5192..cc031bd3ef684 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts @@ -14,15 +14,18 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; +import { deleteConnectorById } from '@kbn/search-connectors'; +import { + fetchConnectorByIndexName, + fetchConnectors, +} from '@kbn/search-connectors/lib/fetch_connectors'; + import { DEFAULT_PIPELINE_NAME } from '../../../common/constants'; import { ErrorCode } from '../../../common/types/error_codes'; import { AlwaysShowPattern } from '../../../common/types/indices'; import type { AttachMlInferencePipelineResponse } from '../../../common/types/pipelines'; -import { deleteConnectorById } from '../../lib/connectors/delete_connector'; - -import { fetchConnectorByIndexName, fetchConnectors } from '../../lib/connectors/fetch_connectors'; import { fetchCrawlerByIndexName, fetchCrawlers } from '../../lib/crawler/fetch_crawlers'; import { createIndex } from '../../lib/indices/create_index'; @@ -113,7 +116,7 @@ export function registerIndexRoutes({ from, size ); - const connectors = await fetchConnectors(client, indexNames); + const connectors = await fetchConnectors(client.asCurrentUser, indexNames); const crawlers = await fetchCrawlers(client, indexNames); const enrichedIndices = indices.map((index) => ({ ...index, @@ -186,7 +189,7 @@ export function registerIndexRoutes({ try { const crawler = await fetchCrawlerByIndexName(client, indexName); - const connector = await fetchConnectorByIndexName(client, indexName); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, indexName); if (crawler) { const crawlerRes = await enterpriseSearchRequestHandler.createRequest({ @@ -199,7 +202,7 @@ export function registerIndexRoutes({ } if (connector) { - await deleteConnectorById(client, connector.id); + await deleteConnectorById(client.asCurrentUser, connector.id); } await deleteIndexPipelines(client, indexName); @@ -575,7 +578,10 @@ export function registerIndexRoutes({ }); } - const connector = await fetchConnectorByIndexName(client, request.body.index_name); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (connector) { return createError({ diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts index 0869a16b79dc7..3f98b5368c7d2 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts @@ -11,11 +11,9 @@ import { IBasePath } from '@kbn/core-http-server'; import { GlobalSearchResultProvider } from '@kbn/global-search-plugin/server'; import { i18n } from '@kbn/i18n'; +import { CONNECTOR_DEFINITIONS, ConnectorServerSideDefinition } from '@kbn/search-connectors'; + import { ConfigType } from '..'; -import { - CONNECTOR_DEFINITIONS, - ConnectorServerSideDefinition, -} from '../../common/connectors/connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, ENTERPRISE_SEARCH_CONTENT_PLUGIN, diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index 25cc264924d47..4195acec083ff 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -11,7 +11,6 @@ "common/**/*", "public/**/*", "server/**/*", - "../../../typings/**/*", ], "kbn_references": [ "@kbn/core", @@ -61,7 +60,7 @@ "@kbn/global-search-plugin", "@kbn/logs-shared-plugin", "@kbn/share-plugin", - "@kbn/core-saved-objects-migration-server-internal", "@kbn/search-api-panels", + "@kbn/search-connectors" ] } diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index d056148e3aa79..bcf4cc540df14 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -7,14 +7,17 @@ "id": "serverlessSearch", "server": true, "browser": true, - "configPath": ["xpack", "serverless", "search"], + "configPath": [ + "xpack", + "serverless", + "search" + ], "requiredPlugins": [ "cloud", "console", "dashboard", "devTools", "discover", - "enterpriseSearch", "grokdebugger", "management", "ml", @@ -26,6 +29,8 @@ "visualizations" ], "optionalPlugins": [], - "requiredBundles": ["kibanaReact"] + "requiredBundles": [ + "kibanaReact" + ] } } diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx index 97a3b5887389f..540c78ac521ab 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx @@ -17,13 +17,12 @@ import { EuiTitle, EuiToolTip, } from '@elastic/eui'; -import { Connector } from '@kbn/enterprise-search-plugin/common/types/connectors'; +import { Connector, ConnectorServerSideDefinition } from '@kbn/search-connectors'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { useQuery } from '@tanstack/react-query'; import React from 'react'; -import { ConnectorServerSideDefinition } from '@kbn/enterprise-search-plugin/common/connectors/connectors'; import { LEARN_MORE_LABEL } from '../../../common/i18n_string'; import { PLUGIN_ID } from '../../../common'; import { useKibanaServices } from '../hooks/use_kibana'; diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.tsx b/x-pack/plugins/serverless_search/public/application/components/overview.tsx index ddcc4e08cce13..a01ebdb941eda 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/overview.tsx @@ -38,7 +38,7 @@ import type { LanguageDefinitionSnippetArguments, } from '@kbn/search-api-panels'; import { useQuery } from '@tanstack/react-query'; -import { Connector } from '@kbn/enterprise-search-plugin/common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; import { docLinks } from '../../../common/doc_links'; import { PLUGIN_ID } from '../../../common'; import { useKibanaServices } from '../hooks/use_kibana'; diff --git a/x-pack/plugins/serverless_search/server/plugin.ts b/x-pack/plugins/serverless_search/server/plugin.ts index 2798a4333d35c..693cdc1e7035e 100644 --- a/x-pack/plugins/serverless_search/server/plugin.ts +++ b/x-pack/plugins/serverless_search/server/plugin.ts @@ -13,7 +13,6 @@ import type { CoreSetup, } from '@kbn/core/server'; import type { SecurityPluginStart } from '@kbn/security-plugin/server'; -import { EnterpriseSearchPluginStart } from '@kbn/enterprise-search-plugin/server'; import { registerApiKeyRoutes } from './routes/api_key_routes'; import { registerIndicesRoutes } from './routes/indices_routes'; @@ -27,9 +26,9 @@ import type { import { registerConnectorsRoutes } from './routes/connectors_routes'; export interface RouteDependencies { + http: CoreSetup['http']; logger: Logger; router: IRouter; - search: EnterpriseSearchPluginStart; security: SecurityPluginStart; } @@ -46,7 +45,6 @@ export class ServerlessSearchPlugin private readonly config: ServerlessSearchConfig; private readonly logger: Logger; private security?: SecurityPluginStart; - private enterpriseSearch?: EnterpriseSearchPluginStart; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); @@ -58,13 +56,12 @@ export class ServerlessSearchPlugin pluginsSetup: SetupDependencies ) { const router = http.createRouter(); - getStartServices().then(([, { enterpriseSearch, security }]) => { + getStartServices().then(([, { security }]) => { this.security = security; - this.enterpriseSearch = enterpriseSearch; const dependencies = { + http, logger: this.logger, router, - search: this.enterpriseSearch, security: this.security, }; diff --git a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts index c74c18f6d7414..766564bb9eaa7 100644 --- a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts +++ b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts @@ -5,16 +5,18 @@ * 2.0. */ +import { CONNECTOR_DEFINITIONS, fetchConnectors } from '@kbn/search-connectors'; import { RouteDependencies } from '../plugin'; -export const registerConnectorsRoutes = ({ router, search, security }: RouteDependencies) => { +export const registerConnectorsRoutes = ({ http, router }: RouteDependencies) => { router.get( { path: '/internal/serverless_search/connectors', validate: {}, }, async (context, request, response) => { - const connectors = await search.connectorsService.getConnectors(request); + const { client } = (await context.core).elasticsearch; + const connectors = await fetchConnectors(client.asCurrentUser); return response.ok({ body: { @@ -31,7 +33,14 @@ export const registerConnectorsRoutes = ({ router, search, security }: RouteDepe validate: {}, }, async (context, request, response) => { - const connectors = await search.connectorsService.getConnectorTypes(); + const connectors = CONNECTOR_DEFINITIONS.map((connector) => ({ + ...connector, + iconPath: connector.iconPath + ? http.basePath.prepend( + `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` + ) + : 'logoEnterpriseSearch', + })); return response.ok({ body: { diff --git a/x-pack/plugins/serverless_search/server/types.ts b/x-pack/plugins/serverless_search/server/types.ts index 38100d36f330e..8e8f7f15a8124 100644 --- a/x-pack/plugins/serverless_search/server/types.ts +++ b/x-pack/plugins/serverless_search/server/types.ts @@ -6,7 +6,6 @@ */ import type { SecurityPluginStart } from '@kbn/security-plugin/server'; -import type { EnterpriseSearchPluginStart } from '@kbn/enterprise-search-plugin/server'; import type { MlPluginSetup } from '@kbn/ml-plugin/server'; // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -15,7 +14,6 @@ export interface ServerlessSearchPluginSetup {} export interface ServerlessSearchPluginStart {} export interface StartDependencies { - enterpriseSearch: EnterpriseSearchPluginStart; security: SecurityPluginStart; } export interface SetupDependencies { diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json index 1187c90cd1a79..c149beabd33ec 100644 --- a/x-pack/plugins/serverless_search/tsconfig.json +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -17,7 +17,6 @@ "kbn_references": [ "@kbn/core", "@kbn/config-schema", - "@kbn/enterprise-search-plugin", "@kbn/management-plugin", "@kbn/shared-ux-chrome-navigation", "@kbn/doc-links", @@ -34,5 +33,6 @@ "@kbn/search-api-panels", "@kbn/core-lifecycle-browser", "@kbn/react-kibana-context-theme", + "@kbn/search-connectors", ] } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index e320b5a24c8be..14688c6898e1f 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -2299,36 +2299,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "Afficher les documents alentour", "discover.documentsAriaLabel": "Documents", "discover.documentsErrorTitle": "Erreur lors de la recherche", - "unifiedDocViewer.docView.table.actions.label": "Actions", - "unifiedDocViewer.docView.table.actions.open": "Actions ouvertes", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "Une ou plusieurs valeurs dans ce champ sont trop longues et ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "Ce champ comporte une ou plusieurs valeurs mal formées qui ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "Une ou plusieurs valeurs dans ce champ ont été ignorées par Elasticsearch et ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "La valeur dans ce champ est trop longue et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "La valeur dans ce champ est mal formée et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "La valeur dans ce champ a été ignorée par Elasticsearch et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.searchPlaceHolder": "Rechercher les noms de champs", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "Filtrer sur le champ", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "Filtrer sur le champ", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "Filtrer sur la valeur", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "Filtrer sur la valeur", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "Exclure la valeur", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "Exclure la valeur", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "Contient des valeurs ignorées", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "Valeur ignorée", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "Épingler le champ", - "unifiedDocViewer.docViews.table.pinFieldLabel": "Épingler le champ", "discover.docViews.table.scoreSortWarningTooltip": "Filtrez sur _score pour pouvoir récupérer les valeurs correspondantes.", - "unifiedDocViewer.docViews.table.tableTitle": "Tableau", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "Afficher/Masquer la colonne dans le tableau", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "Afficher/Masquer la colonne dans le tableau", - "unifiedDocViewer.fieldChooser.discoverField.name": "Afficher/Masquer les détails du champ", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "Impossible de filtrer sur les champs méta", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "Impossible de filtrer sur les champs scriptés", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "Les champs non indexés ou les valeurs ignorées ne peuvent pas être recherchés", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "Désépingler le champ", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "Désépingler le champ", "discover.dropZoneTableLabel": "Abandonner la zone pour ajouter un champ en tant que colonne dans la table", "discover.dscTour.stepAddFields.imageAltText": "Dans la liste Champs disponibles, cliquez sur l'icône Plus pour afficher/masquer un champ dans le tableau de documents.", "discover.dscTour.stepAddFields.title": "Ajouter des champs dans le tableau", @@ -2349,13 +2320,8 @@ "discover.embeddable.search.displayName": "rechercher", "discover.errorCalloutShowErrorMessage": "Afficher les détails", "discover.fieldChooser.availableFieldsTooltip": "Champs disponibles pour l'affichage dans le tableau.", - "unifiedDocViewer.fieldChooser.discoverField.actions": "Actions", "discover.fieldChooser.discoverField.addFieldTooltip": "Ajouter le champ en tant que colonne", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "champ multiple", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs.", - "unifiedDocViewer.fieldChooser.discoverField.name": "Champ", "discover.fieldChooser.discoverField.removeFieldTooltip": "Supprimer le champ du tableau", - "unifiedDocViewer.fieldChooser.discoverField.value": "Valeur", "discover.goToDiscoverButtonText": "Aller à Discover", "discover.grid.flyout.documentNavigation": "Navigation dans le document", "discover.grid.flyout.toastColumnAdded": "La colonne \"{columnName}\" a été ajoutée.", @@ -2371,10 +2337,8 @@ "discover.inspectorRequestDescriptionDocument": "Cette requête interroge Elasticsearch afin de récupérer les documents.", "discover.invalidFiltersWarnToast.description": "Les références d'ID de la vue de données dans certains filtres appliqués diffèrent de la vue de données actuelle.", "discover.invalidFiltersWarnToast.title": "Références d'index différentes", - "unifiedDocViewer.json.codeEditorAriaLabel": "Affichage JSON en lecture seule d’un document Elasticsearch", - "unifiedDocViewer.json.copyToClipboardLabel": "Copier dans le presse-papiers", "discover.loadingDocuments": "Chargement des documents", - "unifiedDocViewer.loadingJSON": "Chargement de JSON", + "discover.loadingResults": "Chargement des résultats", "discover.localMenu.alertsDescription": "Alertes", "discover.localMenu.fallbackReportTitle": "Recherche Discover sans titre", "discover.localMenu.inspectTitle": "Inspecter", @@ -2431,9 +2395,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "Recherche inconnue", "discover.singleDocRoute.errorTitle": "Une erreur s'est produite", "discover.skipToBottomButtonLabel": "Atteindre la fin du tableau", - "unifiedDocViewer.sourceViewer.errorMessage": "Impossible de récupérer les données pour le moment. Actualisez l'onglet et réessayez.", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "Une erreur s'est produite.", - "unifiedDocViewer.sourceViewer.refresh": "Actualiser", "discover.toggleSidebarAriaLabel": "Activer/Désactiver la barre latérale", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "Gérer les recherches", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "Aucune recherche correspondante trouvée.", @@ -2450,25 +2411,73 @@ "discover.viewAlert.searchSourceErrorTitle": "Erreur lors de la récupération de la source de recherche", "discover.viewModes.document.label": "Documents", "discover.viewModes.fieldStatistics.label": "Statistiques de champ", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} – Ce champ représente l'heure à laquelle les événements se sont produits.", - "unifiedDataTable.searchGenerationWithDescription": "Tableau généré par la recherche {searchTitle}", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "Tableau généré par la recherche {searchTitle} ({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr} documents sélectionnés", - "unifiedDataTable.clearSelection": "Effacer la sélection", - "unifiedDataTable.controlColumnHeader": "Colonne de commande", - "unifiedDataTable.copyToClipboardJSON": "Copier les documents dans le presse-papiers (JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "Ce champ représente l'heure à laquelle les événements se sont produits.", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "Copier le nom", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "Copier la colonne", - "unifiedDataTable.grid.documentHeader": "Document", - "unifiedDataTable.grid.editFieldButton": "Modifier le champ de la vue de données", - "unifiedDataTable.grid.selectDoc": "Sélectionner le document \"{rowNumber}\"", - "unifiedDataTable.loadingResults": "Chargement des résultats", - "unifiedDataTable.noResultsFound": "Résultat introuvable", - "unifiedDataTable.removeColumnLabel": "Supprimer la colonne", - "unifiedDataTable.selectColumnHeader": "Sélectionner la colonne", - "unifiedDataTable.showAllDocuments": "Afficher tous les documents", - "unifiedDataTable.showSelectedDocumentsOnly": "Afficher uniquement les documents sélectionnés", + "discover.fieldNameIcons.binaryAriaLabel": "Binaire", + "discover.fieldNameIcons.booleanAriaLabel": "Booléen", + "discover.fieldNameIcons.conflictFieldAriaLabel": "Conflit", + "discover.fieldNameIcons.counterFieldAriaLabel": "Indicateur de compteur", + "discover.fieldNameIcons.dateFieldAriaLabel": "Date", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "Plage de dates", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "Vecteur dense", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "Lissé", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "Indicateur de jauge", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "Point géographique", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "Forme géométrique", + "discover.fieldNameIcons.histogramFieldAriaLabel": "Histogramme", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "Adresse IP", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "Plage d'IP", + "discover.fieldNameIcons.keywordFieldAriaLabel": "Mot-clé", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "Imbriqué", + "discover.fieldNameIcons.numberFieldAriaLabel": "Nombre", + "discover.fieldNameIcons.pointFieldAriaLabel": "Point", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "Fonctionnalité de rang", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "Fonctionnalités de rang", + "discover.fieldNameIcons.recordAriaLabel": "Enregistrements", + "discover.fieldNameIcons.shapeFieldAriaLabel": "Forme", + "discover.fieldNameIcons.sourceFieldAriaLabel": "Champ source", + "discover.fieldNameIcons.stringFieldAriaLabel": "Chaîne", + "discover.fieldNameIcons.textFieldAriaLabel": "Texte", + "discover.fieldNameIcons.unknownFieldAriaLabel": "Champ inconnu", + "discover.fieldNameIcons.versionFieldAriaLabel": "Version", + "unifiedDocViewer.docView.table.actions.label": "Actions", + "unifiedDocViewer.docView.table.actions.open": "Actions ouvertes", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "Une ou plusieurs valeurs dans ce champ sont trop longues et ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "Ce champ comporte une ou plusieurs valeurs mal formées qui ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "Une ou plusieurs valeurs dans ce champ ont été ignorées par Elasticsearch et ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "La valeur dans ce champ est trop longue et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "La valeur dans ce champ est mal formée et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "La valeur dans ce champ a été ignorée par Elasticsearch et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.searchPlaceHolder": "Rechercher les noms de champs", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "Filtrer sur le champ", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "Filtrer sur le champ", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "Filtrer sur la valeur", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "Filtrer sur la valeur", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "Exclure la valeur", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "Exclure la valeur", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "Contient des valeurs ignorées", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "Valeur ignorée", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "Épingler le champ", + "unifiedDocViewer.docViews.table.pinFieldLabel": "Épingler le champ", + "unifiedDocViewer.docViews.table.tableTitle": "Tableau", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "Afficher/Masquer la colonne dans le tableau", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "Afficher/Masquer la colonne dans le tableau", + "unifiedDocViewer.fieldChooser.discoverField.name": "Champ", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "Impossible de filtrer sur les champs méta", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "Impossible de filtrer sur les champs scriptés", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "Les champs non indexés ou les valeurs ignorées ne peuvent pas être recherchés", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "Désépingler le champ", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "Désépingler le champ", + "unifiedDocViewer.fieldChooser.discoverField.actions": "Actions", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "champ multiple", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs.", + "unifiedDocViewer.fieldChooser.discoverField.value": "Valeur", + "unifiedDocViewer.json.codeEditorAriaLabel": "Affichage JSON en lecture seule d’un document Elasticsearch", + "unifiedDocViewer.json.copyToClipboardLabel": "Copier dans le presse-papiers", + "unifiedDocViewer.loadingJSON": "Chargement de JSON", + "unifiedDocViewer.sourceViewer.errorMessage": "Impossible de récupérer les données pour le moment. Actualisez l'onglet et réessayez.", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "Une erreur s'est produite.", + "unifiedDocViewer.sourceViewer.refresh": "Actualiser", "domDragDrop.announce.cancelled": "Mouvement annulé. {label} revenu à sa position initiale", "domDragDrop.announce.cancelledItem": "Mouvement annulé. {label} revenu au groupe {groupLabel} à la position {position}", "domDragDrop.announce.dropped.combineCompatible": "{label} combiné dans le groupe {groupLabel} en {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", @@ -5685,34 +5694,6 @@ "unifiedFieldList.fieldNameDescription.textField": "Texte intégral tel que le corps d'un e-mail ou la description d'un produit.", "unifiedFieldList.fieldNameDescription.unknownField": "Champ inconnu", "unifiedFieldList.fieldNameDescription.versionField": "Versions des logiciels. Prend en charge les règles de priorité de la Gestion sémantique des versions.", - "discover.fieldNameIcons.binaryAriaLabel": "Binaire", - "discover.fieldNameIcons.booleanAriaLabel": "Booléen", - "discover.fieldNameIcons.conflictFieldAriaLabel": "Conflit", - "discover.fieldNameIcons.counterFieldAriaLabel": "Indicateur de compteur", - "discover.fieldNameIcons.dateFieldAriaLabel": "Date", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "Plage de dates", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "Vecteur dense", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "Lissé", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "Indicateur de jauge", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "Point géographique", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "Forme géométrique", - "discover.fieldNameIcons.histogramFieldAriaLabel": "Histogramme", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "Adresse IP", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "Plage d'IP", - "discover.fieldNameIcons.keywordFieldAriaLabel": "Mot-clé", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "Imbriqué", - "discover.fieldNameIcons.numberFieldAriaLabel": "Nombre", - "discover.fieldNameIcons.pointFieldAriaLabel": "Point", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "Fonctionnalité de rang", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "Fonctionnalités de rang", - "discover.fieldNameIcons.recordAriaLabel": "Enregistrements", - "discover.fieldNameIcons.shapeFieldAriaLabel": "Forme", - "discover.fieldNameIcons.sourceFieldAriaLabel": "Champ source", - "discover.fieldNameIcons.stringFieldAriaLabel": "Chaîne", - "discover.fieldNameIcons.textFieldAriaLabel": "Texte", - "discover.fieldNameIcons.unknownFieldAriaLabel": "Champ inconnu", - "discover.fieldNameIcons.versionFieldAriaLabel": "Version", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "Rechercher les noms de champs", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "Filtrer sur le champ", "unifiedFieldList.fieldPopover.deleteFieldLabel": "Supprimer le champ de la vue de données", @@ -13655,19 +13636,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "Incorporation de texte vectoriel dense", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "Expansion de texte ELSER", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "Classification de texte Zero-Shot", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Stockage Blob Azure", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "Connecteur personnalisé", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "Lecteur réseau", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", "xpack.enterpriseSearch.content.navTitle": "Contenu", "xpack.enterpriseSearch.content.new_index.apiDescription": "Utilisez l’API pour ajouter des documents par programme à un index Elasticsearch. Commencez par créer votre index.", "xpack.enterpriseSearch.content.new_index.apiTitle": "Nouvel index de recherche", @@ -14278,40 +14246,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "En savoir plus sur les fonctionnalités incluses dans la licence", "xpack.enterpriseSearch.licenseManagementLink": "Gérer votre licence", "xpack.enterpriseSearch.nameLabel": "Nom", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "Collection", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "Connexion directe", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "Nom d'hôte du serveur", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "Mot de passe", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "Schéma", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "Nom d'utilisateur", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "Valider l’hôte", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "Mot de passe", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "Nom d'utilisateur", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "ID client", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "Valeur secrète", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "Liste de sites séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "Une liste de sites séparés par des virgules dont les données doivent être ingérées. Utilisez \"*\" pour inclure tous les sites disponibles.", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "ID locataire", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "Nom du locataire", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "Utiliser un service d’extraction de texte", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "Nécessite un déploiement distinct du service d’extraction de données d’Elastic. Nécessite également que les paramètres de pipeline désactivent l’extraction de texte.", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", "xpack.enterpriseSearch.nativeLabel": "Natif", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "Explorer", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "Intégration", @@ -14497,9 +14431,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "Expériences de recherche", "xpack.enterpriseSearch.searchExperiences.productDescription": "Construisez une expérience de recherche attrayante et intuitive sans perdre votre temps à tout réinventer.", "xpack.enterpriseSearch.searchExperiences.productName": "Expériences de recherche", - "xpack.enterpriseSearch.server.connectors.configuration.error": "Connecteur introuvable", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "Document introuvable", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "Document introuvable", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "Le nom de collection existe déjà. Choisissez un autre nom.", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "Collection d'analyses introuvable", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "Le connecteur ou l'index existe déjà", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 26fa98a750f8d..6849a96b4bd4a 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2314,36 +2314,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "周りのドキュメントを表示", "discover.documentsAriaLabel": "ドキュメント", "discover.documentsErrorTitle": "検索エラー", - "unifiedDocViewer.docView.table.actions.label": "アクション", - "unifiedDocViewer.docView.table.actions.open": "アクションを開く", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "このフィールドの1つ以上の値が長すぎるため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "このフィールドは、検索またはフィルタリングできない正しくない形式の値が1つ以上あります。", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "このフィールドの1つ以上の値がElasticsearchによって無視されたため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "このフィールドの値が長すぎるため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "このフィールドの値の形式が正しくないため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "このフィールドの値はElasticsearchによって無視されたため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.searchPlaceHolder": "検索フィールド名", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "フィールド表示のフィルター", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "フィールド表示のフィルター", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "値でフィルター", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "値でフィルター", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "値を除外", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "値を除外", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "無視された値を含む", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "無視された値", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "フィールドを固定", - "unifiedDocViewer.docViews.table.pinFieldLabel": "フィールドを固定", "discover.docViews.table.scoreSortWarningTooltip": "_scoreの値を取得するには、並べ替える必要があります。", - "unifiedDocViewer.docViews.table.tableTitle": "表", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "表の列を切り替える", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "表の列を切り替える", - "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド詳細を切り替える", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "メタフィールドの有無でフィルタリングできません", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "スクリプトフィールドの有無でフィルタリングできません", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "インデックスがないフィールドまたは無視された値は検索できません", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "フィールドを固定解除", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "フィールドを固定解除", "discover.dropZoneTableLabel": "フィールドを列として表に追加するには、ゾーンをドロップします", "discover.dscTour.stepAddFields.imageAltText": "[使用可能なフィールド]リストで、プラスアイコンをクリックし、フィールドをドキュメントテーブルに切り替えます。", "discover.dscTour.stepAddFields.title": "フィールドをテーブルに追加", @@ -2364,13 +2335,8 @@ "discover.embeddable.search.displayName": "検索", "discover.errorCalloutShowErrorMessage": "詳細を表示", "discover.fieldChooser.availableFieldsTooltip": "フィールドをテーブルに表示できます。", - "unifiedDocViewer.fieldChooser.discoverField.actions": "アクション", "discover.fieldChooser.discoverField.addFieldTooltip": "フィールドを列として追加", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "複数フィールド", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", - "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド", "discover.fieldChooser.discoverField.removeFieldTooltip": "フィールドを表から削除", - "unifiedDocViewer.fieldChooser.discoverField.value": "値", "discover.goToDiscoverButtonText": "Discoverに移動", "discover.grid.flyout.documentNavigation": "ドキュメントナビゲーション", "discover.grid.flyout.toastColumnAdded": "列'{columnName}'が追加されました", @@ -2386,10 +2352,8 @@ "discover.inspectorRequestDescriptionDocument": "このリクエストはElasticsearchにクエリをかけ、ドキュメントを取得します。", "discover.invalidFiltersWarnToast.description": "一部の適用されたフィルターのデータビューID参照は、現在のデータビューとは異なります。", "discover.invalidFiltersWarnToast.title": "別のインデックス参照", - "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch ドキュメントの JSON ビューのみを読み込む", - "unifiedDocViewer.json.copyToClipboardLabel": "クリップボードにコピー", "discover.loadingDocuments": "ドキュメントを読み込み中", - "unifiedDocViewer.loadingJSON": "JSONを読み込んでいます", + "discover.loadingResults": "結果を読み込み中", "discover.localMenu.alertsDescription": "アラート", "discover.localMenu.fallbackReportTitle": "無題のDiscover検索", "discover.localMenu.inspectTitle": "検査", @@ -2446,9 +2410,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "不明な検索", "discover.singleDocRoute.errorTitle": "エラーが発生しました", "discover.skipToBottomButtonLabel": "テーブルの最後に移動", - "unifiedDocViewer.sourceViewer.errorMessage": "現在データを取得できませんでした。タブを更新して、再試行してください。", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "エラーが発生しました", - "unifiedDocViewer.sourceViewer.refresh": "更新", "discover.toggleSidebarAriaLabel": "サイドバーを切り替える", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "検索の管理", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "一致する検索が見つかりませんでした。", @@ -2465,25 +2426,73 @@ "discover.viewAlert.searchSourceErrorTitle": "検索ソースの取得エラー", "discover.viewModes.document.label": "ドキュメント", "discover.viewModes.fieldStatistics.label": "フィールド統計情報", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} - このフィールドはイベントの発生時刻を表します。", - "unifiedDataTable.searchGenerationWithDescription": "検索{searchTitle}で生成されたテーブル", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "検索{searchTitle}で生成されたテーブル({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr}個のドキュメントが選択されました", - "unifiedDataTable.clearSelection": "選択した項目をクリア", - "unifiedDataTable.controlColumnHeader": "列の制御", - "unifiedDataTable.copyToClipboardJSON": "ドキュメントをクリップボードにコピー(JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "このフィールドはイベントの発生時刻を表します。", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "名前をコピー", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "列をコピー", - "unifiedDataTable.grid.documentHeader": "ドキュメント", - "unifiedDataTable.grid.editFieldButton": "データビューフィールドを編集", - "unifiedDataTable.grid.selectDoc": "ドキュメント'{rowNumber}'を選択", - "unifiedDataTable.loadingResults": "結果を読み込み中", - "unifiedDataTable.noResultsFound": "結果が見つかりませんでした", - "unifiedDataTable.removeColumnLabel": "列を削除", - "unifiedDataTable.selectColumnHeader": "列を選択", - "unifiedDataTable.showAllDocuments": "すべてのドキュメントを表示", - "unifiedDataTable.showSelectedDocumentsOnly": "選択したドキュメントのみを表示", + "discover.fieldNameIcons.binaryAriaLabel": "バイナリー", + "discover.fieldNameIcons.booleanAriaLabel": "ブール", + "discover.fieldNameIcons.conflictFieldAriaLabel": "競合", + "discover.fieldNameIcons.counterFieldAriaLabel": "カウンターメトリック", + "discover.fieldNameIcons.dateFieldAriaLabel": "日付", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日付範囲", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集ベクトル", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "平坦化済み", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "ゲージメトリック", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理ポイント", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "地理情報図形", + "discover.fieldNameIcons.histogramFieldAriaLabel": "ヒストグラム", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP アドレス", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP範囲", + "discover.fieldNameIcons.keywordFieldAriaLabel": "キーワード", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "ネスト済み", + "discover.fieldNameIcons.numberFieldAriaLabel": "数字", + "discover.fieldNameIcons.pointFieldAriaLabel": "点", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "ランク特性", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "ランク特性", + "discover.fieldNameIcons.recordAriaLabel": "記録", + "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", + "discover.fieldNameIcons.sourceFieldAriaLabel": "ソースフィールド", + "discover.fieldNameIcons.stringFieldAriaLabel": "文字列", + "discover.fieldNameIcons.textFieldAriaLabel": "テキスト", + "discover.fieldNameIcons.unknownFieldAriaLabel": "不明なフィールド", + "discover.fieldNameIcons.versionFieldAriaLabel": "バージョン", + "unifiedDocViewer.docView.table.actions.label": "アクション", + "unifiedDocViewer.docView.table.actions.open": "アクションを開く", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "このフィールドの1つ以上の値が長すぎるため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "このフィールドは、検索またはフィルタリングできない正しくない形式の値が1つ以上あります。", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "このフィールドの1つ以上の値がElasticsearchによって無視されたため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "このフィールドの値が長すぎるため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "このフィールドの値の形式が正しくないため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "このフィールドの値はElasticsearchによって無視されたため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.searchPlaceHolder": "検索フィールド名", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "フィールド表示のフィルター", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "フィールド表示のフィルター", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "値でフィルター", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "値でフィルター", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "値を除外", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "値を除外", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "無視された値を含む", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "無視された値", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "フィールドを固定", + "unifiedDocViewer.docViews.table.pinFieldLabel": "フィールドを固定", + "unifiedDocViewer.docViews.table.tableTitle": "表", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "表の列を切り替える", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "表の列を切り替える", + "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "メタフィールドの有無でフィルタリングできません", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "スクリプトフィールドの有無でフィルタリングできません", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "インデックスがないフィールドまたは無視された値は検索できません", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "フィールドを固定解除", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "フィールドを固定解除", + "unifiedDocViewer.fieldChooser.discoverField.actions": "アクション", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "複数フィールド", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", + "unifiedDocViewer.fieldChooser.discoverField.value": "値", + "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch ドキュメントの JSON ビューのみを読み込む", + "unifiedDocViewer.json.copyToClipboardLabel": "クリップボードにコピー", + "unifiedDocViewer.loadingJSON": "JSONを読み込んでいます", + "unifiedDocViewer.sourceViewer.errorMessage": "現在データを取得できませんでした。タブを更新して、再試行してください。", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "エラーが発生しました", + "unifiedDocViewer.sourceViewer.refresh": "更新", "domDragDrop.announce.cancelled": "移動がキャンセルされました。{label}は初期位置に戻りました", "domDragDrop.announce.cancelledItem": "移動がキャンセルされました。{label}は位置{position}の{groupLabel}グループに戻りました", "domDragDrop.announce.dropped.combineCompatible": "レイヤー{dropLayerNumber}の位置{dropPosition}でグループ{dropGroupLabel}の{dropLabel}にグループ{groupLabel}の{label}を結合しました。", @@ -5701,34 +5710,6 @@ "unifiedFieldList.fieldNameDescription.textField": "電子メール本文や製品説明などの全文テキスト。", "unifiedFieldList.fieldNameDescription.unknownField": "不明なフィールド", "unifiedFieldList.fieldNameDescription.versionField": "ソフトウェアバージョン。「セマンティックバージョニング」優先度ルールをサポートします。", - "discover.fieldNameIcons.binaryAriaLabel": "バイナリー", - "discover.fieldNameIcons.booleanAriaLabel": "ブール", - "discover.fieldNameIcons.conflictFieldAriaLabel": "競合", - "discover.fieldNameIcons.counterFieldAriaLabel": "カウンターメトリック", - "discover.fieldNameIcons.dateFieldAriaLabel": "日付", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日付範囲", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集ベクトル", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "平坦化済み", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "ゲージメトリック", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理ポイント", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "地理情報図形", - "discover.fieldNameIcons.histogramFieldAriaLabel": "ヒストグラム", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP アドレス", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP範囲", - "discover.fieldNameIcons.keywordFieldAriaLabel": "キーワード", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "ネスト済み", - "discover.fieldNameIcons.numberFieldAriaLabel": "数字", - "discover.fieldNameIcons.pointFieldAriaLabel": "点", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "ランク特性", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "ランク特性", - "discover.fieldNameIcons.recordAriaLabel": "記録", - "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", - "discover.fieldNameIcons.sourceFieldAriaLabel": "ソースフィールド", - "discover.fieldNameIcons.stringFieldAriaLabel": "文字列", - "discover.fieldNameIcons.textFieldAriaLabel": "テキスト", - "discover.fieldNameIcons.unknownFieldAriaLabel": "不明なフィールド", - "discover.fieldNameIcons.versionFieldAriaLabel": "バージョン", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "検索フィールド名", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "フィールド表示のフィルター", "unifiedFieldList.fieldPopover.deleteFieldLabel": "データビューフィールドを削除", @@ -13669,19 +13650,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "密ベクトルテキスト埋め込み", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "ELSERテキスト拡張", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "ゼロショットテキスト分類", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Azure Blob Storage", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "カスタマイズされたコネクター", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "ネットワークドライブ", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "Sharepoint Online", "xpack.enterpriseSearch.content.navTitle": "コンテンツ", "xpack.enterpriseSearch.content.new_index.apiDescription": "プログラム的にElasticsearchインデックスにドキュメントを追加するにはAPIを使用します。パイプラインを作成して開始", "xpack.enterpriseSearch.content.new_index.apiTitle": "新しい検索インデックス", @@ -14292,40 +14260,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "ライセンス機能の詳細", "xpack.enterpriseSearch.licenseManagementLink": "ライセンスを更新", "xpack.enterpriseSearch.nameLabel": "名前", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "収集", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "直接接続", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "サーバーホスト名", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "パスワード", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "スキーマ", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "ユーザー名", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "ホストを検証", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "パスワード", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "ユーザー名", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "クライアントID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "シークレット値", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "カンマ区切りのサイトのリスト", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "データのインジェスト元のサイトのリスト(カンマ区切り)。すべての使用可能なサイトを含めるには、*を使用します。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "テナントID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "テナント名", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "テキスト抽出サービスを使用", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "Elastic Data Extraction Serviceを別途デプロイする必要があります。また、パイプラインの設定でテキスト抽出を無効にする必要があります。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "Sharepoint Online", "xpack.enterpriseSearch.nativeLabel": "ネイティブ", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "エクスプローラー", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "統合", @@ -14511,9 +14445,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "検索エクスペリエンス", "xpack.enterpriseSearch.searchExperiences.productDescription": "直感的で、魅力的な検索エクスペリエンスを簡単に構築できます。", "xpack.enterpriseSearch.searchExperiences.productName": "検索エクスペリエンス", - "xpack.enterpriseSearch.server.connectors.configuration.error": "コネクターが見つかりませんでした", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "ドキュメントが見つかりませんでした", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "ドキュメントが見つかりませんでした", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "コレクション名はすでに存在します。別の名前を選択してください。", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "分析コレクションが見つかりません", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "コネクターまたはインデックスはすでに存在します", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e96481d694485..9e1a41ddaea15 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2314,36 +2314,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "查看周围文档", "discover.documentsAriaLabel": "文档", "discover.documentsErrorTitle": "搜索错误", - "unifiedDocViewer.docView.table.actions.label": "操作", - "unifiedDocViewer.docView.table.actions.open": "打开操作", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "此字段中的一个或多个值过长,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "此字段包含一个或多个格式错误的值,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "此字段中的一个或多个值被 Elasticsearch 忽略,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "此字段中的值过长,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "此字段中的值格式错误,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "此字段中的值被 Elasticsearch 忽略,无法搜索或筛选。", - "unifiedDocViewer.docView.table.searchPlaceHolder": "搜索字段名称", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "筛留存在的字段", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "字段是否存在筛选", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "筛留值", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "筛留值", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "筛除值", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "筛除值", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "包含被忽略的值", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "被忽略的值", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "固定字段", - "unifiedDocViewer.docViews.table.pinFieldLabel": "固定字段", "discover.docViews.table.scoreSortWarningTooltip": "要检索 _score 的值,必须按其筛选。", - "unifiedDocViewer.docViews.table.tableTitle": "表", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "在表中切换列", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "在表中切换列", - "unifiedDocViewer.fieldChooser.discoverField.name": "切换字段详细信息", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "无法筛选元数据字段是否存在", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "无法筛选脚本字段是否存在", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "无法搜索未编入索引的字段或被忽略的值", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "取消固定字段", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "取消固定字段", "discover.dropZoneTableLabel": "放置区域以将字段作为列添加到表中", "discover.dscTour.stepAddFields.imageAltText": "在可用字段列表中,单击加号图标将字段切换为文档表。", "discover.dscTour.stepAddFields.title": "将字段添加到表中", @@ -2364,13 +2335,8 @@ "discover.embeddable.search.displayName": "搜索", "discover.errorCalloutShowErrorMessage": "显示详情", "discover.fieldChooser.availableFieldsTooltip": "适用于在表中显示的字段。", - "unifiedDocViewer.fieldChooser.discoverField.actions": "操作", "discover.fieldChooser.discoverField.addFieldTooltip": "将字段添加为列", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "多字段", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "多字段的每个字段可以有多个值", - "unifiedDocViewer.fieldChooser.discoverField.name": "字段", "discover.fieldChooser.discoverField.removeFieldTooltip": "从表中移除字段", - "unifiedDocViewer.fieldChooser.discoverField.value": "值", "discover.goToDiscoverButtonText": "前往 Discover", "discover.grid.flyout.documentNavigation": "文档导航", "discover.grid.flyout.toastColumnAdded": "已添加列“{columnName}”", @@ -2386,10 +2352,8 @@ "discover.inspectorRequestDescriptionDocument": "此请求将查询 Elasticsearch 以获取文档。", "discover.invalidFiltersWarnToast.description": "某些应用的筛选中的数据视图 ID 引用与当前数据视图不同。", "discover.invalidFiltersWarnToast.title": "不同的索引引用", - "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch 文档的只读 JSON 视图", - "unifiedDocViewer.json.copyToClipboardLabel": "复制到剪贴板", "discover.loadingDocuments": "正在加载文档", - "unifiedDocViewer.loadingJSON": "正在加载 JSON", + "discover.loadingResults": "正在加载结果", "discover.localMenu.alertsDescription": "告警", "discover.localMenu.fallbackReportTitle": "未命名 Discover 搜索", "discover.localMenu.inspectTitle": "检查", @@ -2446,9 +2410,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "未知搜索", "discover.singleDocRoute.errorTitle": "发生错误", "discover.skipToBottomButtonLabel": "转到表尾", - "unifiedDocViewer.sourceViewer.errorMessage": "当前无法获取数据。请刷新选项卡以重试。", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "发生错误", - "unifiedDocViewer.sourceViewer.refresh": "刷新", "discover.toggleSidebarAriaLabel": "切换侧边栏", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "管理搜索", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "未找到匹配的搜索。", @@ -2465,25 +2426,73 @@ "discover.viewAlert.searchSourceErrorTitle": "提取搜索源时出错", "discover.viewModes.document.label": "文档", "discover.viewModes.fieldStatistics.label": "字段统计信息", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} - 此字段表示事件发生的时间。", - "unifiedDataTable.searchGenerationWithDescription": "搜索 {searchTitle} 生成的表", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "搜索 {searchTitle} 生成的表({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr} 个文档已选择", - "unifiedDataTable.clearSelection": "清除所选内容", - "unifiedDataTable.controlColumnHeader": "控制列", - "unifiedDataTable.copyToClipboardJSON": "将文档复制到剪贴板 (JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "此字段表示事件发生的时间。", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "复制名称", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "复制列", - "unifiedDataTable.grid.documentHeader": "文档", - "unifiedDataTable.grid.editFieldButton": "编辑数据视图字段", - "unifiedDataTable.grid.selectDoc": "选择文档“{rowNumber}”", - "unifiedDataTable.loadingResults": "正在加载结果", - "unifiedDataTable.noResultsFound": "找不到结果", - "unifiedDataTable.removeColumnLabel": "移除列", - "unifiedDataTable.selectColumnHeader": "选择列", - "unifiedDataTable.showAllDocuments": "显示所有文档", - "unifiedDataTable.showSelectedDocumentsOnly": "仅显示选定的文档", + "discover.fieldNameIcons.binaryAriaLabel": "二进制", + "discover.fieldNameIcons.booleanAriaLabel": "布尔型", + "discover.fieldNameIcons.conflictFieldAriaLabel": "冲突", + "discover.fieldNameIcons.counterFieldAriaLabel": "计数器指标", + "discover.fieldNameIcons.dateFieldAriaLabel": "日期", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日期范围", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集向量", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "扁平", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "仪表盘指标", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理点", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "几何形状", + "discover.fieldNameIcons.histogramFieldAriaLabel": "直方图", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP 地址", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP 范围", + "discover.fieldNameIcons.keywordFieldAriaLabel": "关键字", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "嵌套", + "discover.fieldNameIcons.numberFieldAriaLabel": "数字", + "discover.fieldNameIcons.pointFieldAriaLabel": "点", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "排名特征", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "排名特征", + "discover.fieldNameIcons.recordAriaLabel": "记录", + "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", + "discover.fieldNameIcons.sourceFieldAriaLabel": "源字段", + "discover.fieldNameIcons.stringFieldAriaLabel": "字符串", + "discover.fieldNameIcons.textFieldAriaLabel": "文本", + "discover.fieldNameIcons.unknownFieldAriaLabel": "未知字段", + "discover.fieldNameIcons.versionFieldAriaLabel": "版本", + "unifiedDocViewer.docView.table.actions.label": "操作", + "unifiedDocViewer.docView.table.actions.open": "打开操作", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "此字段中的一个或多个值过长,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "此字段包含一个或多个格式错误的值,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "此字段中的一个或多个值被 Elasticsearch 忽略,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "此字段中的值过长,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "此字段中的值格式错误,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "此字段中的值被 Elasticsearch 忽略,无法搜索或筛选。", + "unifiedDocViewer.docView.table.searchPlaceHolder": "搜索字段名称", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "筛留存在的字段", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "字段是否存在筛选", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "筛留值", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "筛留值", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "筛除值", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "筛除值", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "包含被忽略的值", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "被忽略的值", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "固定字段", + "unifiedDocViewer.docViews.table.pinFieldLabel": "固定字段", + "unifiedDocViewer.docViews.table.tableTitle": "表", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "在表中切换列", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "在表中切换列", + "unifiedDocViewer.fieldChooser.discoverField.name": "字段", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "无法筛选元数据字段是否存在", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "无法筛选脚本字段是否存在", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "无法搜索未编入索引的字段或被忽略的值", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "取消固定字段", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "取消固定字段", + "unifiedDocViewer.fieldChooser.discoverField.actions": "操作", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "多字段", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "多字段的每个字段可以有多个值", + "unifiedDocViewer.fieldChooser.discoverField.value": "值", + "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch 文档的只读 JSON 视图", + "unifiedDocViewer.json.copyToClipboardLabel": "复制到剪贴板", + "unifiedDocViewer.loadingJSON": "正在加载 JSON", + "unifiedDocViewer.sourceViewer.errorMessage": "当前无法获取数据。请刷新选项卡以重试。", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "发生错误", + "unifiedDocViewer.sourceViewer.refresh": "刷新", "domDragDrop.announce.cancelled": "移动已取消。{label} 已返回至其初始位置", "domDragDrop.announce.cancelledItem": "移动已取消。{label} 返回至 {groupLabel} 组中的位置 {position}", "domDragDrop.announce.dropped.combineCompatible": "已将组 {groupLabel} 中的 {label} 组合到图层 {dropLayerNumber} 的组 {dropGroupLabel} 中的位置 {dropPosition} 上的 {dropLabel}", @@ -5700,34 +5709,6 @@ "unifiedFieldList.fieldNameDescription.textField": "全文本,如电子邮件正文或产品描述。", "unifiedFieldList.fieldNameDescription.unknownField": "未知字段", "unifiedFieldList.fieldNameDescription.versionField": "软件版本。支持“语义版本控制”优先规则。", - "discover.fieldNameIcons.binaryAriaLabel": "二进制", - "discover.fieldNameIcons.booleanAriaLabel": "布尔型", - "discover.fieldNameIcons.conflictFieldAriaLabel": "冲突", - "discover.fieldNameIcons.counterFieldAriaLabel": "计数器指标", - "discover.fieldNameIcons.dateFieldAriaLabel": "日期", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日期范围", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集向量", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "扁平", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "仪表盘指标", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理点", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "几何形状", - "discover.fieldNameIcons.histogramFieldAriaLabel": "直方图", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP 地址", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP 范围", - "discover.fieldNameIcons.keywordFieldAriaLabel": "关键字", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "嵌套", - "discover.fieldNameIcons.numberFieldAriaLabel": "数字", - "discover.fieldNameIcons.pointFieldAriaLabel": "点", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "排名特征", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "排名特征", - "discover.fieldNameIcons.recordAriaLabel": "记录", - "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", - "discover.fieldNameIcons.sourceFieldAriaLabel": "源字段", - "discover.fieldNameIcons.stringFieldAriaLabel": "字符串", - "discover.fieldNameIcons.textFieldAriaLabel": "文本", - "discover.fieldNameIcons.unknownFieldAriaLabel": "未知字段", - "discover.fieldNameIcons.versionFieldAriaLabel": "版本", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "搜索字段名称", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "筛留存在的字段", "unifiedFieldList.fieldPopover.deleteFieldLabel": "删除数据视图字段", @@ -13669,19 +13650,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "密集向量文本嵌入", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "ELSER 文本扩展", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "Zero-Shot 文本分类", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Azure Blob 存储", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud 和 Confluence Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "定制连接器", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud 和 Jira Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "网络驱动器", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "Sharepoint", "xpack.enterpriseSearch.content.navTitle": "内容", "xpack.enterpriseSearch.content.new_index.apiDescription": "使用 API 以编程方式将文档添加到 Elasticsearch 索引。首先创建索引。", "xpack.enterpriseSearch.content.new_index.apiTitle": "新搜索索引", @@ -14292,40 +14260,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "详细了解许可证功能", "xpack.enterpriseSearch.licenseManagementLink": "管理您的许可", "xpack.enterpriseSearch.nameLabel": "名称", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "集合", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "直接连接", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "服务器主机名", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "密码", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "架构", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "用户名", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "验证主机", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "密码", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "用户名", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "客户端 ID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "机密值", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "网站的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "要从中采集数据的网站的逗号分隔列表。使用 * 以包括所有可用网站。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "租户 ID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "租户名称", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "使用文本提取服务", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "需要独立部署的 Elastic 数据提取服务。还需要管道设置禁用文本提取。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "Sharepoint", "xpack.enterpriseSearch.nativeLabel": "原生", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "浏览器", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "集成", @@ -14511,9 +14445,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "搜索体验", "xpack.enterpriseSearch.searchExperiences.productDescription": "构建直观、具有吸引力的搜索体验,而无需浪费时间进行重复工作。", "xpack.enterpriseSearch.searchExperiences.productName": "搜索体验", - "xpack.enterpriseSearch.server.connectors.configuration.error": "找不到连接器", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "无法找到文档", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "无法找到文档", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "集合名称已存在。请选择其他名称。", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "未找到分析集合", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "连接器或索引已存在", diff --git a/yarn.lock b/yarn.lock index 3ff002d5dfe50..69e5329560e94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5315,6 +5315,10 @@ version "0.0.0" uid "" +"@kbn/search-connectors@link:packages/kbn-search-connectors": + version "0.0.0" + uid "" + "@kbn/search-examples-plugin@link:examples/search_examples": version "0.0.0" uid "" From e8699cedaffaa3b88ada47c5e0867cf9693cb9dc Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Wed, 6 Sep 2023 09:07:10 -0400 Subject: [PATCH 80/84] feat(slo): add public access (#165698) --- .../plugins/observability/server/routes/slo/route.ts | 12 ++++++++++++ x-pack/plugins/observability/server/routes/types.ts | 1 + 2 files changed, 13 insertions(+) diff --git a/x-pack/plugins/observability/server/routes/slo/route.ts b/x-pack/plugins/observability/server/routes/slo/route.ts index 99eec0b54ee5a..2dfdcb2308ee3 100644 --- a/x-pack/plugins/observability/server/routes/slo/route.ts +++ b/x-pack/plugins/observability/server/routes/slo/route.ts @@ -74,6 +74,7 @@ const createSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: createSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -95,6 +96,7 @@ const updateSLORoute = createObservabilityServerRoute({ endpoint: 'PUT /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: updateSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -117,6 +119,7 @@ const deleteSLORoute = createObservabilityServerRoute({ endpoint: 'DELETE /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: deleteSLOParamsSchema, handler: async ({ @@ -145,6 +148,7 @@ const getSLORoute = createObservabilityServerRoute({ endpoint: 'GET /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_read'], + access: 'public', }, params: getSLOParamsSchema, handler: async ({ context, params }) => { @@ -166,6 +170,7 @@ const enableSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos/{id}/enable 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: manageSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -188,6 +193,7 @@ const disableSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos/{id}/disable 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: manageSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -210,6 +216,7 @@ const findSLORoute = createObservabilityServerRoute({ endpoint: 'GET /api/observability/slos 2023-10-31', options: { tags: ['access:slo_read'], + access: 'public', }, params: findSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -247,6 +254,7 @@ const findSloDefinitionsRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/_definitions', options: { tags: ['access:slo_read'], + access: 'internal', }, params: findSloDefinitionsParamsSchema, handler: async ({ context, params }) => { @@ -288,6 +296,7 @@ const getSLOInstancesRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/{id}/_instances', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getSLOInstancesParamsSchema, handler: async ({ context, params }) => { @@ -309,6 +318,7 @@ const getDiagnosisRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/_diagnosis', options: { tags: [], + access: 'internal', }, params: undefined, handler: async ({ context }) => { @@ -331,6 +341,7 @@ const getSloBurnRates = createObservabilityServerRoute({ endpoint: 'POST /internal/observability/slos/{id}/_burn_rates', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getSLOBurnRatesParamsSchema, handler: async ({ context, params }) => { @@ -355,6 +366,7 @@ const getPreviewData = createObservabilityServerRoute({ endpoint: 'POST /internal/observability/slos/_preview', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getPreviewDataParamsSchema, handler: async ({ context, params }) => { diff --git a/x-pack/plugins/observability/server/routes/types.ts b/x-pack/plugins/observability/server/routes/types.ts index 866bd3c79c1d1..a0ef6ee6c0c74 100644 --- a/x-pack/plugins/observability/server/routes/types.ts +++ b/x-pack/plugins/observability/server/routes/types.ts @@ -25,6 +25,7 @@ export interface ObservabilityRouteHandlerResources { export interface ObservabilityRouteCreateOptions { options: { tags: string[]; + access?: 'public' | 'internal'; }; } From b48dc8409977e2cae5363756a772fc4ed1104593 Mon Sep 17 00:00:00 2001 From: Julien Lind Date: Wed, 6 Sep 2023 15:16:39 +0200 Subject: [PATCH 81/84] [Fleet] Add Fleet Settings link to the output section (#165678) ## Summary Update the fleet output page and add links for users. Update the fleet ES output page and add link for the custom yaml box Co-authored-by: julienlind --- packages/kbn-doc-links/src/get_doc_links.ts | 1 + packages/kbn-doc-links/src/types.ts | 1 + .../components/edit_output_flyout/index.tsx | 10 +++++++--- .../components/settings_page/output_section.tsx | 15 +++++++++------ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 147b26fc6e03a..014bd64bbb68a 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -728,6 +728,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { settings: `${FLEET_DOCS}fleet-settings.html`, kafkaSettings: `${FLEET_DOCS}kafka-output-settings.html`, logstashSettings: `${FLEET_DOCS}ls-output-settings.html`, + esSettings: `${FLEET_DOCS}es-output-settings.html`, settingsFleetServerHostSettings: `${FLEET_DOCS}fleet-settings.html#fleet-server-hosts-setting`, settingsFleetServerProxySettings: `${KIBANA_DOCS}fleet-settings-kb.html#fleet-data-visualizer-settings`, troubleshooting: `${FLEET_DOCS}fleet-troubleshooting.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 428ef86267dd1..b576a38239e2e 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -489,6 +489,7 @@ export interface DocLinks { guide: string; fleetServer: string; fleetServerAddFleetServer: string; + esSettings: string; settings: string; logstashSettings: string; kafkaSettings: string; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx index 3270facd176b9..0e9ca6725a1a9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx @@ -424,9 +424,13 @@ export const EditOutputFlyout: React.FunctionComponent = /> + {i18n.translate('xpack.fleet.settings.editOutputFlyout.yamlConfigInputLabel', { + defaultMessage: 'Advanced YAML configuration', + })} + + } {...inputs.additionalYamlConfigInput.formRowProps} fullWidth > diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx index 6f053316ac58b..dd65df3e41c8f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx @@ -6,10 +6,10 @@ */ import React from 'react'; -import { EuiTitle, EuiText, EuiSpacer, EuiButtonEmpty } from '@elastic/eui'; +import { EuiTitle, EuiText, EuiSpacer, EuiButtonEmpty, EuiLink } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useLink } from '../../../../hooks'; +import { useLink, useStartServices } from '../../../../hooks'; import type { Output } from '../../../../types'; import { OutputsTable } from '../outputs_table'; @@ -23,6 +23,7 @@ export const OutputSection: React.FunctionComponent = ({ deleteOutput, }) => { const { getHref } = useLink(); + const { docLinks } = useStartServices(); return ( <> @@ -33,10 +34,12 @@ export const OutputSection: React.FunctionComponent = ({ - + + + From d6a2bd77788c318a9f74247a52a1b6da05779b4b Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 6 Sep 2023 07:38:39 -0600 Subject: [PATCH 82/84] [Actions] Adjust axios payload for APIs that do not want `data` sent (#165756) --- x-pack/plugins/actions/server/lib/axios_utils.test.ts | 3 --- x-pack/plugins/actions/server/lib/axios_utils.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/x-pack/plugins/actions/server/lib/axios_utils.test.ts b/x-pack/plugins/actions/server/lib/axios_utils.test.ts index 1f94e610f60bf..7423042e68228 100644 --- a/x-pack/plugins/actions/server/lib/axios_utils.test.ts +++ b/x-pack/plugins/actions/server/lib/axios_utils.test.ts @@ -66,7 +66,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith('/test', { method: 'get', - data: {}, httpAgent: undefined, httpsAgent: expect.any(HttpsAgent), proxy: false, @@ -100,7 +99,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith(TestUrl, { method: 'get', - data: {}, httpAgent, httpsAgent, proxy: false, @@ -132,7 +130,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith('https://testProxy', { method: 'get', - data: {}, httpAgent: undefined, httpsAgent: expect.any(HttpsAgent), proxy: false, diff --git a/x-pack/plugins/actions/server/lib/axios_utils.ts b/x-pack/plugins/actions/server/lib/axios_utils.ts index 181893db15f0c..163eac3eada2b 100644 --- a/x-pack/plugins/actions/server/lib/axios_utils.ts +++ b/x-pack/plugins/actions/server/lib/axios_utils.ts @@ -51,7 +51,7 @@ export const request = async ({ ...config, method, headers, - data: data ?? {}, + ...(data ? { data } : {}), // use httpAgent and httpsAgent and set axios proxy: false, to be able to handle fail on invalid certs httpAgent, httpsAgent, From 8c39735fcf45d19b68339d646a8b1defb108ff10 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 15:44:48 +0200 Subject: [PATCH 83/84] [Logs Onboarding] Implement Observability Onboarding locator (#165805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary In preparation for #165486 where we'll implement a call to action to bring into the logs onboarding, this PR implement the onboarding locator for the `observability_onboarding` plugin. The locator is both returned in the plugin contract and registered in the central registry so that we'll be able to consume it without creating circular dependencies between `observability_onboarding` and `observability_log_explorer` plugins. With this first iteration, the locator allows to navigate to the landing page or to specify a log source to onboard: ```ts // Navigate to onboarding landing page: /app/observabilityOnboarding plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate() // Navigate to system logs onboarding: /app/observabilityOnboarding/systemLogs plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate({source: 'systemLogs'}) // Navigate to custom logs onboarding: /app/observabilityOnboarding/customLogs plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate({source: 'customLogs'}) ``` --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Yngrid Coello --- .../observability_onboarding/kibana.jsonc | 2 +- .../observability_onboarding/public/index.ts | 2 ++ .../public/locators/index.ts | 12 +++++++ .../onboarding_locator/get_location.ts | 21 ++++++++++++ .../locator_definition.test.ts | 32 +++++++++++++++++++ .../onboarding_locator/locator_definition.ts | 25 +++++++++++++++ .../locators/onboarding_locator/types.ts | 18 +++++++++++ .../observability_onboarding/public/plugin.ts | 27 ++++++++++++++-- .../observability_onboarding/tsconfig.json | 2 ++ 9 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/observability_onboarding/public/locators/index.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts diff --git a/x-pack/plugins/observability_onboarding/kibana.jsonc b/x-pack/plugins/observability_onboarding/kibana.jsonc index 97689407aff41..0379aec27b496 100644 --- a/x-pack/plugins/observability_onboarding/kibana.jsonc +++ b/x-pack/plugins/observability_onboarding/kibana.jsonc @@ -7,7 +7,7 @@ "server": true, "browser": true, "configPath": ["xpack", "observability_onboarding"], - "requiredPlugins": ["data", "observability", "observabilityShared", "discover"], + "requiredPlugins": ["data", "observability", "observabilityShared", "discover", "share"], "optionalPlugins": ["cloud", "usageCollection"], "requiredBundles": ["kibanaReact"], "extraPublicDirs": ["common"] diff --git a/x-pack/plugins/observability_onboarding/public/index.ts b/x-pack/plugins/observability_onboarding/public/index.ts index 9454626e80dc8..d4a667b9e7269 100644 --- a/x-pack/plugins/observability_onboarding/public/index.ts +++ b/x-pack/plugins/observability_onboarding/public/index.ts @@ -17,6 +17,8 @@ import { ObservabilityOnboardingPluginStart, } from './plugin'; +export { OBSERVABILITY_ONBOARDING_LOCATOR } from './locators/onboarding_locator/locator_definition'; + export interface ConfigSchema { ui: { enabled: boolean; diff --git a/x-pack/plugins/observability_onboarding/public/locators/index.ts b/x-pack/plugins/observability_onboarding/public/locators/index.ts new file mode 100644 index 0000000000000..5f82c40181259 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ObservabilityOnboardingLocator } from './onboarding_locator/types'; + +export interface ObservabilityOnboardingPluginLocators { + onboarding: ObservabilityOnboardingLocator; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts new file mode 100644 index 0000000000000..93bb3861740cd --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ObservabilityOnboardingLocatorParams } from './types'; +import { PLUGIN_ID } from '../../../common'; + +export function getLocation(params: ObservabilityOnboardingLocatorParams) { + const { source } = params; + + const path = ['/', source].filter(Boolean).join(''); + + return { + app: PLUGIN_ID, + path, + state: {}, + }; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts new file mode 100644 index 0000000000000..6caf9222a239f --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ObservabilityOnboardingLocatorDefinition } from './locator_definition'; + +describe('Observability onboarding locator', () => { + test('should create a link to the overview page', async () => { + const locator = new ObservabilityOnboardingLocatorDefinition(); + const location = await locator.getLocation(); + + expect(location).toMatchObject({ + app: 'observabilityOnboarding', + path: '/', + state: {}, + }); + }); + + test('should create a link to specified log source onboarding', async () => { + const locator = new ObservabilityOnboardingLocatorDefinition(); + const systemLocation = await locator.getLocation({ source: 'systemLogs' }); + + expect(systemLocation).toMatchObject({ + app: 'observabilityOnboarding', + path: '/systemLogs', + state: {}, + }); + }); +}); diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts new file mode 100644 index 0000000000000..0c18e06cb92f5 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LocatorDefinition } from '@kbn/share-plugin/public'; +import type { ObservabilityOnboardingLocatorParams } from './types'; + +export const OBSERVABILITY_ONBOARDING_LOCATOR = + 'OBSERVABILITY_ONBOARDING_LOCATOR' as const; + +export class ObservabilityOnboardingLocatorDefinition + implements LocatorDefinition +{ + public readonly id = OBSERVABILITY_ONBOARDING_LOCATOR; + + public readonly getLocation = async ( + params: ObservabilityOnboardingLocatorParams = {} + ) => { + const { getLocation } = await import('./get_location'); + return getLocation(params); + }; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts new file mode 100644 index 0000000000000..b8709f6af361d --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LocatorPublic } from '@kbn/share-plugin/public'; +import { SerializableRecord } from '@kbn/utility-types'; + +export interface ObservabilityOnboardingLocatorParams + extends SerializableRecord { + /** If given, it will load the given map else will load the create a new map page. */ + source?: 'customLogs' | 'systemLogs'; +} + +export type ObservabilityOnboardingLocator = + LocatorPublic; diff --git a/x-pack/plugins/observability_onboarding/public/plugin.ts b/x-pack/plugins/observability_onboarding/public/plugin.ts index 8769991169090..45fa8a640c02f 100644 --- a/x-pack/plugins/observability_onboarding/public/plugin.ts +++ b/x-pack/plugins/observability_onboarding/public/plugin.ts @@ -24,15 +24,20 @@ import { DataPublicPluginStart, } from '@kbn/data-plugin/public'; import type { DiscoverSetup } from '@kbn/discover-plugin/public'; +import { SharePluginSetup } from '@kbn/share-plugin/public'; import type { ObservabilityOnboardingConfig } from '../server'; +import { PLUGIN_ID } from '../common'; +import { ObservabilityOnboardingLocatorDefinition } from './locators/onboarding_locator/locator_definition'; +import { ObservabilityOnboardingPluginLocators } from './locators'; export type ObservabilityOnboardingPluginSetup = void; export type ObservabilityOnboardingPluginStart = void; export interface ObservabilityOnboardingPluginSetupDeps { data: DataPublicPluginSetup; - observability: ObservabilityPublicSetup; discover: DiscoverSetup; + observability: ObservabilityPublicSetup; + share: SharePluginSetup; } export interface ObservabilityOnboardingPluginStartDeps { @@ -48,6 +53,8 @@ export class ObservabilityOnboardingPlugin ObservabilityOnboardingPluginStart > { + private locators?: ObservabilityOnboardingPluginLocators; + constructor(private ctx: PluginInitializerContext) {} public setup( @@ -69,7 +76,7 @@ export class ObservabilityOnboardingPlugin navLinkStatus: isServerlessEnabled ? AppNavLinkStatus.visible : AppNavLinkStatus.hidden, - id: 'observabilityOnboarding', + id: PLUGIN_ID, title: 'Observability Onboarding', order: 8500, euiIconType: 'logoObservability', @@ -98,9 +105,23 @@ export class ObservabilityOnboardingPlugin }, }); } + + this.locators = { + onboarding: plugins.share.url.locators.create( + new ObservabilityOnboardingLocatorDefinition() + ), + }; + + return { + locators: this.locators, + }; } public start( core: CoreStart, plugins: ObservabilityOnboardingPluginStartDeps - ) {} + ) { + return { + locators: this.locators, + }; + } } diff --git a/x-pack/plugins/observability_onboarding/tsconfig.json b/x-pack/plugins/observability_onboarding/tsconfig.json index 2119563923cb9..d2b4d9a223a2b 100644 --- a/x-pack/plugins/observability_onboarding/tsconfig.json +++ b/x-pack/plugins/observability_onboarding/tsconfig.json @@ -33,6 +33,8 @@ "@kbn/data-views-plugin", "@kbn/es-query", "@kbn/use-tracked-promise", + "@kbn/share-plugin", + "@kbn/utility-types", ], "exclude": [ "target/**/*", From 630a95bc10ace25c4d2db09928e6dacb77267109 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Wed, 6 Sep 2023 15:47:47 +0200 Subject: [PATCH 84/84] [Defend Workflows] Adjust headers in fleet api (#165823) --- .../pipelines/pull_request/pipeline.ts | 1 + x-pack/plugins/fleet/common/index.ts | 2 ++ .../details_page/hooks/use_agent_status.tsx | 3 +++ .../use_package_policies_with_agent_policy.ts | 3 +++ .../public/hooks/use_request/use_request.ts | 1 + .../scripts/create_agents/create_agents.ts | 2 ++ .../osquery/cypress/tasks/api_fixtures.ts | 6 ++++++ .../osquery/cypress/tasks/integrations.ts | 5 +++-- .../data_loaders/index_fleet_agent.ts | 3 ++- .../index_fleet_endpoint_policy.ts | 18 +++++++++++++++- .../data_loaders/setup_fleet_for_endpoint.ts | 14 ++++++++++++- .../common/endpoint/utils/package.ts | 3 ++- .../cypress/tasks/endpoint_policy.ts | 16 ++++++++++++-- .../public/management/cypress/tasks/fleet.ts | 13 ++++++++++++ .../policy/use_fetch_endpoint_policy.test.ts | 2 ++ .../hooks/policy/use_fetch_endpoint_policy.ts | 5 +++-- ...etch_endpoint_policy_agent_summary.test.ts | 3 ++- ...use_fetch_endpoint_policy_agent_summary.ts | 3 ++- .../policy/use_update_endpoint_policy.test.ts | 3 ++- .../policy/use_update_endpoint_policy.ts | 3 ++- .../policy_settings_layout.test.tsx | 3 ++- .../services/policies/ingest.test.ts | 11 +++++++--- .../management/services/policies/ingest.ts | 14 ++++++++++--- .../services/policies/policies.test.ts | 4 +++- .../management/services/policies/policies.ts | 3 ++- .../scripts/endpoint/common/fleet_services.ts | 17 +++++++++++++++ .../endpoint_agent_runner/fleet_server.ts | 21 ++++++++++++++++++- x-pack/test/osquery_cypress/utils.ts | 16 ++++++++++++-- 28 files changed, 172 insertions(+), 26 deletions(-) diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 6fe1bb1b251e1..80d1312af6e64 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -141,6 +141,7 @@ const uploadPipeline = (pipelineContent: string | object) => { ) { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/fleet_cypress.yml')); pipeline.push(getPipeline('.buildkite/pipelines/pull_request/defend_workflows.yml')); + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/osquery_cypress.yml')); } if ( diff --git a/x-pack/plugins/fleet/common/index.ts b/x-pack/plugins/fleet/common/index.ts index df9ecae76bea5..9ac36d753c4e8 100644 --- a/x-pack/plugins/fleet/common/index.ts +++ b/x-pack/plugins/fleet/common/index.ts @@ -59,6 +59,8 @@ export { // dashboards ids DASHBOARD_LOCATORS_IDS, FLEET_ENROLLMENT_API_PREFIX, + API_VERSIONS, + APP_API_ROUTES, } from './constants'; export { // Route services diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx index 4a92e44436fcd..c31140aca3a96 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx @@ -7,6 +7,8 @@ import React from 'react'; +import { API_VERSIONS } from '../../../../../../../common/constants'; + import type { UseRequestConfig } from '../../../../hooks'; import { useRequest } from '../../../../hooks'; import type { GetAgentStatusResponse } from '../../../../types'; @@ -21,6 +23,7 @@ export function useGetAgentStatus(policyId?: string, options?: RequestOptions) { policyId, }, method: 'get', + version: API_VERSIONS.public.v1, ...options, }); diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts index 399016ebf2042..a7ecbf95d25c1 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts @@ -7,6 +7,8 @@ import { useEffect, useMemo, useState } from 'react'; +import { API_VERSIONS } from '../../../../../../../../common/constants'; + import type { PackagePolicy, GetAgentPoliciesResponse, @@ -75,6 +77,7 @@ export const usePackagePoliciesWithAgentPolicy = ( full: true, ignoreMissing: true, }, + version: API_VERSIONS.public.v1, shouldSendRequest: agentPoliciesIds.length > 0, } as SendConditionalRequestConfig); diff --git a/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts b/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts index 9bd7d482e7e4a..69bf82061d89c 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts @@ -109,6 +109,7 @@ export const useConditionalRequest = ( path: config.path, query: config.query, body: config.body, + version: config.version, }); if (res.error) { throw res.error; diff --git a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts index 206d30cabbb79..52723d0450351 100644 --- a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts +++ b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts @@ -201,6 +201,7 @@ async function getAgentPolicy(id: string) { 'Content-Type': 'application/json', 'kbn-xsrf': 'kibana', 'x-elastic-product-origin': 'fleet', + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, }); const data = await res.json(); @@ -346,6 +347,7 @@ async function bumpAgentPolicyRevision(id: string, policy: any) { 'Content-Type': 'application/json', 'kbn-xsrf': 'kibana', 'x-elastic-product-origin': 'fleet', + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, }); diff --git a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts index 9a139eadf9adf..d7b9f7d43ce43 100644 --- a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts @@ -294,6 +294,9 @@ export const loadAgentPolicy = () => monitoring_enabled: ['logs', 'metrics'], inactivity_timeout: 1209600, }, + headers: { + 'Elastic-Api-Version': API_VERSIONS.public.v1, + }, url: '/api/fleet/agent_policies', }).then((response) => response.body.item); @@ -301,5 +304,8 @@ export const cleanupAgentPolicy = (agentPolicyId: string) => request({ method: 'POST', body: { agentPolicyId }, + headers: { + 'Elastic-Api-Version': API_VERSIONS.public.v1, + }, url: '/api/fleet/agent_policies/delete', }); diff --git a/x-pack/plugins/osquery/cypress/tasks/integrations.ts b/x-pack/plugins/osquery/cypress/tasks/integrations.ts index 09948eca70538..c8bb688dac0f5 100644 --- a/x-pack/plugins/osquery/cypress/tasks/integrations.ts +++ b/x-pack/plugins/osquery/cypress/tasks/integrations.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { API_VERSIONS } from '../../common/constants'; import { DEFAULT_POLICY } from '../screens/fleet'; import { ADD_POLICY_BTN, @@ -125,7 +126,7 @@ export const deleteIntegrations = async (integrationName: string) => { .then(() => { cy.request({ url: `/api/fleet/package_policies/delete`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': API_VERSIONS.public.v1 }, body: `{ "packagePolicyIds": ${JSON.stringify(ids)} }`, method: 'POST', }); @@ -135,7 +136,7 @@ export const deleteIntegrations = async (integrationName: string) => { export const installPackageWithVersion = (integration: string, version: string) => { cy.request({ url: `/api/fleet/epm/packages/${integration}-${version}`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': API_VERSIONS.public.v1 }, body: '{ "force": true }', method: 'POST', }); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts index 0b988d831c923..781d6243384e9 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts @@ -10,7 +10,7 @@ import type { AxiosResponse } from 'axios'; import type { DeleteByQueryResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { KbnClient } from '@kbn/test'; import type { Agent, FleetServerAgent, GetOneAgentResponse } from '@kbn/fleet-plugin/common'; -import { AGENT_API_ROUTES } from '@kbn/fleet-plugin/common'; +import { AGENT_API_ROUTES, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { HostMetadata } from '../types'; import { FleetAgentGenerator } from '../data_generators/fleet_agent_generator'; import { wrapErrorAndRejectPromise } from './utils'; @@ -90,6 +90,7 @@ const fetchFleetAgent = async (kbnClient: KbnClient, agentId: string): Promise
).data.item; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts index 0730eba99306c..fda862d247bae 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts @@ -16,7 +16,11 @@ import type { DeleteAgentPolicyResponse, PostDeletePackagePoliciesResponse, } from '@kbn/fleet-plugin/common'; -import { AGENT_POLICY_API_ROUTES, PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common'; +import { + AGENT_POLICY_API_ROUTES, + PACKAGE_POLICY_API_ROUTES, + API_VERSIONS, +} from '@kbn/fleet-plugin/common'; import { memoize } from 'lodash'; import { getEndpointPackageInfo } from '../utils/package'; import type { PolicyData } from '../types'; @@ -61,6 +65,9 @@ export const indexFleetEndpointPolicy = async ( agentPolicy = (await kbnClient .request({ path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: newAgentPolicyData, }) @@ -101,6 +108,9 @@ export const indexFleetEndpointPolicy = async ( path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, method: 'POST', body: newPackagePolicyData, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -135,6 +145,9 @@ export const deleteIndexedFleetEndpointPolicies = async ( (await kbnClient .request({ path: PACKAGE_POLICY_API_ROUTES.DELETE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: { packagePolicyIds: indexData.integrationPolicies.map((policy) => policy.id), @@ -153,6 +166,9 @@ export const deleteIndexedFleetEndpointPolicies = async ( (await kbnClient .request({ path: AGENT_POLICY_API_ROUTES.DELETE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: { agentPolicyId: agentPolicy.id, diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts index 177dccce73714..6c84cd6e5738f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts @@ -13,7 +13,12 @@ import type { IBulkInstallPackageHTTPError, PostFleetSetupResponse, } from '@kbn/fleet-plugin/common'; -import { AGENTS_SETUP_API_ROUTES, EPM_API_ROUTES, SETUP_API_ROUTE } from '@kbn/fleet-plugin/common'; +import { + AGENTS_SETUP_API_ROUTES, + EPM_API_ROUTES, + SETUP_API_ROUTE, + API_VERSIONS, +} from '@kbn/fleet-plugin/common'; import { ToolingLog } from '@kbn/tooling-log'; import { UsageTracker } from './usage_tracker'; import { EndpointDataLoadingError, retryOnError, wrapErrorAndRejectPromise } from './utils'; @@ -43,6 +48,7 @@ export const setupFleetForEndpoint = async ( const setupResponse = (await kbnClient .request({ path: SETUP_API_ROUTE, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, method: 'POST', }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -64,6 +70,9 @@ export const setupFleetForEndpoint = async ( .request({ path: AGENTS_SETUP_API_ROUTES.CREATE_PATTERN, method: 'POST', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -118,6 +127,9 @@ export const installOrUpgradeEndpointFleetPackage = async ( query: { prerelease: true, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; diff --git a/x-pack/plugins/security_solution/common/endpoint/utils/package.ts b/x-pack/plugins/security_solution/common/endpoint/utils/package.ts index c45c44fa9c561..599fcabe24c9c 100644 --- a/x-pack/plugins/security_solution/common/endpoint/utils/package.ts +++ b/x-pack/plugins/security_solution/common/endpoint/utils/package.ts @@ -9,7 +9,7 @@ import type { AxiosResponse } from 'axios'; import type { KbnClient } from '@kbn/test'; import type { GetInfoResponse } from '@kbn/fleet-plugin/common'; -import { epmRouteService } from '@kbn/fleet-plugin/common'; +import { API_VERSIONS, epmRouteService } from '@kbn/fleet-plugin/common'; export const getEndpointPackageInfo = async ( kbnClient: KbnClient @@ -18,6 +18,7 @@ export const getEndpointPackageInfo = async ( const endpointPackage = ( (await kbnClient.request({ path, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, method: 'GET', })) as AxiosResponse ).data.item; diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts index 9353cdf9ed822..a1b5972758742 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts @@ -10,7 +10,7 @@ import type { UpdatePackagePolicy, UpdatePackagePolicyResponse, } from '@kbn/fleet-plugin/common'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { request } from './common'; import { ProtectionModes } from '../../../../common/endpoint/types'; @@ -24,6 +24,9 @@ export const enableAllPolicyProtections = ( return request({ method: 'GET', url: packagePolicyRouteService.getInfoPath(endpointPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body: { item: endpointPolicy } }) => { const { created_by: _createdBy, @@ -58,6 +61,9 @@ export const enableAllPolicyProtections = ( method: 'PUT', url: packagePolicyRouteService.getUpdatePath(endpointPolicyId), body: updatedEndpointPolicy, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); }); }; @@ -69,6 +75,9 @@ export const setCustomProtectionUpdatesManifestVersion = ( return request({ method: 'GET', url: packagePolicyRouteService.getInfoPath(endpointPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body: { item: endpointPolicy } }) => { const { created_by: _createdBy, @@ -91,6 +100,9 @@ export const setCustomProtectionUpdatesManifestVersion = ( method: 'PUT', url: packagePolicyRouteService.getUpdatePath(endpointPolicyId), body: updatedEndpointPolicy, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); }); }; @@ -103,6 +115,6 @@ export const setCustomProtectionUpdatesNote = ( method: 'POST', url: `/api/endpoint/protection_updates_note/${endpointPolicyId}`, body: { note }, - headers: { 'Elastic-Api-Version': '2023-10-31' }, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, }); }; diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts index 775baa7409f0a..bd6edbea158ce 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts @@ -15,6 +15,7 @@ import { agentRouteService, epmRouteService, packagePolicyRouteService, + API_VERSIONS, } from '@kbn/fleet-plugin/common'; import type { PutAgentReassignResponse } from '@kbn/fleet-plugin/common/types'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; @@ -24,6 +25,9 @@ export const getEndpointIntegrationVersion = (): Cypress.Chainable => request({ url: epmRouteService.getInfoPath('endpoint'), method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then((response) => response.body.item.version); export const getAgentByHostName = (hostname: string): Cypress.Chainable => @@ -33,6 +37,9 @@ export const getAgentByHostName = (hostname: string): Cypress.Chainable = qs: { kuery: `local_metadata.host.hostname: "${hostname}"`, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then((response) => response.body.items[0]); export const reassignAgentPolicy = ( @@ -45,6 +52,9 @@ export const reassignAgentPolicy = ( body: { policy_id: agentPolicyId, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); export const yieldEndpointPolicyRevision = (): Cypress.Chainable => @@ -54,6 +64,9 @@ export const yieldEndpointPolicyRevision = (): Cypress.Chainable => qs: { kuery: 'ingest-package-policies.package.name: endpoint', }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body }) => { return body.items?.[0]?.revision ?? -1; }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts index 78cb1282f94a8..85647202a755c 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts @@ -17,6 +17,7 @@ import { DefaultPolicyRuleNotificationMessage, } from '../../../../common/endpoint/models/policy_config'; import { set } from 'lodash'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common'; const useQueryMock = _useQuery as jest.Mock; @@ -60,6 +61,7 @@ describe('When using the `useGetFileInfo()` hook', () => { expect(apiMocks.responseProvider.endpointPackagePolicy).toHaveBeenCalledWith({ path: `/api/fleet/package_policies/${policy.id}`, + version: API_VERSIONS.public.v1, }); }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts index 35d8a0f2ea255..bb8033ae012bb 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts @@ -8,7 +8,7 @@ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import { useQuery } from '@tanstack/react-query'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { DefaultPolicyNotificationMessage, DefaultPolicyRuleNotificationMessage, @@ -45,7 +45,8 @@ export const useFetchEndpointPolicy = ( ...options, queryFn: async () => { const apiResponse = await http.get( - packagePolicyRouteService.getInfoPath(policyId) + packagePolicyRouteService.getInfoPath(policyId), + { version: API_VERSIONS.public.v1 } ); applyDefaultsToPolicyIfNeeded(apiResponse.item); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts index 0513fee664dc1..80fd6d41dfd6e 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts @@ -12,7 +12,7 @@ import type { PolicyData } from '../../../../common/endpoint/types'; import { allFleetHttpMocks } from '../../mocks'; import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator'; import { useFetchAgentByAgentPolicySummary } from './use_fetch_endpoint_policy_agent_summary'; -import { agentRouteService } from '@kbn/fleet-plugin/common'; +import { agentRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; const useQueryMock = _useQuery as jest.Mock; @@ -57,6 +57,7 @@ describe('When using the `useFetchEndpointPolicyAgentSummary()` hook', () => { expect(apiMocks.responseProvider.agentStatus).toHaveBeenCalledWith({ path: agentRouteService.getStatusPath(), query: { policyId: policy.policy_id }, + version: API_VERSIONS.public.v1, }); expect(data).toEqual({ total: 50, diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts index cbe69a321d1f5..82cebb6263f96 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts @@ -9,7 +9,7 @@ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import type { GetAgentStatusResponse } from '@kbn/fleet-plugin/common'; import { useQuery } from '@tanstack/react-query'; -import { agentRouteService } from '@kbn/fleet-plugin/common'; +import { agentRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { useHttp } from '../../../common/lib/kibana'; type EndpointPolicyAgentSummary = GetAgentStatusResponse['results']; @@ -30,6 +30,7 @@ export const useFetchAgentByAgentPolicySummary = ( return ( await http.get(agentRouteService.getStatusPath(), { query: { policyId: agentPolicyId }, + version: API_VERSIONS.public.v1, }) ).results; }, diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts index 1f9dc8e300f05..8b6be08b41b46 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts @@ -17,7 +17,7 @@ import type { RenderHookResult } from '@testing-library/react-hooks/src/types'; import { useUpdateEndpointPolicy } from './use_update_endpoint_policy'; import type { PolicyData } from '../../../../common/endpoint/types'; import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { API_VERSIONS, packagePolicyRouteService } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../common/endpoint/service/policy'; const useMutationMock = _useMutation as jest.Mock; @@ -64,6 +64,7 @@ describe('When using the `useFetchEndpointPolicyAgentSummary()` hook', () => { expect(apiMocks.responseProvider.updateEndpointPolicy).toHaveBeenCalledWith({ path: packagePolicyRouteService.getUpdatePath(policy.id), body: JSON.stringify(getPolicyDataForUpdate(policy)), + version: API_VERSIONS.public.v1, }); expect(result).toEqual({ item: expect.any(Object) }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts index 2e7f8b83ac19b..5e078ad563481 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts @@ -8,7 +8,7 @@ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import { useMutation } from '@tanstack/react-query'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../common/endpoint/service/policy'; import { useHttp } from '../../../common/lib/kibana'; import type { PolicyData } from '../../../../common/endpoint/types'; @@ -39,6 +39,7 @@ export const useUpdateEndpointPolicy = ( return http.put(packagePolicyRouteService.getUpdatePath(policy.id), { body: JSON.stringify(update), + version: API_VERSIONS.public.v1, }); }, options); }; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx index 64188ce296c6e..0c5a98281eec6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx @@ -20,7 +20,7 @@ import { expectIsViewOnly, getPolicySettingsFormTestSubjects } from '../policy_s import { cloneDeep, set } from 'lodash'; import { ProtectionModes } from '../../../../../../common/endpoint/types'; import { waitFor, cleanup } from '@testing-library/react'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../../../common/endpoint/service/policy'; import { getDeferred } from '../../../../mocks/utils'; @@ -133,6 +133,7 @@ describe('When rendering PolicySettingsLayout', () => { expect(apiMocks.responseProvider.updateEndpointPolicy).toHaveBeenCalledWith({ path: packagePolicyRouteService.getUpdatePath(policyData.id), body: JSON.stringify(getPolicyDataForUpdate(expectedUpdatedPolicy)), + version: API_VERSIONS.public.v1, }); }); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts b/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts index a3644ce691478..d498f32bb1cab 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts @@ -7,7 +7,7 @@ import { sendGetPackagePolicy, sendGetEndpointSecurityPackage } from './ingest'; import { httpServiceMock } from '@kbn/core/public/mocks'; -import { PACKAGE_POLICY_API_ROOT, epmRouteService } from '@kbn/fleet-plugin/common'; +import { PACKAGE_POLICY_API_ROOT, epmRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { policyListApiPathHandlers } from '../../pages/policy/store/test_mock_utils'; describe('ingest service', () => { @@ -20,7 +20,9 @@ describe('ingest service', () => { describe('sendGetPackagePolicy()', () => { it('builds correct API path', async () => { await sendGetPackagePolicy(http, '123'); - expect(http.get).toHaveBeenCalledWith(`${PACKAGE_POLICY_API_ROOT}/123`, undefined); + expect(http.get).toHaveBeenCalledWith(`${PACKAGE_POLICY_API_ROOT}/123`, { + version: API_VERSIONS.public.v1, + }); }); it('supports http options', async () => { await sendGetPackagePolicy(http, '123', { query: { page: 1 } }); @@ -28,6 +30,7 @@ describe('ingest service', () => { query: { page: 1, }, + version: API_VERSIONS.public.v1, }); }); }); @@ -37,7 +40,9 @@ describe('ingest service', () => { const path = epmRouteService.getInfoPath('endpoint'); http.get.mockReturnValue(Promise.resolve(policyListApiPathHandlers()[path]())); await sendGetEndpointSecurityPackage(http); - expect(http.get).toHaveBeenCalledWith(path); + expect(http.get).toHaveBeenCalledWith(path, { + version: API_VERSIONS.public.v1, + }); }); it('should throw if package is not found', async () => { diff --git a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts index e5347449d4dbe..4a2690a112e24 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts @@ -11,7 +11,7 @@ import type { GetPackagePoliciesResponse, GetInfoResponse, } from '@kbn/fleet-plugin/common'; -import { epmRouteService } from '@kbn/fleet-plugin/common'; +import { epmRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { NewPolicyData } from '../../../../common/endpoint/types'; import type { GetPolicyResponse, UpdatePolicyResponse } from '../../pages/policy/types'; @@ -34,7 +34,10 @@ export const sendGetPackagePolicy = ( packagePolicyId: string, options?: HttpFetchOptions ) => { - return http.get(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, options); + return http.get(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, { + ...options, + version: API_VERSIONS.public.v1, + }); }; /** @@ -50,6 +53,7 @@ export const sendBulkGetPackagePolicies = ( ) => { return http.post(`${INGEST_API_PACKAGE_POLICIES}/_bulk_get`, { ...options, + version: API_VERSIONS.public.v1, body: JSON.stringify({ ids: packagePolicyIds, ignoreMissing: true, @@ -73,6 +77,7 @@ export const sendPutPackagePolicy = ( ): Promise => { return http.put(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, { ...options, + version: API_VERSIONS.public.v1, body: JSON.stringify(packagePolicy), }); }; @@ -92,6 +97,7 @@ export const sendGetFleetAgentStatusForPolicy = ( ): Promise => { return http.get(INGEST_API_FLEET_AGENT_STATUS, { ...options, + version: API_VERSIONS.public.v1, query: { policyId, }, @@ -105,7 +111,9 @@ export const sendGetEndpointSecurityPackage = async ( http: HttpStart ): Promise => { const path = epmRouteService.getInfoPath('endpoint'); - const endpointPackageResponse = await http.get(path); + const endpointPackageResponse = await http.get(path, { + version: API_VERSIONS.public.v1, + }); const endpointPackageInfo = endpointPackageResponse.item; if (!endpointPackageInfo) { throw new Error('Endpoint package was not found.'); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts b/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts index 86715ebff3f75..a523f94d489c5 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts @@ -7,7 +7,7 @@ import { httpServiceMock } from '@kbn/core/public/mocks'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; -import { PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common/constants/routes'; +import { API_VERSIONS, PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common/constants'; import { sendGetEndpointSpecificPackagePolicies } from './policies'; describe('ingest service', () => { @@ -24,6 +24,7 @@ describe('ingest service', () => { query: { kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, }, + version: API_VERSIONS.public.v1, }); }); it('supports additional KQL to be defined on input for query params', async () => { @@ -36,6 +37,7 @@ describe('ingest service', () => { perPage: 10, page: 1, }, + version: API_VERSIONS.public.v1, }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/policies.ts b/x-pack/plugins/security_solution/public/management/services/policies/policies.ts index de700e20e8c40..a7a45f832b56d 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/policies.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/policies.ts @@ -7,7 +7,7 @@ import type { HttpFetchOptions, HttpStart } from '@kbn/core/public'; import type { GetPackagePoliciesRequest } from '@kbn/fleet-plugin/common'; -import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { GetPolicyListResponse } from '../../pages/policy/types'; import { INGEST_API_PACKAGE_POLICIES } from './ingest'; @@ -29,5 +29,6 @@ export const sendGetEndpointSpecificPackagePolicies = ( options?.query?.kuery ? `${options.query.kuery} and ` : '' }${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, }, + version: API_VERSIONS.public.v1, }); }; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index 0eca2cbf03501..95f000fd00355 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -19,6 +19,7 @@ import { agentPolicyRouteService, agentRouteService, AGENTS_INDEX, + API_VERSIONS, } from '@kbn/fleet-plugin/common'; import { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test'; @@ -106,6 +107,9 @@ export const fetchFleetAgents = async ( .request({ method: 'GET', path: AGENT_API_ROUTES.LIST_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: options, }) .catch(catchAxiosErrorFormatAndThrow) @@ -160,6 +164,9 @@ export const fetchFleetServerUrl = async (kbnClient: KbnClient): Promise({ method: 'GET', path: fleetServerHostsRoutesService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { perPage: 100, }, @@ -197,6 +204,9 @@ export const fetchAgentPolicyEnrollmentKey = async ( .request({ method: 'GET', path: enrollmentAPIKeyRouteService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { kuery: `policy_id: "${agentPolicyId}"` }, }) .catch(catchAxiosErrorFormatAndThrow) @@ -222,6 +232,9 @@ export const fetchAgentPolicyList = async ( .request({ method: 'GET', path: agentPolicyRouteService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: options, }) .catch(catchAxiosErrorFormatAndThrow) @@ -323,6 +336,7 @@ export const getAgentDownloadUrl = async ( * Given a stack version number, function will return the closest Agent download version available * for download. THis could be the actual version passed in or lower. * @param version + * @param log */ export const getLatestAgentDownloadVersion = async ( version: string, @@ -386,6 +400,9 @@ export const unEnrollFleetAgent = async ( method: 'POST', path: agentRouteService.getUnenrollPath(agentId), body: { revoke: force }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(catchAxiosErrorFormatAndThrow); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts index f9d88382d81c7..60471c5c46864 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts @@ -17,8 +17,9 @@ import { FLEET_SERVER_PACKAGE, PACKAGE_POLICY_API_ROUTES, PACKAGE_POLICY_SAVED_OBJECT_TYPE, + API_VERSIONS, + APP_API_ROUTES, } from '@kbn/fleet-plugin/common'; -import { APP_API_ROUTES } from '@kbn/fleet-plugin/common/constants'; import type { FleetServerHost, GenerateServiceTokenResponse, @@ -87,6 +88,9 @@ const getFleetServerPackagePolicy = async (): Promise .request({ method: 'GET', path: PACKAGE_POLICY_API_ROUTES.LIST_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { perPage: 1, kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: "${FLEET_SERVER_PACKAGE}"`, @@ -121,6 +125,9 @@ const getOrCreateFleetServerAgentPolicyId = async (): Promise => { .request({ method: 'POST', path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { name: `Fleet Server policy (${Math.random().toString(32).substring(2)})`, description: `Created by CLI Tool via: ${__filename}`, @@ -150,6 +157,9 @@ const generateFleetServiceToken = async (): Promise => { .request({ method: 'POST', path: APP_API_ROUTES.GENERATE_SERVICE_TOKEN_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: {}, }) .then((response) => response.data.value); @@ -279,6 +289,9 @@ const configureFleetIfNeeded = async () => { const fleetOutputs = await kbnClient .request({ method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: outputRoutesService.getListPath(), }) .then((response) => response.data); @@ -318,6 +331,9 @@ const configureFleetIfNeeded = async () => { await kbnClient .request({ method: 'PUT', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: outputRoutesService.getUpdatePath(id), body: update, }) @@ -356,6 +372,9 @@ const addFleetServerHostToFleetSettings = async ( .request({ method: 'POST', path: fleetServerHostsRoutesService.getCreatePath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: newFleetHostEntry, }) .catch(catchAxiosErrorFormatAndThrow) diff --git a/x-pack/test/osquery_cypress/utils.ts b/x-pack/test/osquery_cypress/utils.ts index 572170e0ec301..a852cfd8bed99 100644 --- a/x-pack/test/osquery_cypress/utils.ts +++ b/x-pack/test/osquery_cypress/utils.ts @@ -8,7 +8,7 @@ import axios from 'axios'; import semver from 'semver'; import { map } from 'lodash'; -import { PackagePolicy, CreatePackagePolicyResponse } from '@kbn/fleet-plugin/common'; +import { PackagePolicy, CreatePackagePolicyResponse, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { KbnClient } from '@kbn/test'; import { GetEnrollmentAPIKeysResponse, @@ -26,7 +26,10 @@ export const getInstalledIntegration = async (kbnClient: KbnClient, integrationN } = await kbnClient.request<{ item: PackagePolicy }>({ method: 'GET', path: `/api/fleet/epm/packages/${integrationName}`, - headers: DEFAULT_HEADERS, + headers: { + ...DEFAULT_HEADERS, + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); return item; @@ -46,6 +49,9 @@ export const createAgentPolicy = async ( } = await kbnClient.request({ method: 'POST', path: `/api/fleet/agent_policies?sys_monitoring=true`, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { name: agentPolicyName, description: '', @@ -62,6 +68,9 @@ export const createAgentPolicy = async ( log.info('Getting agent enrollment key'); const { data: apiKeys } = await kbnClient.request({ method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: '/api/fleet/enrollment_api_keys', }); @@ -79,6 +88,9 @@ export const addIntegrationToAgentPolicy = async ( return kbnClient.request({ method: 'POST', path: '/api/fleet/package_policies', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { policy_id: agentPolicyId, package: {