From 6b62ae2adfead5ece8b47c0909ab58c67f3f1adb Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Fri, 10 Mar 2023 18:23:48 +0100 Subject: [PATCH 01/12] [Security Solution] Fix exporting all rules (#152900) **Relates to:** https://github.com/elastic/security-team/issues/5339, https://github.com/elastic/kibana/pull/150097, https://github.com/elastic/kibana/pull/150553 ## Summary This PR fixes all rules exporting functionality which started exporting unintentionally runtime fields like `execution_summary`. This way it lead to inability to import just exported rules if as minimum one of them executed just once. On top of this the PR contains functional and Cypress tests to cover the fix. ## TODO - [ ] get rid of `await waitForEventLogExecuteComplete()` in functional tests - [ ] allow `getNewRule()` to rewrite its defaults ### Checklist - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../e2e/detection_rules/export_rule.cy.ts | 36 ++++- .../e2e/detection_rules/import_rules.cy.ts | 22 ++- .../persistent_rules_table_state.cy.ts | 12 +- .../cypress/screens/alerts_detection_rules.ts | 4 + .../cypress/tasks/alerts_detection_rules.ts | 33 ++++- .../components/rules_table/use_columns.tsx | 44 +++--- .../logic/export/get_export_all.ts | 5 +- .../logic/export/get_export_by_object_ids.ts | 10 +- .../rule_management/utils/utils.ts | 17 +++ .../group1/export_rules.ts | 126 +++++++++++++++--- 10 files changed, 234 insertions(+), 75 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts index 9a360d211f3fa..fecf13b21ddeb 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts @@ -5,21 +5,25 @@ * 2.0. */ -import { expectedExportedRule, getNewRule } from '../../objects/rule'; +import path from 'path'; +import { expectedExportedRule, getNewRule } from '../../objects/rule'; import { TOASTER_BODY, MODAL_CONFIRMATION_BODY, MODAL_CONFIRMATION_BTN, + TOASTER, } from '../../screens/alerts_detection_rules'; - import { - exportFirstRule, loadPrebuiltDetectionRulesFromHeaderBtn, filterByElasticRules, selectNumberOfRules, bulkExportRules, selectAllRules, + waitForRuleExecution, + exportRule, + importRules, + expectManagementTableRules, } from '../../tasks/alerts_detection_rules'; import { createExceptionList, deleteExceptionList } from '../../tasks/api_calls/exceptions'; import { getExceptionList } from '../../objects/exception'; @@ -30,9 +34,12 @@ import { login, visitWithoutDateRange } from '../../tasks/login'; import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../urls/navigation'; import { getAvailablePrebuiltRulesCount } from '../../tasks/api_calls/prebuilt_rules'; +const EXPORTED_RULES_FILENAME = 'rules_export.ndjson'; const exceptionList = getExceptionList(); describe('Export rules', () => { + const downloadsFolder = Cypress.config('downloadsFolder'); + before(() => { cleanKibana(); login(); @@ -45,17 +52,34 @@ describe('Export rules', () => { // Rules get exported via _bulk_action endpoint cy.intercept('POST', '/api/detection_engine/rules/_bulk_action').as('bulk_action'); visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - createRule(getNewRule()).as('ruleResponse'); + createRule({ ...getNewRule(), name: 'Rule to export' }).as('ruleResponse'); }); - it('Exports a custom rule', function () { - exportFirstRule(); + it('exports a custom rule', function () { + exportRule('Rule to export'); cy.wait('@bulk_action').then(({ response }) => { cy.wrap(response?.body).should('eql', expectedExportedRule(this.ruleResponse)); cy.get(TOASTER_BODY).should('have.text', 'Successfully exported 1 of 1 rule.'); }); }); + it('creates an importable file from executed rule', () => { + // Rule needs to be enabled to make sure it has been executed so rule's SO contains runtime fields like `execution_summary` + createRule({ ...getNewRule(), name: 'Enabled rule to export', enabled: true }); + waitForRuleExecution('Enabled rule to export'); + + exportRule('Enabled rule to export'); + + cy.get(TOASTER).should('have.text', 'Rules exported'); + cy.get(TOASTER_BODY).should('have.text', 'Successfully exported 1 of 1 rule.'); + + deleteAlertsAndRules(); + importRules(path.join(downloadsFolder, EXPORTED_RULES_FILENAME)); + + cy.get(TOASTER).should('have.text', 'Successfully imported 1 rule'); + expectManagementTableRules(['Enabled rule to export']); + }); + it('shows a modal saying that no rules can be exported if all the selected rules are prebuilt', function () { const expectedElasticRulesCount = 7; diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/import_rules.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/import_rules.cy.ts index 647edd716bc49..5bb0f44b0e5ec 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/import_rules.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/import_rules.cy.ts @@ -5,10 +5,9 @@ * 2.0. */ -import { RULES_MANAGEMENT_TABLE, TOASTER } from '../../screens/alerts_detection_rules'; +import { TOASTER } from '../../screens/alerts_detection_rules'; import { - expectNumberOfRules, - expectToContainRule, + expectManagementTableRules, importRules, importRulesWithOverwriteAll, } from '../../tasks/alerts_detection_rules'; @@ -16,6 +15,7 @@ import { cleanKibana, deleteAlertsAndRules, reload } from '../../tasks/common'; import { login, visitWithoutDateRange } from '../../tasks/login'; import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../urls/navigation'; +const RULES_TO_IMPORT_FILENAME = 'cypress/fixtures/7_16_rules.ndjson'; describe('Import rules', () => { before(() => { @@ -29,10 +29,7 @@ describe('Import rules', () => { }); it('Imports a custom rule with exceptions', function () { - const expectedNumberOfRules = 1; - const expectedImportedRuleName = 'Test Custom Rule'; - - importRules('7_16_rules.ndjson'); + importRules(RULES_TO_IMPORT_FILENAME); cy.wait('@import').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); @@ -41,20 +38,19 @@ describe('Import rules', () => { 'Successfully imported 1 ruleSuccessfully imported 1 exception.' ); - expectNumberOfRules(RULES_MANAGEMENT_TABLE, expectedNumberOfRules); - expectToContainRule(RULES_MANAGEMENT_TABLE, expectedImportedRuleName); + expectManagementTableRules(['Test Custom Rule']); }); }); it('Shows error toaster when trying to import rule and exception list that already exist', function () { - importRules('7_16_rules.ndjson'); + importRules(RULES_TO_IMPORT_FILENAME); cy.wait('@import').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); }); reload(); - importRules('7_16_rules.ndjson'); + importRules(RULES_TO_IMPORT_FILENAME); cy.wait('@import').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); @@ -63,14 +59,14 @@ describe('Import rules', () => { }); it('Does not show error toaster when trying to import rule and exception list that already exist when overwrite is true', function () { - importRules('7_16_rules.ndjson'); + importRules(RULES_TO_IMPORT_FILENAME); cy.wait('@import').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); }); reload(); - importRulesWithOverwriteAll('7_16_rules.ndjson'); + importRulesWithOverwriteAll(RULES_TO_IMPORT_FILENAME); cy.wait('@import').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/persistent_rules_table_state.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/persistent_rules_table_state.cy.ts index 3d9653ae383ee..7685c2a08c7e4 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/persistent_rules_table_state.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/persistent_rules_table_state.cy.ts @@ -17,8 +17,6 @@ import { } from '../../urls/navigation'; import { getNewRule } from '../../objects/rule'; import { - expectNumberOfRules, - expectToContainRule, filterByCustomRules, filterBySearchTerm, filterByTags, @@ -35,8 +33,8 @@ import { filterByDisabledRules, expectFilterByPrebuiltRules, expectFilterByEnabledRules, + expectManagementTableRules, } from '../../tasks/alerts_detection_rules'; -import { RULES_MANAGEMENT_TABLE } from '../../screens/alerts_detection_rules'; import { createRule } from '../../tasks/api_calls/rules'; import { expectRowsPerPage, @@ -108,14 +106,6 @@ function expectDefaultRulesTableState(): void { expectTablePage(1); } -function expectManagementTableRules(ruleNames: string[]): void { - expectNumberOfRules(RULES_MANAGEMENT_TABLE, ruleNames.length); - - for (const ruleName of ruleNames) { - expectToContainRule(RULES_MANAGEMENT_TABLE, ruleName); - } -} - describe('Persistent rules table state', () => { before(() => { cleanKibana(); diff --git a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts index 47bf62a73c3f8..2af59e2ae67d7 100644 --- a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts @@ -71,6 +71,8 @@ export const RULE_CHECKBOX = '.euiTableRow .euiCheckbox__input'; export const RULE_NAME = '[data-test-subj="ruleName"]'; +export const RULE_LAST_RUN = '[data-test-subj="ruleLastRun"]'; + export const RULE_SWITCH = '[data-test-subj="ruleSwitch"]'; export const RULE_SWITCH_LOADER = '[data-test-subj="ruleSwitchLoader"]'; @@ -143,6 +145,8 @@ export const SELECTED_RULES_NUMBER_LABEL = '[data-test-subj="selectedRules"]'; export const REFRESH_SETTINGS_POPOVER = '[data-test-subj="refreshSettings-popover"]'; +export const REFRESH_RULES_TABLE_BUTTON = '[data-test-subj="refreshRulesAction-linkIcon"]'; + export const REFRESH_SETTINGS_SWITCH = '[data-test-subj="refreshSettingsSwitch"]'; export const REFRESH_SETTINGS_SELECTION_NOTE = '[data-test-subj="refreshSettingsSelectionNote"]'; diff --git a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts index 12d63a198cb06..f17fbac688f9d 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts @@ -60,6 +60,8 @@ import { RULES_MONITORING_TAB, ENABLED_RULES_BTN, DISABLED_RULES_BTN, + REFRESH_RULES_TABLE_BUTTON, + RULE_LAST_RUN, } from '../screens/alerts_detection_rules'; import type { RULES_MONITORING_TABLE } from '../screens/alerts_detection_rules'; import { EUI_CHECKBOX } from '../screens/common/controls'; @@ -162,8 +164,10 @@ export const disableSelectedRules = () => { cy.get(DISABLE_RULE_BULK_BTN).click(); }; -export const exportFirstRule = () => { - cy.get(COLLAPSED_ACTION_BTN).first().click({ force: true }); +export const exportRule = (name: string) => { + cy.log(`Export rule "${name}"`); + + cy.contains(RULE_NAME, name).parents(RULES_ROW).find(COLLAPSED_ACTION_BTN).click(); cy.get(EXPORT_ACTION_BTN).click(); cy.get(EXPORT_ACTION_BTN).should('not.exist'); }; @@ -183,6 +187,19 @@ export const filterByTags = (tags: string[]) => { } }; +export const waitForRuleExecution = (name: string) => { + cy.log(`Wait for rule "${name}" to be executed`); + cy.waitUntil(() => { + cy.get(REFRESH_RULES_TABLE_BUTTON).click(); + + return cy + .contains(RULE_NAME, name) + .parents(RULES_ROW) + .find(RULE_LAST_RUN) + .then(($el) => $el.text().endsWith('ago')); + }); +}; + export const filterByElasticRules = () => { cy.get(ELASTIC_RULES_BTN).click(); waitForRulesTableToBeRefreshed(); @@ -358,7 +375,7 @@ export const checkAutoRefresh = (ms: number, condition: string) => { export const importRules = (rulesFile: string) => { cy.get(RULE_IMPORT_MODAL).click(); cy.get(INPUT_FILE).should('exist'); - cy.get(INPUT_FILE).trigger('click', { force: true }).attachFile(rulesFile).trigger('change'); + cy.get(INPUT_FILE).trigger('click', { force: true }).selectFile(rulesFile).trigger('change'); cy.get(RULE_IMPORT_MODAL_BUTTON).last().click({ force: true }); cy.get(INPUT_FILE).should('not.exist'); }; @@ -455,6 +472,14 @@ const selectOverwriteRulesImport = () => { .should('be.checked'); }; +export const expectManagementTableRules = (ruleNames: string[]): void => { + expectNumberOfRules(RULES_MANAGEMENT_TABLE, ruleNames.length); + + for (const ruleName of ruleNames) { + expectToContainRule(RULES_MANAGEMENT_TABLE, ruleName); + } +}; + const selectOverwriteExceptionsRulesImport = () => { cy.get(RULE_IMPORT_OVERWRITE_EXCEPTIONS_CHECKBOX) .pipe(($el) => $el.trigger('click')) @@ -468,7 +493,7 @@ const selectOverwriteConnectorsRulesImport = () => { export const importRulesWithOverwriteAll = (rulesFile: string) => { cy.get(RULE_IMPORT_MODAL).click(); cy.get(INPUT_FILE).should('exist'); - cy.get(INPUT_FILE).trigger('click', { force: true }).attachFile(rulesFile).trigger('change'); + cy.get(INPUT_FILE).trigger('click', { force: true }).selectFile(rulesFile).trigger('change'); selectOverwriteRulesImport(); selectOverwriteExceptionsRulesImport(); selectOverwriteConnectorsRulesImport(); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx index fdc9f5f3a5b43..1296e9728d2e6 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx @@ -278,15 +278,19 @@ export const useRulesColumns = ({ field: 'execution_summary.last_execution.date', name: i18n.COLUMN_LAST_COMPLETE_RUN, render: (value: RuleExecutionSummary['last_execution']['date'] | undefined) => { - return value == null ? ( - getEmptyTagValue() - ) : ( - + return ( + + {value == null ? ( + getEmptyTagValue() + ) : ( + + )} + ); }, sortable: true, @@ -438,15 +442,19 @@ export const useMonitoringColumns = ({ field: 'execution_summary.last_execution.date', name: i18n.COLUMN_LAST_COMPLETE_RUN, render: (value: RuleExecutionSummary['last_execution']['date'] | undefined) => { - return value == null ? ( - getEmptyTagValue() - ) : ( - + return ( + + {value == null ? ( + getEmptyTagValue() + ) : ( + + )} + ); }, sortable: true, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.ts index 88f3e9019d493..5da8576c04a58 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.ts @@ -12,7 +12,7 @@ import type { ExceptionListClient } from '@kbn/lists-plugin/server'; import type { RulesClient, RuleExecutorServices } from '@kbn/alerting-plugin/server'; import { getNonPackagedRules } from '../search/get_existing_prepackaged_rules'; import { getExportDetailsNdjson } from './get_export_details_ndjson'; -import { transformAlertsToRules } from '../../utils/utils'; +import { transformAlertsToRules, transformRuleToExportableFormat } from '../../utils/utils'; import { getRuleExceptionsForExport } from './get_export_rule_exceptions'; import { getRuleActionConnectorsForExport } from './get_export_rule_action_connectors'; @@ -42,6 +42,7 @@ export const getExportAll = async ( logger, }); const rules = transformAlertsToRules(ruleAlertTypes, legacyActions); + const exportRules = rules.map((r) => transformRuleToExportableFormat(r)); // Gather exceptions const exceptions = rules.flatMap((rule) => rule.exceptions_list ?? []); @@ -55,7 +56,7 @@ export const getExportAll = async ( request ); - const rulesNdjson = transformDataToNdjson(rules); + const rulesNdjson = transformDataToNdjson(exportRules); const exportDetails = getExportDetailsNdjson(rules, [], exceptionDetails, actionConnectorDetails); return { rulesNdjson, exportDetails, exceptionLists, actionConnectors }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.ts index 90938420e64b5..5221c4f26761b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.ts @@ -17,6 +17,7 @@ import { getExportDetailsNdjson } from './get_export_details_ndjson'; import { isAlertType } from '../../../rule_schema'; import { findRules } from '../search/find_rules'; +import { transformRuleToExportableFormat } from '../../utils/utils'; import { getRuleExceptionsForExport } from './get_export_rule_exceptions'; import { getRuleActionConnectorsForExport } from './get_export_rule_action_connectors'; @@ -133,14 +134,11 @@ export const getRulesFromObjects = async ( isAlertType(matchingRule) && matchingRule.params.immutable !== true ) { - const rule = internalRuleToAPIResponse(matchingRule, legacyActions[matchingRule.id]); - - // Fields containing runtime information shouldn't be exported. It causes import failures. - delete rule.execution_summary; - return { statusCode: 200, - rule, + rule: transformRuleToExportableFormat( + internalRuleToAPIResponse(matchingRule, legacyActions[matchingRule.id]) + ), }; } else { return { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts index d024de62a95bf..3f65a49795d75 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts @@ -98,6 +98,23 @@ export const transformAlertsToRules = ( return rules.map((rule) => internalRuleToAPIResponse(rule, legacyRuleActions[rule.id])); }; +/** + * Transforms a rule object to exportable format. Exportable format shouldn't contain runtime fields like + * `execution_summary` + */ +export const transformRuleToExportableFormat = ( + rule: RuleResponse +): Omit => { + const exportedRule = { + ...rule, + }; + + // Fields containing runtime information shouldn't be exported. It causes import failures. + delete exportedRule.execution_summary; + + return exportedRule; +}; + export const transformFindAlerts = ( ruleFindResults: FindResult, legacyRuleActions: Record diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts index 945388de7a54e..0946852e6a117 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts @@ -5,9 +5,10 @@ * 2.0. */ -import expect from '@kbn/expect'; +import expect from 'expect'; import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; +import { RuleExecutionStatus } from '@kbn/security-solution-plugin/common/detection_engine/rule_monitoring'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { binaryToString, @@ -19,6 +20,7 @@ import { getSimpleRuleOutput, getWebHookAction, removeServerGeneratedProperties, + waitForRuleSuccessOrStatus, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -49,8 +51,61 @@ export default ({ getService }: FtrProviderContext): void => { .expect('Content-Disposition', 'attachment; filename="export.ndjson"'); }); - it('should export a single rule with a rule_id', async () => { - await createRule(supertest, log, getSimpleRule()); + it('should validate exported rule schema when its exported by its rule_id', async () => { + const ruleId = 'rule-1'; + + const rule = await createRule(supertest, log, getSimpleRule(ruleId, true)); + + await waitForRuleSuccessOrStatus( + supertest, + log, + rule.id, + RuleExecutionStatus['partial failure'] + ); + // to properly execute the test on rule's data with runtime fields some delay is needed as + // ES Search API may return outdated data + // it causes a reliable delay so exported rule's SO contains runtime fields returned via ES Search API + // and will be removed after addressing this issue + await new Promise((r) => setTimeout(r, 1000)); + + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_export`) + .set('kbn-xsrf', 'true') + .send({ + objects: [{ rule_id: 'rule-1' }], + }) + .expect(200) + .parse(binaryToString); + + const exportedRule = JSON.parse(body.toString().split(/\n/)[0]); + + expectToMatchRuleSchema(exportedRule); + }); + + it('should validate all exported rules schema', async () => { + const ruleId1 = 'rule-1'; + const ruleId2 = 'rule-2'; + + const rule1 = await createRule(supertest, log, getSimpleRule(ruleId1, true)); + const rule2 = await createRule(supertest, log, getSimpleRule(ruleId2, true)); + + await waitForRuleSuccessOrStatus( + supertest, + log, + rule1.id, + RuleExecutionStatus['partial failure'] + ); + await waitForRuleSuccessOrStatus( + supertest, + log, + rule2.id, + RuleExecutionStatus['partial failure'] + ); + // to properly execute the test on rule's data with runtime fields some delay is needed as + // ES Search API may return outdated data + // it causes a reliable delay so exported rule's SO contains runtime fields returned via ES Search API + // and will be removed after addressing this issue + await new Promise((r) => setTimeout(r, 1000)); const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_export`) @@ -59,10 +114,11 @@ export default ({ getService }: FtrProviderContext): void => { .expect(200) .parse(binaryToString); - const bodySplitAndParsed = JSON.parse(body.toString().split(/\n/)[0]); - const bodyToTest = removeServerGeneratedProperties(bodySplitAndParsed); + const exportedRule1 = JSON.parse(body.toString().split(/\n/)[1]); + const exportedRule2 = JSON.parse(body.toString().split(/\n/)[0]); - expect(bodyToTest).to.eql(getSimpleRuleOutput()); + expectToMatchRuleSchema(exportedRule1); + expectToMatchRuleSchema(exportedRule2); }); it('should export a exported count with a single rule_id', async () => { @@ -77,7 +133,7 @@ export default ({ getService }: FtrProviderContext): void => { const bodySplitAndParsed = JSON.parse(body.toString().split(/\n/)[1]); - expect(bodySplitAndParsed).to.eql({ + expect(bodySplitAndParsed).toEqual({ exported_exception_list_count: 0, exported_exception_list_item_count: 0, exported_count: 1, @@ -112,7 +168,7 @@ export default ({ getService }: FtrProviderContext): void => { const firstRule = removeServerGeneratedProperties(firstRuleParsed); const secondRule = removeServerGeneratedProperties(secondRuleParsed); - expect([firstRule, secondRule]).to.eql([ + expect([firstRule, secondRule]).toEqual([ getSimpleRuleOutput('rule-2'), getSimpleRuleOutput('rule-1'), ]); @@ -171,7 +227,7 @@ export default ({ getService }: FtrProviderContext): void => { ], throttle: 'rule', }; - expect(firstRule).to.eql(outputRule1); + expect(firstRule).toEqual(outputRule1); }); it('should export actions attached to 2 rules', async () => { @@ -224,8 +280,8 @@ export default ({ getService }: FtrProviderContext): void => { actions: [{ ...action, uuid: secondRule.actions[0].uuid }], throttle: 'rule', }; - expect(firstRule).to.eql(outputRule1); - expect(secondRule).to.eql(outputRule2); + expect(firstRule).toEqual(outputRule1); + expect(secondRule).toEqual(outputRule2); }); /** @@ -291,7 +347,7 @@ export default ({ getService }: FtrProviderContext): void => { const firstRuleParsed = JSON.parse(body.toString().split(/\n/)[0]); const firstRule = removeServerGeneratedProperties(firstRuleParsed); - expect(firstRule).to.eql(outputRule1); + expect(firstRule).toEqual(outputRule1); }); it('should be able to export 2 legacy actions on 1 rule', async () => { @@ -377,7 +433,7 @@ export default ({ getService }: FtrProviderContext): void => { const firstRuleParsed = JSON.parse(body.toString().split(/\n/)[0]); const firstRule = removeServerGeneratedProperties(firstRuleParsed); - expect(firstRule).to.eql(outputRule1); + expect(firstRule).toEqual(outputRule1); }); it('should be able to export 2 legacy actions on 2 rules', async () => { @@ -521,10 +577,50 @@ export default ({ getService }: FtrProviderContext): void => { const firstRule = removeServerGeneratedProperties(firstRuleParsed); const secondRule = removeServerGeneratedProperties(secondRuleParsed); - expect(firstRule).to.eql(outputRule2); - expect(secondRule).to.eql(outputRule1); + expect(firstRule).toEqual(outputRule2); + expect(secondRule).toEqual(outputRule1); }); }); }); }); }; + +function expectToMatchRuleSchema(obj: unknown): void { + expect(obj).toEqual({ + id: expect.any(String), + rule_id: expect.any(String), + enabled: expect.any(Boolean), + immutable: false, + updated_at: expect.any(String), + updated_by: expect.any(String), + created_at: expect.any(String), + created_by: expect.any(String), + name: expect.any(String), + tags: expect.arrayContaining([]), + interval: expect.any(String), + description: expect.any(String), + risk_score: expect.any(Number), + severity: expect.any(String), + output_index: expect.any(String), + author: expect.arrayContaining([]), + false_positives: expect.arrayContaining([]), + from: expect.any(String), + max_signals: expect.any(Number), + risk_score_mapping: expect.arrayContaining([]), + severity_mapping: expect.arrayContaining([]), + threat: expect.arrayContaining([]), + to: expect.any(String), + references: expect.arrayContaining([]), + version: expect.any(Number), + exceptions_list: expect.arrayContaining([]), + related_integrations: expect.arrayContaining([]), + required_fields: expect.arrayContaining([]), + setup: expect.any(String), + type: expect.any(String), + language: expect.any(String), + index: expect.arrayContaining([]), + query: expect.any(String), + throttle: expect.any(String), + actions: expect.arrayContaining([]), + }); +} From ba6058c1477813c65f7775de38b59bc0f3edb860 Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Fri, 10 Mar 2023 13:18:09 -0500 Subject: [PATCH 02/12] Uses refresh=false for creating, updating, and invalidating user sessions (#151800) closes #149338 ## Summary Sets refresh parameter to false in session create, update, and invalidate. Previously refresh was set to 'wait_for' (or 'true' in the case of invalidating by query). ### Tests Several unit tests and functional tests have been updated to reflect the change in test snapshots and to manually refresh the session index in order to complete testing. The bulk of the test changes reside in the [concurrent session limit suite](https://github.com/elastic/kibana/blob/66a43be28ca653809996b53198fc6fae2ee726f8/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts). Flaky Test Runner for relevant test suites: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/1984 ### Documentation Adds a note to the session-management ascii doc to document a known limitation of enforcing the concurrent sessions limit... ``` NOTE: Due to the rate at which session information is refreshed, there might be a few seconds where the concurrent session limit is not enforced. This is something to consider for use cases where it is common to create multiple sessions simultaneously. ``` --------- Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- .../user/security/session-management.asciidoc | 5 +++- .../session_management/session_index.test.ts | 26 +++++++++---------- .../session_management/session_index.ts | 8 +++--- .../tests/session_concurrent_limit/cleanup.ts | 6 +++-- .../session_concurrent_limit/global_limit.ts | 14 ++++++++++ .../tests/session_idle/cleanup.ts | 3 +++ .../tests/session_idle/expired.ts | 1 + .../tests/session_invalidate/invalidate.ts | 2 ++ .../tests/session_lifespan/cleanup.ts | 3 +++ 9 files changed, 48 insertions(+), 20 deletions(-) diff --git a/docs/user/security/session-management.asciidoc b/docs/user/security/session-management.asciidoc index 01b5693d1b0b3..d5edf66523668 100644 --- a/docs/user/security/session-management.asciidoc +++ b/docs/user/security/session-management.asciidoc @@ -57,10 +57,13 @@ To add a limit, use the `xpack.security.session.сoncurrentSessions.maxSessions` If set, the value of this option should be an integer between `1` and `1000`. When the limit is exceeded, the oldest session is automatically invalidated. +NOTE: Due to the rate at which session information is refreshed, there might be a few seconds where the concurrent session limit is not enforced. +This is something to consider for use cases where it is common to create multiple sessions simultaneously. + -- [source,yaml] -------------------------------------------------------------------------------- -xpack.security.session.сoncurrentSessions: +xpack.security.session.concurrentSessions: maxSessions: 3 -------------------------------------------------------------------------------- -- diff --git a/x-pack/plugins/security/server/session_management/session_index.test.ts b/x-pack/plugins/security/server/session_management/session_index.test.ts index 2178abc064179..f3c6d430a0644 100644 --- a/x-pack/plugins/security/server/session_management/session_index.test.ts +++ b/x-pack/plugins/security/server/session_management/session_index.test.ts @@ -1404,7 +1404,7 @@ describe('Session index', () => { id: sid, index: aliasName, body: sessionValue, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { ignore: [404], meta: true } @@ -1415,7 +1415,7 @@ describe('Session index', () => { id: sid, index: aliasName, body: sessionValue, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { ignore: [], meta: true } @@ -1460,7 +1460,7 @@ describe('Session index', () => { id: sid, index: aliasName, body: sessionValue, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { meta: true, ignore: [404] } @@ -1533,7 +1533,7 @@ describe('Session index', () => { body: sessionValue, if_seq_no: 456, if_primary_term: 123, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { ignore: [404, 409], meta: true } @@ -1575,7 +1575,7 @@ describe('Session index', () => { body: sessionValue, if_seq_no: 456, if_primary_term: 123, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { ignore: [404, 409], meta: true } @@ -1630,7 +1630,7 @@ describe('Session index', () => { body: sessionValue, if_seq_no: 456, if_primary_term: 123, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { ignore: [404, 409], meta: true } @@ -1643,7 +1643,7 @@ describe('Session index', () => { body: sessionValue, if_seq_no: 456, if_primary_term: 123, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { ignore: [409], meta: true } @@ -1672,7 +1672,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.delete).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.delete).toHaveBeenCalledWith( - { id: 'some-long-sid', index: aliasName, refresh: 'wait_for' }, + { id: 'some-long-sid', index: aliasName, refresh: false }, { ignore: [404], meta: true } ); }); @@ -1692,7 +1692,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ index: aliasName, - refresh: true, + refresh: false, body: { query: { match_all: {} } }, }); }); @@ -1716,7 +1716,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ index: aliasName, - refresh: true, + refresh: false, body: { query: { bool: { must: [{ term: { 'provider.type': 'basic' } }] } } }, }); }); @@ -1732,7 +1732,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ index: aliasName, - refresh: true, + refresh: false, body: { query: { bool: { @@ -1757,7 +1757,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ index: aliasName, - refresh: true, + refresh: false, body: { query: { bool: { @@ -1782,7 +1782,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ index: aliasName, - refresh: true, + refresh: false, body: { query: { bool: { diff --git a/x-pack/plugins/security/server/session_management/session_index.ts b/x-pack/plugins/security/server/session_management/session_index.ts index 9041745c7d625..cc3307d37adf1 100644 --- a/x-pack/plugins/security/server/session_management/session_index.ts +++ b/x-pack/plugins/security/server/session_management/session_index.ts @@ -338,7 +338,7 @@ export class SessionIndex { // We don't specify primary term and sequence number as delete should always take precedence // over any updates that could happen in the meantime. const { statusCode } = await this.options.elasticsearchClient.delete( - { id: filter.sid, index: this.aliasName, refresh: 'wait_for' }, + { id: filter.sid, index: this.aliasName, refresh: false }, { ignore: [404], meta: true } ); @@ -374,7 +374,7 @@ export class SessionIndex { try { const response = await this.options.elasticsearchClient.deleteByQuery({ index: this.aliasName, - refresh: true, + refresh: false, body: { query: deleteQuery }, }); return response.deleted as number; @@ -720,7 +720,7 @@ export class SessionIndex { // We write to the alias for `create` operations so that we can prevent index auto-creation in the event it is missing. index: this.aliasName, body: sessionValueToStore, - refresh: 'wait_for', + refresh: false, require_alias: true, } as CreateRequest, { meta: true, ignore: ignore404 ? [404] : [] } @@ -742,7 +742,7 @@ export class SessionIndex { body: sessionValueToStore, if_seq_no: metadata.sequenceNumber, if_primary_term: metadata.primaryTerm, - refresh: 'wait_for', + refresh: false, require_alias: true, }, { ignore: ignore404 ? [404, 409] : [409], meta: true } diff --git a/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts b/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts index 2dc18bd3070ec..fbf1c3be82caa 100644 --- a/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts +++ b/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts @@ -371,17 +371,19 @@ export default function ({ getService }: FtrProviderContext) { unauthenticatedSessionOne.cookie, unauthenticatedSessionOne.location ); - await setTimeoutAsync(500); + await setTimeoutAsync(500); // Ensure the order of session cookie timestamps const samlSessionCookieTwo = await finishSAMLHandshake( unauthenticatedSessionTwo.cookie, unauthenticatedSessionTwo.location ); - await setTimeoutAsync(500); + await setTimeoutAsync(500); // Ensure the order of session cookie timestamps const samlSessionCookieThree = await finishSAMLHandshake( unauthenticatedSessionThree.cookie, unauthenticatedSessionThree.location ); + await es.indices.refresh({ index: '.kibana_security_session*' }); + // For authenticated sessions limit should be enforced await checkSessionCookieInvalid(samlSessionCookieOne); await checkSessionCookie(samlSessionCookieTwo, 'a@b.c', samlProvider); diff --git a/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts b/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts index 8e70518990633..56e1f91a1ef19 100644 --- a/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts +++ b/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts @@ -136,6 +136,7 @@ export default function ({ getService }: FtrProviderContext) { beforeEach(async () => { await security.testUser.setRoles(['kibana_admin']); + await es.indices.refresh({ index: '.kibana_security_session*' }); await es.cluster.health({ index: '.kibana_security_session*', wait_for_status: 'green' }); await supertest .post('/api/security/session/_invalidate') @@ -155,12 +156,14 @@ export default function ({ getService }: FtrProviderContext) { // The oldest session should be displaced. const basicSessionCookieThree = await loginWithBasic(testUser); + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookieInvalid(basicSessionCookieOne); await checkSessionCookie(basicSessionCookieTwo, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieThree, testUser.username, basicProvider); // The next oldest session should be displaced as well. const basicSessionCookieFour = await loginWithBasic(testUser); + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookieInvalid(basicSessionCookieTwo); await checkSessionCookie(basicSessionCookieThree, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieFour, testUser.username, basicProvider); @@ -180,6 +183,7 @@ export default function ({ getService }: FtrProviderContext) { // The oldest session of the admin user should be displaced. const basicSessionCookieFive = await loginWithBasic(adminTestUser); + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookie(basicSessionCookieOne, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieTwo, testUser.username, basicProvider); await checkSessionCookieInvalid(basicSessionCookieThree); @@ -188,6 +192,7 @@ export default function ({ getService }: FtrProviderContext) { // The next oldest session of the admin user should be displaced as well. const basicSessionCookieSix = await loginWithBasic(adminTestUser); + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookie(basicSessionCookieOne, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieTwo, testUser.username, basicProvider); await checkSessionCookieInvalid(basicSessionCookieFour); @@ -196,6 +201,7 @@ export default function ({ getService }: FtrProviderContext) { // Only the oldest session of the ordinary user should be displaced. const basicSessionCookieSeven = await loginWithBasic(testUser); + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookieInvalid(basicSessionCookieOne); await checkSessionCookie(basicSessionCookieTwo, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieFive, adminTestUser.username, basicProvider); @@ -212,6 +218,9 @@ export default function ({ getService }: FtrProviderContext) { // hence which specific sessions will be outside the limit. const statusCodes = []; for (const basicSessionCookie of basicSessionCookies) { + // This index refresh is only in the loop because Kibana might internally call + // invalidate after it retrieved the session that's outside the limit + await es.indices.refresh({ index: '.kibana_security_session*' }); const { statusCode } = await supertest .get('/internal/security/me') .set('kbn-xsrf', 'xxx') @@ -232,6 +241,8 @@ export default function ({ getService }: FtrProviderContext) { const samlSessionCookieOne = await loginWithSAML(); const samlSessionCookieTwo = await loginWithSAML(); + await es.indices.refresh({ index: '.kibana_security_session*' }); + // All sessions should be active. await checkSessionCookie(basicSessionCookieOne, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieTwo, testUser.username, basicProvider); @@ -240,6 +251,7 @@ export default function ({ getService }: FtrProviderContext) { // Exceed limit with SAML credentials, other sessions shouldn't be affected. const samlSessionCookieThree = await loginWithSAML(); + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookie(basicSessionCookieOne, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieTwo, testUser.username, basicProvider); await checkSessionCookieInvalid(samlSessionCookieOne); @@ -248,6 +260,7 @@ export default function ({ getService }: FtrProviderContext) { // Exceed limit with Basic credentials, other sessions shouldn't be affected. const basicSessionCookieThree = await loginWithBasic(testUser); + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookieInvalid(basicSessionCookieOne); await checkSessionCookie(basicSessionCookieTwo, testUser.username, basicProvider); await checkSessionCookie(basicSessionCookieThree, testUser.username, basicProvider); @@ -263,6 +276,7 @@ export default function ({ getService }: FtrProviderContext) { await loginWithAnonymous(), await loginWithAnonymous(), ]) { + await es.indices.refresh({ index: '.kibana_security_session*' }); await checkSessionCookie(anonymousSessionCookie, 'anonymous_user', anonymousProvider); } }); diff --git a/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts b/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts index 3ac91ba8d3f9f..125f8eff394c8 100644 --- a/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts +++ b/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts @@ -99,6 +99,7 @@ export default function ({ getService }: FtrProviderContext) { params: { username: basicUsername, password: basicPassword }, }) .expect(200); + await es.indices.refresh({ index: '.kibana_security_session*' }); const sessionCookie = parseCookie(response.headers['set-cookie'][0])!; await checkSessionCookie(sessionCookie, basicUsername, { type: 'basic', name: 'basic1' }); @@ -141,6 +142,7 @@ export default function ({ getService }: FtrProviderContext) { params: { username: basicUsername, password: basicPassword }, }) .expect(200); + await es.indices.refresh({ index: '.kibana_security_session*' }); const basicSessionCookie = parseCookie(response.headers['set-cookie'][0])!; await checkSessionCookie(basicSessionCookie, basicUsername, { @@ -192,6 +194,7 @@ export default function ({ getService }: FtrProviderContext) { params: { username: basicUsername, password: basicPassword }, }) .expect(200); + await es.indices.refresh({ index: '.kibana_security_session*' }); let sessionCookie = parseCookie(response.headers['set-cookie'][0])!; await checkSessionCookie(sessionCookie, basicUsername, { type: 'basic', name: 'basic1' }); diff --git a/x-pack/test/security_api_integration/tests/session_idle/expired.ts b/x-pack/test/security_api_integration/tests/session_idle/expired.ts index ebb1a8ee1b1bf..14c7370068634 100644 --- a/x-pack/test/security_api_integration/tests/session_idle/expired.ts +++ b/x-pack/test/security_api_integration/tests/session_idle/expired.ts @@ -46,6 +46,7 @@ export default function ({ getService }: FtrProviderContext) { params: { username: basicUsername, password: basicPassword }, }) .expect(200); + await es.indices.refresh({ index: '.kibana_security_session*' }); const sessionCookie = parseCookie(response.headers['set-cookie'][0])!; expect(await getNumberOfSessionDocuments()).to.be(1); diff --git a/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts b/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts index ca911b2fc79f1..0f79624c830e3 100644 --- a/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts +++ b/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts @@ -66,6 +66,7 @@ export default function ({ getService }: FtrProviderContext) { const cookie = parseCookie(authenticationResponse.headers['set-cookie'][0])!; await checkSessionCookie(cookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + await es.indices.refresh({ index: '.kibana_security_session*' }); return cookie; } @@ -83,6 +84,7 @@ export default function ({ getService }: FtrProviderContext) { const cookie = parseCookie(authenticationResponse.headers['set-cookie'][0])!; await checkSessionCookie(cookie, credentials.username, { type: 'basic', name: 'basic1' }); + await es.indices.refresh({ index: '.kibana_security_session*' }); return cookie; } diff --git a/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts b/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts index 188e2490cbe0e..09e5e7998750d 100644 --- a/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts +++ b/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts @@ -91,6 +91,7 @@ export default function ({ getService }: FtrProviderContext) { params: { username: basicUsername, password: basicPassword }, }) .expect(200); + await es.indices.refresh({ index: '.kibana_security_session*' }); const sessionCookie = parseCookie(response.headers['set-cookie'][0])!; await checkSessionCookie(sessionCookie, basicUsername, { @@ -132,6 +133,8 @@ export default function ({ getService }: FtrProviderContext) { params: { username: basicUsername, password: basicPassword }, }) .expect(200); + await es.indices.refresh({ index: '.kibana_security_session*' }); + const basicSessionCookie = parseCookie(response.headers['set-cookie'][0])!; await checkSessionCookie(basicSessionCookie, basicUsername, { type: 'basic', From 3d571bd836187103dcd7b4d55814d3c043144c55 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Fri, 10 Mar 2023 12:25:26 -0600 Subject: [PATCH 03/12] skip suite failing es promotion (#153123) --- x-pack/test/monitoring_api_integration/apis/apm/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/monitoring_api_integration/apis/apm/index.ts b/x-pack/test/monitoring_api_integration/apis/apm/index.ts index e63049fdf9b39..40b285a765426 100644 --- a/x-pack/test/monitoring_api_integration/apis/apm/index.ts +++ b/x-pack/test/monitoring_api_integration/apis/apm/index.ts @@ -8,7 +8,8 @@ import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('APM', () => { + // Failing ES Promotion: https://github.com/elastic/kibana/issues/153123 + describe.skip('APM', () => { loadTestFile(require.resolve('./overview')); loadTestFile(require.resolve('./instances')); loadTestFile(require.resolve('./instance')); From 526edbd06161571f730de357048f295c00bff896 Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Fri, 10 Mar 2023 19:47:56 +0100 Subject: [PATCH 04/12] [ML Plugin] Replace SavedObjectsFinder component (#152939) ## Summary This PR replaces the SavedObjectsFinder component from `saved_objects plugin` with the one in `saved_objects_finder` plugin. This is a part of making the component BWCA compliant (https://github.com/elastic/kibana/issues/150604). ### Checklist Delete any items that are not applicable to this PR. ~- [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)~ ~- [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials~ - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [X] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [X] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) ~- [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)~ - [X] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [X] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/ml/kibana.jsonc | 5 +++-- x-pack/plugins/ml/public/application/app.tsx | 1 + .../application/contexts/kibana/kibana_context.ts | 2 ++ .../source_selection/source_selection.test.tsx | 7 ++++--- .../source_selection/source_selection.tsx | 13 ++++++++----- .../components/data_view/change_data_view.tsx | 12 ++++++++---- .../jobs/new_job/pages/index_or_search/page.tsx | 13 ++++++++----- x-pack/plugins/ml/public/plugin.ts | 3 +++ x-pack/plugins/ml/tsconfig.json | 2 ++ 9 files changed, 39 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/ml/kibana.jsonc b/x-pack/plugins/ml/kibana.jsonc index 19c3140de3977..94d24ddf9112b 100644 --- a/x-pack/plugins/ml/kibana.jsonc +++ b/x-pack/plugins/ml/kibana.jsonc @@ -28,7 +28,9 @@ "taskManager", "triggersActionsUi", "uiActions", - "unifiedSearch" + "unifiedSearch", + "savedObjectsFinder", + "savedObjectsManagement" ], "optionalPlugins": [ "alerting", @@ -52,7 +54,6 @@ "kibanaUtils", "lens", "maps", - "savedObjects", "savedSearch", "usageCollection", "unifiedFieldList", diff --git a/x-pack/plugins/ml/public/application/app.tsx b/x-pack/plugins/ml/public/application/app.tsx index b5dafed765ff4..b15abc1d2cddb 100644 --- a/x-pack/plugins/ml/public/application/app.tsx +++ b/x-pack/plugins/ml/public/application/app.tsx @@ -112,6 +112,7 @@ const App: FC = ({ coreStart, deps, appMountParams }) => { unifiedSearch: deps.unifiedSearch, licensing: deps.licensing, lens: deps.lens, + savedObjectsManagement: deps.savedObjectsManagement, ...coreStart, }; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts index aebe71477c7bc..bf1cdc3d787ec 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts @@ -25,6 +25,7 @@ import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { CasesUiStart } from '@kbn/cases-plugin/public'; import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; +import type { SavedObjectsManagementPluginStart } from '@kbn/saved-objects-management-plugin/public'; import type { MlServicesContext } from '../../app'; interface StartPlugins { @@ -47,6 +48,7 @@ interface StartPlugins { core: CoreStart; appName: string; lens: LensPublicStart; + savedObjectsManagement: SavedObjectsManagementPluginStart; } export type StartServices = CoreStart & StartPlugins & { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.test.tsx index d52265634cc23..bd41d70a322f2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.test.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.test.tsx @@ -14,8 +14,8 @@ import { getDataViewAndSavedSearch, DataViewAndSavedSearch } from '../../../../. import { SourceSelection } from './source_selection'; -jest.mock('@kbn/saved-objects-plugin/public', () => { - const SavedObjectFinderUi = ({ +jest.mock('@kbn/saved-objects-finder-plugin/public', () => { + const SavedObjectFinder = ({ onChoose, }: { onChoose: (id: string, type: string, fullName: string, savedObject: object) => void; @@ -63,7 +63,7 @@ jest.mock('@kbn/saved-objects-plugin/public', () => { }; return { - SavedObjectFinderUi, + SavedObjectFinder, }; }); @@ -73,6 +73,7 @@ jest.mock('../../../../../contexts/kibana', () => ({ services: { uiSettings: {}, http: {}, + savedObjectsManagement: {}, }, }), useNavigateToPath: () => mockNavigateToPath, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx index ed327eb7dc71b..f6363405cdc71 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { getNestedProperty } from '@kbn/ml-nested-property'; -import { SavedObjectFinderUi } from '@kbn/saved-objects-plugin/public'; +import { SavedObjectFinder } from '@kbn/saved-objects-finder-plugin/public'; import { SavedObjectCommon } from '@kbn/saved-objects-plugin/common'; import { useMlKibana, useNavigateToPath } from '../../../../../contexts/kibana'; @@ -27,7 +27,7 @@ const fixedPageSize: number = 20; export const SourceSelection: FC = () => { const { - services: { http, uiSettings }, + services: { http, uiSettings, savedObjectsManagement }, } = useMlKibana(); const navigateToPath = useNavigateToPath(); @@ -117,7 +117,7 @@ export const SourceSelection: FC = () => { )} - { }, ]} fixedPageSize={fixedPageSize} - uiSettings={uiSettings} - http={http} + services={{ + uiSettings, + http, + savedObjectsManagement, + }} /> diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx index 40a8a3f5a5c4c..71d68b895f605 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx @@ -23,7 +23,7 @@ import { EuiModalBody, } from '@elastic/eui'; -import { SavedObjectFinderUi } from '@kbn/saved-objects-plugin/public'; +import { SavedObjectFinder } from '@kbn/saved-objects-finder-plugin/public'; import { JobCreatorContext } from '../../../job_creator_context'; import { AdvancedJobCreator } from '../../../../../common/job_creator'; import { resetAdvancedJob } from '../../../../../common/job_creator/util/general'; @@ -57,6 +57,7 @@ export const ChangeDataViewModal: FC = ({ onClose }) => { http, uiSettings, data: { dataViews }, + savedObjectsManagement, }, } = useMlKibana(); const navigateToPath = useNavigateToPath(); @@ -146,7 +147,7 @@ export const ChangeDataViewModal: FC = ({ onClose }) => { - = ({ onClose }) => { }, ]} fixedPageSize={fixedPageSize} - uiSettings={uiSettings} - http={http} + services={{ + uiSettings, + http, + savedObjectsManagement, + }} /> )} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx index 352a2a390fe28..9d2cfa605f50b 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx @@ -9,7 +9,7 @@ import React, { FC } from 'react'; import { EuiPageBody, EuiPageContent_Deprecated as EuiPageContent } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { SavedObjectFinderUi } from '@kbn/saved-objects-plugin/public'; +import { SavedObjectFinder } from '@kbn/saved-objects-finder-plugin/public'; import { useMlKibana, useNavigateToPath } from '../../../../contexts/kibana'; import { MlPageHeader } from '../../../../components/page_header'; @@ -19,7 +19,7 @@ export interface PageProps { export const Page: FC = ({ nextStepPath }) => { const RESULTS_PER_PAGE = 20; - const { uiSettings, http } = useMlKibana().services; + const { uiSettings, http, savedObjectsManagement } = useMlKibana().services; const navigateToPath = useNavigateToPath(); const onObjectSelection = (id: string, type: string) => { @@ -40,7 +40,7 @@ export const Page: FC = ({ nextStepPath }) => { /> - = ({ nextStepPath }) => { }, ]} fixedPageSize={RESULTS_PER_PAGE} - uiSettings={uiSettings} - http={http} + services={{ + uiSettings, + http, + savedObjectsManagement, + }} /> diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index 06a28d5c749a3..f53e4ecb153b6 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -31,6 +31,7 @@ import type { UiActionsSetup, UiActionsStart } from '@kbn/ui-actions-plugin/publ import type { LicenseManagementUIPluginSetup } from '@kbn/license-management-plugin/public'; import type { LicensingPluginSetup, LicensingPluginStart } from '@kbn/licensing-plugin/public'; import type { SecurityPluginStart } from '@kbn/security-plugin/public'; +import type { SavedObjectsManagementPluginStart } from '@kbn/saved-objects-management-plugin/public'; import type { MapsStartApi, MapsSetupApi } from '@kbn/maps-plugin/public'; import { @@ -68,6 +69,7 @@ export interface MlStartDependencies { lens?: LensPublicStart; cases?: CasesUiStart; security: SecurityPluginStart; + savedObjectsManagement: SavedObjectsManagementPluginStart; } export interface MlSetupDependencies { @@ -135,6 +137,7 @@ export class MlPlugin implements Plugin { fieldFormats: pluginsStart.fieldFormats, lens: pluginsStart.lens, cases: pluginsStart.cases, + savedObjectsManagement: pluginsStart.savedObjectsManagement, }, params ); diff --git a/x-pack/plugins/ml/tsconfig.json b/x-pack/plugins/ml/tsconfig.json index dd0d5d0d23ec0..a0bec08acec4c 100644 --- a/x-pack/plugins/ml/tsconfig.json +++ b/x-pack/plugins/ml/tsconfig.json @@ -81,6 +81,8 @@ "@kbn/unified-field-list-plugin", "@kbn/shared-ux-router", "@kbn/saved-search-plugin", + "@kbn/saved-objects-management-plugin", + "@kbn/saved-objects-finder-plugin", "@kbn/monaco", ], } From 6e3a34fdda5bea697d997f8f0e39273076bf0c65 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Fri, 10 Mar 2023 13:39:44 -0600 Subject: [PATCH 05/12] [Security Solution] expanded flyout - right section - overview tab - mitre attack (#152767) --- ...ert_details_right_panel_overview_tab.cy.ts | 44 +++++++++++ .../screens/document_expandable_flyout.ts | 8 ++ .../expand_detail_button.stories.tsx | 2 +- .../components/expand_detail_button.test.tsx | 2 +- .../right/components/mitre_attack.stories.tsx | 66 +++++++++++++++++ .../right/components/mitre_attack.test.tsx | 73 +++++++++++++++++++ .../flyout/right/components/mitre_attack.tsx | 37 ++++++++++ .../flyout/right/components/test_ids.ts | 2 + .../public/flyout/right/context.tsx | 53 +++++++++++++- .../public/flyout/right/tabs/overview_tab.tsx | 5 +- 10 files changed, 285 insertions(+), 7 deletions(-) create mode 100644 x-pack/plugins/security_solution/cypress/e2e/detection_alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts create mode 100644 x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.tsx diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts new file mode 100644 index 0000000000000..721de71fc9fd0 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_DETAILS, + DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_TITLE, +} from '../../../screens/document_expandable_flyout'; +import { + expandFirstAlertExpandableFlyout, + openOverviewTab, +} from '../../../tasks/document_expandable_flyout'; +import { cleanKibana } from '../../../tasks/common'; +import { login, visit } from '../../../tasks/login'; +import { createRule } from '../../../tasks/api_calls/rules'; +import { getNewRule } from '../../../objects/rule'; +import { ALERTS_URL } from '../../../urls/navigation'; +import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; + +// Skipping these for now as the feature is protected behind a feature flag set to false by default +// To run the tests locally, add 'securityFlyoutEnabled' in the Cypress config.ts here https://github.com/elastic/kibana/blob/main/x-pack/test/security_solution_cypress/config.ts#L50 +describe.skip( + 'Alert details expandable flyout right panel overview tab', + { testIsolation: false }, + () => { + before(() => { + cleanKibana(); + login(); + createRule(getNewRule()); + visit(ALERTS_URL); + waitForAlertsToPopulate(); + expandFirstAlertExpandableFlyout(); + openOverviewTab(); + }); + + it('should display mitre attack', () => { + cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_TITLE).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_DETAILS).should('be.visible'); + }); + } +); diff --git a/x-pack/plugins/security_solution/cypress/screens/document_expandable_flyout.ts b/x-pack/plugins/security_solution/cypress/screens/document_expandable_flyout.ts index 5026b54c6e03a..c05a8abfca337 100644 --- a/x-pack/plugins/security_solution/cypress/screens/document_expandable_flyout.ts +++ b/x-pack/plugins/security_solution/cypress/screens/document_expandable_flyout.ts @@ -37,6 +37,8 @@ import { COLLAPSE_DETAILS_BUTTON_TEST_ID, EXPAND_DETAILS_BUTTON_TEST_ID, FLYOUT_HEADER_TITLE_TEST_ID, + MITRE_ATTACK_DETAILS_TEST_ID, + MITRE_ATTACK_TITLE_TEST_ID, } from '../../public/flyout/right/components/test_ids'; import { getDataTestSubjectSelector } from '../helpers/common'; @@ -90,3 +92,9 @@ export const DOCUMENT_DETAILS_FLYOUT_INVESTIGATIONS_TAB_CONTENT = getDataTestSub export const DOCUMENT_DETAILS_FLYOUT_HISTORY_TAB_CONTENT = getDataTestSubjectSelector( HISTORY_TAB_CONTENT_TEST_ID ); +export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_TITLE = getDataTestSubjectSelector( + MITRE_ATTACK_TITLE_TEST_ID +); +export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_DETAILS = getDataTestSubjectSelector( + MITRE_ATTACK_DETAILS_TEST_ID +); diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.stories.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.stories.tsx index b415a1b540825..837bd206e2723 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.stories.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.stories.tsx @@ -24,7 +24,7 @@ export const Expand: Story = () => { const panelContextValue = { eventId: 'eventId', indexName: 'indexName', - }; + } as unknown as RightPanelContext; return ( diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx index cf2cc77836712..d8aef30aa4067 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx @@ -22,7 +22,7 @@ describe('', () => { const panelContextValue = { eventId: 'eventId', indexName: 'indexName', - }; + } as unknown as RightPanelContext; const { getByTestId } = render( diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.stories.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.stories.tsx new file mode 100644 index 0000000000000..38e9dc6a1f122 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.stories.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { Story } from '@storybook/react'; +import { RightPanelContext } from '../context'; +import { MitreAttack } from './mitre_attack'; + +export default { + component: MitreAttack, + title: 'Flyout/MitreAttack', +}; + +export const Default: Story = () => { + const contextValue = { + searchHit: { + fields: { + 'kibana.alert.rule.parameters': [ + { + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { + id: '123', + reference: 'https://attack.mitre.org/tactics/123', + name: 'Tactic', + }, + technique: [ + { + id: '456', + reference: 'https://attack.mitre.org/techniques/456', + name: 'Technique', + }, + ], + }, + ], + }, + ], + }, + }, + } as unknown as RightPanelContext; + + return ( + + + + ); +}; + +export const Emtpy: Story = () => { + const contextValue = { + searchHit: { + some_field: 'some_value', + }, + } as unknown as RightPanelContext; + + return ( + + + + ); +}; diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.test.tsx new file mode 100644 index 0000000000000..c51bad7315d43 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.test.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { render } from '@testing-library/react'; +import { MitreAttack } from './mitre_attack'; +import { RightPanelContext } from '../context'; +import { MITRE_ATTACK_DETAILS_TEST_ID, MITRE_ATTACK_TITLE_TEST_ID } from './test_ids'; + +describe('', () => { + it('should render mitre attack information', () => { + const contextValue = { + searchHit: { + fields: { + 'kibana.alert.rule.parameters': [ + { + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { + id: '123', + reference: 'https://attack.mitre.org/tactics/123', + name: 'Tactic', + }, + technique: [ + { + id: '456', + reference: 'https://attack.mitre.org/techniques/456', + name: 'Technique', + }, + ], + }, + ], + }, + ], + }, + }, + } as unknown as RightPanelContext; + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(MITRE_ATTACK_TITLE_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(MITRE_ATTACK_DETAILS_TEST_ID)).toBeInTheDocument(); + }); + + it('should render empty component if missing mitre attack value', () => { + const contextValue = { + searchHit: { + some_field: 'some_value', + }, + } as unknown as RightPanelContext; + + const { baseElement } = render( + + + + ); + + expect(baseElement).toMatchInlineSnapshot(` + +
+ + `); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.tsx new file mode 100644 index 0000000000000..3b7756631154e --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/right/components/mitre_attack.tsx @@ -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 { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import type { FC } from 'react'; +import React, { useMemo } from 'react'; +import { MITRE_ATTACK_DETAILS_TEST_ID, MITRE_ATTACK_TITLE_TEST_ID } from './test_ids'; +import { getMitreComponentParts } from '../../../detections/mitre/get_mitre_threat_component'; +import { useRightPanelContext } from '../context'; + +export const MitreAttack: FC = () => { + const { searchHit } = useRightPanelContext(); + const threatDetails = useMemo(() => getMitreComponentParts(searchHit), [searchHit]); + + if (!threatDetails || !threatDetails[0]) { + return <>; + } + + return ( + + + +
{threatDetails[0].title}
+
+
+ + {threatDetails[0].description} + +
+ ); +}; + +MitreAttack.displayName = 'MitreAttack'; diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts index d8aeda6163462..b679ef7615e4d 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts @@ -10,3 +10,5 @@ export const EXPAND_DETAILS_BUTTON_TEST_ID = 'securitySolutionDocumentDetailsFlyoutHeaderExpandDetailButton'; export const COLLAPSE_DETAILS_BUTTON_TEST_ID = 'securitySolutionDocumentDetailsFlyoutHeaderCollapseDetailButton'; +export const MITRE_ATTACK_TITLE_TEST_ID = 'securitySolutionAlertDetailsFlyoutMitreAttackTitle'; +export const MITRE_ATTACK_DETAILS_TEST_ID = 'securitySolutionAlertDetailsFlyoutMitreAttackDetails'; diff --git a/x-pack/plugins/security_solution/public/flyout/right/context.tsx b/x-pack/plugins/security_solution/public/flyout/right/context.tsx index 79cc59875ce5f..f79173fd26583 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/context.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/context.tsx @@ -5,7 +5,17 @@ * 2.0. */ +import { css } from '@emotion/react'; import React, { createContext, useContext, useMemo } from 'react'; +import type { SearchHit } from '@kbn/es-types'; +import { EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; +import { useTimelineEventsDetails } from '../../timelines/containers/details'; +import { getAlertIndexAlias } from '../../timelines/components/side_panel/event_details/helpers'; +import { useSpaceId } from '../../common/hooks/use_space_id'; +import { useRouteSpy } from '../../common/utils/route/use_route_spy'; +import { SecurityPageName } from '../../../common/constants'; +import { SourcererScopeName } from '../../common/store/sourcerer/model'; +import { useSourcererDataView } from '../../common/containers/sourcerer'; import type { RightPanelProps } from '.'; export interface RightPanelContext { @@ -17,6 +27,10 @@ export interface RightPanelContext { * Name of the index used in the parent's page */ indexName: string; + /** + * The actual raw document object + */ + searchHit: SearchHit | undefined; } export const RightPanelContext = createContext(undefined); @@ -29,11 +43,46 @@ export type RightPanelProviderProps = { } & Partial; export const RightPanelProvider = ({ id, indexName, children }: RightPanelProviderProps) => { + const currentSpaceId = useSpaceId(); + const eventIndex = indexName ? getAlertIndexAlias(indexName, currentSpaceId) ?? indexName : ''; + const [{ pageName }] = useRouteSpy(); + const sourcererScope = + pageName === SecurityPageName.detections + ? SourcererScopeName.detections + : SourcererScopeName.default; + const sourcererDataView = useSourcererDataView(sourcererScope); + const [loading, _, searchHit] = useTimelineEventsDetails({ + indexName: eventIndex, + eventId: id ?? '', + runtimeMappings: sourcererDataView.runtimeMappings, + skip: !id, + }); + const contextValue = useMemo( - () => (id && indexName ? { eventId: id, indexName } : undefined), - [id, indexName] + () => + id && indexName + ? { + eventId: id, + indexName, + searchHit: searchHit as SearchHit, + } + : undefined, + [id, indexName, searchHit] ); + if (loading) { + return ( + + + + ); + } + return {children}; }; diff --git a/x-pack/plugins/security_solution/public/flyout/right/tabs/overview_tab.tsx b/x-pack/plugins/security_solution/public/flyout/right/tabs/overview_tab.tsx index 57741d1379c04..3681f738f7ed2 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/tabs/overview_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/tabs/overview_tab.tsx @@ -7,14 +7,13 @@ import type { FC } from 'react'; import React, { memo } from 'react'; -import { EuiText } from '@elastic/eui'; -import { OVERVIEW_TAB_CONTENT_TEST_ID } from './test_ids'; +import { MitreAttack } from '../components/mitre_attack'; /** * Overview view displayed in the document details expandable flyout right section */ export const OverviewTab: FC = memo(() => { - return {'Overview tab'}; + return ; }); OverviewTab.displayName = 'OverviewTab'; From a564ca5fe3eb259f9629834fc1f5f067adf5c03c Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Fri, 10 Mar 2023 20:26:40 +0000 Subject: [PATCH 06/12] [SecuritySolution] Add UI tracking for grouping options (#151708) ## Summary Relevant issues: Overall telemetry: https://github.com/elastic/kibana/issues/144945 Alerts telemetry: https://github.com/elastic/kibana/issues/150656 Preview dashboard: https://telemetry-v2-staging.elastic.dev/s/securitysolution/app/dashboards#/view/40755fc0-b454-11ed-a6e6-d32d2209b7b7?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-7d%2Fd,to:now)) **UI counter added** - overall counts 1. alerts_table_group_by_{tableId}_{groupByField} - `alerts_table_group_by_alerts-page_host.name ` triggered on grouping option changed. 2. alerts_table_toggled_{on|off}_{tableId}_group-{groupNumber} - `alerts_table_toggled_off_alerts-page_group-0` sent when grouped alerts toggled 3. alerts_table_{tableId}_group-{groupNumber}_mark-{status} - `alerts_table_alerts-page_group-0_mark-open` sent when group actions taken **Event based telemetry added** - extra info from `properties` can be aggregated / visualised 1. Alerts grouping take action - sent when group actions taken 2. Alerts grouping toggled - sent when grouped alerts toggled 3. Alerts grouping changed - triggered on grouping option changed [Example events](https://telemetry-v2-staging.elastic.dev/s/securitysolution/app/discover#/view/9b0f2080-bcd1-11ed-a6e6-d32d2209b7b7?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-7d%2Fd,to:now))&_a=(columns:!(context.applicationId,properties,properties.groupingId,properties.groupNumber,properties.status,event_type,properties.tableId),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:c5dc7cd0-2950-4e51-b428-d0451b1b8d9d,key:context.applicationId,negate:!f,params:(query:securitySolutionUI),type:phrase),query:(match_phrase:(context.applicationId:securitySolutionUI)))),grid:(),hideChart:!f,index:c5dc7cd0-2950-4e51-b428-d0451b1b8d9d,interval:auto,query:(language:kuery,query:'event_type%20:%20Alerts%20Grouping*'),sort:!(!(timestamp,desc)))) **Steps to verify:** 1. add telemetry.optIn: true to kibana.dev.yml 2. Visit alerts page or rule details page, change the grouping , toggle each group, and take actions to grouped alerts 3. Usually the event would be sent every hour to [staging](https://telemetry-v2-staging.elastic.dev/s/securitysolution/app/discover#/view/9b0f2080-bcd1-11ed-a6e6-d32d2209b7b7?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-7d%2Fd,to:now))&_a=(columns:!(context.applicationId,properties,properties.groupingId,properties.groupNumber,properties.status,event_type,properties.tableId),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:c5dc7cd0-2950-4e51-b428-d0451b1b8d9d,key:context.applicationId,negate:!f,params:(query:securitySolutionUI),type:phrase),query:(match_phrase:(context.applicationId:securitySolutionUI)))),grid:(),hideChart:!f,index:c5dc7cd0-2950-4e51-b428-d0451b1b8d9d,interval:auto,query:(language:kuery,query:'event_type%20:%20Alerts%20Grouping*'),sort:!(!(timestamp,desc)))), if not, visit staging again on the next day. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Pablo Neves Machado --- .../components/group_selector/index.test.tsx | 1 + .../src/components/group_selector/index.tsx | 1 + .../src/components/grouping.test.tsx | 34 ++++++ .../src/components/grouping.tsx | 37 ++++++- .../src/hooks/use_get_group_selector.test.tsx | 51 +++++++++ .../src/hooks/use_get_group_selector.tsx | 22 ++++ .../src/hooks/use_grouping.test.tsx | 3 +- .../src/hooks/use_grouping.tsx | 12 ++- .../src/telemetry/const.ts | 26 +++++ .../tsconfig.json | 1 + .../public/common/lib/telemetry/index.ts | 17 ++- .../lib/telemetry/telemetry_client.mock.ts | 14 +++ .../common/lib/telemetry/telemetry_client.ts | 61 +++++++++++ .../common/lib/telemetry/telemetry_events.ts | 102 ++++++++++++++++++ .../lib/telemetry/telemetry_service.mock.ts | 10 ++ .../lib/telemetry/telemetry_service.test.ts | 80 ++++++++++++++ .../common/lib/telemetry/telemetry_service.ts | 57 ++++++++++ .../public/common/lib/telemetry/types.ts | 63 +++++++++++ .../alerts_table/alerts_grouping.tsx | 37 +++++-- .../group_take_action_items.test.tsx | 9 +- .../group_take_action_items.tsx | 89 +++++++++++++-- .../security_solution/public/plugin.tsx | 11 +- .../plugins/security_solution/public/types.ts | 3 +- .../plugins/security_solution/tsconfig.json | 2 + 24 files changed, 719 insertions(+), 24 deletions(-) create mode 100644 packages/kbn-securitysolution-grouping/src/telemetry/const.ts create mode 100644 x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts create mode 100644 x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts create mode 100644 x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_events.ts create mode 100644 x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.mock.ts create mode 100644 x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts create mode 100644 x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.ts create mode 100644 x-pack/plugins/security_solution/public/common/lib/telemetry/types.ts diff --git a/packages/kbn-securitysolution-grouping/src/components/group_selector/index.test.tsx b/packages/kbn-securitysolution-grouping/src/components/group_selector/index.test.tsx index 4706247f2f0a7..daa58396df70b 100644 --- a/packages/kbn-securitysolution-grouping/src/components/group_selector/index.test.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/group_selector/index.test.tsx @@ -12,6 +12,7 @@ import React from 'react'; const onGroupChange = jest.fn(); const testProps = { + groupingId: 'test-grouping-id', fields: [ { name: 'kibana.alert.rule.name', diff --git a/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx b/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx index 210ffef50e381..f0274f7c73ab7 100644 --- a/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx @@ -20,6 +20,7 @@ import { StyledContextMenu, StyledEuiButtonEmpty } from '../styles'; export interface GroupSelectorProps { 'data-test-subj'?: string; fields: FieldSpec[]; + groupingId: string; groupSelected: string; onGroupChange: (groupSelection: string) => void; options: Array<{ key: string; label: string }>; diff --git a/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx b/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx index 6b1d360e50468..149e05513ac94 100644 --- a/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx @@ -11,9 +11,12 @@ import React from 'react'; import { I18nProvider } from '@kbn/i18n-react'; import { Grouping } from './grouping'; import { createGroupFilter } from './accordion_panel/helpers'; +import { METRIC_TYPE } from '@kbn/analytics'; +import { getTelemetryEvent } from '../telemetry/const'; const renderChildComponent = jest.fn(); const takeActionItems = jest.fn(); +const mockTracker = jest.fn(); const rule1Name = 'Rule 1 name'; const rule1Desc = 'Rule 1 description'; const rule2Name = 'Rule 2 name'; @@ -98,6 +101,7 @@ const testProps = { value: 2, }, }, + groupingId: 'test-grouping-id', isLoading: false, pagination: { pageIndex: 0, @@ -109,6 +113,7 @@ const testProps = { renderChildComponent, selectedGroup: 'kibana.alert.rule.name', takeActionItems, + tracker: mockTracker, }; describe('grouping container', () => { @@ -171,4 +176,33 @@ describe('grouping container', () => { createGroupFilter(testProps.selectedGroup, rule2Name) ); }); + + it('Send Telemetry when each group is clicked', () => { + const { getAllByTestId } = render( + + + + ); + const group1 = within(getAllByTestId('grouping-accordion')[0]).getAllByRole('button')[0]; + fireEvent.click(group1); + expect(mockTracker).toHaveBeenNthCalledWith( + 1, + METRIC_TYPE.CLICK, + getTelemetryEvent.groupToggled({ + isOpen: true, + groupingId: testProps.groupingId, + groupNumber: 0, + }) + ); + fireEvent.click(group1); + expect(mockTracker).toHaveBeenNthCalledWith( + 2, + METRIC_TYPE.CLICK, + getTelemetryEvent.groupToggled({ + isOpen: false, + groupingId: testProps.groupingId, + groupNumber: 0, + }) + ); + }); }); diff --git a/packages/kbn-securitysolution-grouping/src/components/grouping.tsx b/packages/kbn-securitysolution-grouping/src/components/grouping.tsx index 420656c69db41..995c9c0fcb401 100644 --- a/packages/kbn-securitysolution-grouping/src/components/grouping.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/grouping.tsx @@ -15,6 +15,7 @@ import { } from '@elastic/eui'; import type { Filter } from '@kbn/es-query'; import React, { useMemo, useState } from 'react'; +import { METRIC_TYPE, UiCounterMetricType } from '@kbn/analytics'; import { defaultUnit, firstNonNullValue } from '../helpers'; import { createGroupFilter } from './accordion_panel/helpers'; import type { BadgeMetric, CustomMetric } from './accordion_panel'; @@ -24,15 +25,23 @@ import { EmptyGroupingComponent } from './empty_results_panel'; import { groupingContainerCss, countCss } from './styles'; import { GROUPS_UNIT } from './translations'; import type { GroupingAggregation, GroupingFieldTotalAggregation, RawBucket } from './types'; +import { getTelemetryEvent } from '../telemetry/const'; export interface GroupingProps { badgeMetricStats?: (fieldBucket: RawBucket) => BadgeMetric[]; customMetricStats?: (fieldBucket: RawBucket) => CustomMetric[]; data?: GroupingAggregation & GroupingFieldTotalAggregation; + groupingId: string; groupPanelRenderer?: (fieldBucket: RawBucket) => JSX.Element | undefined; groupSelector?: JSX.Element; inspectButton?: JSX.Element; isLoading: boolean; + onToggleCallback?: (params: { + isOpen: boolean; + groupName?: string | undefined; + groupNumber: number; + groupingId: string; + }) => void; pagination: { pageIndex: number; pageSize: number; @@ -42,7 +51,12 @@ export interface GroupingProps { }; renderChildComponent: (groupFilter: Filter[]) => React.ReactNode; selectedGroup: string; - takeActionItems: (groupFilters: Filter[]) => JSX.Element[]; + takeActionItems: (groupFilters: Filter[], groupNumber: number) => JSX.Element[]; + tracker?: ( + type: UiCounterMetricType, + event: string | string[], + count?: number | undefined + ) => void; unit?: (n: number) => string; } @@ -50,14 +64,17 @@ const GroupingComponent = ({ badgeMetricStats, customMetricStats, data, + groupingId, groupPanelRenderer, groupSelector, inspectButton, isLoading, + onToggleCallback, pagination, renderChildComponent, selectedGroup, takeActionItems, + tracker, unit = defaultUnit, }: GroupingProps) => { const [trigger, setTrigger] = useState< @@ -77,9 +94,9 @@ const GroupingComponent = ({ const groupPanels = useMemo( () => - data?.stackByMultipleFields0?.buckets?.map((groupBucket) => { + data?.stackByMultipleFields0?.buckets?.map((groupBucket, groupNumber) => { const group = firstNonNullValue(groupBucket.key); - const groupKey = `group0-${group}`; + const groupKey = `group-${groupNumber}-${group}`; return ( @@ -87,7 +104,10 @@ const GroupingComponent = ({ extraAction={ @@ -97,6 +117,11 @@ const GroupingComponent = ({ groupPanelRenderer={groupPanelRenderer && groupPanelRenderer(groupBucket)} isLoading={isLoading} onToggleGroup={(isOpen) => { + // built-in telemetry: UI-counter + tracker?.( + METRIC_TYPE.CLICK, + getTelemetryEvent.groupToggled({ isOpen, groupingId, groupNumber }) + ); setTrigger({ // ...trigger, -> this change will keep only one group at a time expanded and one table displayed [groupKey]: { @@ -104,6 +129,7 @@ const GroupingComponent = ({ selectedBucket: groupBucket, }, }); + onToggleCallback?.({ isOpen, groupName: group, groupNumber, groupingId }); }} renderChildComponent={ trigger[groupKey] && trigger[groupKey].state === 'open' @@ -121,10 +147,13 @@ const GroupingComponent = ({ customMetricStats, data?.stackByMultipleFields0?.buckets, groupPanelRenderer, + groupingId, isLoading, + onToggleCallback, renderChildComponent, selectedGroup, takeActionItems, + tracker, trigger, ] ); diff --git a/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.test.tsx b/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.test.tsx index 2a3e6d39d7a41..7a659a55eba08 100644 --- a/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.test.tsx +++ b/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.test.tsx @@ -10,6 +10,7 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { useGetGroupSelector } from './use_get_group_selector'; import { initialState } from './state'; import { ActionType, defaultGroup } from '..'; +import { METRIC_TYPE } from '@kbn/analytics'; const defaultGroupingOptions = [ { label: 'ruleName', key: 'kibana.alert.rule.name' }, @@ -25,6 +26,8 @@ const defaultArgs = { fields: [], groupingId, groupingState: initialState, + tracker: jest.fn(), + onGroupChangeCallback: jest.fn(), }; const customField = 'custom.field'; describe('useGetGroupSelector', () => { @@ -123,6 +126,54 @@ describe('useGetGroupSelector', () => { expect(dispatch).toHaveBeenCalledTimes(2); }); + it('On group change, sends telemetry', () => { + const testGroup = { + [groupingId]: { + ...defaultGroup, + options: defaultGroupingOptions, + activeGroup: 'host.name', + }, + }; + const { result } = renderHook((props) => useGetGroupSelector(props), { + initialProps: { + ...defaultArgs, + groupingState: { + groupById: testGroup, + }, + }, + }); + act(() => result.current.props.onGroupChange(customField)); + expect(defaultArgs.tracker).toHaveBeenCalledTimes(1); + expect(defaultArgs.tracker).toHaveBeenCalledWith( + METRIC_TYPE.CLICK, + `alerts_table_group_by_test-table_${customField}` + ); + }); + + it('On group change, executes callback', () => { + const testGroup = { + [groupingId]: { + ...defaultGroup, + options: defaultGroupingOptions, + activeGroup: 'host.name', + }, + }; + const { result } = renderHook((props) => useGetGroupSelector(props), { + initialProps: { + ...defaultArgs, + groupingState: { + groupById: testGroup, + }, + }, + }); + act(() => result.current.props.onGroupChange(customField)); + expect(defaultArgs.onGroupChangeCallback).toHaveBeenCalledTimes(1); + expect(defaultArgs.onGroupChangeCallback).toHaveBeenCalledWith({ + tableId: groupingId, + groupByField: customField, + }); + }); + it('On group change to custom field, updates options', () => { const testGroup = { [groupingId]: { diff --git a/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.tsx b/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.tsx index 3509e095e6cc8..2b52ca141b55f 100644 --- a/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.tsx +++ b/packages/kbn-securitysolution-grouping/src/hooks/use_get_group_selector.tsx @@ -9,10 +9,12 @@ import type { FieldSpec } from '@kbn/data-views-plugin/common'; import { useCallback, useEffect } from 'react'; +import { METRIC_TYPE, UiCounterMetricType } from '@kbn/analytics'; import { getGroupSelector, isNoneGroup } from '../..'; import { groupActions, groupByIdSelector } from './state'; import type { GroupOption } from './types'; import { Action, defaultGroup, GroupMap } from './types'; +import { getTelemetryEvent } from '../telemetry/const'; export interface UseGetGroupSelectorArgs { defaultGroupingOptions: GroupOption[]; @@ -20,6 +22,12 @@ export interface UseGetGroupSelectorArgs { fields: FieldSpec[]; groupingId: string; groupingState: GroupMap; + onGroupChangeCallback?: (param: { groupByField: string; tableId: string }) => void; + tracker: ( + type: UiCounterMetricType, + event: string | string[], + count?: number | undefined + ) => void; } export const useGetGroupSelector = ({ @@ -28,6 +36,8 @@ export const useGetGroupSelector = ({ fields, groupingId, groupingState, + onGroupChangeCallback, + tracker, }: UseGetGroupSelectorArgs) => { const { activeGroup: selectedGroup, options } = groupByIdSelector({ groups: groupingState }, groupingId) ?? defaultGroup; @@ -61,6 +71,14 @@ export const useGetGroupSelector = ({ setGroupsActivePage(0); setSelectedGroup(groupSelection); + // built-in telemetry: UI-counter + tracker?.( + METRIC_TYPE.CLICK, + getTelemetryEvent.groupChanged({ groupingId, selected: groupSelection }) + ); + + onGroupChangeCallback?.({ tableId: groupingId, groupByField: groupSelection }); + // only update options if the new selection is a custom field if ( !isNoneGroup(groupSelection) && @@ -77,11 +95,14 @@ export const useGetGroupSelector = ({ }, [ defaultGroupingOptions, + groupingId, + onGroupChangeCallback, options, selectedGroup, setGroupsActivePage, setOptions, setSelectedGroup, + tracker, ] ); @@ -106,6 +127,7 @@ export const useGetGroupSelector = ({ }, [defaultGroupingOptions, options.length, selectedGroup, setOptions]); return getGroupSelector({ + groupingId, groupSelected: selectedGroup, 'data-test-subj': 'alerts-table-group-selector', onGroupChange, diff --git a/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.test.tsx b/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.test.tsx index 9d585ce4fc454..c1e1839754869 100644 --- a/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.test.tsx +++ b/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.test.tsx @@ -21,6 +21,7 @@ const defaultArgs = { defaultGroupingOptions, fields: [], groupingId, + tracker: jest.fn(), }; const groupingArgs = { @@ -36,7 +37,7 @@ const groupingArgs = { renderChildComponent: jest.fn(), runtimeMappings: {}, signalIndexName: 'test', - tableId: groupingId, + groupingId, takeActionItems: jest.fn(), to: '2020-07-08T08:20:18.966Z', }; diff --git a/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.tsx b/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.tsx index d81c19cafda91..c621695d6b17c 100644 --- a/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.tsx +++ b/packages/kbn-securitysolution-grouping/src/hooks/use_grouping.tsx @@ -8,6 +8,7 @@ import { FieldSpec } from '@kbn/data-views-plugin/common'; import React, { useCallback, useMemo, useReducer } from 'react'; +import { UiCounterMetricType } from '@kbn/analytics'; import { groupsReducerWithStorage, initialState } from './state/reducer'; import { GroupingProps, GroupSelectorProps } from '..'; import { useGroupingPagination } from './use_grouping_pagination'; @@ -31,14 +32,21 @@ interface Grouping { interface GroupingArgs { defaultGroupingOptions: GroupOption[]; - fields: FieldSpec[]; groupingId: string; + onGroupChangeCallback?: (param: { groupByField: string; tableId: string }) => void; + tracker: ( + type: UiCounterMetricType, + event: string | string[], + count?: number | undefined + ) => void; } export const useGrouping = ({ defaultGroupingOptions, fields, groupingId, + onGroupChangeCallback, + tracker, }: GroupingArgs): Grouping => { const [groupingState, dispatch] = useReducer(groupsReducerWithStorage, initialState); @@ -53,6 +61,8 @@ export const useGrouping = ({ fields, groupingId, groupingState, + onGroupChangeCallback, + tracker, }); const pagination = useGroupingPagination({ groupingId, groupingState, dispatch }); diff --git a/packages/kbn-securitysolution-grouping/src/telemetry/const.ts b/packages/kbn-securitysolution-grouping/src/telemetry/const.ts new file mode 100644 index 0000000000000..5397d98514901 --- /dev/null +++ b/packages/kbn-securitysolution-grouping/src/telemetry/const.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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. + */ +enum TELEMETRY_EVENT { + GROUP_TOGGLED = 'alerts_table_toggled_', + GROUPED_ALERTS = 'alerts_table_group_by_', +} + +export const getTelemetryEvent = { + groupToggled: ({ + isOpen, + groupingId, + groupNumber, + }: { + isOpen: boolean; + groupingId: string; + groupNumber: number; + }) => + `${TELEMETRY_EVENT.GROUP_TOGGLED}${isOpen ? 'on' : 'off'}_${groupingId}_group-${groupNumber}`, + groupChanged: ({ groupingId, selected }: { groupingId: string; selected: string }) => + `${TELEMETRY_EVENT.GROUPED_ALERTS}${groupingId}_${selected}`, +}; diff --git a/packages/kbn-securitysolution-grouping/tsconfig.json b/packages/kbn-securitysolution-grouping/tsconfig.json index 5767aafe7051a..ab98ec47e3c93 100644 --- a/packages/kbn-securitysolution-grouping/tsconfig.json +++ b/packages/kbn-securitysolution-grouping/tsconfig.json @@ -24,5 +24,6 @@ "@kbn/kibana-react-plugin", "@kbn/shared-svg", "@kbn/ui-theme", + "@kbn/analytics" ] } diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/index.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/index.ts index 19aaf93417a3e..5158ac09c50e7 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/index.ts @@ -9,9 +9,13 @@ import type { UiCounterMetricType } from '@kbn/analytics'; import { METRIC_TYPE } from '@kbn/analytics'; import type { SetupPlugins } from '../../../types'; +import type { AlertWorkflowStatus } from '../../types'; export { telemetryMiddleware } from './middleware'; export { METRIC_TYPE }; +export * from './telemetry_client'; +export * from './telemetry_service'; +export * from './types'; type TrackFn = (type: UiCounterMetricType, event: string | string[], count?: number) => void; @@ -40,7 +44,6 @@ export enum TELEMETRY_EVENT { SIEM_RULE_DISABLED = 'siem_rule_disabled', CUSTOM_RULE_ENABLED = 'custom_rule_enabled', CUSTOM_RULE_DISABLED = 'custom_rule_disabled', - // ML SIEM_JOB_ENABLED = 'siem_job_enabled', SIEM_JOB_DISABLED = 'siem_job_disabled', @@ -67,3 +70,15 @@ export enum TELEMETRY_EVENT { BREADCRUMB = 'breadcrumb_', LEGACY_NAVIGATION = 'legacy_navigation_', } + +export const getTelemetryEvent = { + groupedAlertsTakeAction: ({ + tableId, + groupNumber, + status, + }: { + tableId: string; + groupNumber: number; + status: AlertWorkflowStatus; + }) => `alerts_table_${tableId}_group-${groupNumber}_mark-${status}`, +}; diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts new file mode 100644 index 0000000000000..7b1c33eac9f0f --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { TelemetryClientStart } from './types'; + +export const createTelemetryClientMock = (): jest.Mocked => ({ + reportAlertsGroupingChanged: jest.fn(), + reportAlertsGroupingToggled: jest.fn(), + reportAlertsGroupingTakeAction: jest.fn(), +}); diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts new file mode 100644 index 0000000000000..aebe7b5b3aa55 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { AnalyticsServiceSetup } from '@kbn/core-analytics-server'; +import type { + TelemetryClientStart, + ReportAlertsGroupingChangedParams, + ReportAlertsGroupingToggledParams, + ReportAlertsTakeActionParams, +} from './types'; +import { TelemetryEventTypes } from './types'; + +/** + * Client which aggregate all the available telemetry tracking functions + * for the plugin + */ +export class TelemetryClient implements TelemetryClientStart { + constructor(private analytics: AnalyticsServiceSetup) {} + + public reportAlertsGroupingChanged = ({ + tableId, + groupByField, + }: ReportAlertsGroupingChangedParams) => { + this.analytics.reportEvent(TelemetryEventTypes.AlertsGroupingChanged, { + tableId, + groupByField, + }); + }; + + public reportAlertsGroupingToggled = ({ + isOpen, + tableId, + groupNumber, + groupName, + }: ReportAlertsGroupingToggledParams) => { + this.analytics.reportEvent(TelemetryEventTypes.AlertsGroupingToggled, { + isOpen, + tableId, + groupNumber, + groupName, + }); + }; + + public reportAlertsGroupingTakeAction = ({ + tableId, + groupNumber, + status, + groupByField, + }: ReportAlertsTakeActionParams) => { + this.analytics.reportEvent(TelemetryEventTypes.AlertsGroupingTakeAction, { + tableId, + groupNumber, + status, + groupByField, + }); + }; +} diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_events.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_events.ts new file mode 100644 index 0000000000000..d37957d2508d5 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_events.ts @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { TelemetryEvent } from './types'; +import { TelemetryEventTypes } from './types'; + +const alertsGroupingToggledEvent: TelemetryEvent = { + eventType: TelemetryEventTypes.AlertsGroupingToggled, + schema: { + isOpen: { + type: 'boolean', + _meta: { + description: 'on or off', + optional: false, + }, + }, + tableId: { + type: 'text', + _meta: { + description: 'Table ID', + optional: false, + }, + }, + groupNumber: { + type: 'integer', + _meta: { + description: 'Group number', + optional: false, + }, + }, + groupName: { + type: 'keyword', + _meta: { + description: 'Group value', + optional: true, + }, + }, + }, +}; + +const alertsGroupingChangedEvent: TelemetryEvent = { + eventType: TelemetryEventTypes.AlertsGroupingChanged, + schema: { + tableId: { + type: 'keyword', + _meta: { + description: 'Table ID', + optional: false, + }, + }, + groupByField: { + type: 'keyword', + _meta: { + description: 'Selected field', + optional: false, + }, + }, + }, +}; + +const alertsGroupingTakeActionEvent: TelemetryEvent = { + eventType: TelemetryEventTypes.AlertsGroupingTakeAction, + schema: { + tableId: { + type: 'keyword', + _meta: { + description: 'Table ID', + optional: false, + }, + }, + groupNumber: { + type: 'integer', + _meta: { + description: 'Group number', + optional: false, + }, + }, + status: { + type: 'keyword', + _meta: { + description: 'Alert status', + optional: false, + }, + }, + groupByField: { + type: 'keyword', + _meta: { + description: 'Selected field', + optional: false, + }, + }, + }, +}; + +export const telemetryEvents = [ + alertsGroupingToggledEvent, + alertsGroupingChangedEvent, + alertsGroupingTakeActionEvent, +]; diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.mock.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.mock.ts new file mode 100644 index 0000000000000..519ba4527560b --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.mock.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createTelemetryClientMock } from './telemetry_client.mock'; + +export const createTelemetryServiceMock = () => createTelemetryClientMock(); diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts new file mode 100644 index 0000000000000..0c2cd9c508289 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { coreMock } from '@kbn/core/server/mocks'; +import { telemetryEvents } from './telemetry_events'; + +import { TelemetryService } from './telemetry_service'; +import { TelemetryEventTypes } from './types'; + +describe('TelemetryService', () => { + let service: TelemetryService; + + beforeEach(() => { + service = new TelemetryService(); + }); + + const getSetupParams = () => { + const mockCoreStart = coreMock.createSetup(); + return { + analytics: mockCoreStart.analytics, + }; + }; + + describe('#setup()', () => { + it('should register all the custom events', () => { + const setupParams = getSetupParams(); + service.setup(setupParams); + + expect(setupParams.analytics.registerEventType).toHaveBeenCalledTimes(telemetryEvents.length); + + telemetryEvents.forEach((eventConfig, pos) => { + expect(setupParams.analytics.registerEventType).toHaveBeenNthCalledWith( + pos + 1, + eventConfig + ); + }); + }); + }); + + describe('#start()', () => { + it('should return all the available tracking methods', () => { + const setupParams = getSetupParams(); + service.setup(setupParams); + const telemetry = service.start(); + + expect(telemetry).toHaveProperty('reportAlertsGroupingChanged'); + expect(telemetry).toHaveProperty('reportAlertsGroupingToggled'); + expect(telemetry).toHaveProperty('reportAlertsGroupingTakeAction'); + }); + }); + + describe('#reportAlertsGroupingTakeAction', () => { + it('should report hosts entry click with properties', async () => { + const setupParams = getSetupParams(); + service.setup(setupParams); + const telemetry = service.start(); + + telemetry.reportAlertsGroupingTakeAction({ + tableId: 'test-groupingId', + groupNumber: 0, + status: 'closed', + groupByField: 'host.name', + }); + + expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1); + expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith( + TelemetryEventTypes.AlertsGroupingTakeAction, + { + tableId: 'test-groupingId', + groupNumber: 0, + status: 'closed', + groupByField: 'host.name', + } + ); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.ts new file mode 100644 index 0000000000000..58d1c3d7d7418 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { AnalyticsServiceSetup } from '@kbn/core-analytics-server'; +import { of } from 'rxjs'; + +import type { + TelemetryServiceSetupParams, + TelemetryClientStart, + TelemetryEventParams, +} from './types'; +import { telemetryEvents } from './telemetry_events'; +import { TelemetryClient } from './telemetry_client'; + +/** + * Service that interacts with the Core's analytics module + * to trigger custom event for the Infra plugin features + */ +export class TelemetryService { + constructor(private analytics: AnalyticsServiceSetup | null = null) {} + + public setup({ analytics }: TelemetryServiceSetupParams, context?: Record) { + this.analytics = analytics; + if (context) { + const context$ = of(context); + + analytics.registerContextProvider({ + name: 'detection_response', + // RxJS Observable that emits every time the context changes. + context$, + // Similar to the `reportEvent` API, schema defining the structure of the expected output of the context$ observable. + schema: { + prebuiltRulesPackageVersion: { + type: 'keyword', + _meta: { description: 'The version of prebuilt rules', optional: true }, + }, + }, + }); + } + telemetryEvents.forEach((eventConfig) => + analytics.registerEventType(eventConfig) + ); + } + + public start(): TelemetryClientStart { + if (!this.analytics) { + throw new Error( + 'The TelemetryService.setup() method has not been invoked, be sure to call it during the plugin setup.' + ); + } + + return new TelemetryClient(this.analytics); + } +} diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/types.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/types.ts new file mode 100644 index 0000000000000..2610dc51c1e41 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/types.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 { RootSchema } from '@kbn/analytics-client'; +import type { AnalyticsServiceSetup } from '@kbn/core/public'; + +export interface TelemetryServiceSetupParams { + analytics: AnalyticsServiceSetup; +} + +export enum TelemetryEventTypes { + AlertsGroupingChanged = 'Alerts Grouping Changed', + AlertsGroupingToggled = 'Alerts Grouping Toggled', + AlertsGroupingTakeAction = 'Alerts Grouping Take Action', +} + +export interface ReportAlertsGroupingChangedParams { + tableId: string; + groupByField: string; +} + +export interface ReportAlertsGroupingToggledParams { + isOpen: boolean; + tableId: string; + groupNumber: number; + groupName?: string | undefined; +} + +export interface ReportAlertsTakeActionParams { + tableId: string; + groupNumber: number; + status: 'open' | 'closed' | 'acknowledged'; + groupByField: string; +} + +export type TelemetryEventParams = + | ReportAlertsGroupingChangedParams + | ReportAlertsGroupingToggledParams + | ReportAlertsTakeActionParams; + +export interface TelemetryClientStart { + reportAlertsGroupingChanged(params: ReportAlertsGroupingChangedParams): void; + reportAlertsGroupingToggled(params: ReportAlertsGroupingToggledParams): void; + reportAlertsGroupingTakeAction(params: ReportAlertsTakeActionParams): void; +} + +export type TelemetryEvent = + | { + eventType: TelemetryEventTypes.AlertsGroupingToggled; + schema: RootSchema; + } + | { + eventType: TelemetryEventTypes.AlertsGroupingChanged; + schema: RootSchema; + } + | { + eventType: TelemetryEventTypes.AlertsGroupingTakeAction; + schema: RootSchema; + }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx index 57ef10a5285e6..448bd297c50c0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx @@ -45,6 +45,7 @@ import { useGroupTakeActionsItems, } from './grouping_settings'; import { updateGroupSelector, updateSelectedGroup } from '../../../common/store/grouping/actions'; +import { track } from '../../../common/lib/telemetry'; const ALERTS_GROUPING_ID = 'alerts-grouping'; @@ -82,16 +83,19 @@ export const GroupedAlertsTableComponent: React.FC = renderChildComponent, }) => { const dispatch = useDispatch(); + const { browserFields, indexPattern, selectedPatterns } = useSourcererDataView( SourcererScopeName.detections ); - const kibana = useKibana(); + const { + services: { uiSettings, telemetry }, + } = useKibana(); const getGlobalQuery = useCallback( (customFilters: Filter[]) => { if (browserFields != null && indexPattern != null) { return combineQueries({ - config: getEsQueryConfig(kibana.services.uiSettings), + config: getEsQueryConfig(uiSettings), dataProviders: [], indexPattern, browserFields, @@ -107,13 +111,22 @@ export const GroupedAlertsTableComponent: React.FC = } return null; }, - [browserFields, defaultFilters, globalFilters, globalQuery, indexPattern, kibana, to, from] + [browserFields, indexPattern, uiSettings, defaultFilters, globalFilters, from, to, globalQuery] + ); + + const onGroupChangeCallback = useCallback( + (param) => { + telemetry.reportAlertsGroupingChanged(param); + }, + [telemetry] ); const { groupSelector, getGrouping, selectedGroup, pagination } = useGrouping({ defaultGroupingOptions: getDefaultGroupingOptions(tableId), groupingId: tableId, fields: indexPattern.fields, + onGroupChangeCallback, + tracker: track, }); const resetPagination = pagination.reset; @@ -221,9 +234,14 @@ export const GroupedAlertsTableComponent: React.FC = }); const getTakeActionItems = useCallback( - (groupFilters: Filter[]) => - takeActionItems(getGlobalQuery([...(defaultFilters ?? []), ...groupFilters])?.filterQuery), - [defaultFilters, getGlobalQuery, takeActionItems] + (groupFilters: Filter[], groupNumber: number) => + takeActionItems({ + query: getGlobalQuery([...(defaultFilters ?? []), ...groupFilters])?.filterQuery, + tableId, + groupNumber, + selectedGroup, + }), + [defaultFilters, getGlobalQuery, selectedGroup, tableId, takeActionItems] ); const groupedAlerts = useMemo( @@ -236,12 +254,17 @@ export const GroupedAlertsTableComponent: React.FC = customMetricStats: (fieldBucket: RawBucket) => getSelectedGroupCustomMetrics(selectedGroup, fieldBucket), data: alertsGroupsData?.aggregations, + groupingId: tableId, groupPanelRenderer: (fieldBucket: RawBucket) => getSelectedGroupButtonContent(selectedGroup, fieldBucket), inspectButton: inspect, isLoading: loading || isLoadingGroups, + onToggleCallback: (param) => { + telemetry.reportAlertsGroupingToggled({ ...param, tableId: param.groupingId }); + }, renderChildComponent, takeActionItems: getTakeActionItems, + tracker: track, unit: defaultUnit, }), [ @@ -253,6 +276,8 @@ export const GroupedAlertsTableComponent: React.FC = loading, renderChildComponent, selectedGroup, + tableId, + telemetry, ] ); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.test.tsx index 4bd1d0b6005f4..f84305dcb3b37 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.test.tsx @@ -25,6 +25,11 @@ describe('useGroupTakeActionsItems', () => { const wrapperContainer: React.FC<{ children?: React.ReactNode }> = ({ children }) => ( {children} ); + const getActionItemsParams = { + tableId: 'mock-id', + groupNumber: 0, + selectedGroup: 'test', + }; it('returns array take actions items available for alerts table if showAlertStatusActions is true', async () => { await act(async () => { const { result, waitForNextUpdate } = renderHook( @@ -38,7 +43,7 @@ describe('useGroupTakeActionsItems', () => { } ); await waitForNextUpdate(); - expect(result.current().length).toEqual(3); + expect(result.current(getActionItemsParams).length).toEqual(3); }); }); @@ -55,7 +60,7 @@ describe('useGroupTakeActionsItems', () => { } ); await waitForNextUpdate(); - expect(result.current().length).toEqual(0); + expect(result.current(getActionItemsParams).length).toEqual(0); }); }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.tsx index d1e4d61e30dd5..d2baadb99d124 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_take_action_items.tsx @@ -7,6 +7,7 @@ import React, { useMemo, useCallback } from 'react'; import { EuiContextMenuItem } from '@elastic/eui'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; import type { Status } from '../../../../../common/detection_engine/schemas/common'; import type { inputsModel } from '../../../../common/store'; import { inputsSelectors } from '../../../../common/store'; @@ -27,7 +28,8 @@ import { import { FILTER_ACKNOWLEDGED, FILTER_CLOSED, FILTER_OPEN } from '../../../../../common/types'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; import * as i18n from '../translations'; - +import { getTelemetryEvent, METRIC_TYPE, track } from '../../../../common/lib/telemetry'; +import type { StartServices } from '../../../../types'; export interface TakeActionsProps { currentStatus?: Status; indexName: string; @@ -47,6 +49,21 @@ export const useGroupTakeActionsItems = ({ const refetchQuery = useCallback(() => { globalQueries.forEach((q) => q.refetch && (q.refetch as inputsModel.Refetch)()); }, [globalQueries]); + const { + services: { telemetry }, + } = useKibana(); + + const reportAlertsGroupingTakeActionClick = useCallback( + (params: { + tableId: string; + groupNumber: number; + status: 'open' | 'closed' | 'acknowledged'; + groupByField: string; + }) => { + telemetry.reportAlertsGroupingTakeAction(params); + }, + [telemetry] + ); const onUpdateSuccess = useCallback( (updated: number, conflicts: number, newStatus: AlertWorkflowStatus) => { @@ -113,13 +130,36 @@ export const useGroupTakeActionsItems = ({ ); const onClickUpdate = useCallback( - async (status: AlertWorkflowStatus, query?: string) => { + async ({ + groupNumber, + query, + status, + tableId, + selectedGroup, + }: { + groupNumber: number; + query?: string; + status: AlertWorkflowStatus; + tableId: string; + selectedGroup: string; + }) => { if (query) { startTransaction({ name: APM_USER_INTERACTIONS.BULK_QUERY_STATUS_UPDATE }); } else { startTransaction({ name: APM_USER_INTERACTIONS.STATUS_UPDATE }); } + track( + METRIC_TYPE.CLICK, + getTelemetryEvent.groupedAlertsTakeAction({ tableId, groupNumber, status }) + ); + reportAlertsGroupingTakeActionClick({ + tableId, + groupNumber, + status, + groupByField: selectedGroup, + }); + try { const response = await updateAlertStatus({ index: indexName, @@ -133,16 +173,27 @@ export const useGroupTakeActionsItems = ({ } }, [ + startTransaction, + reportAlertsGroupingTakeActionClick, updateAlertStatus, indexName, onAlertStatusUpdateSuccess, onAlertStatusUpdateFailure, - startTransaction, ] ); const items = useMemo(() => { - const getActionItems = (query?: string) => { + const getActionItems = ({ + query, + tableId, + groupNumber, + selectedGroup, + }: { + query?: string; + tableId: string; + groupNumber: number; + selectedGroup: string; + }) => { const actionItems: JSX.Element[] = []; if (showAlertStatusActions) { if (currentStatus !== FILTER_OPEN) { @@ -150,7 +201,15 @@ export const useGroupTakeActionsItems = ({ onClickUpdate(FILTER_OPEN as AlertWorkflowStatus, query)} + onClick={() => + onClickUpdate({ + groupNumber, + query, + selectedGroup, + status: FILTER_OPEN as AlertWorkflowStatus, + tableId, + }) + } > {BULK_ACTION_OPEN_SELECTED} @@ -161,7 +220,15 @@ export const useGroupTakeActionsItems = ({ onClickUpdate(FILTER_ACKNOWLEDGED as AlertWorkflowStatus, query)} + onClick={() => + onClickUpdate({ + groupNumber, + query, + selectedGroup, + status: FILTER_ACKNOWLEDGED as AlertWorkflowStatus, + tableId, + }) + } > {BULK_ACTION_ACKNOWLEDGED_SELECTED} @@ -172,7 +239,15 @@ export const useGroupTakeActionsItems = ({ onClickUpdate(FILTER_CLOSED as AlertWorkflowStatus, query)} + onClick={() => + onClickUpdate({ + groupNumber, + query, + selectedGroup, + status: FILTER_CLOSED as AlertWorkflowStatus, + tableId, + }) + } > {BULK_ACTION_CLOSE_SELECTED} diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 78680086d45c0..634e488bf14ce 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -30,7 +30,7 @@ import type { StartedSubPlugins, StartPluginsDependencies, } from './types'; -import { initTelemetry } from './common/lib/telemetry'; +import { initTelemetry, TelemetryService } from './common/lib/telemetry'; import { KibanaServices } from './common/lib/kibana/services'; import { SOLUTION_NAME } from './common/translations'; @@ -83,6 +83,8 @@ export class Plugin implements IPlugin(); @@ -120,6 +124,10 @@ export class Plugin implements IPlugin SecuritySolutionTemplateWrapper, }, + telemetry: this.telemetry.start(), }; return services; }; diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index cb16591da9fb4..9ee21755d61ad 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -60,7 +60,7 @@ import type { CloudDefend } from './cloud_defend'; import type { ThreatIntelligence } from './threat_intelligence'; import type { SecuritySolutionTemplateWrapper } from './app/home/template_wrapper'; import type { Explore } from './explore'; - +import type { TelemetryClientStart } from './common/lib/telemetry'; export interface SetupPlugins { home?: HomePublicPluginSetup; licensing: LicensingPluginSetup; @@ -119,6 +119,7 @@ export type StartServices = CoreStart & securityLayout: { getPluginWrapper: () => typeof SecuritySolutionTemplateWrapper; }; + telemetry: TelemetryClientStart; }; export interface PluginSetup { diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index c7b13f92ff070..346b2bf3289cf 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -147,6 +147,8 @@ "@kbn/alerts-as-data-utils", "@kbn/expandable-flyout", "@kbn/securitysolution-grouping", + "@kbn/core-analytics-server", + "@kbn/analytics-client", "@kbn/security-solution-side-nav", ] } From 15f1f64acefa5c67556bdfe813cd26b7397f9195 Mon Sep 17 00:00:00 2001 From: Garrett Spong Date: Fri, 10 Mar 2023 15:12:22 -0700 Subject: [PATCH 07/12] [RAM] Adds auto-incrementing revision field to rules (#147398) ## Summary Resolves https://github.com/elastic/kibana/issues/137164. This PR adds a new `revision` field (number) to Alerting Rules that auto-increments when relevant content changes have been made via the `Rules Client`. _Relevant content changes_ are defined as any content change that the user may either want to be notified about, or have the option to later revert to. This will include most all changes, except the enabling/disabling of the rule, or updates to metadata fields like `executionStatus` or `monitoring`. This `revision` field is not intended to be user editable, and should be ignored if ever provided via the API. See https://github.com/elastic/kibana/issues/136213 for additional details. To be followed-up by https://github.com/elastic/kibana/issues/137168, which will remove the version bump logic from security solution. ## Details ### Migrations Includes SO migration to default `revision` to `0` when upgrading a cluster, or when importing `pre-8.8.0` rules via the SO Management UI. For consistency, security rule import follows the same logic as SO Management and will not reset the `revision` to `0` when overriding or creating a new rule. ### Downstream Index Updates * EventLog _has not_ been updated to include `revision` along with basic rule fields currently being written. Should we? * AAD Schema will be updated in https://github.com/elastic/kibana/pull/151388 (as this one is getting pretty big) to include `revision` so alerts written will include which specific revision of the rule created the alert. ### Reference Fields Any creation of or modification to `actions` will result in a revision increment. More typical reference fields like `exception lists` on the security side will only result in a revision increment when the list is initially associated/deleted from the rule (as subsequent updates will be done directly against the list). ### RuleClient Updates The following methods within the RuleClient have been updated to support incrementing revision when relevant field changes have been detected: * `clone()` - resets to 0 currently (see open question) * `update()` - increments `revision` so long a change has been made to relevant fields (fields not in [ignore list](https://github.com/elastic/kibana/pull/147398/files#diff-6736e143ede2dc06e825bddcdc23b4d088a6620805751db4eddc5900d586c4dfR69-R85)) * `bulkEdit()` - increments `revision` for relevant fields (all current bulk edit fields minus api key/snooze/mute) Mutation methods not updated to include revision log: * `snooze()` * `unsnooze()` * `clearExpiredSnoozes()` * `muteAll()` * `unmuteAll()` * `muteInstance()` * `unmuteInstance()` * `updateApiKey()` - increments revision as rule functionality could be impacted ## Open questions: - [X] Should `clone()` in RulesClient reset revision to 0 as if it's a new rule, or keep the current value? (see [comment](https://github.com/elastic/kibana/pull/147398/files#r1106484105)) - [X] What about snooze/un-snooze, and mute/unmute? Should we update revision on these field changes as well? (see [comment](https://github.com/elastic/kibana/pull/147398/files#r1106431966)) - Discussed with @XavierM and determined to not update on snooze/mute/API key changes as this actions could be plentiful and don't necessarily represent a version of the rule a user would want to revert to, thus polluting the revision history. - [ ] Should we write `revision` to EventLog? --- ### Checklist Delete any items that are not applicable to this PR. - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] To work with docs team - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [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) --- .../group2/check_registered_types.test.ts | 2 +- .../rules_list_notify_badge_sandbox.tsx | 1 + x-pack/plugins/alerting/common/rule.ts | 1 + .../plugins/alerting/public/alert_api.test.ts | 3 + .../public/lib/common_transformations.test.ts | 4 + .../lib/alert_summary_from_event_log.test.ts | 1 + .../server/routes/bulk_edit_rules.test.ts | 1 + .../alerting/server/routes/clone_rule.test.ts | 2 + .../server/routes/create_rule.test.ts | 2 + .../alerting/server/routes/get_rule.test.ts | 2 + .../server/routes/legacy/create.test.ts | 1 + .../alerting/server/routes/legacy/get.test.ts | 1 + .../server/routes/lib/rewrite_rule.test.ts | 1 + .../server/routes/resolve_rule.test.ts | 2 + .../lib/increment_revision.test.ts | 100 ++++++++++++++++++ .../rules_client/lib/increment_revision.ts | 38 +++++++ .../alerting/server/rules_client/lib/index.ts | 1 + .../server/rules_client/methods/bulk_edit.ts | 34 +++++- .../server/rules_client/methods/clone.ts | 1 + .../server/rules_client/methods/create.ts | 2 + .../server/rules_client/methods/update.ts | 37 +++++-- .../server/rules_client/rules_client.ts | 24 +++++ .../rules_client/tests/bulk_edit.test.ts | 80 +++++++++++++- .../server/rules_client/tests/create.test.ts | 11 ++ .../tests/get_action_error_log.test.ts | 1 + .../tests/get_alert_summary.test.ts | 1 + .../tests/get_execution_log.test.ts | 1 + .../server/rules_client/tests/update.test.ts | 20 ++++ .../rules_client/tests/update_api_key.test.ts | 3 + .../alerting/server/saved_objects/index.ts | 2 + .../alerting/server/saved_objects/mappings.ts | 4 + .../saved_objects/migrations/8.8/index.ts | 12 ++- .../saved_objects/migrations/index.test.ts | 8 ++ .../task_runner/alert_task_instance.test.ts | 1 + .../alerting/server/task_runner/fixtures.ts | 1 + x-pack/plugins/alerting/server/types.ts | 1 + ...get_alert_panels_by_category.test.tsx.snap | 15 +++ .../get_alert_panels_by_node.test.tsx.snap | 8 ++ .../lib/get_alert_panels_by_category.test.tsx | 1 + .../lib/get_alert_panels_by_node.test.tsx | 1 + .../model/import/rule_to_import.ts | 3 +- .../model/rule_response_schema.mock.ts | 1 + .../rule_schema/model/rule_schemas.ts | 2 + .../schemas/common/schemas.ts | 1 + .../security_solution/cypress/objects/rule.ts | 1 + .../routes/__mocks__/request_responses.ts | 5 + .../routes/__mocks__/utils.ts | 1 + .../api/rules/bulk_actions/route.ts | 1 + .../logic/actions/duplicate_rule.test.ts | 1 + .../rule_management/logic/crud/patch_rules.ts | 4 + .../logic/export/get_export_all.test.ts | 2 + .../export/get_export_by_object_ids.test.ts | 3 + .../logic/import/import_rules_utils.ts | 1 + .../normalization/rule_converters.ts | 1 + .../rule_management/utils/validate.test.ts | 1 + .../rule_types/__mocks__/es_results.ts | 1 + .../e2e/journeys/synthetics/index.ts | 3 +- .../public/legacy_uptime/state/api/alerts.ts | 1 + .../application/lib/rule_api/create.test.ts | 1 + .../application/lib/rule_api/update.test.ts | 2 + .../application/lib/value_validators.test.ts | 4 + .../with_bulk_rule_api_operations.test.tsx | 1 + .../components/rule_actions_popover.test.tsx | 1 + .../components/rule_definition.test.tsx | 1 + .../components/rule_details.test.tsx | 1 + .../components/rule_details_route.test.tsx | 1 + .../components/rule_error_log.test.tsx | 1 + .../components/rule_route.test.tsx | 1 + .../rule_details/components/test_helpers.ts | 1 + .../components/view_in_app.test.tsx | 1 + .../sections/rule_form/rule_add.test.tsx | 1 + .../sections/rule_form/rule_edit.test.tsx | 1 + .../sections/rule_form/rule_errors.test.tsx | 1 + .../collapsed_item_actions.test.tsx | 1 + .../notify_badge/notify_badge.test.tsx | 1 + .../components/rule_enabled_switch.test.tsx | 2 + .../group1/tests/alerting/create.ts | 1 + .../group1/tests/alerting/find.ts | 2 + .../group1/tests/alerting/get.ts | 1 + .../group2/tests/alerting/update.ts | 5 + .../group2/tests/alerting/update_api_key.ts | 10 ++ .../group3/tests/alerting/bulk_delete.ts | 2 + .../group3/tests/alerting/bulk_disable.ts | 1 + .../group3/tests/alerting/bulk_enable.ts | 1 + .../group3/tests/alerting/clone.ts | 1 + .../tests/alerting/group1/create.ts | 3 + .../tests/alerting/group1/disable.ts | 24 +++++ .../tests/alerting/group1/enable.ts | 6 ++ .../spaces_only/tests/alerting/group1/find.ts | 2 + .../spaces_only/tests/alerting/group1/get.ts | 2 + .../tests/alerting/group2/update.ts | 2 + .../tests/alerting/group2/update_api_key.ts | 6 ++ .../tests/alerting/group4/bulk_edit.ts | 22 ++++ .../synthetics/enable_default_alerting.ts | 1 + .../basic/tests/create_rules.ts | 1 + .../basic/tests/import_rules.ts | 1 + .../basic/tests/patch_rules.ts | 5 + .../basic/tests/patch_rules_bulk.ts | 11 ++ .../basic/tests/update_rules.ts | 5 + .../basic/tests/update_rules_bulk.ts | 11 ++ .../group1/create_rules.ts | 1 + .../group1/export_rules.ts | 1 + .../group1/update_actions.ts | 10 +- .../group10/import_rules.ts | 1 + .../group10/patch_rules.ts | 11 +- .../group10/patch_rules_bulk.ts | 12 +++ .../group10/update_rules.ts | 9 ++ .../group10/update_rules_bulk.ts | 13 +++ .../utils/get_complex_rule_output.ts | 1 + .../utils/get_simple_rule_output.ts | 1 + .../utils/rule_to_update_schema.ts | 1 + .../legacy_actions/data.json | 8 ++ 112 files changed, 663 insertions(+), 20 deletions(-) create mode 100644 x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts create mode 100644 x-pack/plugins/alerting/server/rules_client/lib/increment_revision.ts 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 fbc82719bd381..474aab15b2c1e 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 @@ -57,7 +57,7 @@ describe('checking migration metadata changes on all registered SO types', () => Object { "action": "6cfc277ed3211639e37546ac625f4a68f2494215", "action_task_params": "5f419caba96dd8c77d0f94013e71d43890e3d5d6", - "alert": "785240e3137f5eb1a0f8986e5b8eff99780fc04f", + "alert": "1e4cd6941f1eb39c729c646e91fbfb9700de84b9", "api_key_pending_invalidation": "16e7bcf8e78764102d7f525542d5b616809a21ee", "apm-indices": "d19dd7fb51f2d2cbc1f8769481721e0953f9a6d2", "apm-server-schema": "1d42f17eff9ec6c16d3a9324d9539e2d123d0a9a", diff --git a/x-pack/examples/triggers_actions_ui_example/public/components/rules_list_notify_badge_sandbox.tsx b/x-pack/examples/triggers_actions_ui_example/public/components/rules_list_notify_badge_sandbox.tsx index 47b08acd88e31..6ff26f7725f64 100644 --- a/x-pack/examples/triggers_actions_ui_example/public/components/rules_list_notify_badge_sandbox.tsx +++ b/x-pack/examples/triggers_actions_ui_example/public/components/rules_list_notify_badge_sandbox.tsx @@ -45,6 +45,7 @@ const mockRule: RuleTableItem = { ruleType: 'Test Rule Type', isEditable: true, enabledInLicense: true, + revision: 0, }; export const RulesListNotifyBadgeSandbox = ({ triggersActionsUi }: SandboxProps) => { diff --git a/x-pack/plugins/alerting/common/rule.ts b/x-pack/plugins/alerting/common/rule.ts index 3ff66f68c5417..b886f6af83705 100644 --- a/x-pack/plugins/alerting/common/rule.ts +++ b/x-pack/plugins/alerting/common/rule.ts @@ -161,6 +161,7 @@ export interface Rule { isSnoozedUntil?: Date | null; lastRun?: RuleLastRun | null; nextRun?: Date | null; + revision: number; running?: boolean | null; viewInAppRelativeUrl?: string; } diff --git a/x-pack/plugins/alerting/public/alert_api.test.ts b/x-pack/plugins/alerting/public/alert_api.test.ts index abbaa6a5049eb..7bd910f5deff3 100644 --- a/x-pack/plugins/alerting/public/alert_api.test.ts +++ b/x-pack/plugins/alerting/public/alert_api.test.ts @@ -132,6 +132,7 @@ describe('loadRule', () => { "params": Object { "x": 42, }, + "revision": 0, "schedule": Object { "interval": "1s", }, @@ -268,6 +269,7 @@ function getApiRule() { updated_by: '2889684073', mute_all: false, muted_alert_ids: [], + revision: 0, schedule: { interval: '1s', }, @@ -333,5 +335,6 @@ function getRule(): Rule<{ x: number }> { lastExecutionDate: RuleExecuteDate, lastDuration: 1194, }, + revision: 0, }; } diff --git a/x-pack/plugins/alerting/public/lib/common_transformations.test.ts b/x-pack/plugins/alerting/public/lib/common_transformations.test.ts index ac57340f109b2..0a3cdcb336386 100644 --- a/x-pack/plugins/alerting/public/lib/common_transformations.test.ts +++ b/x-pack/plugins/alerting/public/lib/common_transformations.test.ts @@ -46,6 +46,7 @@ describe('common_transformations', () => { notify_when: 'onActiveAlert', mute_all: false, muted_alert_ids: ['bob', 'jim'], + revision: 0, execution_status: { last_execution_date: dateExecuted.toISOString(), last_duration: 42, @@ -185,6 +186,7 @@ describe('common_transformations', () => { ], }, }, + "revision": 0, "schedule": Object { "interval": "1s", }, @@ -229,6 +231,7 @@ describe('common_transformations', () => { notify_when: 'onActiveAlert', mute_all: false, muted_alert_ids: ['bob', 'jim'], + revision: 0, execution_status: { last_execution_date: dateExecuted.toISOString(), status: 'error', @@ -344,6 +347,7 @@ describe('common_transformations', () => { "nextRun": 2021-12-15T12:34:55.789Z, "notifyWhen": "onActiveAlert", "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1s", }, diff --git a/x-pack/plugins/alerting/server/lib/alert_summary_from_event_log.test.ts b/x-pack/plugins/alerting/server/lib/alert_summary_from_event_log.test.ts index 3bf01caaead1a..fc6518a5d0960 100644 --- a/x-pack/plugins/alerting/server/lib/alert_summary_from_event_log.test.ts +++ b/x-pack/plugins/alerting/server/lib/alert_summary_from_event_log.test.ts @@ -784,4 +784,5 @@ const BaseRule: SanitizedRule<{ bar: boolean }> = { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; diff --git a/x-pack/plugins/alerting/server/routes/bulk_edit_rules.test.ts b/x-pack/plugins/alerting/server/routes/bulk_edit_rules.test.ts index 944b2db172c91..b2819fda6f60f 100644 --- a/x-pack/plugins/alerting/server/routes/bulk_edit_rules.test.ts +++ b/x-pack/plugins/alerting/server/routes/bulk_edit_rules.test.ts @@ -59,6 +59,7 @@ describe('bulkEditInternalRulesRoute', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; const mockedAlerts: Array> = [mockedAlert]; diff --git a/x-pack/plugins/alerting/server/routes/clone_rule.test.ts b/x-pack/plugins/alerting/server/routes/clone_rule.test.ts index 6c79ca7680940..035e5fa5885b8 100644 --- a/x-pack/plugins/alerting/server/routes/clone_rule.test.ts +++ b/x-pack/plugins/alerting/server/routes/clone_rule.test.ts @@ -65,6 +65,7 @@ describe('cloneRuleRoute', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; const ruleToClone: AsApiContract['data']> = { @@ -90,6 +91,7 @@ describe('cloneRuleRoute', () => { created_at: mockedRule.createdAt, updated_at: mockedRule.updatedAt, id: mockedRule.id, + revision: 0, execution_status: { status: mockedRule.executionStatus.status, last_execution_date: mockedRule.executionStatus.lastExecutionDate, diff --git a/x-pack/plugins/alerting/server/routes/create_rule.test.ts b/x-pack/plugins/alerting/server/routes/create_rule.test.ts index 0d8caff92202a..5563c886b24b0 100644 --- a/x-pack/plugins/alerting/server/routes/create_rule.test.ts +++ b/x-pack/plugins/alerting/server/routes/create_rule.test.ts @@ -68,6 +68,7 @@ describe('createRuleRoute', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; const ruleToCreate: AsApiContract['data']> = { @@ -93,6 +94,7 @@ describe('createRuleRoute', () => { created_at: mockedAlert.createdAt, updated_at: mockedAlert.updatedAt, id: mockedAlert.id, + revision: mockedAlert.revision, execution_status: { status: mockedAlert.executionStatus.status, last_execution_date: mockedAlert.executionStatus.lastExecutionDate, diff --git a/x-pack/plugins/alerting/server/routes/get_rule.test.ts b/x-pack/plugins/alerting/server/routes/get_rule.test.ts index 81b0ed5a6032a..9ae211eed0bcc 100644 --- a/x-pack/plugins/alerting/server/routes/get_rule.test.ts +++ b/x-pack/plugins/alerting/server/routes/get_rule.test.ts @@ -62,6 +62,7 @@ describe('getRuleRoute', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; const getResult: AsApiContract> = { @@ -76,6 +77,7 @@ describe('getRuleRoute', () => { created_at: mockedAlert.createdAt, updated_at: mockedAlert.updatedAt, id: mockedAlert.id, + revision: mockedAlert.revision, execution_status: { status: mockedAlert.executionStatus.status, last_execution_date: mockedAlert.executionStatus.lastExecutionDate, diff --git a/x-pack/plugins/alerting/server/routes/legacy/create.test.ts b/x-pack/plugins/alerting/server/routes/legacy/create.test.ts index 60b299be6db97..548015ef55f03 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/create.test.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/create.test.ts @@ -80,6 +80,7 @@ describe('createAlertRoute', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; it('creates an alert with proper parameters', async () => { diff --git a/x-pack/plugins/alerting/server/routes/legacy/get.test.ts b/x-pack/plugins/alerting/server/routes/legacy/get.test.ts index 6860140ce2540..403f7a5b42ac8 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/get.test.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/get.test.ts @@ -66,6 +66,7 @@ describe('getAlertRoute', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; it('gets an alert with proper parameters', async () => { diff --git a/x-pack/plugins/alerting/server/routes/lib/rewrite_rule.test.ts b/x-pack/plugins/alerting/server/routes/lib/rewrite_rule.test.ts index b4d1962931218..64326075b495a 100644 --- a/x-pack/plugins/alerting/server/routes/lib/rewrite_rule.test.ts +++ b/x-pack/plugins/alerting/server/routes/lib/rewrite_rule.test.ts @@ -60,6 +60,7 @@ const sampleRule: SanitizedRule & { activeSnoozes?: string[] } = }, }, nextRun: DATE_2020, + revision: 0, }; describe('rewriteRule', () => { diff --git a/x-pack/plugins/alerting/server/routes/resolve_rule.test.ts b/x-pack/plugins/alerting/server/routes/resolve_rule.test.ts index dfac49fc04a67..273a7ea7fb8aa 100644 --- a/x-pack/plugins/alerting/server/routes/resolve_rule.test.ts +++ b/x-pack/plugins/alerting/server/routes/resolve_rule.test.ts @@ -64,6 +64,7 @@ describe('resolveRuleRoute', () => { }, outcome: 'aliasMatch', alias_target_id: '2', + revision: 0, }; const resolveResult: AsApiContract> = { @@ -88,6 +89,7 @@ describe('resolveRuleRoute', () => { created_at: mockedRule.createdAt, updated_at: mockedRule.updatedAt, id: mockedRule.id, + revision: mockedRule.revision, execution_status: { status: mockedRule.executionStatus.status, last_execution_date: mockedRule.executionStatus.lastExecutionDate, diff --git a/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts new file mode 100644 index 0000000000000..aed29b5996003 --- /dev/null +++ b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { UpdateOptions } from '..'; +import { mockedDateString } from '../tests/lib'; +import { incrementRevision } from './increment_revision'; +import { SavedObject } from '@kbn/core/server'; +import { RawRule, RuleTypeParams } from '../../types'; + +describe('incrementRevision', () => { + const currentRule: SavedObject = { + id: '1', + type: 'alert', + attributes: { + enabled: true, + name: 'rule-name', + tags: ['tag-1', 'tag-2'], + alertTypeId: '123', + consumer: 'rule-consumer', + legacyId: null, + schedule: { interval: '1s' }, + actions: [], + params: {}, + createdBy: null, + updatedBy: null, + createdAt: mockedDateString, + updatedAt: mockedDateString, + apiKey: null, + apiKeyOwner: null, + throttle: null, + notifyWhen: null, + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'unknown', + lastExecutionDate: '2020-08-20T19:23:38Z', + error: null, + warning: null, + }, + revision: 0, + }, + references: [], + }; + + const updateOptions: UpdateOptions = { + id: '1', + data: { + schedule: { + interval: '1m', + }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + risk_score: 40, + severity: 'low', + }, + throttle: null, + notifyWhen: 'onActiveAlert', + actions: [], + }, + }; + const updatedParams: RuleTypeParams = { bar: true, risk_score: 40, severity: 'low' }; + + it('should return the current revision if no attrs or params are updated', () => { + // @ts-expect-error + expect(incrementRevision(currentRule, { data: {} }, {})).toBe(0); + }); + + it('should increment the revision if a root level attr is updated', () => { + expect(incrementRevision(currentRule, updateOptions, {})).toBe(1); + }); + + it('should increment the revision if a rule param is updated', () => { + // @ts-expect-error + expect(incrementRevision(currentRule, { data: {} }, updatedParams)).toBe(1); + }); + + it('should not increment the revision if an excluded attr is updated', () => { + // @ts-expect-error + expect(incrementRevision(currentRule, { data: { activeSnoozes: 'excludedValue' } }, {})).toBe( + 0 + ); + }); + + it('should not increment the revision if an excluded param is updated', () => { + expect( + incrementRevision( + currentRule, + // @ts-expect-error + { data: {} }, + { isSnoozedUntil: '1970-01-02T00:00:00.000Z' } + ) + ).toBe(0); + }); +}); diff --git a/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.ts b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.ts new file mode 100644 index 0000000000000..5bf3ae02cedc8 --- /dev/null +++ b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.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 { SavedObject } from '@kbn/core/server'; +import { get, isEqual } from 'lodash'; +import { RawRule, RuleTypeParams } from '../../types'; +import { fieldsToExcludeFromRevisionUpdates, UpdateOptions } from '..'; + +export function incrementRevision( + currentRule: SavedObject, + { data }: UpdateOptions, + updatedParams: RuleTypeParams +): number { + // Diff root level attrs + for (const [field, value] of Object.entries(data).filter(([key]) => key !== 'params')) { + if ( + !fieldsToExcludeFromRevisionUpdates.has(field) && + !isEqual(value, get(currentRule.attributes, field)) + ) { + return currentRule.attributes.revision + 1; + } + } + + // Diff rule params + for (const [field, value] of Object.entries(updatedParams)) { + if ( + !fieldsToExcludeFromRevisionUpdates.has(field) && + !isEqual(value, get(currentRule.attributes.params, field)) + ) { + return currentRule.attributes.revision + 1; + } + } + return currentRule.attributes.revision; +} diff --git a/x-pack/plugins/alerting/server/rules_client/lib/index.ts b/x-pack/plugins/alerting/server/rules_client/lib/index.ts index 26cf359d14f15..09024474020e1 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/index.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/index.ts @@ -16,3 +16,4 @@ export { scheduleTask } from './schedule_task'; export { createNewAPIKeySet } from './create_new_api_key_set'; export { recoverRuleAlerts } from './recover_rule_alerts'; export { addUuid } from './add_uuid'; +export { incrementRevision } from './increment_revision'; diff --git a/x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts b/x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts index 9bf0280e4314b..4bbe493d93c6b 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts @@ -69,6 +69,9 @@ export type BulkEditFields = keyof Pick< 'actions' | 'tags' | 'schedule' | 'throttle' | 'notifyWhen' | 'snoozeSchedule' | 'apiKey' >; +export const bulkEditFieldsToExcludeFromRevisionUpdates: ReadonlySet = + new Set(['snoozeSchedule', 'apiKey']); + export type BulkEditOperation = | { operation: 'add' | 'delete' | 'set'; @@ -126,16 +129,22 @@ export type RuleParamsModifier = ( params: Params ) => Promise>; +export type ShouldIncrementRevision = ( + params?: RuleTypeParams +) => boolean; + export interface BulkEditOptionsFilter { filter?: string | KueryNode; operations: BulkEditOperation[]; paramsModifier?: RuleParamsModifier; + shouldIncrementRevision?: ShouldIncrementRevision; } export interface BulkEditOptionsIds { ids: string[]; operations: BulkEditOperation[]; paramsModifier?: RuleParamsModifier; + shouldIncrementRevision?: ShouldIncrementRevision; } export type BulkEditOptions = @@ -244,12 +253,13 @@ export async function bulkEdit( context.logger, `rulesClient.update('operations=${JSON.stringify(options.operations)}, paramsModifier=${ options.paramsModifier ? '[Function]' : undefined - }')`, + }', shouldIncrementRevision=${options.shouldIncrementRevision ? '[Function]' : undefined}')`, (filterKueryNode: KueryNode | null) => bulkEditOcc(context, { filter: filterKueryNode, operations: options.operations, paramsModifier: options.paramsModifier, + shouldIncrementRevision: options.shouldIncrementRevision, }), qNodeFilterWithAuth ); @@ -284,10 +294,12 @@ async function bulkEditOcc( filter, operations, paramsModifier, + shouldIncrementRevision, }: { filter: KueryNode | null; operations: BulkEditOptions['operations']; paramsModifier: BulkEditOptions['paramsModifier']; + shouldIncrementRevision?: BulkEditOptions['shouldIncrementRevision']; } ): Promise<{ apiKeysToInvalidate: string[]; @@ -326,6 +338,7 @@ async function bulkEditOcc( skipped, errors, username, + shouldIncrementRevision, }), { concurrency: API_KEY_GENERATE_CONCURRENCY } ); @@ -395,6 +408,7 @@ async function updateRuleAttributesAndParamsInMemory true, }: { context: RulesClientContext; rule: SavedObjectsFindResult; @@ -405,6 +419,7 @@ async function updateRuleAttributesAndParamsInMemory['shouldIncrementRevision']; }): Promise { try { if (rule.attributes.apiKey) { @@ -427,6 +442,15 @@ async function updateRuleAttributesAndParamsInMemory( mutedInstanceIds: [], executionStatus: getRuleExecutionStatusPending(lastRunTimestamp.toISOString()), monitoring: getDefaultMonitoring(lastRunTimestamp.toISOString()), + revision: 0, scheduledTaskId: null, running: false, }; diff --git a/x-pack/plugins/alerting/server/rules_client/methods/create.ts b/x-pack/plugins/alerting/server/rules_client/methods/create.ts index 48735c0327d04..960cd8a7c43f7 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/create.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/create.ts @@ -43,6 +43,7 @@ export interface CreateOptions { | 'isSnoozedUntil' | 'lastRun' | 'nextRun' + | 'revision' > & { actions: NormalizedAlertAction[] }; options?: SavedObjectOptions; allowMissingConnectorSecrets?: boolean; @@ -153,6 +154,7 @@ export async function create( throttle, executionStatus: getRuleExecutionStatusPending(lastRunTimestamp.toISOString()), monitoring: getDefaultMonitoring(lastRunTimestamp.toISOString()), + revision: 0, running: false, }; diff --git a/x-pack/plugins/alerting/server/rules_client/methods/update.ts b/x-pack/plugins/alerting/server/rules_client/methods/update.ts index 673f300a722c6..0e1ecd40da43c 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/update.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/update.ts @@ -9,6 +9,7 @@ import Boom from '@hapi/boom'; import { isEqual, omit } from 'lodash'; import { SavedObject } from '@kbn/core/server'; import { AlertConsumers } from '@kbn/rule-data-utils'; +import type { ShouldIncrementRevision } from './bulk_edit'; import { PartialRule, RawRule, @@ -30,6 +31,7 @@ import { updateMeta, getPartialRuleFromRaw, addUuid, + incrementRevision, } from '../lib'; import { generateAPIKeyName, apiKeyAsAlertAttributes } from '../common'; @@ -45,22 +47,29 @@ export interface UpdateOptions { notifyWhen?: RuleNotifyWhenType | null; }; allowMissingConnectorSecrets?: boolean; + shouldIncrementRevision?: ShouldIncrementRevision; } export async function update( context: RulesClientContext, - { id, data, allowMissingConnectorSecrets }: UpdateOptions + { id, data, allowMissingConnectorSecrets, shouldIncrementRevision }: UpdateOptions ): Promise> { return await retryIfConflicts( context.logger, `rulesClient.update('${id}')`, - async () => await updateWithOCC(context, { id, data, allowMissingConnectorSecrets }) + async () => + await updateWithOCC(context, { + id, + data, + allowMissingConnectorSecrets, + shouldIncrementRevision, + }) ); } async function updateWithOCC( context: RulesClientContext, - { id, data, allowMissingConnectorSecrets }: UpdateOptions + { id, data, allowMissingConnectorSecrets, shouldIncrementRevision }: UpdateOptions ): Promise> { let alertSavedObject: SavedObject; @@ -108,7 +117,7 @@ async function updateWithOCC( const updateResult = await updateAlert( context, - { id, data, allowMissingConnectorSecrets }, + { id, data, allowMissingConnectorSecrets, shouldIncrementRevision }, alertSavedObject ); @@ -149,9 +158,15 @@ async function updateWithOCC( async function updateAlert( context: RulesClientContext, - { id, data: initialData, allowMissingConnectorSecrets }: UpdateOptions, - { attributes, version }: SavedObject + { + id, + data: initialData, + allowMissingConnectorSecrets, + shouldIncrementRevision = () => true, + }: UpdateOptions, + currentRule: SavedObject ): Promise> { + const { attributes, version } = currentRule; const data = { ...initialData, actions: addUuid(initialData.actions) }; const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId); @@ -203,6 +218,15 @@ async function updateAlert( const apiKeyAttributes = apiKeyAsAlertAttributes(createdAPIKey, username); const notifyWhen = getRuleNotifyWhenType(data.notifyWhen ?? null, data.throttle ?? null); + // Increment revision if applicable field has changed + const revision = shouldIncrementRevision(updatedParams) + ? incrementRevision( + currentRule, + { id, data, allowMissingConnectorSecrets }, + updatedParams + ) + : currentRule.attributes.revision; + let updatedObject: SavedObject; const createAttributes = updateMeta(context, { ...attributes, @@ -211,6 +235,7 @@ async function updateAlert( params: updatedParams as RawRule['params'], actions, notifyWhen, + revision, updatedBy: username, updatedAt: new Date().toISOString(), }); diff --git a/x-pack/plugins/alerting/server/rules_client/rules_client.ts b/x-pack/plugins/alerting/server/rules_client/rules_client.ts index 75e563d2011da..ec720335c94e6 100644 --- a/x-pack/plugins/alerting/server/rules_client/rules_client.ts +++ b/x-pack/plugins/alerting/server/rules_client/rules_client.ts @@ -66,6 +66,30 @@ const fieldsToExcludeFromPublicApi: Array = [ 'activeSnoozes', ]; +export const fieldsToExcludeFromRevisionUpdates: ReadonlySet = new Set([ + 'activeSnoozes', + 'alertTypeId', + 'apiKey', + 'apiKeyOwner', + 'consumer', + 'createdAt', + 'createdBy', + 'enabled', + 'executionStatus', + 'id', + 'isSnoozedUntil', + 'lastRun', + 'monitoring', + 'muteAll', + 'mutedInstanceIds', + 'nextRun', + 'revision', + 'running', + 'snoozeSchedule', + 'updatedBy', + 'updatedAt', +]); + export class RulesClient { private readonly context: RulesClientContext; diff --git a/x-pack/plugins/alerting/server/rules_client/tests/bulk_edit.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/bulk_edit.test.ts index 9bcf957a467a6..7ae9d4fcf041b 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/bulk_edit.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/bulk_edit.test.ts @@ -94,6 +94,7 @@ describe('bulkEdit()', () => { notifyWhen: null, actions: [], name: 'my rule name', + revision: 0, }, references: [], version: '123', @@ -220,6 +221,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -251,6 +253,7 @@ describe('bulkEdit()', () => { type: 'alert', attributes: expect.objectContaining({ tags: ['foo', 'test-1'], + revision: 1, }), }), ], @@ -275,6 +278,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -302,6 +306,7 @@ describe('bulkEdit()', () => { type: 'alert', attributes: expect.objectContaining({ tags: [], + revision: 1, }), }), ], @@ -326,6 +331,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -354,6 +360,7 @@ describe('bulkEdit()', () => { type: 'alert', attributes: expect.objectContaining({ tags: ['test-1', 'test-2'], + revision: 1, }), }), ], @@ -579,6 +586,7 @@ describe('bulkEdit()', () => { updatedAt: '2019-02-12T21:01:22.479Z', updatedBy: 'elastic', tags: ['foo'], + revision: 1, }, references: [{ id: '1', name: 'action_0', type: 'action' }], }, @@ -592,6 +600,50 @@ describe('bulkEdit()', () => { snoozeSchedule: [], }); }); + + test('should only increment revision once for multiple operations', async () => { + unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ + saved_objects: [ + { + ...existingRule, + attributes: { + ...existingRule.attributes, + revision: 1, + }, + }, + ], + }); + const result = await rulesClient.bulkEdit({ + filter: '', + operations: [ + { + field: 'actions', + operation: 'add', + value: [ + { + id: '687300e0-b882-11ed-ad70-c74a8cf8f386', + group: 'default', + params: { + message: 'Rule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ], + }, + { + field: 'throttle', + operation: 'set', + value: null, + }, + { + field: 'notifyWhen', + operation: 'set', + value: 'onActiveAlert', + }, + ], + }); + + expect(result.rules[0]).toHaveProperty('revision', 1); + }); }); describe('index pattern operations', () => { @@ -628,6 +680,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -665,6 +718,7 @@ describe('bulkEdit()', () => { params: expect.objectContaining({ index: ['test-1', 'test-2', 'test-4', 'test-5'], }), + revision: 1, }), }), ], @@ -691,6 +745,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -723,6 +778,7 @@ describe('bulkEdit()', () => { params: expect.objectContaining({ index: ['test-1'], }), + revision: 1, }), }), ], @@ -819,6 +875,7 @@ describe('bulkEdit()', () => { type: 'alert', attributes: expect.objectContaining({ snoozeSchedule: [snoozePayload], + revision: 0, }), }), ], @@ -848,6 +905,7 @@ describe('bulkEdit()', () => { id: '1', type: 'alert', attributes: expect.objectContaining({ + revision: 0, snoozeSchedule: [snoozePayload], }), }), @@ -893,6 +951,7 @@ describe('bulkEdit()', () => { id: '1', type: 'alert', attributes: expect.objectContaining({ + revision: 0, snoozeSchedule: [...existingSnooze, snoozePayload], }), }), @@ -938,6 +997,7 @@ describe('bulkEdit()', () => { type: 'alert', attributes: expect.objectContaining({ muteAll: true, + revision: 0, snoozeSchedule: [snoozePayload], }), }), @@ -981,6 +1041,7 @@ describe('bulkEdit()', () => { id: '1', type: 'alert', attributes: expect.objectContaining({ + revision: 0, snoozeSchedule: [existingSnooze[1], existingSnooze[2]], }), }), @@ -1025,6 +1086,7 @@ describe('bulkEdit()', () => { id: '1', type: 'alert', attributes: expect.objectContaining({ + revision: 0, snoozeSchedule: [], }), }), @@ -1069,6 +1131,7 @@ describe('bulkEdit()', () => { id: '1', type: 'alert', attributes: expect.objectContaining({ + revision: 0, snoozeSchedule: [existingSnooze[0]], }), }), @@ -1181,7 +1244,7 @@ describe('bulkEdit()', () => { expect(createAPIKeyMock).not.toHaveBeenCalled(); // Explicitly bulk editing the apiKey will set the api key, even if the rule is disabled - await rulesClient.bulkEdit({ + const result = await rulesClient.bulkEdit({ filter: 'alert.attributes.tags: "APM"', operations: [ { @@ -1192,6 +1255,9 @@ describe('bulkEdit()', () => { }); expect(createAPIKeyMock).toHaveBeenCalled(); + + // Just API key updates do not result in an increment to revision + expect(result.rules[0]).toHaveProperty('revision', 0); }); }); @@ -1211,7 +1277,7 @@ describe('bulkEdit()', () => { }); }); - it('should succesfully update tags and index patterns and return updated rule', async () => { + it('should successfully update tags and index patterns and return updated rule', async () => { unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ saved_objects: [ { @@ -1230,6 +1296,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -1270,6 +1337,7 @@ describe('bulkEdit()', () => { params: { index: ['index-1', 'index-2', 'index-3'], }, + revision: 1, }), }), ], @@ -1277,7 +1345,7 @@ describe('bulkEdit()', () => { ); }); - it('should succesfully update rule if tags are updated but index patterns are not', async () => { + it('should successfully update rule if tags are updated but index patterns are not', async () => { unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ saved_objects: [ { @@ -1296,6 +1364,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -1337,6 +1406,7 @@ describe('bulkEdit()', () => { params: { index: ['index-1', 'index-2'], }, + revision: 1, }), }), ], @@ -1344,7 +1414,7 @@ describe('bulkEdit()', () => { ); }); - it('should succesfully update rule if index patterns are updated but tags are not', async () => { + it('should successfully update rule if index patterns are updated but tags are not', async () => { unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ saved_objects: [ { @@ -1363,6 +1433,7 @@ describe('bulkEdit()', () => { throttle: null, notifyWhen: null, actions: [], + revision: 0, }, references: [], version: '123', @@ -1404,6 +1475,7 @@ describe('bulkEdit()', () => { params: { index: ['index-1', 'index-2', 'index-3'], }, + revision: 1, }), }), ], diff --git a/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts index 8d5d681845f8a..61d204b6024b5 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts @@ -457,6 +457,7 @@ describe('create()', () => { "params": Object { "bar": true, }, + "revision": 0, "running": false, "schedule": Object { "interval": "1m", @@ -677,6 +678,7 @@ describe('create()', () => { "params": Object { "bar": true, }, + "revision": 0, "running": false, "schedule": Object { "interval": "1m", @@ -1105,6 +1107,7 @@ describe('create()', () => { name: 'abc', notifyWhen: null, params: { bar: true }, + revision: 0, running: false, schedule: { interval: '1m' }, tags: ['foo'], @@ -1314,6 +1317,7 @@ describe('create()', () => { name: 'abc', notifyWhen: null, params: { bar: true, parameterThatIsSavedObjectRef: 'soRef_0' }, + revision: 0, running: false, schedule: { interval: '1m' }, tags: ['foo'], @@ -1493,6 +1497,7 @@ describe('create()', () => { name: 'abc', notifyWhen: null, params: { bar: true, parameterThatIsSavedObjectRef: 'action_0' }, + revision: 0, running: false, schedule: { interval: '1m' }, tags: ['foo'], @@ -1668,6 +1673,7 @@ describe('create()', () => { warning: null, }, monitoring: getDefaultMonitoring('2019-02-12T21:01:22.479Z'), + revision: 0, running: false, }, { @@ -1804,6 +1810,7 @@ describe('create()', () => { warning: null, }, monitoring: getDefaultMonitoring('2019-02-12T21:01:22.479Z'), + revision: 0, running: false, }, { @@ -1940,6 +1947,7 @@ describe('create()', () => { warning: null, }, monitoring: getDefaultMonitoring('2019-02-12T21:01:22.479Z'), + revision: 0, running: false, }, { @@ -2116,6 +2124,7 @@ describe('create()', () => { meta: { versionApiKeyLastmodified: 'v8.0.0', }, + revision: 0, running: false, }, { @@ -2470,6 +2479,7 @@ describe('create()', () => { warning: null, }, monitoring: getDefaultMonitoring('2019-02-12T21:01:22.479Z'), + revision: 0, running: false, }, { @@ -2575,6 +2585,7 @@ describe('create()', () => { warning: null, }, monitoring: getDefaultMonitoring('2019-02-12T21:01:22.479Z'), + revision: 0, running: false, }, { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts index 672281469d18b..90d68301f97aa 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts @@ -90,6 +90,7 @@ const BaseRuleSavedObject: SavedObject = { error: null, warning: null, }, + revision: 0, }, references: [], }; diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts index cbf766bd482d5..c7e2c65980afb 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts @@ -94,6 +94,7 @@ const BaseRuleSavedObject: SavedObject = { error: null, warning: null, }, + revision: 0, }, references: [], }; diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts index ffc40cd705abd..3f8dfd92ee894 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts @@ -91,6 +91,7 @@ const BaseRuleSavedObject: SavedObject = { error: null, warning: null, }, + revision: 0, }, references: [], }; diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts index 2e1be7076004a..074bbfa3552b1 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts @@ -90,6 +90,7 @@ describe('update()', () => { alertTypeId: 'myType', schedule: { interval: '1m' }, consumer: 'myApp', + revision: 0, scheduledTaskId: 'task-123', params: {}, actions: [ @@ -235,6 +236,7 @@ describe('update()', () => { }, ], notifyWhen: 'onActiveAlert', + revision: 1, scheduledTaskId: 'task-123', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), @@ -330,6 +332,7 @@ describe('update()', () => { "params": Object { "bar": true, }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -395,6 +398,7 @@ describe('update()', () => { "risk_score": 40, "severity": "low", }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -527,6 +531,7 @@ describe('update()', () => { }, ], notifyWhen: 'onActiveAlert', + revision: 1, scheduledTaskId: 'task-123', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), @@ -623,6 +628,7 @@ describe('update()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true }, + revision: 1, schedule: { interval: '1m' }, scheduledTaskId: 'task-123', tags: ['foo'], @@ -673,6 +679,7 @@ describe('update()', () => { "params": Object { "bar": true, }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -747,6 +754,7 @@ describe('update()', () => { }, ], notifyWhen: 'onActiveAlert', + revision: 1, scheduledTaskId: 'task-123', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), @@ -807,6 +815,7 @@ describe('update()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true, parameterThatIsSavedObjectRef: 'soRef_0' }, + revision: 1, schedule: { interval: '1m' }, scheduledTaskId: 'task-123', tags: ['foo'], @@ -852,6 +861,7 @@ describe('update()', () => { "bar": true, "parameterThatIsSavedObjectId": "9", }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -889,6 +899,7 @@ describe('update()', () => { }, ], apiKey: Buffer.from('123:abc').toString('base64'), + revision: 1, scheduledTaskId: 'task-123', }, updated_at: new Date().toISOString(), @@ -942,6 +953,7 @@ describe('update()', () => { "params": Object { "bar": true, }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -986,6 +998,7 @@ describe('update()', () => { "params": Object { "bar": true, }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -1044,6 +1057,7 @@ describe('update()', () => { }, }, ], + revision: 1, scheduledTaskId: 'task-123', apiKey: null, }, @@ -1099,6 +1113,7 @@ describe('update()', () => { "params": Object { "bar": true, }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -1135,6 +1150,7 @@ describe('update()', () => { "params": Object { "bar": true, }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -2079,6 +2095,7 @@ describe('update()', () => { }, ], notifyWhen: 'onActiveAlert', + revision: 1, scheduledTaskId: 'task-123', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), @@ -2144,6 +2161,7 @@ describe('update()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true }, + revision: 1, schedule: { interval: '1m' }, scheduledTaskId: 'task-123', tags: ['foo'], @@ -2178,6 +2196,7 @@ describe('update()', () => { "params": Object { "bar": true, }, + "revision": 1, "schedule": Object { "interval": "1m", }, @@ -2690,6 +2709,7 @@ describe('update()', () => { name: 'abc', notifyWhen: null, params: { bar: true, risk_score: 40, severity: 'low' }, + revision: 1, schedule: { interval: '1m' }, scheduledTaskId: 'task-123', tags: ['foo'], diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts index e2841ba4927c6..3051a39f238c1 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts @@ -64,6 +64,7 @@ describe('updateApiKey()', () => { id: '1', type: 'alert', attributes: { + revision: 0, schedule: { interval: '10s' }, alertTypeId: 'myType', consumer: 'myApp', @@ -117,6 +118,7 @@ describe('updateApiKey()', () => { enabled: true, apiKey: Buffer.from('234:abc').toString('base64'), apiKeyOwner: 'elastic', + revision: 0, updatedBy: 'elastic', updatedAt: '2019-02-12T21:01:22.479Z', actions: [ @@ -177,6 +179,7 @@ describe('updateApiKey()', () => { enabled: true, apiKey: Buffer.from('234:abc').toString('base64'), apiKeyOwner: 'elastic', + revision: 0, updatedAt: '2019-02-12T21:01:22.479Z', updatedBy: 'elastic', actions: [ diff --git a/x-pack/plugins/alerting/server/saved_objects/index.ts b/x-pack/plugins/alerting/server/saved_objects/index.ts index cd69efaf3e875..2d8fe52469386 100644 --- a/x-pack/plugins/alerting/server/saved_objects/index.ts +++ b/x-pack/plugins/alerting/server/saved_objects/index.ts @@ -40,6 +40,7 @@ export const AlertAttributesExcludedFromAAD = [ 'isSnoozedUntil', 'lastRun', 'nextRun', + 'revision', 'running', ]; @@ -60,6 +61,7 @@ export type AlertAttributesExcludedFromAADType = | 'isSnoozedUntil' | 'lastRun' | 'nextRun' + | 'revision' | 'running'; export function setupSavedObjects( diff --git a/x-pack/plugins/alerting/server/saved_objects/mappings.ts b/x-pack/plugins/alerting/server/saved_objects/mappings.ts index f065c5e069ce1..9e3bc06e7ca39 100644 --- a/x-pack/plugins/alerting/server/saved_objects/mappings.ts +++ b/x-pack/plugins/alerting/server/saved_objects/mappings.ts @@ -198,6 +198,10 @@ export const alertMappings: SavedObjectsTypeMappingDefinition = { }, }, }, + revision: { + index: true, // Explicitly setting to `true` as there is need to query for a rule by a specific revision + type: 'long', + }, snoozeSchedule: { type: 'nested', properties: { diff --git a/x-pack/plugins/alerting/server/saved_objects/migrations/8.8/index.ts b/x-pack/plugins/alerting/server/saved_objects/migrations/8.8/index.ts index 48c58fad0c2c6..fb90230f64f6f 100644 --- a/x-pack/plugins/alerting/server/saved_objects/migrations/8.8/index.ts +++ b/x-pack/plugins/alerting/server/saved_objects/migrations/8.8/index.ts @@ -11,6 +11,16 @@ import { v4 as uuidv4 } from 'uuid'; import { createEsoMigration, pipeMigrations } from '../utils'; import { RawRule } from '../../../types'; +function addRevision(doc: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc { + return { + ...doc, + attributes: { + ...doc.attributes, + revision: 0, + }, + }; +} + function addActionUuid( doc: SavedObjectUnsanitizedDoc ): SavedObjectUnsanitizedDoc { @@ -36,5 +46,5 @@ export const getMigrations880 = (encryptedSavedObjects: EncryptedSavedObjectsPlu createEsoMigration( encryptedSavedObjects, (doc: SavedObjectUnsanitizedDoc): doc is SavedObjectUnsanitizedDoc => true, - pipeMigrations(addActionUuid) + pipeMigrations(addActionUuid, addRevision) ); diff --git a/x-pack/plugins/alerting/server/saved_objects/migrations/index.test.ts b/x-pack/plugins/alerting/server/saved_objects/migrations/index.test.ts index de03eec71d4e1..aba9b085f70dc 100644 --- a/x-pack/plugins/alerting/server/saved_objects/migrations/index.test.ts +++ b/x-pack/plugins/alerting/server/saved_objects/migrations/index.test.ts @@ -2652,6 +2652,14 @@ describe('successful migrations', () => { }, ]); }); + + test('migrates rule to include revision and defaults revision to 0', () => { + const migration880 = getMigrations(encryptedSavedObjectsSetup, {}, isPreconfigured)['8.8.0']; + + const rule = getMockData(); + const migratedAlert880 = migration880(rule, migrationContext); + expect(migratedAlert880.attributes.revision).toEqual(0); + }); }); describe('Metrics Inventory Threshold rule', () => { diff --git a/x-pack/plugins/alerting/server/task_runner/alert_task_instance.test.ts b/x-pack/plugins/alerting/server/task_runner/alert_task_instance.test.ts index b78c06eaff7b6..916d9c27a7831 100644 --- a/x-pack/plugins/alerting/server/task_runner/alert_task_instance.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/alert_task_instance.test.ts @@ -37,6 +37,7 @@ const alert: SanitizedRule<{ status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; describe('Alert Task Instance', () => { diff --git a/x-pack/plugins/alerting/server/task_runner/fixtures.ts b/x-pack/plugins/alerting/server/task_runner/fixtures.ts index 8558cd6cbd70f..af5576f041c89 100644 --- a/x-pack/plugins/alerting/server/task_runner/fixtures.ts +++ b/x-pack/plugins/alerting/server/task_runner/fixtures.ts @@ -210,6 +210,7 @@ export const mockedRuleTypeSavedObject: Rule = { lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, monitoring: getDefaultMonitoring('2020-08-20T19:23:38Z'), + revision: 0, }; export const mockTaskInstance = () => ({ diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index 8a463e7ec1aa1..ebe0f98a5b150 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -350,6 +350,7 @@ export interface RawRule extends SavedObjectAttributes { isSnoozedUntil?: string | null; lastRun?: RawRuleLastRun | null; nextRun?: string | null; + revision: number; running?: boolean | null; } diff --git a/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_category.test.tsx.snap b/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_category.test.tsx.snap index c2d9d0df2d4d1..1ed3850227b76 100644 --- a/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_category.test.tsx.snap +++ b/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_category.test.tsx.snap @@ -87,6 +87,7 @@ Array [ "name": "monitoring_alert_cpu_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -250,6 +251,7 @@ Array [ "name": "monitoring_alert_jvm_memory_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -310,6 +312,7 @@ Array [ "name": "monitoring_alert_jvm_memory_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -602,6 +605,7 @@ Array [ "name": "monitoring_alert_nodes_changed_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -662,6 +666,7 @@ Array [ "name": "monitoring_alert_nodes_changed_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -722,6 +727,7 @@ Array [ "name": "monitoring_alert_disk_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -782,6 +788,7 @@ Array [ "name": "monitoring_alert_license_expiration_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -842,6 +849,7 @@ Array [ "name": "monitoring_alert_license_expiration_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -931,6 +939,7 @@ Array [ "name": "monitoring_alert_jvm_memory_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -1032,6 +1041,7 @@ Array [ "name": "monitoring_alert_nodes_changed_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -1068,6 +1078,7 @@ Array [ "name": "monitoring_alert_disk_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -1104,6 +1115,7 @@ Array [ "name": "monitoring_alert_license_expiration_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -1205,6 +1217,7 @@ Array [ "name": "monitoring_alert_logstash_version_mismatch_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -1241,6 +1254,7 @@ Array [ "name": "monitoring_alert_cpu_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -1277,6 +1291,7 @@ Array [ "name": "monitoring_alert_thread_pool_write_rejections_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, diff --git a/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_node.test.tsx.snap b/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_node.test.tsx.snap index 9bb6d1c979571..b576b029f1a70 100644 --- a/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_node.test.tsx.snap +++ b/x-pack/plugins/monitoring/public/alerts/lib/__snapshots__/get_alert_panels_by_node.test.tsx.snap @@ -114,6 +114,7 @@ Array [ "name": "monitoring_alert_jvm_memory_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -174,6 +175,7 @@ Array [ "name": "monitoring_alert_jvm_memory_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -407,6 +409,7 @@ Array [ "name": "monitoring_alert_nodes_changed_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -467,6 +470,7 @@ Array [ "name": "monitoring_alert_disk_usage_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -527,6 +531,7 @@ Array [ "name": "monitoring_alert_license_expiration_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -587,6 +592,7 @@ Array [ "name": "monitoring_alert_nodes_changed_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -647,6 +653,7 @@ Array [ "name": "monitoring_alert_license_expiration_label", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, @@ -707,6 +714,7 @@ Array [ "name": "monitoring_alert_nodes_changed_label_2", "notifyWhen": null, "params": Object {}, + "revision": 0, "schedule": Object { "interval": "1m", }, diff --git a/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_category.test.tsx b/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_category.test.tsx index 445006ecf715e..367b48f5a6786 100644 --- a/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_category.test.tsx +++ b/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_category.test.tsx @@ -58,6 +58,7 @@ const mockAlert = { lastExecutionDate: new Date('2020-12-08'), }, notifyWhen: null, + revision: 0, }; describe('getAlertPanelsByCategory', () => { diff --git a/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_node.test.tsx b/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_node.test.tsx index 7e7cd96f75aba..9103eaa0c3207 100644 --- a/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_node.test.tsx +++ b/x-pack/plugins/monitoring/public/alerts/lib/get_alert_panels_by_node.test.tsx @@ -57,6 +57,7 @@ const mockAlert = { lastExecutionDate: new Date('2020-12-08'), }, notifyWhen: null, + revision: 0, }; describe('getAlertPanelsByNode', () => { diff --git a/x-pack/plugins/security_solution/common/detection_engine/rule_management/model/import/rule_to_import.ts b/x-pack/plugins/security_solution/common/detection_engine/rule_management/model/import/rule_to_import.ts index b40bed8ce65c5..8d9cee09a9f7b 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/rule_management/model/import/rule_to_import.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/rule_management/model/import/rule_to_import.ts @@ -17,7 +17,7 @@ import { BaseCreateProps, TypeSpecificCreateProps, } from '../../../rule_schema'; -import { created_at, updated_at, created_by, updated_by } from '../../../schemas/common'; +import { created_at, updated_at, created_by, updated_by, revision } from '../../../schemas/common'; /** * Differences from this and the createRulesSchema are @@ -44,6 +44,7 @@ export const RuleToImport = t.intersection([ created_by, related_integrations: RelatedIntegrationArray, required_fields: RequiredFieldArray, + revision, setup: SetupGuide, }) ), diff --git a/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_response_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_response_schema.mock.ts index 86018ff1a7b88..7ccdd03b1355c 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_response_schema.mock.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_response_schema.mock.ts @@ -31,6 +31,7 @@ const getResponseBaseParams = (anchorDate: string = ANCHOR_DATE): SharedResponse immutable: false, name: 'Query with a rule id', references: ['test 1', 'test 2'], + revision: 0, severity: 'high' as const, severity_mapping: [], updated_by: 'elastic_kibana', diff --git a/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_schemas.ts index 636c5ee5f6fa8..e0b427cdcefbc 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/rule_schema/model/rule_schemas.ts @@ -36,6 +36,7 @@ import { updated_by, created_at, created_by, + revision, } from '../../schemas/common'; import { @@ -154,6 +155,7 @@ const responseRequiredFields = { updated_by, created_at, created_by, + revision, // NOTE: For now, Related Integrations, Required Fields and Setup Guide are supported for prebuilt // rules only. We don't want to allow users to edit these 3 fields via the API. If we added them diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts index 52ba9e06622d4..b6f90f4cf7025 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts @@ -59,6 +59,7 @@ export const status_code = PositiveInteger; export const message = t.string; export const perPage = PositiveInteger; export const total = PositiveInteger; +export const revision = PositiveInteger; export const success = t.boolean; export const success_count = PositiveInteger; diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index 5506fa091f478..cdcdc99b7ae8a 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -499,6 +499,7 @@ export const expectedExportedRule = (ruleResponse: Cypress.Response(params: T): SanitizedRule = status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }); export const resolveRuleMock = (params: T): ResolvedSanitizedRule => ({ @@ -552,6 +553,7 @@ export const legacyGetNotificationResult = ({ status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }); /** @@ -600,6 +602,7 @@ export const legacyGetHourlyNotificationResult = ( status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }); /** @@ -648,6 +651,7 @@ export const legacyGetDailyNotificationResult = ( status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }); /** @@ -696,6 +700,7 @@ export const legacyGetWeeklyNotificationResult = ( status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }); /** diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts index edb7c2c699882..7df109deb6f3b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts @@ -86,6 +86,7 @@ export const getOutputRuleAlertForRest = (): RuleResponse => ({ type: 'query', note: '# Investigative notes', version: 1, + revision: 0, execution_summary: undefined, related_integrations: [], required_fields: [], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts index e3fabc5366980..8779c19e71988 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts @@ -544,6 +544,7 @@ export const performBulkActionRoute = ( exceptionsList: exceptions, }, }, + shouldIncrementRevision: () => false, }); // TODO: figureout why types can't return just updatedRule diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts index ecc646d11c8da..b441d071c21c1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts @@ -76,6 +76,7 @@ describe('duplicateRule', () => { mutedInstanceIds: [], updatedAt: new Date(2021, 0), createdAt: new Date(2021, 0), + revision: 0, scheduledTaskId: undefined, executionStatus: { lastExecutionDate: new Date(2021, 0), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/patch_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/patch_rules.ts index 45d1a21325abd..3ce61fcc9800b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/patch_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/patch_rules.ts @@ -17,6 +17,8 @@ export interface PatchRulesOptions { nextParams: PatchRuleRequestBody; existingRule: RuleAlertType | null | undefined; allowMissingConnectorSecrets?: boolean; + + shouldIncrementRevision?: boolean; } export const patchRules = async ({ @@ -24,6 +26,7 @@ export const patchRules = async ({ existingRule, nextParams, allowMissingConnectorSecrets, + shouldIncrementRevision = true, }: PatchRulesOptions): Promise | null> => { if (existingRule == null) { return null; @@ -35,6 +38,7 @@ export const patchRules = async ({ id: existingRule.id, data: patchedRule, allowMissingConnectorSecrets, + shouldIncrementRevision: () => shouldIncrementRevision, }); if (nextParams.throttle !== undefined) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.test.ts index d5511ccf7b1cc..b38329bdab3da 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.test.ts @@ -93,6 +93,7 @@ describe('getExportAll', () => { references: ['http://example.com', 'https://example.com'], related_integrations: [], required_fields: [], + revision: 0, setup: '', timeline_id: 'some-timeline-id', timeline_title: 'some-timeline-title', @@ -287,6 +288,7 @@ describe('getExportAll', () => { throttle: 'rule', note: '# Investigative notes', version: 1, + revision: 0, exceptions_list: getListArrayMock(), }); expect(detailsJson).toEqual({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.test.ts index 570954ba9c8b0..40a1435b2d64f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.test.ts @@ -91,6 +91,7 @@ describe('get_export_by_object_ids', () => { references: ['http://example.com', 'https://example.com'], related_integrations: [], required_fields: [], + revision: 0, setup: '', timeline_id: 'some-timeline-id', timeline_title: 'some-timeline-title', @@ -297,6 +298,7 @@ describe('get_export_by_object_ids', () => { throttle: 'rule', note: '# Investigative notes', version: 1, + revision: 0, exceptions_list: getListArrayMock(), }); expect(detailsJson).toEqual({ @@ -399,6 +401,7 @@ describe('get_export_by_object_ids', () => { throttle: 'no_actions', note: '# Investigative notes', version: 1, + revision: 0, exceptions_list: getListArrayMock(), execution_summary: undefined, outcome: undefined, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts index 5a8d6f9a34e87..89ec68ff79bb1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts @@ -141,6 +141,7 @@ export const importRules = async ({ exceptions_list: [...exceptions], }, allowMissingConnectorSecrets, + shouldIncrementRevision: false, }); resolve({ rule_id: parsedRule.rule_id, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts index 0eec37b2c83db..b2554e4f957da 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts @@ -692,6 +692,7 @@ export const internalRuleToAPIResponse = ( tags: rule.tags, interval: rule.schedule.interval, enabled: rule.enabled, + revision: rule.revision, // Security solution shared rule params ...commonParamsCamelToSnake(rule.params), // Type specific security solution rule params diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.test.ts index 40ced9baaf28f..71ccb07d03cb3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.test.ts @@ -46,6 +46,7 @@ export const ruleOutput = (): RuleResponse => ({ throttle: 'no_actions', threat: getThreatMock(), version: 1, + revision: 0, filters: [ { query: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts index 5bf47929cffa5..9593dd5624c22 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts @@ -497,6 +497,7 @@ export const sampleSignalHit = (): SignalHit => ({ related_integrations: [], required_fields: [], response_actions: undefined, + revision: 0, setup: '', throttle: 'no_actions', actions: [], diff --git a/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts b/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts index bf4ecd526e911..1e182d06fefdc 100644 --- a/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts +++ b/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts @@ -20,7 +20,8 @@ export * from './detail_flyout'; export * from './alert_rules/default_status_alert.journey'; export * from './test_now_mode.journey'; export * from './data_retention.journey'; -export * from './monitor_details_page/monitor_summary.journey'; +// Additional flake skip along with https://github.com/elastic/kibana/pull/151936 +// export * from './monitor_details_page/monitor_summary.journey'; export * from './test_run_details.journey'; export * from './step_details.journey'; export * from './project_monitor_read_only.journey'; diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/state/api/alerts.ts b/x-pack/plugins/synthetics/public/legacy_uptime/state/api/alerts.ts index 33cbac6468306..db335a1ef458b 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/state/api/alerts.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/state/api/alerts.ts @@ -63,6 +63,7 @@ type NewMonitorStatusAlert = Omit< | 'muteAll' | 'mutedInstanceIds' | 'executionStatus' + | 'revision' | 'ruleTypeId' | 'notifyWhen' | 'actions' diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.test.ts index 484bff68d92b3..b2e5ecd01a63a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.test.ts @@ -95,6 +95,7 @@ describe('createRule', () => { createdAt: new Date('2021-04-01T21:33:13.247Z'), updatedAt: new Date('2021-04-01T21:33:13.247Z'), apiKeyOwner: '', + revision: 0, }; http.post.mockResolvedValueOnce(resolvedValue); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.test.ts index 6b65e6cc64818..8b3ebc3f96e52 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.test.ts @@ -26,6 +26,7 @@ describe('updateRule', () => { updatedAt: new Date('1970-01-01T00:00:00.000Z'), apiKey: null, apiKeyOwner: null, + revision: 0, }; const resolvedValue: Rule = { ...ruleToUpdate, @@ -40,6 +41,7 @@ describe('updateRule', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 1, }; http.put.mockResolvedValueOnce(resolvedValue); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts index a0069bcdc328d..4fdd9fe0893ab 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts @@ -275,6 +275,7 @@ describe('getRuleWithInvalidatedFields', () => { throttle: '', updatedAt: new Date(), updatedBy: '', + revision: 0, }; const baseAlertErrors = {}; const actionsErrors: IErrorObject[] = []; @@ -313,6 +314,7 @@ describe('getRuleWithInvalidatedFields', () => { throttle: '', updatedAt: new Date(), updatedBy: '', + revision: 0, }; const baseAlertErrors = {}; const actionsErrors: IErrorObject[] = []; @@ -363,6 +365,7 @@ describe('getRuleWithInvalidatedFields', () => { throttle: '', updatedAt: new Date(), updatedBy: '', + revision: 0, }; const baseAlertErrors = {}; const actionsErrors = [{ 'incident.field.name': ['Name is required.'] }]; @@ -422,6 +425,7 @@ describe('getRuleWithInvalidatedFields', () => { throttle: '', updatedAt: new Date(), updatedBy: '', + revision: 0, }; const baseAlertErrors = {}; const actionsErrors = [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx index 753b3c8497fe9..4fba7e7027d8c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx @@ -385,6 +385,7 @@ function mockRule(overloads: Partial = {}): Rule { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_actions_popover.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_actions_popover.test.tsx index 6fa62883e3aff..f981fd07a1b54 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_actions_popover.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_actions_popover.test.tsx @@ -40,6 +40,7 @@ describe('rule_actions_popover', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_definition.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_definition.test.tsx index 6f215e139adf0..148d0994fc497 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_definition.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_definition.test.tsx @@ -215,6 +215,7 @@ function mockRule(overwrite = {}): Rule { updatedAt: new Date(), consumer: 'alerts', notifyWhen: 'onActiveAlert', + revision: 0, executionStatus: { status: 'active', lastDuration: 500, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.test.tsx index a57b896a95902..d07ee7460217c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.test.tsx @@ -818,6 +818,7 @@ describe('rule_details', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.test.tsx index 1d0be2b9ae834..a04e0b2e14df7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.test.tsx @@ -494,6 +494,7 @@ function mockRule(overloads: Partial = {}): Rule { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx index 20114096699d1..c586aba931682 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx @@ -117,6 +117,7 @@ const mockRule: Rule = { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, }; const loadActionErrorLogMock = jest.fn(); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.test.tsx index ab8d28d4a0c0e..117bca134f0f9 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.test.tsx @@ -125,6 +125,7 @@ function mockRule(overloads: Partial = {}): Rule { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/test_helpers.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/test_helpers.ts index 6cc06dbd80d40..4146ac8006325 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/test_helpers.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/test_helpers.ts @@ -54,6 +54,7 @@ export function mockRule(overloads: Partial = {}): Rule { notifyWhen: null, muteAll: false, mutedInstanceIds: [], + revision: 0, executionStatus: { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.test.tsx index 7744846863bec..6b6e467a96359 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.test.tsx @@ -93,6 +93,7 @@ function mockRule(overloads: Partial = {}): Rule { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx index d3e989bd135a0..92a1329b0e67a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx @@ -397,6 +397,7 @@ function mockRule(overloads: Partial = {}): Rule { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.test.tsx index 57ba467c79762..50f8049fc4299 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.test.tsx @@ -174,6 +174,7 @@ describe('rule_edit', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...initialRuleFields, }; actionTypeRegistry.get.mockReturnValueOnce(actionTypeModel); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.test.tsx index babd4ce594b8c..0e4bd4108c271 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.test.tsx @@ -266,6 +266,7 @@ function mockRule(overloads: Partial = {}): Rule { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, + revision: 0, ...overloads, }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.test.tsx index 30b871104b393..8d5b7952b5f00 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.test.tsx @@ -83,6 +83,7 @@ describe('CollapsedItemActions', () => { ruleType: 'Test Rule Type', isEditable: true, enabledInLicense: true, + revision: 0, ...overrides, }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/notify_badge/notify_badge.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/notify_badge/notify_badge.test.tsx index 84c39f38136e9..35cddf249d8e7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/notify_badge/notify_badge.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/notify_badge/notify_badge.test.tsx @@ -53,6 +53,7 @@ const getRule = (overrides = {}): RuleTableItem => ({ ruleType: 'Test Rule Type', isEditable: true, enabledInLicense: true, + revision: 0, ...overrides, }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.test.tsx index 418b6931ca1a3..6796b741fc0c1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.test.tsx @@ -42,6 +42,7 @@ describe('RuleEnabledSwitch', () => { notifyWhen: null, index: 0, updatedAt: new Date('2020-08-20T19:23:38Z'), + revision: 0, }, onRuleChanged: jest.fn(), }; @@ -86,6 +87,7 @@ describe('RuleEnabledSwitch', () => { notifyWhen: null, index: 0, updatedAt: new Date('2020-08-20T19:23:38Z'), + revision: 0, }, }} /> diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/create.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/create.ts index 6fa2b71176788..5ff6a1cf55175 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/create.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/create.ts @@ -126,6 +126,7 @@ export default function createAlertTests({ getService }: FtrProviderContext) { mute_all: false, muted_alert_ids: [], execution_status: response.body.execution_status, + revision: 0, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts index be950eedb8c18..2c7a55134c711 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts @@ -123,6 +123,7 @@ const findTestUtils = ( api_key_owner: 'elastic', mute_all: false, muted_alert_ids: [], + revision: 0, execution_status: match.execution_status, ...(match.next_run ? { next_run: match.next_run } : {}), ...(match.last_run ? { last_run: match.last_run } : {}), @@ -335,6 +336,7 @@ const findTestUtils = ( created_at: match.created_at, updated_at: match.updated_at, execution_status: match.execution_status, + revision: 0, ...(match.next_run ? { next_run: match.next_run } : {}), ...(match.last_run ? { last_run: match.last_run } : {}), ...(describeType === 'internal' diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/get.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/get.ts index d6de374d2524b..d0d93c0154745 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/get.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/get.ts @@ -82,6 +82,7 @@ const getTestUtils = ( mute_all: false, muted_alert_ids: [], execution_status: response.body.execution_status, + revision: 0, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), ...(describeType === 'internal' diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update.ts index a5254c6032109..ba3963a00ddd1 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update.ts @@ -134,6 +134,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { created_at: response.body.created_at, updated_at: response.body.updated_at, execution_status: response.body.execution_status, + revision: 1, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), }); @@ -224,6 +225,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { created_at: response.body.created_at, updated_at: response.body.updated_at, execution_status: response.body.execution_status, + revision: 1, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), }); @@ -325,6 +327,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { created_at: response.body.created_at, updated_at: response.body.updated_at, execution_status: response.body.execution_status, + revision: 1, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), }); @@ -426,6 +429,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { created_at: response.body.created_at, updated_at: response.body.updated_at, execution_status: response.body.execution_status, + revision: 1, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), }); @@ -525,6 +529,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { created_at: response.body.created_at, updated_at: response.body.updated_at, execution_status: response.body.execution_status, + revision: 1, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update_api_key.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update_api_key.ts index a0d1eb4dd0756..6a594316796d4 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update_api_key.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/update_api_key.ts @@ -98,6 +98,8 @@ export default function createUpdateApiKeyTests({ getService }: FtrProviderConte .auth(user.username, user.password) .expect(200); expect(updatedAlert.api_key_owner).to.eql(user.username); + // Ensure revision is not incremented when API key is updated + expect(updatedAlert.revision).to.eql(0); // Ensure AAD isn't broken await checkAAD({ supertest, @@ -152,6 +154,8 @@ export default function createUpdateApiKeyTests({ getService }: FtrProviderConte .auth(user.username, user.password) .expect(200); expect(updatedAlert.api_key_owner).to.eql(user.username); + // Ensure revision is not incremented when API key is updated + expect(updatedAlert.revision).to.eql(0); // Ensure AAD isn't broken await checkAAD({ supertest, @@ -217,6 +221,8 @@ export default function createUpdateApiKeyTests({ getService }: FtrProviderConte .auth(user.username, user.password) .expect(200); expect(updatedAlert.api_key_owner).to.eql(user.username); + // Ensure revision is not incremented when API key is updated + expect(updatedAlert.revision).to.eql(0); // Ensure AAD isn't broken await checkAAD({ supertest, @@ -282,6 +288,8 @@ export default function createUpdateApiKeyTests({ getService }: FtrProviderConte .auth(user.username, user.password) .expect(200); expect(updatedAlert.api_key_owner).to.eql(user.username); + // Ensure revision is not incremented when API key is updated + expect(updatedAlert.revision).to.eql(0); // Ensure AAD isn't broken await checkAAD({ supertest, @@ -346,6 +354,8 @@ export default function createUpdateApiKeyTests({ getService }: FtrProviderConte .auth(user.username, user.password) .expect(200); expect(updatedAlert.api_key_owner).to.eql(user.username); + // Ensure revision is not incremented when API key is updated + expect(updatedAlert.revision).to.eql(0); // Ensure AAD isn't broken await checkAAD({ supertest, diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts index cb5cc4b1d5687..3073fc077b5e8 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts @@ -35,6 +35,7 @@ const getDefaultRules = (response: any) => ({ scheduledTaskId: response.body.rules[0].scheduledTaskId, executionStatus: response.body.rules[0].executionStatus, monitoring: response.body.rules[0].monitoring, + revision: 0, ...(response.body.rules[0].nextRun ? { nextRun: response.body.rules[0].nextRun } : {}), ...(response.body.rules[0].lastRun ? { lastRun: response.body.rules[0].lastRun } : {}), }); @@ -67,6 +68,7 @@ const getThreeRules = (response: any) => { scheduledTaskId: response.body.rules[i].scheduledTaskId, executionStatus: response.body.rules[i].executionStatus, monitoring: response.body.rules[i].monitoring, + revision: 0, ...(response.body.rules[i].nextRun ? { nextRun: response.body.rules[i].nextRun } : {}), ...(response.body.rules[i].lastRun ? { lastRun: response.body.rules[i].lastRun } : {}), }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts index ee2e6c27b58a4..86f468534318e 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts @@ -34,6 +34,7 @@ const getDefaultRules = (response: any) => ({ scheduledTaskId: response.body.rules[0].scheduledTaskId, executionStatus: response.body.rules[0].executionStatus, monitoring: response.body.rules[0].monitoring, + revision: 0, ...(response.body.rules[0].nextRun ? { nextRun: response.body.rules[0].nextRun } : {}), ...(response.body.rules[0].lastRun ? { lastRun: response.body.rules[0].lastRun } : {}), }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_enable.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_enable.ts index d16cfe0a77720..7469773cc5705 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_enable.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_enable.ts @@ -95,6 +95,7 @@ export default ({ getService }: FtrProviderContext) => { snoozeSchedule: [], updatedAt: response.body.rules[0].updatedAt, createdAt: response.body.rules[0].createdAt, + revision: 0, scheduledTaskId: response.body.rules[0].scheduledTaskId, executionStatus: { lastDuration: 0, diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/clone.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/clone.ts index 8bb9d14572725..d9fc773d5d12a 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/clone.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/clone.ts @@ -165,6 +165,7 @@ export default function createAlertTests({ getService }: FtrProviderContext) { mute_all: false, muted_alert_ids: [], execution_status: response.body.execution_status, + revision: 0, last_run: { alerts_count: { active: 0, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts index ccf6d89cc602e..fe71eca901745 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts @@ -81,6 +81,7 @@ export default function createAlertTests({ getService }: FtrProviderContext) { ], enabled: true, rule_type_id: 'test.noop', + revision: 0, running: false, consumer: 'alertsFixture', params: {}, @@ -184,6 +185,7 @@ export default function createAlertTests({ getService }: FtrProviderContext) { ], enabled: true, rule_type_id: 'test.noop', + revision: 0, running: false, consumer: 'alertsFixture', params: {}, @@ -503,6 +505,7 @@ export default function createAlertTests({ getService }: FtrProviderContext) { createdAt: response.body.createdAt, updatedAt: response.body.updatedAt, executionStatus: response.body.executionStatus, + revision: 0, running: false, ...(response.body.next_run ? { next_run: response.body.next_run } : {}), ...(response.body.last_run ? { last_run: response.body.last_run } : {}), diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/disable.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/disable.ts index 1ff7aab8f4ca6..c4620416f4bd6 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/disable.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/disable.ts @@ -63,6 +63,14 @@ export default function createDisableRuleTests({ getService }: FtrProviderContex expect(taskRecord.task.enabled).to.eql(false); }); + const { body: disabledRule } = await supertestWithoutAuth + .get(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule/${createdRule.id}`) + .set('kbn-xsrf', 'foo') + .expect(200); + + // Ensure revision was not updated + expect(disabledRule.revision).to.eql(0); + // Ensure AAD isn't broken await checkAAD({ supertest: supertestWithoutAuth, @@ -173,6 +181,14 @@ export default function createDisableRuleTests({ getService }: FtrProviderContex }); await ruleUtils.disable(createdRule.id); + const { body: disabledRule } = await supertestWithoutAuth + .get(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule/${createdRule.id}`) + .set('kbn-xsrf', 'foo') + .expect(200); + + // Ensure revision was not updated + expect(disabledRule.revision).to.eql(0); + // Ensure AAD isn't broken await checkAAD({ supertest: supertestWithoutAuth, @@ -209,6 +225,14 @@ export default function createDisableRuleTests({ getService }: FtrProviderContex expect(taskRecord.task.enabled).to.eql(false); }); + const { body: disabledRule } = await supertestWithoutAuth + .get(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule/${createdRule.id}`) + .set('kbn-xsrf', 'foo') + .expect(200); + + // Ensure revision was not updated + expect(disabledRule.revision).to.eql(0); + // Ensure AAD isn't broken await checkAAD({ supertest: supertestWithoutAuth, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/enable.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/enable.ts index f4ad874d3357e..b9538c786a496 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/enable.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/enable.ts @@ -61,6 +61,9 @@ export default function createEnableAlertTests({ getService }: FtrProviderContex }); expect(taskRecord.task.enabled).to.eql(true); + // Ensure revision was not updated + expect(updatedAlert.revision).to.eql(0); + // Ensure AAD isn't broken await checkAAD({ supertest: supertestWithoutAuth, @@ -114,6 +117,9 @@ export default function createEnableAlertTests({ getService }: FtrProviderContex }); expect(taskRecord.task.enabled).to.eql(true); + // Ensure revision was not updated + expect(updatedAlert.revision).to.eql(0); + // Ensure AAD isn't broken await checkAAD({ supertest: supertestWithoutAuth, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts index d730c2819596c..2d85f6249db5e 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts @@ -87,6 +87,7 @@ const findTestUtils = ( name: 'abc', tags: ['foo'], rule_type_id: 'test.noop', + revision: 0, running: false, consumer: 'alertsFixture', schedule: { interval: '1m' }, @@ -369,6 +370,7 @@ export default function createFindTests({ getService }: FtrProviderContext) { createdAt: match.createdAt, updatedAt: match.updatedAt, executionStatus: match.executionStatus, + revision: 0, running: false, ...(match.nextRun ? { nextRun: match.nextRun } : {}), ...(match.lastRun ? { lastRun: match.lastRun } : {}), diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/get.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/get.ts index dd6b7b9327d27..43f93cccfe470 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/get.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/get.ts @@ -38,6 +38,7 @@ const getTestUtils = ( name: 'abc', tags: ['foo'], rule_type_id: 'test.noop', + revision: 0, running: false, consumer: 'alertsFixture', schedule: { interval: '1m' }, @@ -155,6 +156,7 @@ export default function createGetTests({ getService }: FtrProviderContext) { createdAt: response.body.createdAt, updatedAt: response.body.updatedAt, executionStatus: response.body.executionStatus, + revision: 0, running: false, ...(response.body.nextRun ? { nextRun: response.body.nextRun } : {}), ...(response.body.lastRun ? { lastRun: response.body.lastRun } : {}), diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts index 20239f94cfef3..d3ef53d5d4bd8 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts @@ -60,6 +60,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { mute_all: false, muted_alert_ids: [], notify_when: 'onThrottleInterval', + revision: 1, scheduled_task_id: createdAlert.scheduled_task_id, created_at: response.body.created_at, updated_at: response.body.updated_at, @@ -169,6 +170,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { createdAt: response.body.createdAt, updatedAt: response.body.updatedAt, executionStatus: response.body.executionStatus, + revision: 1, running: false, ...(response.body.nextRun ? { nextRun: response.body.nextRun } : {}), ...(response.body.lastRun ? { lastRun: response.body.lastRun } : {}), diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update_api_key.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update_api_key.ts index a57d9dc90fd6d..bd3a12d9afdb6 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update_api_key.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update_api_key.ts @@ -46,6 +46,9 @@ export default function createUpdateApiKeyTests({ getService }: FtrProviderConte .expect(200); expect(updatedAlert.api_key_owner).to.eql(null); + // Ensure revision is not incremented when API key is updated + expect(updatedAlert.revision).to.eql(0); + // Ensure AAD isn't broken await checkAAD({ supertest: supertestWithoutAuth, @@ -92,6 +95,9 @@ export default function createUpdateApiKeyTests({ getService }: FtrProviderConte .expect(200); expect(updatedAlert.api_key_owner).to.eql(null); + // Ensure revision is not incremented when API key is updated + expect(updatedAlert.revision).to.eql(0); + // Ensure AAD isn't broken await checkAAD({ supertest: supertestWithoutAuth, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/bulk_edit.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/bulk_edit.ts index fa039cc3f0533..cfd8be8d5b181 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/bulk_edit.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/bulk_edit.ts @@ -76,6 +76,9 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(updatedRule.tags).to.eql(['default', 'tag-1']); + // Ensure revision is updated + expect(updatedRule.revision).to.eql(1); + // Ensure AAD isn't broken await checkAAD({ supertest, @@ -137,6 +140,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { updatedRules.forEach((rule) => { expect(rule.tags).to.eql([`rewritten`]); + expect(rule.revision).to.eql(1); }); }); @@ -174,6 +178,9 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(updatedRule.schedule).to.eql({ interval: '1h' }); + // Ensure revision is updated + expect(updatedRule.revision).to.eql(1); + // Ensure AAD isn't broken await checkAAD({ supertest, @@ -217,6 +224,9 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(updatedRule).property('throttle', '1h'); + // Ensure revision is updated + expect(updatedRule.revision).to.eql(1); + // Ensure AAD isn't broken await checkAAD({ supertest, @@ -260,6 +270,9 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(updatedRule).property('notify_when', 'onActionGroupChange'); + // Ensure revision is updated + expect(updatedRule.revision).to.eql(1); + // Ensure AAD isn't broken await checkAAD({ supertest, @@ -305,6 +318,9 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(bulkSnoozeResponse.body.rules[0].snooze_schedule.length).to.eql(1); expect(bulkSnoozeResponse.body.rules[0].snooze_schedule[0].duration).to.eql(28800000); + // Ensure revision is NOT updated + expect(bulkSnoozeResponse.body.rules[0].revision).to.eql(0); + const bulkUnsnoozeResponse = await supertest .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_bulk_edit`) .set('kbn-xsrf', 'foo') @@ -378,6 +394,8 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(bulkSnoozeResponse.body.errors).to.have.length(0); expect(bulkSnoozeResponse.body.rules).to.have.length(1); expect(bulkSnoozeResponse.body.rules[0].snooze_schedule.length).to.eql(5); + // Ensure revision is NOT updated + expect(bulkSnoozeResponse.body.rules[0].revision).to.eql(0); // Try adding more than 5 schedules const bulkSnoozeError = await supertest @@ -433,6 +451,8 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(bulkSnoozeResponse.body.errors).to.have.length(0); expect(bulkSnoozeResponse.body.rules).to.have.length(1); expect(bulkSnoozeResponse.body.rules[0].snooze_schedule).empty(); + // Ensure revision is NOT updated + expect(bulkSnoozeResponse.body.rules[0].revision).to.eql(0); // Ensure AAD isn't broken await checkAAD({ @@ -473,6 +493,8 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(bulkApiKeyResponse.body.errors).to.have.length(0); expect(bulkApiKeyResponse.body.rules).to.have.length(1); expect(bulkApiKeyResponse.body.rules[0].api_key_owner).to.eql(null); + // Ensure revision is updated + expect(bulkApiKeyResponse.body.rules[0].revision).to.eql(1); }); it(`shouldn't bulk edit rule from another space`, async () => { diff --git a/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts b/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts index ad47a031f0628..b1e587eedb5ea 100644 --- a/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts +++ b/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts @@ -81,6 +81,7 @@ export default function ({ getService }: FtrProviderContext) { executionStatus: { status: 'pending', lastExecutionDate: '2022-12-20T09:10:15.500Z' }, ruleTypeId: 'xpack.synthetics.alerts.monitorStatus', running: false, + revision: 0, }, omitFields ) diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/create_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/create_rules.ts index da25991d1d25b..62fa4d3786db6 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/create_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/create_rules.ts @@ -102,6 +102,7 @@ export default ({ getService }: FtrProviderContext) => { throttle: 'no_actions', exceptions_list: [], version: 1, + revision: 0, }; const { body } = await supertest diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts index 774c0f8607058..5b8508ffe480d 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts @@ -361,6 +361,7 @@ export default ({ getService }: FtrProviderContext): void => { }; ruleOutput.name = 'some other name'; ruleOutput.version = 2; + ruleOutput.revision = 0; expect(bodyToCompare).to.eql(ruleOutput); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts index 21de2d8e3e432..31dd7b0dbc99c 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts @@ -50,6 +50,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -86,6 +87,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutputWithoutRuleId(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -103,6 +105,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -138,6 +141,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); @@ -165,6 +169,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.timeline_title = 'some title'; outputRule.timeline_id = 'some id'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts index 54fb2948e9c61..21715fb7901bb 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts @@ -50,6 +50,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -71,10 +72,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutput(); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutput('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedProperties(body[0]); const bodyToCompare2 = removeServerGeneratedProperties(body[1]); @@ -95,6 +98,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -116,10 +120,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutputWithoutRuleId('rule-1'); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutputWithoutRuleId('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedPropertiesIncludingRuleId(body[0]); const bodyToCompare2 = removeServerGeneratedPropertiesIncludingRuleId(body[1]); @@ -140,6 +146,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -175,6 +182,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -202,6 +210,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.timeline_title = 'some title'; outputRule.timeline_id = 'some id'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -256,6 +265,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ @@ -286,6 +296,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts index 0f9e7276b8798..4270e70d68f0e 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts @@ -57,6 +57,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -102,6 +103,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutputWithoutRuleId(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -124,6 +126,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -146,6 +149,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); @@ -178,6 +182,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts index 03a0fa5b3963a..0cc2cee2066bb 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts @@ -57,6 +57,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -87,10 +88,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutput(); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutput('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedProperties(body[0]); const bodyToCompare2 = removeServerGeneratedProperties(body[1]); @@ -116,6 +119,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -144,10 +148,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutputWithoutRuleId('rule-1'); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutputWithoutRuleId('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedPropertiesIncludingRuleId(body[0]); const bodyToCompare2 = removeServerGeneratedPropertiesIncludingRuleId(body[1]); @@ -173,6 +179,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -195,6 +202,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -227,6 +235,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -294,6 +303,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ @@ -331,6 +341,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts index 1975e8b5133e0..dbb8210cfd962 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts @@ -192,6 +192,7 @@ export default ({ getService }: FtrProviderContext) => { references: [], related_integrations: [], required_fields: [], + revision: 0, setup: '', severity: 'high', severity_mapping: [], diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts index 0946852e6a117..3340c700ed95a 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts @@ -606,6 +606,7 @@ function expectToMatchRuleSchema(obj: unknown): void { false_positives: expect.arrayContaining([]), from: expect.any(String), max_signals: expect.any(Number), + revision: expect.any(Number), risk_score_mapping: expect.arrayContaining([]), severity_mapping: expect.arrayContaining([]), threat: expect.arrayContaining([]), diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/update_actions.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/update_actions.ts index 858ea3722b2de..61e25772c1d44 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/update_actions.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/update_actions.ts @@ -75,6 +75,7 @@ export default ({ getService }: FtrProviderContext) => { `${bodyToCompare.actions?.[0].id}`, `${bodyToCompare.actions?.[0].uuid}` ), + revision: 1, // version bump is required since this is an updated rule and this is part of the testing that we do bump the version number on update version: 2, // version bump is required since this is an updated rule and this is part of the testing that we do bump the version number on update }; expect(bodyToCompare).to.eql(expected); @@ -90,6 +91,7 @@ export default ({ getService }: FtrProviderContext) => { const bodyToCompare = removeServerGeneratedProperties(ruleAfterActionRemoved); const expected = { ...getSimpleRuleOutput(), + revision: 2, // version bump is required since this is an updated rule and this is part of the testing that we do bump the version number on update version: 3, // version bump is required since this is an updated rule and this is part of the testing that we do bump the version number on update }; expect(bodyToCompare).to.eql(expected); @@ -130,10 +132,10 @@ export default ({ getService }: FtrProviderContext) => { const updatedRule = await updateRule(supertest, log, ruleToUpdate); const expected = omit(removeServerGeneratedProperties(updatedRule), actionsProps); - const immutableRuleToAssert = omit( - removeServerGeneratedProperties(immutableRule), - actionsProps - ); + const immutableRuleToAssert = { + ...omit(removeServerGeneratedProperties(immutableRule), actionsProps), + revision: 1, // Unlike `version` which is static for immutable rules, `revision` will increment when an action/exception is added + }; expect(immutableRuleToAssert).to.eql(expected); expect(expected.immutable).to.be(true); // It should stay immutable true when returning diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/import_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/import_rules.ts index a15b6d799adea..849c2a9858aaf 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/import_rules.ts @@ -715,6 +715,7 @@ export default ({ getService }: FtrProviderContext): void => { }; ruleOutput.name = 'some other name'; ruleOutput.version = 2; + ruleOutput.revision = 0; expect(bodyToCompare).to.eql(ruleOutput); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules.ts index 71c778789a8c3..e8df71ca61a4c 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules.ts @@ -54,6 +54,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -70,6 +71,9 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleMlRuleOutput(); outputRule.version = 2; + // TODO: Followup to #147398 + // NOTE: Once we remove `version` increment, revision will not be updated as `machine_learning_job_id` value doesn't actually change + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -87,6 +91,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleMlRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -106,6 +111,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutputWithoutRuleId(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -123,6 +129,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -158,6 +165,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); @@ -185,6 +193,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.timeline_title = 'some title'; outputRule.timeline_id = 'some id'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); @@ -374,7 +383,7 @@ export default ({ getService }: FtrProviderContext) => { }, ]; outputRule.throttle = '1h'; - + outputRule.revision = 2; // Expected revision is 2 as call to `createLegacyRuleAction()` does two separate rules updates for `notifyWhen` & `actions` field expect(bodyToCompare).to.eql(outputRule); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules_bulk.ts index 03156e53e978b..48ea361536585 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/patch_rules_bulk.ts @@ -73,6 +73,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -94,10 +95,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutput(); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutput('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedProperties(body[0]); const bodyToCompare2 = removeServerGeneratedProperties(body[1]); @@ -118,6 +121,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -139,10 +143,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutputWithoutRuleId('rule-1'); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutputWithoutRuleId('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedPropertiesIncludingRuleId(body[0]); const bodyToCompare2 = removeServerGeneratedPropertiesIncludingRuleId(body[1]); @@ -196,6 +202,7 @@ export default ({ getService }: FtrProviderContext) => { }, ]; outputRule.throttle = '1h'; + outputRule.revision = 2; // Expected revision is 2 as call to `createLegacyRuleAction()` does two separate rules updates for `notifyWhen` & `actions` field expect(bodyToCompare).to.eql(outputRule); }); }); @@ -213,6 +220,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -248,6 +256,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -275,6 +284,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.timeline_title = 'some title'; outputRule.timeline_id = 'some id'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -329,6 +339,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ @@ -359,6 +370,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules.ts index 9a454f8f4acd4..52f6613100e2a 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules.ts @@ -63,6 +63,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -86,6 +87,7 @@ export default ({ getService }: FtrProviderContext) => { // @ts-expect-error type narrowing is lost due to Omit<> outputRule.machine_learning_job_id = ['legacy_job_id']; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -108,6 +110,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleMlRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -132,6 +135,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutputWithoutRuleId(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -181,6 +185,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutputWithoutRuleId(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; // Expect an empty array outputRule.actions = []; // Expect "no_actions" @@ -234,6 +239,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutputWithoutRuleId(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 2; // Migration of action results in additional revision increment (change to `notifyWhen`), so expected revision is 2 outputRule.actions = [ { action_type_id: '.slack', @@ -269,6 +275,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); }); @@ -291,6 +298,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); @@ -323,6 +331,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body); expect(bodyToCompare).to.eql(outputRule); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules_bulk.ts index 326a7a3693be8..2148b9b13d797 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/update_rules_bulk.ts @@ -79,6 +79,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -109,10 +110,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutput(); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutput('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedProperties(body[0]); const bodyToCompare2 = removeServerGeneratedProperties(body[1]); @@ -170,6 +173,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(response.rule_id); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 2; outputRule.actions = [ { action_type_id: '.slack', @@ -233,6 +237,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(response.rule_id); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 2; outputRule.actions = []; outputRule.throttle = 'no_actions'; const bodyToCompare = removeServerGeneratedProperties(response); @@ -258,6 +263,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -286,10 +292,12 @@ export default ({ getService }: FtrProviderContext) => { const outputRule1 = getSimpleRuleOutput('rule-1'); outputRule1.name = 'some other name'; outputRule1.version = 2; + outputRule1.revision = 1; const outputRule2 = getSimpleRuleOutput('rule-2'); outputRule2.name = 'some other name'; outputRule2.version = 2; + outputRule2.revision = 1; const bodyToCompare1 = removeServerGeneratedProperties(body[0]); const bodyToCompare2 = removeServerGeneratedProperties(body[1]); @@ -315,6 +323,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); }); @@ -337,6 +346,7 @@ export default ({ getService }: FtrProviderContext) => { outputRule.enabled = false; outputRule.severity = 'low'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -369,6 +379,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 3; + outputRule.revision = 2; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect(bodyToCompare).to.eql(outputRule); @@ -436,6 +447,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ @@ -473,6 +485,7 @@ export default ({ getService }: FtrProviderContext) => { const outputRule = getSimpleRuleOutput(); outputRule.name = 'some other name'; outputRule.version = 2; + outputRule.revision = 1; const bodyToCompare = removeServerGeneratedProperties(body[0]); expect([bodyToCompare, body[1]]).to.eql([ diff --git a/x-pack/test/detection_engine_api_integration/utils/get_complex_rule_output.ts b/x-pack/test/detection_engine_api_integration/utils/get_complex_rule_output.ts index a8f5916c3598d..af66123014383 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_complex_rule_output.ts +++ b/x-pack/test/detection_engine_api_integration/utils/get_complex_rule_output.ts @@ -51,6 +51,7 @@ export const getComplexRuleOutput = (ruleId = 'rule-1'): Partial = tags: ['tag 1', 'tag 2', 'any tag you want'], to: 'now', from: 'now-6m', + revision: 0, severity: 'high', severity_mapping: [], language: 'kuery', diff --git a/x-pack/test/detection_engine_api_integration/utils/get_simple_rule_output.ts b/x-pack/test/detection_engine_api_integration/utils/get_simple_rule_output.ts index 39b8d2acf088e..9826d9a2b98b4 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_simple_rule_output.ts +++ b/x-pack/test/detection_engine_api_integration/utils/get_simple_rule_output.ts @@ -43,6 +43,7 @@ export const getMockSharedResponseSchema = ( throttle: 'no_actions', exceptions_list: [], version: 1, + revision: 0, id: 'id', updated_at: '2020-07-08T16:36:32.377Z', created_at: '2020-07-08T16:36:32.377Z', diff --git a/x-pack/test/detection_engine_api_integration/utils/rule_to_update_schema.ts b/x-pack/test/detection_engine_api_integration/utils/rule_to_update_schema.ts index 7c10c98c105d6..b4d2759ccf67d 100644 --- a/x-pack/test/detection_engine_api_integration/utils/rule_to_update_schema.ts +++ b/x-pack/test/detection_engine_api_integration/utils/rule_to_update_schema.ts @@ -20,6 +20,7 @@ const propertiesToRemove = [ 'created_by', 'related_integrations', 'required_fields', + 'revision', 'setup', 'execution_summary', ]; diff --git a/x-pack/test/functional/es_archives/security_solution/legacy_actions/data.json b/x-pack/test/functional/es_archives/security_solution/legacy_actions/data.json index f0c883c6b3756..8dbc0fbe883e8 100644 --- a/x-pack/test/functional/es_archives/security_solution/legacy_actions/data.json +++ b/x-pack/test/functional/es_archives/security_solution/legacy_actions/data.json @@ -74,6 +74,7 @@ ], "alertTypeId" : "siem.queryRule", "consumer" : "siem", + "revision": 0, "params" : { "author" : [ ], "description" : "a", @@ -168,6 +169,7 @@ ], "alertTypeId" : "siem.queryRule", "consumer" : "siem", + "revision": 0, "params" : { "author" : [ ], "description" : "a", @@ -281,6 +283,7 @@ ], "alertTypeId" : "siem.queryRule", "consumer" : "siem", + "revision": 0, "params" : { "author" : [ ], "description" : "a", @@ -375,6 +378,7 @@ ], "alertTypeId" : "siem.queryRule", "consumer" : "siem", + "revision": 0, "params" : { "author" : [ ], "description" : "a", @@ -469,6 +473,7 @@ ], "alertTypeId" : "siem.queryRule", "consumer" : "siem", + "revision": 0, "params" : { "author" : [ ], "description" : "a", @@ -561,6 +566,7 @@ ], "alertTypeId" : "siem.notifications", "consumer" : "siem", + "revision": 0, "params" : { "ruleAlertId" : "61ec7a40-b076-11ec-bb3f-1f063f8e06cf" }, @@ -641,6 +647,7 @@ ], "alertTypeId" : "siem.notifications", "consumer" : "siem", + "revision": 0, "params" : { "ruleAlertId" : "064e3160-b076-11ec-bb3f-1f063f8e06cf" }, @@ -733,6 +740,7 @@ ], "alertTypeId" : "siem.notifications", "consumer" : "siem", + "revision": 0, "params" : { "ruleAlertId" : "27639570-b076-11ec-bb3f-1f063f8e06cf" }, From 6552165c5737888cb89dccd730ae9e35d4018641 Mon Sep 17 00:00:00 2001 From: Karl Godard Date: Fri, 10 Mar 2023 14:50:09 -0800 Subject: [PATCH 08/12] [D4C] policy schema/UI refactored to support process and file selectors (network soon) (#153126) ## Summary This PR refactors alot of the interface/type definitions around "cloud_defend/control" selectors and responses. A lot of refactoring went into ensuring the interfaces and types that represent file and process selector/responses in the UI is as type safe as possible. It should take fewer changes to add new conditions, and compile time checks should ensure most code paths are updated correctly. Updates to policy_schema.json (json-schema) made to support the following yaml schema format: ``` file: selectors: - name: nginxBinMods operation: - createExecutable - modifyExecutable targetFilePath: - /usr/bin/** containerImageName: - nginx - name: excludeTestServers containerImageTag: - staging - preprod responses: - match: - nginxBinMods exclude: - excludeTestServers actions: - alert process: selectors: - name: allProcesses operation: - fork - exec responses: - match: - allProcesses actions: - log ``` Both selectors and responses now ask for a "type" to be selected when adding. This locks it into either a process or file selector/response type. Certain conditions are available to specfiic types. ### TODOS - more unit tests to cover new UX features - cloud_defend integration package needs to be updated with new defaults for configuration - i18n copy could use PM/Techwriter review ### Screenshot ![image](https://user-images.githubusercontent.com/16198204/224398453-e41d8bf7-e952-46f4-9cd9-340c4928ad7e.png) ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../cloud_defend/public/common/constants.ts | 2 +- .../cloud_defend/public/common/utils.test.ts | 108 ++++++ .../cloud_defend/public/common/utils.ts | 150 +++++++- .../control_general_view/index.test.tsx | 41 ++- .../components/control_general_view/index.tsx | 282 +++++++------- .../control_general_view/translations.ts | 133 ++++--- .../index.test.tsx | 61 ++- .../control_general_view_response/index.tsx | 348 ++++++++++++------ .../control_general_view_response/styles.ts | 27 +- .../index.test.tsx | 102 ++--- .../control_general_view_selector/index.tsx | 300 ++++++++++----- .../control_general_view_selector/styles.ts | 27 +- .../hooks/policy_schema.json | 295 +++++++++++++-- .../hooks/use_config_model.ts | 49 ++- .../components/control_yaml_view/index.tsx | 13 +- .../plugins/cloud_defend/public/test/mocks.ts | 51 ++- x-pack/plugins/cloud_defend/public/types.ts | 192 ++++++---- 17 files changed, 1528 insertions(+), 653 deletions(-) create mode 100644 x-pack/plugins/cloud_defend/public/common/utils.test.ts diff --git a/x-pack/plugins/cloud_defend/public/common/constants.ts b/x-pack/plugins/cloud_defend/public/common/constants.ts index 1e101a47c0122..e193d7e005b66 100644 --- a/x-pack/plugins/cloud_defend/public/common/constants.ts +++ b/x-pack/plugins/cloud_defend/public/common/constants.ts @@ -6,7 +6,7 @@ */ export const DEFAULT_VISIBLE_ROWS_PER_PAGE = 10; // generic default # of table rows to show (currently we only have a list of policies) export const LOCAL_STORAGE_PAGE_SIZE = 'cloudDefend:userPageSize'; -export const VALID_SELECTOR_NAME_REGEX = /^[a-z0-9][a-z0-9_\-]+$/i; // alphanumberic (no - or _ allowed on first char) +export const VALID_SELECTOR_NAME_REGEX = /^[a-z0-9][a-z0-9_\-]*$/i; // alphanumberic (no - or _ allowed on first char) export const MAX_SELECTOR_NAME_LENGTH = 128; // chars export const MAX_CONDITION_VALUE_LENGTH_BYTES = 511; export const MAX_FILE_PATH_VALUE_LENGTH_BYTES = 255; diff --git a/x-pack/plugins/cloud_defend/public/common/utils.test.ts b/x-pack/plugins/cloud_defend/public/common/utils.test.ts new file mode 100644 index 0000000000000..1eb28e499165f --- /dev/null +++ b/x-pack/plugins/cloud_defend/public/common/utils.test.ts @@ -0,0 +1,108 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + getSelectorsAndResponsesFromYaml, + getYamlFromSelectorsAndResponses, + getSelectorConditions, + conditionCombinationInvalid, + getRestrictedValuesForCondition, +} from './utils'; +import { MOCK_YAML_CONFIGURATION, MOCK_YAML_INVALID_CONFIGURATION } from '../test/mocks'; + +describe('getSelectorsAndResponsesFromYaml', () => { + it('converts yaml into arrays of selectors and responses', () => { + const { selectors, responses } = getSelectorsAndResponsesFromYaml(MOCK_YAML_CONFIGURATION); + + expect(selectors).toHaveLength(3); + expect(responses).toHaveLength(2); + }); + + it('returns empty arrays if bad yaml', () => { + const { selectors, responses } = getSelectorsAndResponsesFromYaml( + MOCK_YAML_INVALID_CONFIGURATION + ); + + expect(selectors).toHaveLength(0); + expect(responses).toHaveLength(0); + }); +}); + +describe('getYamlFromSelectorsAndResponses', () => { + it('converts arrays of selectors and responses into yaml', () => { + const { selectors, responses } = getSelectorsAndResponsesFromYaml(MOCK_YAML_CONFIGURATION); + const yaml = getYamlFromSelectorsAndResponses(selectors, responses); + expect(yaml).toEqual(MOCK_YAML_CONFIGURATION); + }); +}); + +describe('getSelectorConditions', () => { + it('grabs file conditions for file selectors', () => { + const options = getSelectorConditions('file'); + + // check at least one common condition present + expect(options.includes('containerImageName')).toBeTruthy(); + + // check file specific conditions present + expect(options.includes('ignoreVolumeFiles')).toBeTruthy(); + expect(options.includes('ignoreVolumeMounts')).toBeTruthy(); + expect(options.includes('targetFilePath')).toBeTruthy(); + + // check that process specific conditions are not included + expect(options.includes('processExecutable')).toBeFalsy(); + expect(options.includes('processName')).toBeFalsy(); + }); + + it('grabs process conditions for process selectors', () => { + const options = getSelectorConditions('process'); + + // check at least one common condition present + expect(options.includes('containerImageName')).toBeTruthy(); + + // check file specific conditions present + expect(options.includes('ignoreVolumeFiles')).toBeFalsy(); + expect(options.includes('ignoreVolumeMounts')).toBeFalsy(); + expect(options.includes('targetFilePath')).toBeFalsy(); + + // check that process specific conditions are not included + expect(options.includes('processExecutable')).toBeTruthy(); + expect(options.includes('processName')).toBeTruthy(); + expect(options.includes('processUserName')).toBeTruthy(); + expect(options.includes('processUserId')).toBeTruthy(); + expect(options.includes('sessionLeaderInteractive')).toBeTruthy(); + }); +}); + +describe('conditionCombinationInvalid', () => { + it('returns true when conditions cannot be combined', () => { + const result = conditionCombinationInvalid(['ignoreVolumeMounts'], 'ignoreVolumeFiles'); + + expect(result).toBeTruthy(); + }); + + it('returns false when they can', () => { + const result = conditionCombinationInvalid(['containerImageName'], 'ignoreVolumeFiles'); + + expect(result).toBeFalsy(); + }); +}); + +describe('getRestrictedValuesForCondition', () => { + it('works', () => { + let values = getRestrictedValuesForCondition('file', 'operation'); + expect(values).toEqual([ + 'createExecutable', + 'modifyExecutable', + 'createFile', + 'modifyFile', + 'deleteFile', + ]); + + values = getRestrictedValuesForCondition('process', 'operation'); + expect(values).toEqual(['fork', 'exec']); + }); +}); diff --git a/x-pack/plugins/cloud_defend/public/common/utils.ts b/x-pack/plugins/cloud_defend/public/common/utils.ts index 7f2ee09ad3e07..1a34c986a2d85 100644 --- a/x-pack/plugins/cloud_defend/public/common/utils.ts +++ b/x-pack/plugins/cloud_defend/public/common/utils.ts @@ -4,9 +4,157 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import yaml from 'js-yaml'; import { NewPackagePolicy } from '@kbn/fleet-plugin/public'; +import { + Selector, + Response, + SelectorType, + DefaultFileSelector, + DefaultProcessSelector, + DefaultFileResponse, + DefaultProcessResponse, + SelectorConditionsMap, + SelectorCondition, +} from '../types'; export function getInputFromPolicy(policy: NewPackagePolicy, inputId: string) { return policy.inputs.find((input) => input.type === inputId); } + +export function getSelectorTypeIcon(type: SelectorType) { + switch (type) { + case 'process': + return 'gear'; + case 'file': + default: + return 'document'; + } +} + +export function camelToSentenceCase(prop: string) { + const sentence = prop.replace(/([A-Z])/g, ' $1').toLowerCase(); + return sentence[0].toUpperCase() + sentence.slice(1); +} + +export function conditionCombinationInvalid( + addedConditions: SelectorCondition[], + condition: SelectorCondition +): boolean { + const options = SelectorConditionsMap[condition]; + const invalid = addedConditions.find((added) => { + return options?.not?.includes(added); + }); + + return !!invalid; +} + +export function getRestrictedValuesForCondition( + type: SelectorType, + condition: SelectorCondition +): string[] | undefined { + const options = SelectorConditionsMap[condition]; + + if (Array.isArray(options.values)) { + return options.values; + } + + if (options?.values?.[type]) { + return options.values[type]; + } +} + +export function getSelectorConditions(type: SelectorType): SelectorCondition[] { + const allConditions = Object.keys(SelectorConditionsMap) as SelectorCondition[]; + return allConditions.filter((key) => { + const options = SelectorConditionsMap[key]; + return !options.selectorType || options.selectorType === type; + }); +} + +export function getDefaultSelectorByType(type: SelectorType): Selector { + switch (type) { + case 'process': + return { ...DefaultProcessSelector }; + case 'file': + default: + return { ...DefaultFileSelector }; + } +} + +export function getDefaultResponseByType(type: SelectorType): Response { + switch (type) { + case 'process': + return { ...DefaultProcessResponse }; + case 'file': + default: + return { ...DefaultFileResponse }; + } +} + +export function getSelectorsAndResponsesFromYaml(configuration: string): { + selectors: Selector[]; + responses: Response[]; +} { + let selectors: Selector[] = []; + let responses: Response[] = []; + + try { + const result = yaml.load(configuration); + + if (result) { + // iterate selector/response types + Object.keys(result).forEach((selectorType) => { + const obj = result[selectorType]; + + if (obj.selectors) { + selectors = selectors.concat( + obj.selectors.map((selector: any) => ({ ...selector, type: selectorType })) + ); + } + + if (obj.responses) { + responses = responses.concat( + obj.responses.map((response: any) => ({ ...response, type: selectorType })) + ); + } + }); + } + } catch { + // noop + } + return { selectors, responses }; +} + +export function getYamlFromSelectorsAndResponses(selectors: Selector[], responses: Response[]) { + const schema: any = {}; + + selectors.reduce((current, selector: any) => { + if (current && selector) { + if (current[selector.type]) { + current[selector.type]?.selectors.push(selector); + } else { + current[selector.type] = { selectors: [selector], responses: [] }; + } + } + + // the 'any' cast is used so we can keep 'selector.type' type safe + delete selector.type; + + return current; + }, schema); + + responses.reduce((current, response: any) => { + if (current && response && response.type) { + if (current[response.type]) { + current[response.type]?.responses.push(response); + } + } + + delete response.type; + + return current; + }, schema); + + return yaml.dump(schema); +} diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.test.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view/index.test.tsx index 1d221f49f866f..dc58de3eaad56 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.test.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view/index.test.tsx @@ -42,20 +42,20 @@ describe('', () => { try { const json = yaml.load(configuration); - expect(json.selectors.length).toBe(getAllByTestId('cloud-defend-selector').length); - expect(json.responses.length).toBe(getAllByTestId('cloud-defend-response').length); - expect(json.selectors.length).toBe(3); - expect(json.responses.length).toBe(2); + expect(json.file.selectors.length).toBe(getAllByTestId('cloud-defend-selector').length); + expect(json.file.responses.length).toBe(getAllByTestId('cloud-defend-response').length); + expect(json.file.selectors.length).toBe(3); + expect(json.file.responses.length).toBe(2); } catch (err) { throw err; } }); - it('allows a user to add a new selector and new response', async () => { + it('allows a user to add a new selector', async () => { const { getAllByTestId, getByTestId, rerender } = render(); - userEvent.click(getByTestId('cloud-defend-btnaddselector')); - userEvent.click(getByTestId('cloud-defend-btnaddresponse')); + userEvent.click(getByTestId('cloud-defend-btnAddSelector')); + await waitFor(() => userEvent.click(getByTestId('cloud-defend-btnAddFileSelector'))); const policy = onChange.mock.calls[0][0].updatedPolicy; @@ -67,10 +67,29 @@ describe('', () => { try { const json = yaml.load(configuration); - expect(json.selectors.length).toBe(getAllByTestId('cloud-defend-selector').length); - expect(json.responses.length).toBe(getAllByTestId('cloud-defend-response').length); - expect(json.selectors.length).toBe(4); - expect(json.responses.length).toBe(3); + expect(json.file.selectors.length).toBe(getAllByTestId('cloud-defend-selector').length); + } catch (err) { + throw err; + } + }); + + it('allows a user to add a new response', async () => { + const { getAllByTestId, getByTestId, rerender } = render(); + + userEvent.click(getByTestId('cloud-defend-btnAddResponse')); + await waitFor(() => userEvent.click(getByTestId('cloud-defend-btnAddFileResponse'))); + + const policy = onChange.mock.calls[0][0].updatedPolicy; + + rerender(); + + const input = getInputFromPolicy(policy, INPUT_CONTROL); + const configuration = input?.vars?.configuration?.value; + + try { + const json = yaml.load(configuration); + + expect(json.file.responses.length).toBe(getAllByTestId('cloud-defend-response').length); } catch (err) { throw err; } diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx index 01f2affa09c5d..7a8994dc61828 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx @@ -4,69 +4,133 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useMemo, useCallback } from 'react'; +import React, { useMemo, useCallback, useState } from 'react'; import { - EuiIcon, + EuiContextMenuPanel, + EuiContextMenuItem, + EuiPopover, EuiFlexGroup, EuiFlexItem, EuiText, EuiTitle, EuiButton, - EuiPanel, - EuiDragDropContext, - EuiDraggable, - EuiDroppable, - euiDragDropReorder, EuiSpacer, } from '@elastic/eui'; -import yaml from 'js-yaml'; import { INPUT_CONTROL } from '../../../common/constants'; import { useStyles } from './styles'; -import { getInputFromPolicy } from '../../common/utils'; import { - ControlSelector, - ControlResponse, - DefaultSelector, - DefaultResponse, - ViewDeps, -} from '../../types'; + getInputFromPolicy, + getYamlFromSelectorsAndResponses, + getSelectorsAndResponsesFromYaml, + getDefaultSelectorByType, + getDefaultResponseByType, +} from '../../common/utils'; +import { SelectorType, Selector, Response, ViewDeps } from '../../types'; import * as i18n from './translations'; import { ControlGeneralViewSelector } from '../control_general_view_selector'; import { ControlGeneralViewResponse } from '../control_general_view_response'; +interface AddSelectorButtonProps { + type: 'Selector' | 'Response'; + onSelectType(type: SelectorType): void; +} + +/** + * dual purpose button for adding selectors and responses by type + */ +const AddButton = ({ type, onSelectType }: AddSelectorButtonProps) => { + const [isPopoverOpen, setPopover] = useState(false); + const onButtonClick = () => { + setPopover(!isPopoverOpen); + }; + + const closePopover = () => { + setPopover(false); + }; + + const addFile = useCallback(() => { + closePopover(); + onSelectType('file'); + }, [onSelectType]); + + const addProcess = useCallback(() => { + closePopover(); + onSelectType('process'); + }, [onSelectType]); + + const isSelector = type === 'Selector'; + + const items = [ + + {isSelector ? i18n.fileSelector : i18n.fileResponse} + , + + {isSelector ? i18n.processSelector : i18n.processResponse} + , + + {isSelector ? i18n.networkSelector : i18n.networkResponse} + , + ]; + + return ( + + {isSelector ? i18n.addSelector : i18n.addResponse} + + } + isOpen={isPopoverOpen} + closePopover={closePopover} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + ); +}; + export const ControlGeneralView = ({ policy, onChange, show }: ViewDeps) => { const styles = useStyles(); const input = getInputFromPolicy(policy, INPUT_CONTROL); const configuration = input?.vars?.configuration?.value || ''; - const json = useMemo<{ selectors: ControlSelector[]; responses: ControlResponse[] }>(() => { - try { - const result = yaml.load(configuration); - - if (result && result.hasOwnProperty('selectors') && result.hasOwnProperty('responses')) { - return result; - } - } catch { - // noop - } - - return { selectors: [], responses: [] }; + const { selectors, responses } = useMemo(() => { + return getSelectorsAndResponsesFromYaml(configuration); }, [configuration]); - const { selectors, responses } = json; - const onUpdateYaml = useCallback( - (newSelectors: ControlSelector[], newResponses: ControlResponse[]) => { + (newSelectors: Selector[], newResponses: Response[]) => { if (input?.vars?.configuration) { const isValid = !newSelectors.find((selector) => selector.hasErrors) && !newResponses.find((response) => response.hasErrors); - // remove hasErrors prop prior to yaml conversion - newSelectors.forEach((selector) => delete selector.hasErrors); - newResponses.forEach((response) => delete response.hasErrors); - - const yml = yaml.dump({ selectors: newSelectors, responses: newResponses }); - input.vars.configuration.value = yml; + input.vars.configuration.value = getYamlFromSelectorsAndResponses( + newSelectors, + newResponses + ); onChange({ isValid, updatedPolicy: { ...policy } }); } @@ -93,26 +157,32 @@ export const ControlGeneralView = ({ policy, onChange, show }: ViewDeps) => { [selectors] ); - const onAddSelector = useCallback(() => { - const newSelector = { ...DefaultSelector }; - const dupe = selectors.find((selector) => selector.name === newSelector.name); + const onAddSelector = useCallback( + (type: SelectorType) => { + const newSelector = getDefaultSelectorByType(type); + const dupe = selectors.find((selector) => selector.name === newSelector.name); - if (dupe) { - newSelector.name = incrementName(dupe.name); - } + if (dupe) { + newSelector.name = incrementName(dupe.name); + } - selectors.push(newSelector); - onUpdateYaml(selectors, responses); - }, [incrementName, onUpdateYaml, responses, selectors]); + selectors.push(newSelector); + onUpdateYaml(selectors, responses); + }, + [incrementName, onUpdateYaml, responses, selectors] + ); - const onAddResponse = useCallback(() => { - const newResponse = { ...DefaultResponse }; - responses.push(newResponse); - onUpdateYaml(selectors, responses); - }, [onUpdateYaml, responses, selectors]); + const onAddResponse = useCallback( + (type: SelectorType) => { + const newResponse = getDefaultResponseByType(type); + responses.push(newResponse); + onUpdateYaml(selectors, responses); + }, + [onUpdateYaml, responses, selectors] + ); const onDuplicateSelector = useCallback( - (selector: ControlSelector) => { + (selector: Selector) => { const duplicate = JSON.parse(JSON.stringify(selector)); duplicate.name = incrementName(duplicate.name); @@ -156,7 +226,7 @@ export const ControlGeneralView = ({ policy, onChange, show }: ViewDeps) => { ); const onDuplicateResponse = useCallback( - (response: ControlResponse) => { + (response: Response) => { const duplicate = { ...response }; responses.push(duplicate); onUpdateYaml(selectors, responses); @@ -174,11 +244,15 @@ export const ControlGeneralView = ({ policy, onChange, show }: ViewDeps) => { ); const onSelectorChange = useCallback( - (updatedSelector: ControlSelector, index: number) => { + (updatedSelector: Selector, index: number) => { const old = selectors[index]; - const updatedSelectors: ControlSelector[] = [...selectors]; - let updatedResponses: ControlResponse[] = [...responses]; + if (updatedSelector.hasErrors === false) { + delete updatedSelector.hasErrors; + } + + const updatedSelectors: Selector[] = [...selectors]; + let updatedResponses: Response[] = [...responses]; if (old.name !== updatedSelector.name) { // update all references to this selector in responses @@ -208,25 +282,14 @@ export const ControlGeneralView = ({ policy, onChange, show }: ViewDeps) => { ); const onResponseChange = useCallback( - (updatedResponse: ControlResponse, index: number) => { - const updatedResponses: ControlResponse[] = [...responses]; - + (updatedResponse: Response, index: number) => { + const updatedResponses: Response[] = [...responses]; updatedResponses[index] = updatedResponse; onUpdateYaml(selectors, updatedResponses); }, [onUpdateYaml, responses, selectors] ); - const onResponseDragEnd = useCallback( - ({ source, destination }) => { - if (source && destination) { - const reorderedResponses = euiDragDropReorder(responses, source.index, destination.index); - onUpdateYaml(selectors, reorderedResponses); - } - }, - [onUpdateYaml, responses, selectors] - ); - return ( { ); })} - - {i18n.addSelector} - + @@ -280,62 +335,23 @@ export const ControlGeneralView = ({ policy, onChange, show }: ViewDeps) => { - - - - {responses.map((response, i) => { - return ( - - {(provided) => ( - - - - - - - - - - - - - )} - - ); - })} - - - - {i18n.addResponse} - - - + {responses.map((response, i) => { + return ( + + + + ); + })} + + ); }; diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts b/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts index b886bd1c4d68a..c11d198d8dbfd 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts @@ -6,7 +6,34 @@ */ import { i18n } from '@kbn/i18n'; -import { ControlSelectorCondition } from '../../types'; +import { SelectorCondition, SelectorType } from '../../types'; + +export const fileSelector = i18n.translate('xpack.cloudDefend.fileSelector', { + defaultMessage: 'File selector', +}); + +export const processSelector = i18n.translate('xpack.cloudDefend.processSelector', { + defaultMessage: 'Process selector', +}); + +export const networkSelector = i18n.translate('xpack.cloudDefend.networkSelector', { + defaultMessage: 'Network (coming soon)', +}); + +export const fileResponse = i18n.translate('xpack.cloudDefend.fileResponse', { + defaultMessage: 'File response', +}); + +export const processResponse = i18n.translate('xpack.cloudDefend.processResponse', { + defaultMessage: 'Process response', +}); + +export const networkResponse = i18n.translate('xpack.cloudDefend.networkResponse', { + defaultMessage: 'Network (coming soon)', +}); +export const conditions = i18n.translate('xpack.cloudDefend.conditions', { + defaultMessage: 'Conditions: ', +}); export const duplicate = i18n.translate('xpack.cloudDefend.controlDuplicate', { defaultMessage: 'Duplicate', @@ -21,7 +48,8 @@ export const selectors = i18n.translate('xpack.cloudDefend.controlSelectors', { }); export const selectorsHelp = i18n.translate('xpack.cloudDefend.controlSelectorsHelp', { - defaultMessage: 'Create selectors to match on operations that should be blocked or alerted.', + defaultMessage: + 'Create file or process selectors to match on operations and or conditions of interest.', }); export const responses = i18n.translate('xpack.cloudDefend.controlResponses', { @@ -30,7 +58,7 @@ export const responses = i18n.translate('xpack.cloudDefend.controlResponses', { export const responsesHelp = i18n.translate('xpack.cloudDefend.controlResponsesHelp', { defaultMessage: - 'Responses are evaluated from top to bottom. At most, one set of actions will be performed.', + 'Use responses to map one or more selectors to a set of actions. Selectors can also be used to "exclude" events.', }); export const matchSelectors = i18n.translate('xpack.cloudDefend.controlMatchSelectors', { @@ -41,10 +69,18 @@ export const excludeSelectors = i18n.translate('xpack.cloudDefend.controlExclude defaultMessage: 'Exclude selectors', }); +export const exclude = i18n.translate('xpack.cloudDefend.controlExclude', { + defaultMessage: 'Exclude', +}); + export const actions = i18n.translate('xpack.cloudDefend.controlResponseActions', { defaultMessage: 'Actions', }); +export const actionLog = i18n.translate('xpack.cloudDefend.controlResponseActionLog', { + defaultMessage: 'Log', +}); + export const actionAlert = i18n.translate('xpack.cloudDefend.controlResponseActionAlert', { defaultMessage: 'Alert', }); @@ -53,6 +89,10 @@ export const actionBlock = i18n.translate('xpack.cloudDefend.controlResponseActi defaultMessage: 'Block', }); +export const actionBlockHelp = i18n.translate('xpack.cloudDefend.controlResponseActionBlockHelp', { + defaultMessage: 'Alert action must be enabled to block an event.', +}); + export const actionAlertAndBlock = i18n.translate( 'xpack.cloudDefend.controlResponseActionAlertAndBlock', { @@ -99,71 +139,44 @@ export const errorValueLengthExceeded = i18n.translate( } ); -export const getConditionHelpLabel = (prop: string) => { - switch (prop) { - case ControlSelectorCondition.ignoreVolumeMounts: - return i18n.translate('xpack.cloudDefend.ignoreVolumeMountsHelp', { - defaultMessage: 'Ignore operations on all volume mounts.', - }); - case ControlSelectorCondition.ignoreVolumeFiles: - return i18n.translate('xpack.cloudDefend.ignoreVolumeFilesHelp', { - defaultMessage: - 'Ignore operations on file mounts only. e.g mounted files, configMaps, secrets etc...', +export const getSelectorIconTooltip = (type: SelectorType) => { + switch (type) { + case 'process': + return i18n.translate('xpack.cloudDefend.processSelectorIconTooltip', { + defaultMessage: 'A process selector. Matches only on process operations.', }); + case 'file': default: - return ''; + return i18n.translate('xpack.cloudDefend.fileSelectorIconTooltip', { + defaultMessage: 'A file selector. Matches only on file operations.', + }); } }; -export const getConditionLabel = (prop: string) => { - switch (prop) { - case ControlSelectorCondition.operation: - return i18n.translate('xpack.cloudDefend.operation', { - defaultMessage: 'Operation', - }); - case ControlSelectorCondition.containerImageName: - return i18n.translate('xpack.cloudDefend.containerImageName', { - defaultMessage: 'Container image name', - }); - case ControlSelectorCondition.containerImageTag: - return i18n.translate('xpack.cloudDefend.containerImageTag', { - defaultMessage: 'Container image tag', - }); - case ControlSelectorCondition.targetFilePath: - return i18n.translate('xpack.cloudDefend.targetFilePath', { - defaultMessage: 'Target file path', - }); - case ControlSelectorCondition.ignoreVolumeFiles: - return i18n.translate('xpack.cloudDefend.ignoreVolumeFiles', { - defaultMessage: 'Ignore volume files', - }); - case ControlSelectorCondition.ignoreVolumeMounts: - return i18n.translate('xpack.cloudDefend.ignoreVolumeMounts', { - defaultMessage: 'Ignore volume mounts', - }); - case ControlSelectorCondition.orchestratorClusterId: - return i18n.translate('xpack.cloudDefend.orchestratorClusterId', { - defaultMessage: 'Orchestrator cluster ID', +export const getResponseIconTooltip = (type: SelectorType) => { + switch (type) { + case 'process': + return i18n.translate('xpack.cloudDefend.processResponseIconTooltip', { + defaultMessage: 'A process response.\nOnly process selectors can be used to match/exclude.', }); - case ControlSelectorCondition.orchestratorClusterName: - return i18n.translate('xpack.cloudDefend.orchestratorClusterName', { - defaultMessage: 'Orchestrator cluster name', - }); - case ControlSelectorCondition.orchestratorNamespace: - return i18n.translate('xpack.cloudDefend.orchestratorNamespace', { - defaultMessage: 'Orchestrator namespace', - }); - case ControlSelectorCondition.orchestratorResourceLabel: - return i18n.translate('xpack.cloudDefend.orchestratorResourceLabel', { - defaultMessage: 'Orchestrator resource label', + case 'file': + default: + return i18n.translate('xpack.cloudDefend.fileResponseIconTooltip', { + defaultMessage: 'A file response.\nOnly file selectors can be used to match/exclude.', }); - case ControlSelectorCondition.orchestratorResourceName: - return i18n.translate('xpack.cloudDefend.orchestratorResourceName', { - defaultMessage: 'Orchestrator resource name', + } +}; + +export const getConditionHelpLabel = (prop: SelectorCondition) => { + switch (prop) { + case 'ignoreVolumeMounts': + return i18n.translate('xpack.cloudDefend.ignoreVolumeMountsHelp', { + defaultMessage: 'Ignore operations on all volume mounts.', }); - case ControlSelectorCondition.orchestratorResourceType: - return i18n.translate('xpack.cloudDefend.orchestratorResourceType', { - defaultMessage: 'Orchestrator resource type', + case 'ignoreVolumeFiles': + return i18n.translate('xpack.cloudDefend.ignoreVolumeFilesHelp', { + defaultMessage: + 'Ignore operations on file mounts only. e.g mounted files, configMaps, secrets etc...', }); default: return ''; diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx index 2912b8ecac5e4..24bfcbadc124f 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx @@ -10,12 +10,7 @@ import { coreMock } from '@kbn/core/public/mocks'; import userEvent from '@testing-library/user-event'; import { TestProvider } from '../../test/test_provider'; import { ControlGeneralViewResponse } from '.'; -import { - ControlResponse, - ControlResponseAction, - ControlSelector, - ControlSelectorOperation, -} from '../../types'; +import { Response, Selector } from '../../types'; import * as i18n from '../control_general_view/translations'; describe('', () => { @@ -26,37 +21,42 @@ describe('', () => { // defining this here to avoid a warning in testprovider with params.history changing on rerender. const params = coreMock.createAppMountParameters(); - const mockSelector: ControlSelector = { + const mockSelector: Selector = { + type: 'file', name: 'mock', - operation: [ControlSelectorOperation.createExecutable], + operation: ['createExecutable'], }; - const mockSelector2: ControlSelector = { + const mockSelector2: Selector = { + type: 'file', name: 'mock2', - operation: [ControlSelectorOperation.modifyExecutable], + operation: ['modifyExecutable'], }; - const mockExclude: ControlSelector = { + const mockExclude: Selector = { + type: 'file', name: 'mockExclude', containerImageName: ['nginx'], }; - const mockResponse: ControlResponse = { + const mockResponse: Response = { + type: 'file', match: [mockSelector.name], - actions: [ControlResponseAction.alert], + actions: ['alert'], }; - const mockResponse2: ControlResponse = { + const mockResponse2: Response = { + type: 'file', match: [mockSelector.name], - actions: [ControlResponseAction.alert, ControlResponseAction.block], + actions: ['alert', 'block'], }; const WrappedComponent = ({ response = { ...mockResponse }, responses, }: { - response?: ControlResponse; - responses?: ControlResponse[]; + response?: Response; + responses?: Response[]; }) => { return ( @@ -83,12 +83,8 @@ describe('', () => { const { getByTestId, queryByTestId } = render(); expect(getByTestId('cloud-defend-responsematch').querySelector('.euiBadge__text')).toBeTruthy(); expect(queryByTestId('cloud-defend-responseexclude')).toBeFalsy(); - expect( - getByTestId('cloud-defend-chkalertaction').querySelector('.euiRadio__input') - ).toBeChecked(); - expect( - getByTestId('cloud-defend-chkblockaction').querySelector('.euiRadio__input') - ).not.toBeChecked(); + expect(getByTestId('cloud-defend-chkalertaction')).toBeChecked(); + expect(getByTestId('cloud-defend-chkblockaction')).not.toBeChecked(); }); it('allows the user to add more selectors to match on', () => { @@ -103,7 +99,7 @@ describe('', () => { userEvent.click(options[0]); - const updatedResponse: ControlResponse = onChange.mock.calls[0][0]; + const updatedResponse: Response = onChange.mock.calls[0][0]; rerender(); @@ -123,7 +119,7 @@ describe('', () => { userEvent.click(getByTitle('Remove mock from selection in this group')); - const updatedResponse: ControlResponse = onChange.mock.calls[0][0]; + const updatedResponse: Response = onChange.mock.calls[0][0]; rerender(); expect(getByText(i18n.errorValueRequired)).toBeTruthy(); @@ -135,7 +131,7 @@ describe('', () => { // first must click button to show combobox userEvent.click(getByTestId('cloud-defend-btnshowexclude')); - let updatedResponse: ControlResponse = onChange.mock.calls[0][0]; + let updatedResponse: Response = onChange.mock.calls[0][0]; rerender(); getAllByTestId('comboBoxSearchInput')[1].focus(); @@ -168,14 +164,15 @@ describe('', () => { it('allows the user to enable block action (which should force alert action on)', () => { const { getByTestId } = render(); - const radioBtn = getByTestId('cloud-defend-chkblockaction').querySelector('.euiRadio__input'); - if (radioBtn) { - userEvent.click(radioBtn); + const checkBox = getByTestId('cloud-defend-chkblockaction'); + + if (checkBox) { + userEvent.click(checkBox); } - const response: ControlResponse = onChange.mock.calls[0][0]; - expect(response.actions).toContain(ControlResponseAction.alert); - expect(response.actions).toContain(ControlResponseAction.block); + const response: Response = onChange.mock.calls[0][0]; + expect(response.actions).toContain('alert'); + expect(response.actions).toContain('block'); }); it('allows the user to remove the response', async () => { diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx index e98259acf7c55..fc29f0388457a 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx @@ -4,8 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useMemo, useState, useCallback } from 'react'; +import React, { useMemo, useState, useCallback, ChangeEvent } from 'react'; import { + EuiIcon, + EuiToolTip, + EuiText, + EuiBadge, + EuiAccordion, EuiFlexGroup, EuiFlexItem, EuiButtonIcon, @@ -16,14 +21,22 @@ import { EuiForm, EuiFormRow, EuiComboBox, - EuiRadio, + EuiCheckbox, EuiComboBoxOptionOption, EuiSpacer, euiPaletteColorBlindBehindText, + useEuiTheme, } from '@elastic/eui'; import { useStyles } from './styles'; -import { ControlGeneralViewResponseDeps, ControlResponseAction } from '../../types'; +import { useStyles as useSelectorStyles } from '../control_general_view_selector/styles'; +import { ControlGeneralViewResponseDeps, ResponseAction } from '../../types'; import * as i18n from '../control_general_view/translations'; +import { getSelectorTypeIcon } from '../../common/utils'; + +// max number of names to show in title (in collapsed state) +// selectorA, selectorB, selectorC, selectorD [+5] +const titleThreshold = 4; +const titleThresholdCollapsed = 2; export const ControlGeneralViewResponse = ({ response, @@ -34,9 +47,16 @@ export const ControlGeneralViewResponse = ({ onDuplicate, onChange, }: ControlGeneralViewResponseDeps) => { + const { + euiTheme: { colors }, + } = useEuiTheme(); const [isPopoverOpen, setPopoverOpen] = useState(false); const styles = useStyles(); + const selectorStyles = useSelectorStyles(); const visColorsBehindText = euiPaletteColorBlindBehindText(); + const [accordionState, setAccordionState] = useState<'open' | 'closed'>( + responses.length - 1 === index ? 'open' : 'closed' + ); const onTogglePopover = useCallback(() => { setPopoverOpen(!isPopoverOpen); @@ -59,7 +79,11 @@ export const ControlGeneralViewResponse = ({ const onChangeMatches = useCallback( (options) => { response.match = options.map((option: EuiComboBoxOptionOption) => option.value); - response.hasErrors = response.match.length === 0; + if (response.match.length === 0) { + response.hasErrors = true; + } else { + delete response.hasErrors; // keeps it out of the yaml. + } onChange(response, index); }, @@ -83,10 +107,14 @@ export const ControlGeneralViewResponse = ({ return selectors .filter( (selector) => - !(response.match.includes(selector.name) || response.exclude?.includes(selector.name)) + !( + selector.type !== response.type || + response.match.includes(selector.name) || + response.exclude?.includes(selector.name) + ) ) .map((selector) => ({ label: selector.name, value: selector.name })); - }, [response.exclude, response.match, selectors]); + }, [response.exclude, response.match, response.type, selectors]); const selectedMatches = useMemo( () => @@ -115,24 +143,35 @@ export const ControlGeneralViewResponse = ({ onChange(updatedResponse, index); }, [index, onChange, response]); - const alertSelected = !response.actions.includes(ControlResponseAction.block); - const blockSelected = response.actions.includes(ControlResponseAction.block); - - const onSelectAlertAction = useCallback(() => { - const updatedResponse = { ...response }; + const logSelected = response.actions.includes('log'); + const alertSelected = response.actions.includes('alert'); + const blockSelected = response.actions.includes('block'); - updatedResponse.actions = [ControlResponseAction.alert]; + const onToggleAction = useCallback( + (e: ChangeEvent) => { + const action = e.currentTarget.id as ResponseAction; + const updatedResponse = JSON.parse(JSON.stringify(response)); + const actionIndex = updatedResponse.actions.indexOf(action); - onChange(updatedResponse, index); - }, [index, onChange, response]); + if (actionIndex === -1) { + updatedResponse.actions.push(action); + } else { + // if alert action gets disabled, disable block action + if (action === 'alert') { + const blockIndex = updatedResponse.actions.indexOf('block'); - const onSelectAlertAndBlockAction = useCallback(() => { - const updatedResponse = { ...response }; + if (blockIndex !== -1) { + updatedResponse.actions.splice(blockIndex, 1); + } + } - updatedResponse.actions = [ControlResponseAction.alert, ControlResponseAction.block]; + updatedResponse.actions.splice(actionIndex, 1); + } - onChange(updatedResponse, index); - }, [index, onChange, response]); + onChange(updatedResponse, index); + }, + [index, onChange, response] + ); const errors = useMemo(() => { const errs: string[] = []; @@ -144,112 +183,189 @@ export const ControlGeneralViewResponse = ({ return errs; }, [response.match.length]); + const onToggleAccordion = useCallback((isOpen: boolean) => { + setAccordionState(isOpen ? 'open' : 'closed'); + }, []); + + const { title, plusCount, remainingNames } = useMemo(() => { + if (accordionState === 'open') { + return { + title: response.match.slice(0, titleThreshold).join(', '), + plusCount: response.match.length - titleThreshold, + remainingNames: response.match.slice(titleThreshold).join(','), + }; + } + + return { + title: response.match.slice(0, titleThresholdCollapsed).join(', '), + plusCount: response.match.length - titleThresholdCollapsed, + remainingNames: response.match.slice(titleThresholdCollapsed).join(','), + }; + }, [accordionState, response.match]); + return ( - - - 0}> - 0}> + + + + + + + + + {title} + {plusCount > 0 && +{plusCount}} + + + + } + css={styles.accordion} + initialIsOpen={index === 0} + extraAction={ + + {accordionState === 'closed' && ( + + {i18n.exclude}: + {response?.exclude?.length && ( + + {response.exclude.length} + + )} +
+ {i18n.actions}: + {response.actions.map((action, i) => ( + + + {action[0].toUpperCase() + action.slice(1)} + + {i !== response.actions.length - 1 && ', '} + + ))} +
+ + )} + + + } + isOpen={isPopoverOpen} + closePopover={closePopover} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + {i18n.duplicate} + , + + {i18n.remove} + , + ]} + /> + + + + } + > + 0}> + 0}> + + + {response.exclude && ( + - {response.exclude && ( - - + {!response.exclude && ( + + {i18n.excludeSelectors} + + )} + + + + + - - )} - - {!response.exclude && ( - - {i18n.excludeSelectors} - - )} - - - + + + + + {response.type === 'file' && ( - - - - - - - + + + - - - - - - } - isOpen={isPopoverOpen} - closePopover={closePopover} - panelPaddingSize="none" - anchorPosition="downLeft" - > - - {i18n.duplicate} - , - - {i18n.remove} - , - ]} - /> - - - + )} + + + + ); }; diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/styles.ts b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/styles.ts index a54cae7ae9ce5..bcc881935778c 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/styles.ts +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/styles.ts @@ -7,11 +7,12 @@ import { useMemo } from 'react'; import { CSSObject } from '@emotion/react'; -import { useEuiTheme } from '@elastic/eui'; +import { useEuiTheme, useEuiBackgroundColor } from '@elastic/eui'; export const useStyles = () => { const { euiTheme } = useEuiTheme(); - const { size } = euiTheme; + const { border, size } = euiTheme; + const accordionColor = useEuiBackgroundColor('subdued'); return useMemo(() => { const options: CSSObject = { @@ -20,6 +21,24 @@ export const useStyles = () => { right: size.m, }; - return { options }; - }, [size.m]); + const accordion: CSSObject = { + borderRadius: border.radius.medium, + '> .euiAccordion__triggerWrapper': { + padding: size.m, + }, + backgroundColor: accordionColor, + }; + + const accordionHeader: CSSObject = { + '> *': { + display: 'inline-block', + verticalAlign: 'middle', + }, + '> b': { + marginRight: size.s, + }, + }; + + return { options, accordion, accordionHeader }; + }, [accordionColor, border.radius.medium, size.m, size.s]); }; diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx index 77273cc1b2ba1..b1b8d7b13f045 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx @@ -5,12 +5,13 @@ * 2.0. */ import React from 'react'; -import { render, waitFor } from '@testing-library/react'; +import { act, render, waitFor } from '@testing-library/react'; import { coreMock } from '@kbn/core/public/mocks'; import userEvent from '@testing-library/user-event'; import { TestProvider } from '../../test/test_provider'; import { ControlGeneralViewSelector } from '.'; -import { ControlSelector, ControlSelectorCondition, ControlSelectorOperation } from '../../types'; +import { Selector } from '../../types'; +import { getSelectorConditions } from '../../common/utils'; import * as i18n from '../control_general_view/translations'; describe('', () => { @@ -21,22 +22,24 @@ describe('', () => { // defining this here to avoid a warning in testprovider with params.history changing on rerender. const params = coreMock.createAppMountParameters(); - const mockSelector: ControlSelector = { + const mockSelector: Selector = { + type: 'file', name: 'mock', - operation: [ControlSelectorOperation.createExecutable], + operation: ['createExecutable'], }; - const mockSelector2: ControlSelector = { + const mockSelector2: Selector = { + type: 'file', name: 'mock2', - operation: [ControlSelectorOperation.modifyExecutable], + operation: ['createExecutable', 'modifyExecutable'], }; const WrappedComponent = ({ selector = { ...mockSelector }, selectors, }: { - selector?: ControlSelector; - selectors?: ControlSelector[]; + selector?: Selector; + selectors?: Selector[]; }) => { return ( @@ -68,53 +71,55 @@ describe('', () => { it('allows the user to add a limited set of operations', () => { const { getByTestId, rerender } = render(); - userEvent.click(getByTestId('cloud-defend-selectorcondition-operation')); - + getByTestId('cloud-defend-selectorcondition-operation').click(); getByTestId('comboBoxSearchInput').focus(); const options = getByTestId( 'comboBoxOptionsList cloud-defend-selectorcondition-operation-optionsList' ).querySelectorAll('.euiComboBoxOption__content'); - expect(options).toHaveLength(2); - expect(options[0].textContent).toBe(ControlSelectorOperation.modifyExecutable); - expect(options[1].textContent).toBe(ControlSelectorOperation.execMemFd); + expect(options).toHaveLength(4); + expect(options[0].textContent).toBe('modifyExecutable'); + expect(options[1].textContent).toBe('createFile'); + expect(options[2].textContent).toBe('modifyFile'); + expect(options[3].textContent).toBe('deleteFile'); - userEvent.click(options[1]); // select execMemFd + act(() => { + userEvent.click(options[3]); // select deleteFile + }); - const updatedSelector: ControlSelector = onChange.mock.calls[0][0]; + const updatedSelector: Selector = onChange.mock.calls[0][0]; rerender(); - expect(updatedSelector.operation).toContain(ControlSelectorOperation.execMemFd); + expect(updatedSelector.operation).toContain('deleteFile'); - // test that only 1 option is remaining + // test that only 3 option is remaining const updatedOptions = getByTestId( 'comboBoxOptionsList cloud-defend-selectorcondition-operation-optionsList' ).querySelectorAll('.euiComboBoxOption__content'); - expect(updatedOptions).toHaveLength(1); - expect(updatedOptions[0].textContent).toBe(ControlSelectorOperation.modifyExecutable); + expect(updatedOptions).toHaveLength(3); }); it('allows the user add additional conditions', async () => { const { getByTestId, rerender } = render(); const addConditionBtn = getByTestId('cloud-defend-btnaddselectorcondition'); - - userEvent.click(addConditionBtn); + addConditionBtn.click(); const options = document.querySelectorAll('.euiContextMenuItem'); - expect(options).toHaveLength(Object.values(ControlSelectorCondition).length - 1); // since operation is already present + const conditions = getSelectorConditions('file'); + expect(options).toHaveLength(conditions.length - 1); // -1 since operation is already present await waitFor(() => userEvent.click(options[0])); // add first option "containerImageName" // rerender and check that containerImageName is not in the list anymore - const updatedSelector: ControlSelector = { ...onChange.mock.calls[0][0] }; + const updatedSelector: Selector = { ...onChange.mock.calls[0][0] }; rerender(); expect(updatedSelector.containerImageName).toHaveLength(0); - userEvent.click(addConditionBtn); + addConditionBtn.click(); const updatedOptions = document.querySelectorAll('.euiContextMenuItem'); - expect(updatedOptions).toHaveLength(Object.values(ControlSelectorCondition).length - 2); // since operation and containerImageName are already selected + expect(updatedOptions).toHaveLength(conditions.length - 2); // since operation and containerImageName are already selected expect(updatedOptions[0]).not.toHaveTextContent('containerImageName'); }); @@ -122,13 +127,13 @@ describe('', () => { const { getByTestId, rerender } = render(); const addConditionBtn = getByTestId('cloud-defend-btnaddselectorcondition'); - userEvent.click(addConditionBtn); + addConditionBtn.click(); const addIgnoreVolumeMounts = getByTestId('cloud-defend-addmenu-ignoreVolumeMounts'); - await waitFor(() => userEvent.click(addIgnoreVolumeMounts)); + await waitFor(() => addIgnoreVolumeMounts.click()); - const updatedSelector: ControlSelector = { ...onChange.mock.calls[0][0] }; + const updatedSelector: Selector = { ...onChange.mock.calls[0][0] }; rerender(); expect(updatedSelector.ignoreVolumeMounts).toBeTruthy(); }); @@ -136,9 +141,9 @@ describe('', () => { it('shows an error if no conditions are added', async () => { const { getByText, getByTestId, rerender } = render(); - userEvent.click(getByTestId('cloud-defend-btnremovecondition-operation')); + getByTestId('cloud-defend-btnremovecondition-operation').click(); - const updatedSelector: ControlSelector = { ...onChange.mock.calls[0][0] }; + const updatedSelector: Selector = { ...onChange.mock.calls[0][0] }; rerender(); @@ -151,10 +156,10 @@ describe('', () => { const { getByText, getByTestId } = render(); const addConditionBtn = getByTestId('cloud-defend-btnaddselectorcondition'); - userEvent.click(getByTestId('cloud-defend-btnremovecondition-operation')); - userEvent.click(addConditionBtn); + getByTestId('cloud-defend-btnremovecondition-operation').click(); + addConditionBtn.click(); - await waitFor(() => userEvent.click(getByText('Container image name'))); // add containerImageName + await waitFor(() => getByText('Container image name').click()); // add containerImageName expect(onChange.mock.calls).toHaveLength(2); expect(onChange.mock.calls[1][0]).toHaveProperty('containerImageName'); @@ -166,11 +171,11 @@ describe('', () => { const { getByText, getByTestId, rerender } = render(); const addConditionBtn = getByTestId('cloud-defend-btnaddselectorcondition'); - userEvent.click(addConditionBtn); + addConditionBtn.click(); - await waitFor(() => userEvent.click(getByText('Container image name'))); // add containerImageName + await waitFor(() => getByText('Container image name').click()); // add containerImageName - const updatedSelector: ControlSelector = onChange.mock.calls[0][0]; + const updatedSelector: Selector = onChange.mock.calls[0][0]; rerender(); @@ -191,11 +196,11 @@ describe('', () => { const { getByText, getByTestId, rerender } = render(); const addConditionBtn = getByTestId('cloud-defend-btnaddselectorcondition'); - userEvent.click(addConditionBtn); + addConditionBtn.click(); - await waitFor(() => userEvent.click(getByText('Target file path'))); + await waitFor(() => getByText('Target file path').click()); - const updatedSelector: ControlSelector = onChange.mock.calls[0][0]; + const updatedSelector: Selector = onChange.mock.calls[0][0]; rerender(); @@ -211,15 +216,16 @@ describe('', () => { }); it('allows the user to remove conditions', async () => { - const selector: ControlSelector = { + const selector: Selector = { + type: 'file', name: 'mock3', - operation: [ControlSelectorOperation.createExecutable], + operation: ['createExecutable'], containerImageTag: ['test'], }; const { getByTestId } = render(); - userEvent.click(getByTestId('cloud-defend-btnremovecondition-operation')); + getByTestId('cloud-defend-btnremovecondition-operation').click(); expect(onChange.mock.calls).toHaveLength(1); expect(onChange.mock.calls[0][0]).not.toHaveProperty('operation'); }); @@ -227,9 +233,9 @@ describe('', () => { it('allows the user to remove the selector (unless its the last one)', async () => { const { getByTestId, rerender } = render(); const btnSelectorPopover = getByTestId('cloud-defend-btnselectorpopover'); - userEvent.click(btnSelectorPopover); + btnSelectorPopover.click(); - await waitFor(() => userEvent.click(getByTestId('cloud-defend-btndeleteselector'))); + await waitFor(() => getByTestId('cloud-defend-btndeleteselector').click()); expect(onRemove.mock.calls).toHaveLength(1); expect(onRemove.mock.calls[0][0]).toEqual(0); @@ -239,17 +245,17 @@ describe('', () => { rerender(); // try and delete again, and ensure the last selector can't be deleted. - userEvent.click(btnSelectorPopover); - await waitFor(() => userEvent.click(getByTestId('cloud-defend-btndeleteselector'))); + btnSelectorPopover.click(); + await waitFor(() => getByTestId('cloud-defend-btndeleteselector').click()); expect(onRemove.mock.calls).toHaveLength(0); }); it('allows the user to duplicate the selector', async () => { const { getByTestId } = render(); const btnSelectorPopover = getByTestId('cloud-defend-btnselectorpopover'); - userEvent.click(btnSelectorPopover); + btnSelectorPopover.click(); - await waitFor(() => userEvent.click(getByTestId('cloud-defend-btnduplicateselector'))); + await waitFor(() => getByTestId('cloud-defend-btnduplicateselector').click()); expect(onDuplicate.mock.calls).toHaveLength(1); expect(onDuplicate.mock.calls[0][0]).toEqual(mockSelector); diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx index bc42466c63329..3c883e080507d 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx @@ -6,6 +6,9 @@ */ import React, { useState, useMemo, useCallback, FormEvent } from 'react'; import { + EuiBadge, + EuiIcon, + EuiToolTip, EuiAccordion, EuiButtonIcon, EuiPopover, @@ -20,16 +23,23 @@ import { EuiFlexGroup, EuiFlexItem, EuiText, + EuiCheckbox, } from '@elastic/eui'; import { useStyles } from './styles'; import { ControlGeneralViewSelectorDeps, ControlFormErrorMap, - ControlSelectorCondition, - ControlSelectorConditionUIOptionsMap, - ControlSelectorBooleanConditions, - ControlSelector, + Selector, + SelectorCondition, + SelectorConditionsMap, } from '../../types'; +import { + getSelectorConditions, + camelToSentenceCase, + getSelectorTypeIcon, + conditionCombinationInvalid, + getRestrictedValuesForCondition, +} from '../../common/utils'; import * as i18n from '../control_general_view/translations'; import { VALID_SELECTOR_NAME_REGEX, @@ -40,18 +50,57 @@ import { interface ConditionProps { label: string; - prop: string; - onRemoveCondition(prop: string): void; + prop: SelectorCondition; + onRemoveCondition(prop: SelectorCondition): void; +} + +interface BooleanConditionProps extends ConditionProps { + selector: Selector; + onChangeBooleanCondition(prop: SelectorCondition, value: boolean): void; } interface StringArrayConditionProps extends ConditionProps { - selector: ControlSelector; + selector: Selector; errorMap: ControlFormErrorMap; - onAddValueToCondition(prop: string, value: string): void; - onChangeStringArrayCondition(prop: string, value: string[]): void; + onAddValueToCondition(prop: SelectorCondition, value: string): void; + onChangeStringArrayCondition(prop: SelectorCondition, value: string[]): void; } -const BooleanCondition = ({ label, prop, onRemoveCondition }: ConditionProps) => { +const BooleanCondition = ({ + label, + prop, + selector, + onChangeBooleanCondition, + onRemoveCondition, +}: BooleanConditionProps) => { + const value = selector[prop as keyof Selector] as boolean; + const onChange = useCallback( + (e) => { + onChangeBooleanCondition(prop, e.target.checked); + }, + [onChangeBooleanCondition, prop] + ); + + return ( + + + + + + + onRemoveCondition(prop)} + aria-label="Remove condition" + data-test-subj={'cloud-defend-btnremovecondition-' + prop} + /> + + + + ); +}; + +const FlagCondition = ({ label, prop, onRemoveCondition }: ConditionProps) => { return ( @@ -84,13 +133,13 @@ const StringArrayCondition = ({ onAddValueToCondition, onChangeStringArrayCondition, }: StringArrayConditionProps) => { - const values = selector[prop as keyof ControlSelector] as string[]; + const values = selector[prop as keyof Selector] as string[]; const selectedOptions = values?.map((option) => { return { label: option, value: option }; }) || []; - const restrictedValues = ControlSelectorConditionUIOptionsMap[prop]?.values; + const restrictedValues = getRestrictedValuesForCondition(selector.type, prop); return ( { + // ensure most recently added is open by default + const [accordionState, setAccordionState] = useState<'open' | 'closed'>( + selectors.length - 1 === index ? 'open' : 'closed' + ); const [isPopoverOpen, setPopoverOpen] = useState(false); const [isAddConditionOpen, setAddConditionOpen] = useState(false); const [errorMap, setErrorMap] = useState({}); @@ -164,13 +217,17 @@ export const ControlGeneralViewSelector = ({ setAddConditionOpen(false); }, []); - const remainingProps = useMemo(() => { - return Object.keys(ControlSelectorCondition).filter( - (condition) => !selector.hasOwnProperty(condition) - ); - }, [selector]); + const availableConditions = useMemo(() => getSelectorConditions(selector.type), [selector]); - const conditionsAdded = Object.keys(ControlSelectorCondition).length - remainingProps.length; + const remainingConditions = useMemo(() => { + return availableConditions.filter((condition) => !selector.hasOwnProperty(condition)); + }, [availableConditions, selector]); + + const conditionsAdded = useMemo(() => { + return Object.keys(selector).filter( + (key) => !['type', 'hasErrors', 'name'].includes(key) + ) as SelectorCondition[]; + }, [selector]); const onRemoveClicked = useCallback(() => { // we prevent the removal of the last selector to avoid an empty state @@ -214,7 +271,7 @@ export const ControlGeneralViewSelector = ({ const updatedSelector = { ...selector }; updatedSelector.name = value; - updatedSelector.hasErrors = Object.keys(errorMap).length > 0 || conditionsAdded === 0; + updatedSelector.hasErrors = Object.keys(errorMap).length > 0 || conditionsAdded.length === 0; onChange(updatedSelector, index); }, @@ -222,7 +279,7 @@ export const ControlGeneralViewSelector = ({ ); const onChangeStringArrayCondition = useCallback( - (prop: string, values: string[]) => { + (prop: SelectorCondition, values: string[]) => { const updatedSelector = { ...selector, [prop]: values }; const errors = []; @@ -233,7 +290,7 @@ export const ControlGeneralViewSelector = ({ values.forEach((value) => { const bytes = new Blob([value]).size; - if (prop === ControlSelectorCondition.targetFilePath) { + if (prop === 'targetFilePath') { if (bytes > MAX_FILE_PATH_VALUE_LENGTH_BYTES) { errors.push(i18n.errorValueLengthExceeded); } @@ -248,7 +305,7 @@ export const ControlGeneralViewSelector = ({ delete errorMap[prop]; } - updatedSelector.hasErrors = Object.keys(errorMap).length > 0 || conditionsAdded === 0; + updatedSelector.hasErrors = Object.keys(errorMap).length > 0 || conditionsAdded.length === 0; setErrorMap({ ...errorMap }); onChange(updatedSelector, index); @@ -266,8 +323,10 @@ export const ControlGeneralViewSelector = ({ ); const onAddCondition = useCallback( - (prop: string) => { - if (prop in ControlSelectorBooleanConditions) { + (prop: SelectorCondition) => { + const valueType = SelectorConditionsMap[prop].type; + + if (valueType === 'flag' || valueType === 'boolean') { onChangeBooleanCondition(prop, true); } else { onChangeStringArrayCondition(prop, []); @@ -284,7 +343,7 @@ export const ControlGeneralViewSelector = ({ delete errorMap[prop]; setErrorMap({ ...errorMap }); - updatedSelector.hasErrors = Object.keys(errorMap).length > 0 || conditionsAdded === 1; + updatedSelector.hasErrors = Object.keys(errorMap).length > 0 || conditionsAdded.length === 1; onChange(updatedSelector, index); closeAddCondition(); @@ -293,9 +352,9 @@ export const ControlGeneralViewSelector = ({ ); const onAddValueToCondition = useCallback( - (prop: string, searchValue: string) => { + (prop: SelectorCondition, searchValue: string) => { const value = searchValue.trim(); - const values = selector[prop as keyof ControlSelector] as string[]; + const values = selector[prop as keyof Selector] as string[]; if (values && values.indexOf(value) === -1) { onChangeStringArrayCondition(prop, [...values, value]); @@ -309,60 +368,93 @@ export const ControlGeneralViewSelector = ({ return prev.concat(errorMap[current]); }, []); - if (conditionsAdded === 0) { + if (conditionsAdded.length === 0) { errs.push(i18n.errorConditionRequired); } return errs; }, [errorMap, conditionsAdded]); + const onToggleAccordion = useCallback((isOpen: boolean) => { + setAccordionState(isOpen ? 'open' : 'closed'); + }, []); + return ( + + + + + + + + {selector.name} + + + + } css={styles.accordion} - initialIsOpen={index === 0} extraAction={ - - } - isOpen={isPopoverOpen} - closePopover={closePopover} - panelPaddingSize="none" - anchorPosition="downLeft" - > - - {i18n.duplicate} - , - - {i18n.remove} - , - ]} - /> - + + {accordionState === 'closed' && ( +
+ + {i18n.conditions} + + + {conditionsAdded.length} + +
+
+ )} + + + } + isOpen={isPopoverOpen} + closePopover={closePopover} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + {i18n.duplicate} + , + + {i18n.remove} + , + ]} + /> + + + } > 0}> @@ -381,33 +473,43 @@ export const ControlGeneralViewSelector = ({ maxLength={MAX_SELECTOR_NAME_LENGTH} /> - {Object.keys(selector).map((prop: string) => { - if (['name', 'hasErrors'].indexOf(prop) === -1) { - const label = i18n.getConditionLabel(prop); - - if (prop in ControlSelectorBooleanConditions) { - return ( - - ); - } else { - return ( - - ); - } + {conditionsAdded.map((prop) => { + const label = camelToSentenceCase(prop); + const valueType = SelectorConditionsMap[prop].type; + + if (valueType === 'flag') { + return ( + + ); + } else if (valueType === 'boolean') { + return ( + + ); + } else { + return ( + + ); } })} @@ -431,14 +533,18 @@ export const ControlGeneralViewSelector = ({ > { + items={remainingConditions.map((prop) => { + const label = camelToSentenceCase(prop); + const disabled = conditionCombinationInvalid(conditionsAdded, prop); + return ( onAddCondition(prop)} + disabled={disabled} > - {i18n.getConditionLabel(prop)} + {label} ); })} diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts b/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts index ca060c3fac8be..84c59cb0a0538 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts @@ -11,17 +11,34 @@ import { useEuiTheme } from '@elastic/eui'; export const useStyles = () => { const { euiTheme } = useEuiTheme(); - const { colors, size, border } = euiTheme; + const { size, border } = euiTheme; return useMemo(() => { const accordion: CSSObject = { - borderRadius: border.radius.small, - backgroundColor: colors.lightestShade, + borderRadius: border.radius.medium, + border: border.thin, '> .euiAccordion__triggerWrapper': { padding: size.m, }, }; - return { accordion }; - }, [border.radius.small, colors.lightestShade, size.m]); + const conditionsBadge: CSSObject = { + display: 'inline', + }; + + const verticalDivider: CSSObject = { + display: 'inline-block', + verticalAlign: 'middle', + width: '1px', + height: '20px', + border: border.thin, + borderRight: 0, + borderTop: 0, + borderBottom: 0, + marginLeft: size.base, + marginRight: size.base, + }; + + return { accordion, conditionsBadge, verticalDivider }; + }, [border.radius.medium, border.thin, size.base, size.m]); }; diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json b/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json index e3c5a2675dcad..0194676d70467 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json +++ b/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json @@ -1,26 +1,60 @@ { "$id": "https://elastic.co/cloud-defend/policy-schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", - "required": ["selectors", "responses"], + "anyOf": [ + { + "required": ["file"] + }, + { + "required": ["process"] + } + ], "additionalProperties": false, "properties": { - "selectors": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/$defs/selector" + "file": { + "type": "object", + "required": ["selectors", "responses"], + "properties": { + "selectors": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/fileSelector" + } + }, + "responses": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/fileResponse" + } + } } }, - "responses": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/$defs/response" + "process": { + "type": "object", + "required": ["selectors", "responses"], + "properties": { + "selectors": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/processSelector" + } + }, + "responses": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/processResponse" + } + } } } }, "$defs": { - "selector": { + "fileSelector": { "type": "object", "required": ["name"], "additionalProperties": false, @@ -31,6 +65,9 @@ { "required": ["containerImageName"] }, + { + "required": ["fullContainerImageName"] + }, { "required": ["containerImageTag"] }, @@ -66,6 +103,71 @@ "name": { "type": "string" }, + "containerImageName": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^[a-z0-9]+$" + } + }, + "containerImageTag": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "fullContainerImageName": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^(?:\\[[a-fA-F0-9:]+\\]|(?:[a-zA-Z0-9-](?:\\.[a-z0-9]+)*)+)(?::[0-9]+)?(?:\\/[a-z0-9]+)+$" + } + }, + "orchestratorClusterId": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "orchestratorClusterName": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "orchestratorNamespace": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "orchestratorResourceLabel": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "orchestratorResourceName": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "orchestratorType": { + "type": "array", + "minItems": 1, + "items": { + "enum": ["kubernetes"] + } + }, "operation": { "type": "array", "minItems": 1, @@ -79,13 +181,98 @@ ] } }, - "containerImageName": { + "targetFilePath": { "type": "array", "minItems": 1, "items": { "type": "string" } }, + "ignoreVolumeMounts": { + "type": "boolean", + "description": "Ignore all volume mounts. e.g directories, files, configMaps, secrets etc...\nNote: should not be used with ignoreVolumeFiles" + }, + "ignoreVolumeFiles": { + "type": "boolean", + "description": "Ignore file mounts. e.g files, configMaps, secrets\nNote: should not be used with ignoreVolumeMounts" + } + }, + "dependencies": { + "ignoreVolumeMounts": { + "not": { + "required": ["ignoreVolumeFiles"] + } + }, + "fullContainerImageName": { + "not": { + "required": ["containerImageName"] + } + } + } + }, + "processSelector": { + "type": "object", + "required": ["name"], + "additionalProperties": false, + "anyOf": [ + { + "required": ["operation"] + }, + { + "required": ["containerImageName"] + }, + { + "required": ["fullContainerImageName"] + }, + { + "required": ["containerImageTag"] + }, + { + "required": ["orchestratorClusterId"] + }, + { + "required": ["orchestratorClusterName"] + }, + { + "required": ["orchestratorNamespace"] + }, + { + "required": ["orchestratorResourceLabel"] + }, + { + "required": ["orchestratorResourceName"] + }, + { + "required": ["orchestratorType"] + }, + { + "required": ["processExecutable"] + }, + { + "required": ["processName"] + }, + { + "required": ["processUserName"] + }, + { + "required": ["processUserId"] + }, + { + "required": ["sessionLeaderInteractive"] + } + ], + "properties": { + "name": { + "type": "string" + }, + "containerImageName": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^[a-z0-9]+$" + } + }, "containerImageTag": { "type": "array", "minItems": 1, @@ -93,11 +280,12 @@ "type": "string" } }, - "targetFilePath": { + "fullContainerImageName": { "type": "array", "minItems": 1, "items": { - "type": "string" + "type": "string", + "pattern": "^(?:\\[[a-fA-F0-9:]+\\]|(?:[a-zA-Z0-9-](?:\\.[a-z0-9]+)*)+)(?::[0-9]+)?(?:\\/[a-z0-9]+)+$" } }, "orchestratorClusterId": { @@ -142,24 +330,81 @@ "enum": ["kubernetes"] } }, - "ignoreVolumeMounts": { - "type": "boolean", - "description": "Ignore all volume mounts. e.g directories, files, configMaps, secrets etc...\nNote: should not be used with ignoreVolumeFiles" + "operation": { + "type": "array", + "minItems": 1, + "items": { + "enum": ["fork", "exec"] + } }, - "ignoreVolumeFiles": { - "type": "boolean", - "description": "Ignore file mounts. e.g files, configMaps, secrets\nNote: should not be used with ignoreVolumeMounts" + "processExecutable": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "processName": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "processUserName": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "processUserId": { + "type": "array", + "minItems": 1, + "items": { + "type": "integer" + } + }, + "sessionLeaderInteractive": { + "type": "boolean" } }, "dependencies": { - "ignoreVolumeMounts": { + "fullContainerImageName": { "not": { - "required": ["ignoreVolumeFiles"] + "required": ["containerImageName"] + } + } + } + }, + "fileResponse": { + "type": "object", + "required": ["match", "actions"], + "additionalProperties": false, + "properties": { + "match": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "actions": { + "type": "array", + "minItems": 1, + "items": { + "enum": ["alert", "block", "log"] } } } }, - "response": { + "processResponse": { "type": "object", "required": ["match", "actions"], "additionalProperties": false, @@ -181,7 +426,7 @@ "type": "array", "minItems": 1, "items": { - "enum": ["alert", "block"] + "enum": ["alert", "log"] } } } diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts b/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts index 359639f2a56cf..862b0cd27bc92 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts +++ b/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts @@ -5,49 +5,48 @@ * 2.0. */ import { useMemo } from 'react'; -import yaml from 'js-yaml'; import { setDiagnosticsOptions } from 'monaco-yaml'; import { monaco } from '@kbn/monaco'; +import { getSelectorsAndResponsesFromYaml } from '../../../common/utils'; /** * In order to keep this json in sync with https://github.com/elastic/cloud-defend/blob/main/modules/service/policy-schema.json - * Do NOT commit edits to policy_schema.json as part of a PR. Please make the changes in the cloud-defend repo and use the - * make push-policy-schema-kibana command to automate the creation of a PR to sync the changes. + * Do NOT commit edits to policy_schema.json as part of a PR. Please make the changes in the cloud-defend repo. + * Buildkite will take care of creating a PR in kibana. */ import policySchemaJson from './policy_schema.json'; const { Uri, editor } = monaco; -const SCHEMA_URI = 'http://elastic.co/cloud_defend.yaml'; +const SCHEMA_URI = 'http://elastic.co/cloud_defend.json'; const modelUri = Uri.parse(SCHEMA_URI); export const useConfigModel = (configuration: string) => { - const json = useMemo(() => { - try { - return yaml.load(configuration); - } catch { - return { selectors: [], responses: [] }; - } - }, [configuration]); - - // creating a string csv to avoid the next useMemo from re-running regardless of whether - // selector names changed or not. - const selectorNamesCSV = useMemo( - () => json?.selectors?.map((selector: any) => selector.name).join(',') || '', - [json?.selectors] - ); - return useMemo(() => { + const { selectors } = getSelectorsAndResponsesFromYaml(configuration); const schema: any = { ...policySchemaJson }; // dynamically setting enum values for response match and exclude properties. - if (schema.$defs.response.properties.match.items) { - const responseProps = schema.$defs.response.properties; - const selectorEnum = { enum: selectorNamesCSV.split(',') }; + if (schema.$defs.fileResponse.properties.match.items) { + const responseProps = schema.$defs.fileResponse.properties; + const selectorEnum = { + enum: selectors + .filter((selector) => selector.type === 'file') + .map((selector) => selector.name), + }; + responseProps.match.items = selectorEnum; + responseProps.exclude.items = selectorEnum; + } + + if (schema.$defs.processResponse.properties.match.items) { + const responseProps = schema.$defs.processResponse.properties; + const selectorEnum = { + enum: selectors + .filter((selector) => selector.type === 'process') + .map((selector) => selector.name), + }; responseProps.match.items = selectorEnum; responseProps.exclude.items = selectorEnum; - } else { - throw new Error('cloud_defend json schema is invalid'); } setDiagnosticsOptions({ @@ -70,5 +69,5 @@ export const useConfigModel = (configuration: string) => { } return model; - }, [selectorNamesCSV]); + }, [configuration]); }; diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.tsx b/x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.tsx index eb58560d60881..bd6e964faab94 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.tsx @@ -14,7 +14,7 @@ import { useStyles } from './styles'; import { useConfigModel } from './hooks/use_config_model'; import { getInputFromPolicy } from '../../common/utils'; import * as i18n from './translations'; -import { ControlResponseAction, ViewDeps } from '../../types'; +import { ViewDeps } from '../../types'; const { editor } = monaco; @@ -45,14 +45,17 @@ export const ControlYamlView = ({ policy, onChange, show }: ViewDeps) => { return error; }); - onChange({ isValid: actionsValid && errs.length === 0, updatedPolicy: policy }); - setErrors(errs); + // prevents infinite loop + if (JSON.stringify(errs) !== JSON.stringify(errors)) { + onChange({ isValid: actionsValid && errs.length === 0, updatedPolicy: policy }); + setErrors(errs); + } }); return () => { listener.dispose(); }; - }, [actionsValid, onChange, policy]); + }, [actionsValid, errors, onChange, policy]); // for now we force 'alert' action on all responses. This restriction may be removed in future when we have a plan to record all responses. e.g. audit const validateActions = useCallback((value) => { @@ -62,7 +65,7 @@ export const ControlYamlView = ({ policy, onChange, show }: ViewDeps) => { for (let i = 0; i < json.responses.length; i++) { const response = json.responses[i]; - if (!response.actions.includes(ControlResponseAction.alert)) { + if (!response.actions.includes('alert')) { return false; } } diff --git a/x-pack/plugins/cloud_defend/public/test/mocks.ts b/x-pack/plugins/cloud_defend/public/test/mocks.ts index 4921d3f6d0f98..b672a12dccaca 100644 --- a/x-pack/plugins/cloud_defend/public/test/mocks.ts +++ b/x-pack/plugins/cloud_defend/public/test/mocks.ts @@ -8,33 +8,30 @@ import type { NewPackagePolicy } from '@kbn/fleet-plugin/public'; import type { PackagePolicy } from '@kbn/fleet-plugin/common'; import { INTEGRATION_PACKAGE_NAME, INPUT_CONTROL, ALERTS_DATASET } from '../../common/constants'; -const MOCK_YAML_CONFIGURATION = ` -selectors: - # default selector (user can modify or remove if they want) - - name: default - operation: [createExecutable, modifyExecutable, execMemFd] - - # example custom selector - - name: nginxOnly - containerImageName: - - nginx - - # example selector used for exclude - - name: excludeCustomNginxBuild - containerImageTag: - - staging - -# responses are evaluated from top to bottom -# only the first response with a match will run its actions -responses: - - match: [nginxOnly] - exclude: [excludeCustomNginxBuild] - actions: [alert, block] - - # default response - # delete this if no default response needed - - match: [default] - actions: [alert] +export const MOCK_YAML_CONFIGURATION = `file: + selectors: + - name: default + operation: + - createExecutable + - modifyExecutable + - name: nginxOnly + containerImageName: + - nginx + - name: excludeCustomNginxBuild + containerImageTag: + - staging + responses: + - match: + - nginxOnly + exclude: + - excludeCustomNginxBuild + actions: + - alert + - block + - match: + - default + actions: + - alert `; export const MOCK_YAML_INVALID_CONFIGURATION = ` diff --git a/x-pack/plugins/cloud_defend/public/types.ts b/x-pack/plugins/cloud_defend/public/types.ts index 3b242b9fc2add..302a8b78ed678 100755 --- a/x-pack/plugins/cloud_defend/public/types.ts +++ b/x-pack/plugins/cloud_defend/public/types.ts @@ -51,61 +51,97 @@ export interface CloudDefendSecuritySolutionContext { /** * cloud_defend/control types */ -export enum ControlResponseAction { - alert = 'alert', - block = 'block', -} - -export enum ControlSelectorCondition { - operation = 'operation', - containerImageName = 'containerImageName', - containerImageTag = 'containerImageTag', - targetFilePath = 'targetFilePath', - ignoreVolumeFiles = 'ignoreVolumeFiles', - ignoreVolumeMounts = 'ignoreVolumeMounts', - orchestratorClusterId = 'orchestratorClusterId', - orchestratorClusterName = 'orchestratorClusterName', - orchestratorNamespace = 'orchestratorNamespace', - orchestratorResourceLabel = 'orchestratorResourceLabel', - orchestratorResourceName = 'orchestratorResourceName', - orchestratorResourceType = 'orchestratorResourceType', - orchestratorType = 'orchestratorType', -} - -export enum ControlSelectorBooleanConditions { - ignoreVolumeFiles = 'ignoreVolumeFiles', - ignoreVolumeMounts = 'ignoreVolumeMounts', -} - -export enum ControlSelectorOperation { - createExecutable = 'createExecutable', - modifyExecutable = 'modifyExecutable', - execMemFd = 'execMemFd', -} -export enum ControlSelectorOrchestratorType { - kubernetes = 'kubernetes', -} +// Currently we support file and process selectors (which match on their respective set of lsm hook points) +export type SelectorType = 'file' | 'process'; -export interface ControlSelectorConditionUIOptions { - [key: string]: { - values: string[]; - }; -} +/* + * 'stringArray' uses a EuiComboBox + * 'flag' is a boolean value which is always 'true' + * 'boolean' can be true or false + */ +export type SelectorConditionType = 'stringArray' | 'flag' | 'boolean'; + +export type SelectorCondition = + | 'containerImageName' + | 'containerImageTag' + | 'fullContainerImageName' + | 'orchestratorClusterId' + | 'orchestratorClusterName' + | 'orchestratorNamespace' + | 'orchestratorResourceLabel' + | 'orchestratorResourceName' + | 'orchestratorResourceType' + | 'orchestratorResourceLabel' + | 'orchestratorType' + | 'targetFilePath' + | 'ignoreVolumeFiles' + | 'ignoreVolumeMounts' + | 'operation' + | 'processExecutable' + | 'processName' + | 'processUserName' + | 'processUserId' + | 'sessionLeaderInteractive' + | 'sessionLeaderExecutable' + | 'operation'; + +export interface SelectorConditionOptions { + type: SelectorConditionType; + selectorType?: SelectorType; + not?: SelectorCondition[]; + values?: + | { + file?: string[]; + process?: string[]; + } + | string[]; +} + +export type SelectorConditionsMapProps = { + [key in SelectorCondition]: SelectorConditionOptions; +}; -export const ControlSelectorConditionUIOptionsMap: ControlSelectorConditionUIOptions = { - operation: { values: Object.values(ControlSelectorOperation) }, - orchestratorType: { values: Object.values(ControlSelectorOrchestratorType) }, +// used to determine UX control and allowed values for each condition +export const SelectorConditionsMap: SelectorConditionsMapProps = { + containerImageName: { type: 'stringArray', not: ['fullContainerImageName'] }, + containerImageTag: { type: 'stringArray' }, + fullContainerImageName: { + type: 'stringArray', + not: ['containerImageName'], + }, + orchestratorClusterId: { type: 'stringArray' }, + orchestratorClusterName: { type: 'stringArray' }, + orchestratorNamespace: { type: 'stringArray' }, + orchestratorResourceLabel: { type: 'stringArray' }, + orchestratorResourceName: { type: 'stringArray' }, + orchestratorResourceType: { type: 'stringArray' }, + orchestratorType: { type: 'stringArray', values: ['kubernetes'] }, + operation: { + type: 'stringArray', + values: { + file: ['createExecutable', 'modifyExecutable', 'createFile', 'modifyFile', 'deleteFile'], + process: ['fork', 'exec'], + }, + }, + targetFilePath: { selectorType: 'file', type: 'stringArray' }, + ignoreVolumeFiles: { selectorType: 'file', type: 'flag', not: ['ignoreVolumeMounts'] }, + ignoreVolumeMounts: { selectorType: 'file', type: 'flag', not: ['ignoreVolumeFiles'] }, + processExecutable: { selectorType: 'process', type: 'stringArray', not: ['processName'] }, + processName: { selectorType: 'process', type: 'stringArray', not: ['processExecutable'] }, + processUserName: { selectorType: 'process', type: 'stringArray' }, + processUserId: { selectorType: 'process', type: 'stringArray' }, + sessionLeaderInteractive: { selectorType: 'process', type: 'boolean' }, + sessionLeaderExecutable: { selectorType: 'process', type: 'stringArray' }, }; -export interface ControlSelector { +export type ResponseAction = 'log' | 'alert' | 'block'; + +export interface Selector { name: string; operation?: string[]; containerImageName?: string[]; containerImageTag?: string[]; - targetFilePath?: string[]; - ignoreVolumeFiles?: boolean; - ignoreVolumeMounts?: boolean; orchestratorClusterId?: string[]; orchestratorClusterName?: string[]; orchestratorNamespace?: string[]; @@ -114,27 +150,57 @@ export interface ControlSelector { orchestratorResourceType?: string[]; orchestratorType?: string[]; - // ephemeral, used to track selector error state in UI + // selector properties + targetFilePath?: string[]; + ignoreVolumeFiles?: boolean; + ignoreVolumeMounts?: boolean; + + // process selector properties + processExecutable?: string[]; + processName?: string[]; + processUserName?: string[]; + processUserId?: string[]; + sessionLeaderInteractive?: string[]; + + // non yaml fields + type: SelectorType; + // used to track selector error state in UI hasErrors?: boolean; } -export interface ControlResponse { +export interface Response { match: string[]; exclude?: string[]; - actions: ControlResponseAction[]; + actions: ResponseAction[]; - // ephemeral, used to track response error state in UI + // non yaml fields + type: SelectorType; + // used to track response error state in UI hasErrors?: boolean; } -export const DefaultSelector: ControlSelector = { +export const DefaultFileSelector: Selector = { + type: 'file', name: 'Untitled', - operation: ControlSelectorConditionUIOptionsMap.operation.values, + operation: ['createExecutable', 'modifyExecutable'], +}; + +export const DefaultProcessSelector: Selector = { + type: 'process', + name: 'Untitled', + operation: ['fork', 'exec'], +}; + +export const DefaultFileResponse: Response = { + type: 'file', + match: [], + actions: ['alert'], }; -export const DefaultResponse: ControlResponse = { +export const DefaultProcessResponse: Response = { + type: 'process', match: [], - actions: [ControlResponseAction.alert], + actions: ['alert'], }; export interface OnChangeDeps { @@ -152,22 +218,22 @@ export interface ViewDeps extends SettingsDeps { } export interface ControlGeneralViewSelectorDeps { - selector: ControlSelector; - selectors: ControlSelector[]; + selector: Selector; + selectors: Selector[]; index: number; - onChange(selector: ControlSelector, index: number): void; + onChange(selector: Selector, index: number): void; onRemove(index: number): void; - onDuplicate(selector: ControlSelector): void; + onDuplicate(selector: Selector): void; } export interface ControlGeneralViewResponseDeps { - response: ControlResponse; - selectors: ControlSelector[]; - responses: ControlResponse[]; + response: Response; + selectors: Selector[]; + responses: Response[]; index: number; - onChange(response: ControlResponse, index: number): void; + onChange(response: Response, index: number): void; onRemove(index: number): void; - onDuplicate(response: ControlResponse): void; + onDuplicate(response: Response): void; } export interface ControlFormErrorMap { From 58c918a061db9c2d69f87d9de20f47ece5d0117f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Fri, 10 Mar 2023 20:52:57 -0500 Subject: [PATCH 09/12] [Profiling][Flamegraps] persistent normalization mode (#153116) https://user-images.githubusercontent.com/55978943/224367585-a6623d40-951b-418a-8615-2c3de46e4e6e.mov Saves the normalization option selected and keeps it when changing the comparison mode. I also refactored the Flamegraph component extracting some components away to simplify. --- .../differential_comparison_mode.tsx | 70 ++++++++ .../flame_graph_search_panel.tsx | 114 ++++++++++++ .../components/flame_graphs_view/index.tsx | 165 ++---------------- 3 files changed, 198 insertions(+), 151 deletions(-) create mode 100644 x-pack/plugins/profiling/public/components/flame_graphs_view/differential_comparison_mode.tsx create mode 100644 x-pack/plugins/profiling/public/components/flame_graphs_view/flame_graph_search_panel.tsx diff --git a/x-pack/plugins/profiling/public/components/flame_graphs_view/differential_comparison_mode.tsx b/x-pack/plugins/profiling/public/components/flame_graphs_view/differential_comparison_mode.tsx new file mode 100644 index 0000000000000..433802798402a --- /dev/null +++ b/x-pack/plugins/profiling/public/components/flame_graphs_view/differential_comparison_mode.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { EuiButtonGroup, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { FlameGraphComparisonMode } from '../../../common/flamegraph'; + +interface Props { + comparisonMode: FlameGraphComparisonMode; + onChange: (nextComparisonMode: FlameGraphComparisonMode) => void; +} +export function DifferentialComparisonMode({ comparisonMode, onChange }: Props) { + return ( + + + + +

+ {i18n.translate( + 'xpack.profiling.flameGraphsView.differentialFlameGraphComparisonModeTitle', + { defaultMessage: 'Format' } + )} +

+
+
+ + { + onChange(nextComparisonMode as FlameGraphComparisonMode); + }} + options={[ + { + id: FlameGraphComparisonMode.Absolute, + label: i18n.translate( + 'xpack.profiling.flameGraphsView.differentialFlameGraphComparisonModeAbsoluteButtonLabel', + { + defaultMessage: 'Abs', + } + ), + }, + { + id: FlameGraphComparisonMode.Relative, + label: i18n.translate( + 'xpack.profiling.flameGraphsView.differentialFlameGraphComparisonModeRelativeButtonLabel', + { + defaultMessage: 'Rel', + } + ), + }, + ]} + /> + +
+
+ ); +} diff --git a/x-pack/plugins/profiling/public/components/flame_graphs_view/flame_graph_search_panel.tsx b/x-pack/plugins/profiling/public/components/flame_graphs_view/flame_graph_search_panel.tsx new file mode 100644 index 0000000000000..397cb994e575b --- /dev/null +++ b/x-pack/plugins/profiling/public/components/flame_graphs_view/flame_graph_search_panel.tsx @@ -0,0 +1,114 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiPanel } from '@elastic/eui'; +import React from 'react'; +import { FlameGraphInformationWindowSwitch } from '.'; +import { FlameGraphComparisonMode, FlameGraphNormalizationMode } from '../../../common/flamegraph'; +import { useProfilingParams } from '../../hooks/use_profiling_params'; +import { useProfilingRouter } from '../../hooks/use_profiling_router'; +import { useProfilingRoutePath } from '../../hooks/use_profiling_route_path'; +import { PrimaryAndComparisonSearchBar } from '../primary_and_comparison_search_bar'; +import { PrimaryProfilingSearchBar } from '../profiling_app_page_template/primary_profiling_search_bar'; +import { DifferentialComparisonMode } from './differential_comparison_mode'; +import { FlameGraphNormalizationOptions, NormalizationMenu } from './normalization_menu'; + +interface Props { + isDifferentialView: boolean; + comparisonMode: FlameGraphComparisonMode; + normalizationMode: FlameGraphNormalizationMode; + normalizationOptions: FlameGraphNormalizationOptions; + showInformationWindow: boolean; + onChangeShowInformationWindow: () => void; +} + +export function FlameGraphSearchPanel({ + comparisonMode, + normalizationMode, + isDifferentialView, + normalizationOptions, + showInformationWindow, + onChangeShowInformationWindow, +}: Props) { + const { path, query } = useProfilingParams('/flamegraphs/*'); + const routePath = useProfilingRoutePath(); + const profilingRouter = useProfilingRouter(); + + function onChangeComparisonMode(nextComparisonMode: FlameGraphComparisonMode) { + if (!('comparisonRangeFrom' in query)) { + return; + } + + profilingRouter.push(routePath, { + path, + query: { + ...query, + ...(nextComparisonMode === FlameGraphComparisonMode.Absolute + ? { + comparisonMode: FlameGraphComparisonMode.Absolute, + normalizationMode, + } + : { comparisonMode: FlameGraphComparisonMode.Relative }), + }, + }); + } + + function onChangeNormalizationMode( + nextNormalizationMode: FlameGraphNormalizationMode, + options: FlameGraphNormalizationOptions + ) { + profilingRouter.push(routePath, { + path: routePath, + query: + nextNormalizationMode === FlameGraphNormalizationMode.Scale + ? { + ...query, + baseline: options.baselineScale, + comparison: options.comparisonScale, + normalizationMode: nextNormalizationMode, + } + : { + ...query, + normalizationMode: nextNormalizationMode, + }, + }); + } + return ( + + {isDifferentialView ? : } + + + {isDifferentialView && ( + <> + + {comparisonMode === FlameGraphComparisonMode.Absolute && ( + + + + + + + + )} + + )} + + + + + + ); +} diff --git a/x-pack/plugins/profiling/public/components/flame_graphs_view/index.tsx b/x-pack/plugins/profiling/public/components/flame_graphs_view/index.tsx index fab21b235c2ff..978d01710f2ca 100644 --- a/x-pack/plugins/profiling/public/components/flame_graphs_view/index.tsx +++ b/x-pack/plugins/profiling/public/components/flame_graphs_view/index.tsx @@ -4,16 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { - EuiButtonGroup, - EuiFlexGroup, - EuiFlexItem, - EuiHorizontalRule, - EuiPageHeaderContentProps, - EuiPanel, - EuiSwitch, - EuiTitle, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiPageHeaderContentProps, EuiSwitch } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { get } from 'lodash'; import React, { useState } from 'react'; @@ -26,11 +17,10 @@ import { useTimeRangeAsync } from '../../hooks/use_time_range_async'; import { AsyncComponent } from '../async_component'; import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies'; import { FlameGraph } from '../flamegraph'; -import { PrimaryAndComparisonSearchBar } from '../primary_and_comparison_search_bar'; -import { PrimaryProfilingSearchBar } from '../profiling_app_page_template/primary_profiling_search_bar'; import { ProfilingAppPageTemplate } from '../profiling_app_page_template'; import { RedirectTo } from '../redirect_to'; -import { FlameGraphNormalizationOptions, NormalizationMenu } from './normalization_menu'; +import { FlameGraphSearchPanel } from './flame_graph_search_panel'; +import { FlameGraphNormalizationOptions } from './normalization_menu'; export function FlameGraphInformationWindowSwitch({ showInformationWindow, @@ -50,25 +40,8 @@ export function FlameGraphInformationWindowSwitch({ ); } -export function FlameGraphSearchPanel({ - children, - searchBar, -}: { - children: React.ReactNode; - searchBar: JSX.Element; -}) { - return ( - - {searchBar} - - {children} - - ); -} - export function FlameGraphsView({ children }: { children: React.ReactElement }) { const { - path, query, query: { rangeFrom, rangeTo, kuery }, } = useProfilingParams('/flamegraphs/*'); @@ -184,136 +157,26 @@ export function FlameGraphsView({ children }: { children: React.ReactElement }) ]; const [showInformationWindow, setShowInformationWindow] = useState(false); + function toggleShowInformationWindow() { + setShowInformationWindow((prev) => !prev); + } if (routePath === '/flamegraphs') { return ; } - const searchBar = isDifferentialView ? ( - - ) : ( - - ); - - const differentialComparisonMode = ( - - - - -

- {i18n.translate( - 'xpack.profiling.flameGraphsView.differentialFlameGraphComparisonModeTitle', - { defaultMessage: 'Format' } - )} -

-
-
- - { - if (!('comparisonRangeFrom' in query)) { - return; - } - - profilingRouter.push(routePath, { - path, - query: { - ...query, - ...(nextComparisonMode === FlameGraphComparisonMode.Absolute - ? { - comparisonMode: FlameGraphComparisonMode.Absolute, - normalizationMode: FlameGraphNormalizationMode.Time, - } - : { comparisonMode: FlameGraphComparisonMode.Relative }), - }, - }); - }} - options={[ - { - id: FlameGraphComparisonMode.Absolute, - label: i18n.translate( - 'xpack.profiling.flameGraphsView.differentialFlameGraphComparisonModeAbsoluteButtonLabel', - { - defaultMessage: 'Abs', - } - ), - }, - { - id: FlameGraphComparisonMode.Relative, - label: i18n.translate( - 'xpack.profiling.flameGraphsView.differentialFlameGraphComparisonModeRelativeButtonLabel', - { - defaultMessage: 'Rel', - } - ), - }, - ]} - /> - -
-
- ); - - const differentialComparisonNormalization = ( - - - - { - profilingRouter.push(routePath, { - path: routePath, - query: - mode === FlameGraphNormalizationMode.Scale - ? { - ...query, - baseline: options.baselineScale, - comparison: options.comparisonScale, - normalizationMode: mode, - } - : { - ...query, - normalizationMode: mode, - }, - }); - }} - mode={normalizationMode} - options={normalizationOptions} - /> - - - - ); - - const informationWindowSwitch = ( - - setShowInformationWindow((prev) => !prev)} - /> - - ); - return ( - - {isDifferentialView && differentialComparisonMode} - {isDifferentialView && - comparisonMode === FlameGraphComparisonMode.Absolute && - differentialComparisonNormalization} - {informationWindowSwitch} - + From 01ba0270d9e9f62aadbe8cfc38b20810581619d7 Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Fri, 10 Mar 2023 21:29:14 -0500 Subject: [PATCH 10/12] [Synthetics] handle onboarding for onprem deployments (#152048) ## Summary Directs on-prem users to create a private location, before allowing on-prem users to create monitors. Admin user [Monitor-Management-Synthetics---Kibana (6).webm](https://user-images.githubusercontent.com/11356435/222554184-3f399764-0c3d-41e4-9652-7ec5616a320c.webm) User without Fleet privileges [Synthetics-Getting-Started-Synthetics---Kibana (3).webm](https://user-images.githubusercontent.com/11356435/222554216-893a9a79-a152-459d-b6e6-d5bdfc5014dc.webm) ### Testing 1. Start ES with yarn es snapshot 2. Remove all `xpack.uptime.service` configs in your Kibana.dev.yml 3. Start Kibana connected to local ES 4. Navigate to Synthetics and enable monitor 5. Confirm that Add monitor flow appears first before creating a monitor --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: shahzad31 Co-authored-by: florent-leborgne --- .../plugins/synthetics/common/constants/ui.ts | 2 + .../form_fields/service_locations.tsx | 2 +- .../getting_started_page.test.tsx | 175 +++++++++++++++ .../getting_started/getting_started_page.tsx | 211 +++++++++++++++--- .../getting_started/simple_monitor_form.tsx | 2 +- .../private_locations/add_location_flyout.tsx | 56 +++-- .../private_locations/empty_locations.tsx | 45 ++-- .../hooks/use_locations_api.test.tsx | 12 +- .../hooks/use_locations_api.ts | 2 +- .../private_locations/location_form.tsx | 132 +++++------ .../private_locations/manage_empty_state.tsx | 17 +- .../manage_private_locations.test.tsx | 8 +- .../manage_private_locations.tsx | 25 ++- .../private_locations/policy_name.tsx | 14 +- .../hooks/use_location_name.test.tsx | 2 - .../public/apps/synthetics/state/index.ts | 1 + .../synthetics/utils/testing/rtl_helpers.tsx | 8 +- .../hooks/use_locations_api.test.tsx | 33 ++- .../hooks/use_locations_api.ts | 2 +- .../manage_locations/location_form.tsx | 2 +- .../manage_locations_flyout.tsx | 4 +- 21 files changed, 581 insertions(+), 174 deletions(-) create mode 100644 x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.test.tsx diff --git a/x-pack/plugins/synthetics/common/constants/ui.ts b/x-pack/plugins/synthetics/common/constants/ui.ts index 57737c2cef192..40c1d26c58cbc 100644 --- a/x-pack/plugins/synthetics/common/constants/ui.ts +++ b/x-pack/plugins/synthetics/common/constants/ui.ts @@ -27,6 +27,8 @@ export const GETTING_STARTED_ROUTE = '/monitors/getting-started'; export const SETTINGS_ROUTE = '/settings'; +export const PRIVATE_LOCATIOSN_ROUTE = '/settings/private-locations'; + export const SYNTHETICS_SETTINGS_ROUTE = '/settings/:tabId'; export const CERTIFICATES_ROUTE = '/certificates'; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/form_fields/service_locations.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/form_fields/service_locations.tsx index 9f720268e5e09..5c6d242f87b37 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/form_fields/service_locations.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/form_fields/service_locations.tsx @@ -66,7 +66,7 @@ export const ServiceLocationsField = ({ const SELECT_ONE_OR_MORE_LOCATIONS = i18n.translate( 'xpack.synthetics.monitorManagement.selectOneOrMoreLocations', { - defaultMessage: 'Select one or more locations', + defaultMessage: 'Select one or more locations.', } ); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.test.tsx new file mode 100644 index 0000000000000..811a2b676503e --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.test.tsx @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 * as permissionsHooks from '../../hooks/use_fleet_permissions'; +import { render } from '../../utils/testing/rtl_helpers'; +import { GettingStartedPage } from './getting_started_page'; +import * as privateLocationsHooks from '../settings/private_locations/hooks/use_locations_api'; + +describe('GettingStartedPage', () => { + beforeEach(() => { + jest.spyOn(privateLocationsHooks, 'usePrivateLocationsAPI').mockReturnValue({ + loading: false, + privateLocations: [], + deleteLoading: false, + onSubmit: jest.fn(), + onDelete: jest.fn(), + formData: undefined, + }); + jest.spyOn(permissionsHooks, 'useCanManagePrivateLocation').mockReturnValue(true); + }); + it('works with cloud locations', () => { + const { getByText } = render(, { + state: { + serviceLocations: { + locations: [ + { + id: 'us_central', + label: 'Us Central', + }, + { + id: 'us_east', + label: 'US East', + }, + ], + locationsLoaded: true, + loading: false, + }, + agentPolicies: { + loading: false, + }, + }, + }); + + // page is loaded + expect(getByText('Create a single page browser monitor')).toBeInTheDocument(); + }); + + it('serves on prem getting started experience when locations are not available', () => { + const { getByText } = render(, { + state: { + serviceLocations: { + locations: [], + locationsLoaded: true, + loading: false, + }, + }, + }); + + // page is loaded + expect(getByText('Get started with synthetic monitoring')).toBeInTheDocument(); + }); + + it('shows need agent flyout when isAddingNewPrivateLocation is true and agentPolicies.length === 0', async () => { + const { getByText, getByRole, queryByLabelText } = render(, { + state: { + serviceLocations: { + locations: [], + locationsLoaded: true, + loading: false, + }, + agentPolicies: { + data: { + total: 0, + }, + isAddingNewPrivateLocation: true, + }, + }, + }); + + // page is loaded + expect(getByText('Get started with synthetic monitoring')).toBeInTheDocument(); + + expect(getByRole('heading', { name: 'Create private location', level: 2 })); + expect(getByText('No agent policies found')).toBeInTheDocument(); + expect(getByRole('link', { name: 'Create agent policy' })).toBeEnabled(); + expect(queryByLabelText('Location name')).not.toBeInTheDocument(); + expect(queryByLabelText('Agent policy')).not.toBeInTheDocument(); + }); + + it('shows add location flyout when isAddingNewPrivateLocation is true and agentPolicies.length > 0', async () => { + const { getByText, getByRole, getByLabelText, queryByText } = render(, { + state: { + serviceLocations: { + locations: [], + locationsLoaded: true, + loading: false, + }, + agentPolicies: { + data: { + total: 1, + items: [{}], + }, + isAddingNewPrivateLocation: true, + }, + }, + }); + + // page is loaded + expect(getByText('Get started with synthetic monitoring')).toBeInTheDocument(); + + expect(getByRole('heading', { name: 'Create private location', level: 2 })); + expect(queryByText('No agent policies found')).not.toBeInTheDocument(); + expect(getByLabelText('Location name')).toBeInTheDocument(); + expect(getByLabelText('Agent policy')).toBeInTheDocument(); + }); + + it('shows permissions callout and hides form when agent policies are available but the user does not have permissions', async () => { + jest.spyOn(permissionsHooks, 'useCanManagePrivateLocation').mockReturnValue(false); + const { getByText, getByRole, queryByLabelText, queryByRole } = render(, { + state: { + serviceLocations: { + locations: [], + locationsLoaded: true, + loading: false, + }, + agentPolicies: { + data: { + total: 1, + items: [{}], + }, + isAddingNewPrivateLocation: true, + }, + }, + }); + + // page is loaded + expect(getByText('Get started with synthetic monitoring')).toBeInTheDocument(); + + expect(getByRole('heading', { name: 'Create private location', level: 2 })); + expect(queryByLabelText('Location name')).not.toBeInTheDocument(); + expect(queryByLabelText('Agent policy')).not.toBeInTheDocument(); + expect(queryByRole('button', { name: 'Save' })).not.toBeInTheDocument(); + expect(getByText("You're missing some Kibana privileges to manage private locations")); + }); + + it('shows permissions callout when agent policy is needed but the user does not have permissions', async () => { + jest.spyOn(permissionsHooks, 'useCanManagePrivateLocation').mockReturnValue(false); + const { getByText, getByRole, queryByLabelText } = render(, { + state: { + serviceLocations: { + locations: [], + locationsLoaded: true, + loading: false, + }, + agentPolicies: { + data: undefined, // data will be undefined when user does not have permissions + isAddingNewPrivateLocation: true, + }, + }, + }); + + // page is loaded + expect(getByText('Get started with synthetic monitoring')).toBeInTheDocument(); + + expect(getByRole('heading', { name: 'Create private location', level: 2 })); + expect(queryByLabelText('Location name')).not.toBeInTheDocument(); + expect(queryByLabelText('Agent policy')).not.toBeInTheDocument(); + expect(getByText("You're missing some Kibana privileges to manage private locations")); + }); +}); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.tsx index abcdd2c405465..a41439e1288ab 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/getting_started_page.tsx @@ -5,54 +5,152 @@ * 2.0. */ -import React, { useEffect } from 'react'; -import { EuiEmptyPrompt, EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; -import { useDispatch } from 'react-redux'; +import React, { useEffect, useCallback } from 'react'; +import { + EuiEmptyPrompt, + EuiLink, + EuiSpacer, + EuiText, + EuiButton, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; +import { useDispatch, useSelector } from 'react-redux'; import { useHistory } from 'react-router-dom'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; import styled from 'styled-components'; -import { useBreadcrumbs } from '../../hooks'; -import { getServiceLocations } from '../../state'; +import { useBreadcrumbs, useLocations, useFleetPermissions } from '../../hooks'; +import { usePrivateLocationsAPI } from '../settings/private_locations/hooks/use_locations_api'; +import { LoadingState } from '../monitors_page/overview/overview/monitor_detail_flyout'; +import { + getServiceLocations, + selectAddingNewPrivateLocation, + setAddingNewPrivateLocation, + getAgentPoliciesAction, + selectAgentPolicies, +} from '../../state'; import { MONITOR_ADD_ROUTE } from '../../../../../common/constants/ui'; +import { PrivateLocation } from '../../../../../common/runtime_types'; import { SimpleMonitorForm } from './simple_monitor_form'; +import { AddLocationFlyout } from '../settings/private_locations/add_location_flyout'; export const GettingStartedPage = () => { const dispatch = useDispatch(); const history = useHistory(); + const { canReadAgentPolicies } = useFleetPermissions(); + useEffect(() => { dispatch(getServiceLocations()); - }, [dispatch]); + if (canReadAgentPolicies) { + dispatch(getAgentPoliciesAction.get()); + } + }, [canReadAgentPolicies, dispatch]); useBreadcrumbs([{ text: MONITORING_OVERVIEW_LABEL }]); // No extra breadcrumbs on overview - return ( + const { locations, loading: allLocationsLoading } = useLocations(); + const { loading: agentPoliciesLoading } = useSelector(selectAgentPolicies); + const loading = allLocationsLoading || agentPoliciesLoading; + + const hasNoLocations = !allLocationsLoading && locations.length === 0; + + return !loading ? ( + {hasNoLocations ? ( + + ) : ( + {CREATE_SINGLE_PAGE_LABEL}} + layout="horizontal" + color="plain" + body={ + <> + + {OR_LABEL}{' '} + + {SELECT_DIFFERENT_MONITOR} + + {i18n.translate('xpack.synthetics.gettingStarted.createSingle.description', { + defaultMessage: ' to get started with Elastic Synthetics Monitoring.', + })} + + + + + } + /> + )} + + ) : ( + + ); +}; + +export const GettingStartedOnPrem = () => { + const dispatch = useDispatch(); + + useBreadcrumbs([{ text: MONITORING_OVERVIEW_LABEL }]); // No extra breadcrumbs on overview + + const isAddingNewLocation = useSelector(selectAddingNewPrivateLocation); + + const setIsAddingNewLocation = useCallback( + (val: boolean) => dispatch(setAddingNewPrivateLocation(val)), + [dispatch] + ); + + const { onSubmit, privateLocations, loading } = usePrivateLocationsAPI(); + + const handleSubmit = (formData: PrivateLocation) => { + onSubmit(formData); + }; + + // make sure flyout is closed when first visiting the page + useEffect(() => { + setIsAddingNewLocation(false); + }, [setIsAddingNewLocation]); + + return ( + <> {CREATE_SINGLE_PAGE_LABEL}} + title={

{GET_STARTED_LABEL}

} layout="horizontal" color="plain" body={ - <> - - {OR_LABEL}{' '} - + + {CREATE_LOCATION_DESCRIPTION} + + {PUBLIC_LOCATION_DESCRIPTION} + + + setIsAddingNewLocation(true)} > - {SELECT_DIFFERENT_MONITOR} - - {i18n.translate('xpack.synthetics.gettingStarted.createSingle.description', { - defaultMessage: ' to get started with Elastic Synthetics Monitoring', - })} - - - - + {CREATE_LOCATION_LABEL} + +
+
} /> - + + {isAddingNewLocation ? ( + + ) : null} + ); }; @@ -72,6 +170,69 @@ const CREATE_SINGLE_PAGE_LABEL = i18n.translate( } ); +const GET_STARTED_LABEL = i18n.translate('xpack.synthetics.gettingStarted.createLocationHeading', { + defaultMessage: 'Get started with synthetic monitoring', +}); + +const PRIVATE_LOCATION_LABEL = i18n.translate( + 'xpack.synthetics.gettingStarted.privateLocationLabel', + { + defaultMessage: 'private location', + } +); + +const CREATE_LOCATION_LABEL = i18n.translate( + 'xpack.synthetics.gettingStarted.createLocationLabel', + { + defaultMessage: 'Create location', + } +); + +const CREATE_LOCATION_DESCRIPTION = ( + + {PRIVATE_LOCATION_LABEL} + + ), + }} + /> +); +const PUBLIC_LOCATION_DESCRIPTION = ( + + {i18n.translate( + 'xpack.synthetics.gettingStarted.gettingStartedLabel.elasticManagedLink', + { + defaultMessage: 'Elastic’s global managed testing infrastructure', + } + )} + + ), + link: ( + + {i18n.translate( + 'xpack.synthetics.gettingStarted.gettingStartedLabel.elasticCloudDeployments', + { + defaultMessage: 'Elastic Cloud', + } + )} + + ), + }} + /> +); + const SELECT_DIFFERENT_MONITOR = i18n.translate( 'xpack.synthetics.gettingStarted.gettingStartedLabel.selectDifferentMonitor', { diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx index 114be36195215..049d213249cb9 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx @@ -126,7 +126,7 @@ export const WEBSITE_URL_PLACEHOLDER = i18n.translate( export const WEBSITE_URL_HELP_TEXT = i18n.translate( 'xpack.synthetics.monitorManagement.websiteUrlHelpText', { - defaultMessage: `For example, your company's homepage or https://elastic.co`, + defaultMessage: `For example, your company's homepage or https://elastic.co.`, } ); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/add_location_flyout.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/add_location_flyout.tsx index 51e4cce0f2fb0..4a9dcdfec47d8 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/add_location_flyout.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/add_location_flyout.tsx @@ -24,6 +24,7 @@ import { useFormWrapped } from '../../../../../hooks/use_form_wrapped'; import { PrivateLocation } from '../../../../../../common/runtime_types'; import { FleetPermissionsCallout } from '../../common/components/permissions'; import { LocationForm } from './location_form'; +import { ManageEmptyState } from './manage_empty_state'; export const AddLocationFlyout = ({ onSubmit, @@ -69,32 +70,39 @@ export const AddLocationFlyout = ({ - {!canManagePrivateLocation && } - - + hasFleetPermissions={canManagePrivateLocation} + showEmptyLocations={false} + > + {!canManagePrivateLocation && } + + - - - - - {CANCEL_LABEL} - - - - - {SAVE_LABEL} - - - - + {canManagePrivateLocation && ( + + + + + {CANCEL_LABEL} + + + + + {SAVE_LABEL} + + + + + )} ); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/empty_locations.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/empty_locations.tsx index 9bee7b8c2e222..6f20a5c03a5d1 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/empty_locations.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/empty_locations.tsx @@ -6,21 +6,26 @@ */ import React from 'react'; +import { useHistory } from 'react-router-dom'; import { EuiEmptyPrompt, EuiButton, EuiLink, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; +import { PRIVATE_LOCATIOSN_ROUTE } from '../../../../../../common/constants'; import { setAddingNewPrivateLocation, setManageFlyoutOpen } from '../../../state/private_locations'; export const EmptyLocations = ({ inFlyout = true, setIsAddingNew, disabled, + redirectToSettings, }: { inFlyout?: boolean; disabled?: boolean; setIsAddingNew?: (val: boolean) => void; + redirectToSettings?: boolean; }) => { const dispatch = useDispatch(); + const history = useHistory(); return ( } actions={ - { - setIsAddingNew?.(true); - dispatch(setManageFlyoutOpen(true)); - dispatch(setAddingNewPrivateLocation(true)); - }} - > - {ADD_LOCATION} - + redirectToSettings ? ( + + {ADD_LOCATION} + + ) : ( + { + setIsAddingNew?.(true); + dispatch(setManageFlyoutOpen(true)); + dispatch(setAddingNewPrivateLocation(true)); + }} + > + {ADD_LOCATION} + + ) } footer={ diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.test.tsx index ce80c7d97e71e..95093c4c00562 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.test.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.test.tsx @@ -9,11 +9,11 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { WrappedHelper } from '../../../../utils/testing'; import { getServiceLocations } from '../../../../state/service_locations'; import { setAddingNewPrivateLocation } from '../../../../state/private_locations'; -import { useLocationsAPI } from './use_locations_api'; +import { usePrivateLocationsAPI } from './use_locations_api'; import * as locationAPI from '../../../../state/private_locations/api'; import * as reduxHooks from 'react-redux'; -describe('useLocationsAPI', () => { +describe('usePrivateLocationsAPI', () => { const dispatch = jest.fn(); const addAPI = jest.spyOn(locationAPI, 'addSyntheticsPrivateLocations').mockResolvedValue({ locations: [], @@ -25,7 +25,7 @@ describe('useLocationsAPI', () => { jest.spyOn(reduxHooks, 'useDispatch').mockReturnValue(dispatch); it('returns expected results', () => { - const { result } = renderHook(() => useLocationsAPI(), { + const { result } = renderHook(() => usePrivateLocationsAPI(), { wrapper: WrappedHelper, }); @@ -46,7 +46,7 @@ describe('useLocationsAPI', () => { ], }); it('returns expected results after data', async () => { - const { result, waitForNextUpdate } = renderHook(() => useLocationsAPI(), { + const { result, waitForNextUpdate } = renderHook(() => usePrivateLocationsAPI(), { wrapper: WrappedHelper, }); @@ -73,7 +73,7 @@ describe('useLocationsAPI', () => { }); it('adds location on submit', async () => { - const { result, waitForNextUpdate } = renderHook(() => useLocationsAPI(), { + const { result, waitForNextUpdate } = renderHook(() => usePrivateLocationsAPI(), { wrapper: WrappedHelper, }); @@ -109,7 +109,7 @@ describe('useLocationsAPI', () => { }); it('deletes location on delete', async () => { - const { result, waitForNextUpdate } = renderHook(() => useLocationsAPI(), { + const { result, waitForNextUpdate } = renderHook(() => usePrivateLocationsAPI(), { wrapper: WrappedHelper, }); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts index 8678328445a62..64b1060e43006 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts @@ -17,7 +17,7 @@ import { } from '../../../../state/private_locations/api'; import { PrivateLocation } from '../../../../../../../common/runtime_types'; -export const useLocationsAPI = () => { +export const usePrivateLocationsAPI = () => { const [formData, setFormData] = useState(); const [deleteId, setDeleteId] = useState(); const [privateLocations, setPrivateLocations] = useState([]); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/location_form.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/location_form.tsx index a001c503697b1..f3bdb8d2fa1df 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/location_form.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/location_form.tsx @@ -46,78 +46,47 @@ export const LocationForm = ({ return ( <> {data?.items.length === 0 && } - - - + { - return privateLocations.some((loc) => loc.label === val) - ? NAME_ALREADY_EXISTS - : undefined; - }, - })} - /> - - - - - - - -

- { - elastic-agent-complete, - link: ( - - - - ), - }} - /> - } -

-
- - - {selectedPolicy?.agents === 0 && ( - + { + return privateLocations.some((loc) => loc.label === val) + ? NAME_ALREADY_EXISTS + : undefined; + }, + })} + /> +
+ + + + + +

{ elastic-agent-complete, link: ( - )} - + + + {selectedPolicy?.agents === 0 && ( + +

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

+
+ )} +
+ ) : null} ); }; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_empty_state.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_empty_state.tsx index 92768f48a83ef..216ae53b04286 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_empty_state.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_empty_state.tsx @@ -15,15 +15,24 @@ import { selectAgentPolicies } from '../../../state/private_locations'; export const ManageEmptyState: FC<{ privateLocations: PrivateLocation[]; hasFleetPermissions: boolean; - setIsAddingNew: (val: boolean) => void; -}> = ({ children, privateLocations, setIsAddingNew, hasFleetPermissions }) => { + setIsAddingNew?: (val: boolean) => void; + showNeedAgentPolicy?: boolean; + showEmptyLocations?: boolean; +}> = ({ + children, + privateLocations, + setIsAddingNew, + hasFleetPermissions, + showNeedAgentPolicy = true, + showEmptyLocations = true, +}) => { const { data: agentPolicies } = useSelector(selectAgentPolicies); - if (agentPolicies?.total === 0) { + if (agentPolicies?.total === 0 && showNeedAgentPolicy) { return ; } - if (privateLocations.length === 0) { + if (privateLocations.length === 0 && showEmptyLocations) { return ; } diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.test.tsx index b4e406353f2a1..484157d3e28a9 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.test.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.test.tsx @@ -21,7 +21,11 @@ jest.mock('../../../contexts/synthetics_settings_context'); describe('', () => { beforeEach(() => { jest.spyOn(permissionsHooks, 'useCanManagePrivateLocation').mockReturnValue(true); - jest.spyOn(locationHooks, 'useLocationsAPI').mockReturnValue({ + jest.spyOn(permissionsHooks, 'useFleetPermissions').mockReturnValue({ + canReadAgentPolicies: true, + canSaveIntegrations: false, + }); + jest.spyOn(locationHooks, 'usePrivateLocationsAPI').mockReturnValue({ formData: {} as PrivateLocation, loading: false, onSubmit: jest.fn(), @@ -120,7 +124,7 @@ describe('', () => { canSaveIntegrations: hasFleetPermissions, canReadAgentPolicies: hasFleetPermissions, }); - jest.spyOn(locationHooks, 'useLocationsAPI').mockReturnValue({ + jest.spyOn(locationHooks, 'usePrivateLocationsAPI').mockReturnValue({ formData: {} as PrivateLocation, loading: false, onSubmit: jest.fn(), diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.tsx index e8246aa13221e..fc199eb4eb235 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/manage_private_locations.tsx @@ -4,15 +4,15 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useEffect } from 'react'; +import React, { useEffect, useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { EuiSpacer } from '@elastic/eui'; import { LoadingState } from '../../monitors_page/overview/overview/monitor_detail_flyout'; import { PrivateLocationsTable } from './locations_table'; -import { useCanManagePrivateLocation } from '../../../hooks'; +import { useCanManagePrivateLocation, useFleetPermissions } from '../../../hooks'; import { ManageEmptyState } from './manage_empty_state'; import { AddLocationFlyout } from './add_location_flyout'; -import { useLocationsAPI } from './hooks/use_locations_api'; +import { usePrivateLocationsAPI } from './hooks/use_locations_api'; import { getAgentPoliciesAction, selectAddingNewPrivateLocation, @@ -26,16 +26,27 @@ export const ManagePrivateLocations = () => { const dispatch = useDispatch(); const isAddingNew = useSelector(selectAddingNewPrivateLocation); - const setIsAddingNew = (val: boolean) => dispatch(setAddingNewPrivateLocation(val)); + const setIsAddingNew = useCallback( + (val: boolean) => dispatch(setAddingNewPrivateLocation(val)), + [dispatch] + ); - const { onSubmit, loading, privateLocations, onDelete, deleteLoading } = useLocationsAPI(); + const { onSubmit, loading, privateLocations, onDelete, deleteLoading } = usePrivateLocationsAPI(); + const { canReadAgentPolicies } = useFleetPermissions(); const canManagePrivateLocation = useCanManagePrivateLocation(); + // make sure flyout is closed when first visiting the page + useEffect(() => { + setIsAddingNew(false); + }, [setIsAddingNew]); + useEffect(() => { - dispatch(getAgentPoliciesAction.get()); + if (canReadAgentPolicies) { + dispatch(getAgentPoliciesAction.get()); + } dispatch(getServiceLocations()); - }, [dispatch]); + }, [dispatch, canReadAgentPolicies]); const handleSubmit = (formData: PrivateLocation) => { onSubmit(formData); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/policy_name.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/policy_name.tsx index 2c44bc80fed36..b176b14619d6e 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/policy_name.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/private_locations/policy_name.tsx @@ -43,11 +43,15 @@ export const PolicyName = ({ agentPolicyId }: { agentPolicyId: string }) => { ) : ( agentPolicyId )} -     - - {AGENTS_LABEL} - {policy?.agents} - + {canReadAgentPolicies && ( + <> +     + + {AGENTS_LABEL} + {policy?.agents} + + + )}
); }; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx index 2cc4002910de1..d03b70d94768c 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx @@ -52,11 +52,9 @@ describe('useLocationName', () => { { wrapper: WrapperWithState } ); expect(result.current).toEqual({ - geo: { lat: 41.25, lon: -95.86 }, id: 'us_central', isServiceManaged: true, label: 'US Central', - status: 'ga', url: 'mockUrl', }); }); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/state/index.ts b/x-pack/plugins/synthetics/public/apps/synthetics/state/index.ts index 84d11cdfa1b75..09af66556532e 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/state/index.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/state/index.ts @@ -18,3 +18,4 @@ export * from './monitor_details'; export * from './overview'; export * from './browser_journey'; export * from './ping_status'; +export * from './private_locations'; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx index 2faf26be23b62..c1c9d6072a404 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx @@ -16,7 +16,7 @@ import { import { Router } from 'react-router-dom'; import { Route } from '@kbn/shared-ux-router'; -import { merge } from 'lodash'; +import { merge, mergeWith } from 'lodash'; import { createMemoryHistory, History } from 'history'; import { CoreStart } from '@kbn/core/public'; import { I18nProvider } from '@kbn/i18n-react'; @@ -227,7 +227,11 @@ export function WrappedHelper({ path, history = createMemoryHistory(), }: RenderRouterOptions & { children: ReactElement; useRealStore?: boolean }) { - const testState: AppState = merge({}, mockState, state); + const testState: AppState = mergeWith({}, mockState, state, (objValue, srcValue) => { + if (Array.isArray(objValue)) { + return srcValue; + } + }); if (url) { history = getHistoryFromUrl(url); diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.test.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.test.tsx index 736c987a37351..91ed400d3bf80 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.test.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.test.tsx @@ -8,11 +8,11 @@ import { renderHook } from '@testing-library/react-hooks'; import { defaultCore, WrappedHelper } from '../../../../../apps/synthetics/utils/testing'; -import { useLocationsAPI } from './use_locations_api'; +import { usePrivateLocationsAPI } from './use_locations_api'; -describe('useLocationsAPI', () => { +describe('usePrivateLocationsAPI', () => { it('returns expected results', () => { - const { result } = renderHook(() => useLocationsAPI({ isOpen: false }), { + const { result } = renderHook(() => usePrivateLocationsAPI({ isOpen: false }), { wrapper: WrappedHelper, }); @@ -38,9 +38,12 @@ describe('useLocationsAPI', () => { }, }); it('returns expected results after data', async () => { - const { result, waitForNextUpdate } = renderHook(() => useLocationsAPI({ isOpen: true }), { - wrapper: WrappedHelper, - }); + const { result, waitForNextUpdate } = renderHook( + () => usePrivateLocationsAPI({ isOpen: true }), + { + wrapper: WrappedHelper, + } + ); expect(result.current).toEqual( expect.objectContaining({ @@ -65,9 +68,12 @@ describe('useLocationsAPI', () => { }); it('adds location on submit', async () => { - const { result, waitForNextUpdate } = renderHook(() => useLocationsAPI({ isOpen: true }), { - wrapper: WrappedHelper, - }); + const { result, waitForNextUpdate } = renderHook( + () => usePrivateLocationsAPI({ isOpen: true }), + { + wrapper: WrappedHelper, + } + ); await waitForNextUpdate(); @@ -121,9 +127,12 @@ describe('useLocationsAPI', () => { }, }); - const { result, waitForNextUpdate } = renderHook(() => useLocationsAPI({ isOpen: true }), { - wrapper: WrappedHelper, - }); + const { result, waitForNextUpdate } = renderHook( + () => usePrivateLocationsAPI({ isOpen: true }), + { + wrapper: WrappedHelper, + } + ); await waitForNextUpdate(); diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.ts b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.ts index c3dfa118a0bc6..caa603f5db6b5 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/hooks/use_locations_api.ts @@ -14,7 +14,7 @@ import { getSyntheticsPrivateLocations, } from '../../../../state/private_locations/api'; -export const useLocationsAPI = ({ isOpen }: { isOpen: boolean }) => { +export const usePrivateLocationsAPI = ({ isOpen }: { isOpen: boolean }) => { const [formData, setFormData] = useState(); const [deleteId, setDeleteId] = useState(); const [privateLocations, setPrivateLocations] = useState([]); diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/location_form.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/location_form.tsx index a15629a99e3d9..99aa2f6f8e1d5 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/location_form.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/location_form.tsx @@ -67,7 +67,7 @@ export const LocationForm = ({ { elastic-agent-complete, link: ( diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/manage_locations_flyout.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/manage_locations_flyout.tsx index 805097312d4e8..870f96190c9f1 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/manage_locations_flyout.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/manage_locations/manage_locations_flyout.tsx @@ -27,7 +27,7 @@ import { AddLocationFlyout } from './add_location_flyout'; import { ClientPluginsStart } from '../../../../plugin'; import { getServiceLocations } from '../../../state/actions'; import { PrivateLocationsList } from './locations_list'; -import { useLocationsAPI } from './hooks/use_locations_api'; +import { usePrivateLocationsAPI } from './hooks/use_locations_api'; import { getAgentPoliciesAction, selectAddingNewPrivateLocation, @@ -49,7 +49,7 @@ export const ManageLocationsFlyout = () => { const setIsAddingNew = (val: boolean) => dispatch(setAddingNewPrivateLocation(val)); - const { onSubmit, loading, privateLocations, onDelete } = useLocationsAPI({ + const { onSubmit, loading, privateLocations, onDelete } = usePrivateLocationsAPI({ isOpen, }); From c875a284af465287dd3ba49b431086d4befac0e4 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Fri, 10 Mar 2023 22:22:19 -0500 Subject: [PATCH 11/12] [Response Ops][Alerting] Delete `unrecognized` tasks when enabling a rule (#152975) --- .../rules_client/methods/bulk_enable.ts | 18 +- .../server/rules_client/methods/enable.ts | 10 +- .../rules_client/tests/bulk_enable.test.ts | 242 +++++++++++++++++- .../server/rules_client/tests/enable.test.ts | 47 ++++ .../alerting/server/rules_client/tests/lib.ts | 17 ++ .../alerting/group4/scheduled_task_id.ts | 32 +++ .../rules_scheduled_task_id/data.json | 77 +++++- 7 files changed, 435 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts index 4ce189c6caca6..03643ccc02ac2 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts @@ -10,7 +10,7 @@ import { KueryNode, nodeBuilder } from '@kbn/es-query'; import { SavedObjectsBulkUpdateObject } from '@kbn/core/server'; import { withSpan } from '@kbn/apm-utils'; import { Logger } from '@kbn/core/server'; -import { TaskManagerStartContract } from '@kbn/task-manager-plugin/server'; +import { TaskManagerStartContract, TaskStatus } from '@kbn/task-manager-plugin/server'; import { RawRule, IntervalSchedule } from '../../types'; import { convertRuleIdsToKueryNode } from '../../lib'; import { ruleAuditEvent, RuleAuditAction } from '../common/audit_events'; @@ -36,10 +36,18 @@ const getShouldScheduleTask = async ( if (!scheduledTaskId) return true; try { // make sure scheduledTaskId exist - await withSpan({ name: 'getShouldScheduleTask', type: 'rules' }, () => - context.taskManager.get(scheduledTaskId) - ); - return false; + return await withSpan({ name: 'getShouldScheduleTask', type: 'rules' }, async () => { + const task = await context.taskManager.get(scheduledTaskId); + + // Check whether task status is unrecognized. If so, we want to delete + // this task and create a fresh one + if (task.status === TaskStatus.Unrecognized) { + await context.taskManager.removeIfExists(scheduledTaskId); + return true; + } + + return false; + }); } catch (err) { return true; } diff --git a/x-pack/plugins/alerting/server/rules_client/methods/enable.ts b/x-pack/plugins/alerting/server/rules_client/methods/enable.ts index 1aee25fa5adbc..6e93dee530665 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/enable.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/enable.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { TaskStatus } from '@kbn/task-manager-plugin/server'; import { RawRule, IntervalSchedule } from '../../types'; import { resetMonitoringLastRun, getNextRun } from '../../lib'; import { WriteOperations, AlertingAuthorizationEntity } from '../../authorization'; @@ -110,7 +111,14 @@ async function enableWithOCC(context: RulesClientContext, { id }: { id: string } if (attributes.scheduledTaskId) { // If scheduledTaskId defined in rule SO, make sure it exists try { - await context.taskManager.get(attributes.scheduledTaskId); + const task = await context.taskManager.get(attributes.scheduledTaskId); + + // Check whether task status is unrecognized. If so, we want to delete + // this task and create a fresh one + if (task.status === TaskStatus.Unrecognized) { + await context.taskManager.removeIfExists(attributes.scheduledTaskId); + scheduledTaskIdToCreate = id; + } } catch (err) { scheduledTaskIdToCreate = id; } diff --git a/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts index eaa302e41ac85..0aeca36a2b458 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts @@ -30,6 +30,7 @@ import { returnedRule1, returnedRule2, } from './test_helpers'; +import { TaskStatus } from '@kbn/task-manager-plugin/server'; jest.mock('../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation', () => ({ bulkMarkApiKeysForInvalidation: jest.fn(), @@ -379,7 +380,7 @@ describe('bulkEnableRules', () => { }); describe('taskManager', () => { - test('should return task id if deleting task failed', async () => { + test('should return task id if enabling task failed', async () => { unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ saved_objects: [enabledRule1, enabledRule2], }); @@ -487,6 +488,245 @@ describe('bulkEnableRules', () => { ); expect(logger.error).toBeCalledTimes(0); }); + + test('should schedule task when scheduledTaskId is defined but task with that ID does not', async () => { + // One rule gets the task successfully, one rule doesn't so only one task should be scheduled + taskManager.get.mockRejectedValueOnce(new Error('Failed to get task!')); + taskManager.schedule.mockResolvedValueOnce({ + id: 'id1', + taskType: 'alerting:fakeType', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ + saved_objects: [enabledRule1, enabledRule2], + }); + + const result = await rulesClient.bulkEnableRules({ ids: ['id1', 'id2'] }); + + expect(taskManager.schedule).toHaveBeenCalledTimes(1); + expect(taskManager.schedule).toHaveBeenCalledWith({ + id: 'id1', + taskType: `alerting:fakeType`, + params: { + alertId: 'id1', + spaceId: 'default', + consumer: 'fakeConsumer', + }, + schedule: { + interval: '5m', + }, + enabled: true, + state: { + alertInstances: {}, + alertTypeState: {}, + previousStartedAt: null, + }, + scope: ['alerting'], + }); + + expect(unsecuredSavedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.bulkCreate).toHaveBeenCalledWith( + expect.arrayContaining([ + expect.objectContaining({ + id: 'id1', + attributes: expect.objectContaining({ + enabled: true, + }), + }), + expect.objectContaining({ + id: 'id2', + attributes: expect.objectContaining({ + enabled: true, + }), + }), + ]), + { overwrite: true } + ); + + expect(result).toStrictEqual({ + errors: [], + rules: [returnedRule1, returnedRule2], + total: 2, + taskIdsFailedToBeEnabled: [], + }); + }); + + test('should schedule task when scheduledTaskId is not defined', async () => { + encryptedSavedObjects.createPointInTimeFinderDecryptedAsInternalUser = jest + .fn() + .mockResolvedValueOnce({ + close: jest.fn(), + find: function* asyncGenerator() { + yield { + saved_objects: [ + { + ...disabledRule1, + attributes: { ...disabledRule1.attributes, scheduledTaskId: null }, + }, + disabledRule2, + ], + }; + }, + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'id1', + taskType: 'alerting:fakeType', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ + saved_objects: [enabledRule1, enabledRule2], + }); + const result = await rulesClient.bulkEnableRules({ ids: ['id1', 'id2'] }); + + expect(taskManager.schedule).toHaveBeenCalledTimes(1); + expect(taskManager.schedule).toHaveBeenCalledWith({ + id: 'id1', + taskType: `alerting:fakeType`, + params: { + alertId: 'id1', + spaceId: 'default', + consumer: 'fakeConsumer', + }, + schedule: { + interval: '5m', + }, + enabled: true, + state: { + alertInstances: {}, + alertTypeState: {}, + previousStartedAt: null, + }, + scope: ['alerting'], + }); + + expect(unsecuredSavedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.bulkCreate).toHaveBeenCalledWith( + expect.arrayContaining([ + expect.objectContaining({ + id: 'id1', + attributes: expect.objectContaining({ + enabled: true, + }), + }), + expect.objectContaining({ + id: 'id2', + attributes: expect.objectContaining({ + enabled: true, + }), + }), + ]), + { overwrite: true } + ); + + expect(result).toStrictEqual({ + errors: [], + rules: [returnedRule1, returnedRule2], + total: 2, + taskIdsFailedToBeEnabled: [], + }); + }); + + test('should schedule task when task with scheduledTaskId exists but is unrecognized', async () => { + taskManager.get.mockResolvedValueOnce({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Unrecognized, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: { + alertId: '1', + }, + ownerId: null, + enabled: false, + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'id1', + taskType: 'alerting:fakeType', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ + saved_objects: [enabledRule1, enabledRule2], + }); + + const result = await rulesClient.bulkEnableRules({ ids: ['id1', 'id2'] }); + + expect(taskManager.removeIfExists).toHaveBeenCalledTimes(1); + expect(taskManager.removeIfExists).toHaveBeenCalledWith('id1'); + expect(taskManager.schedule).toHaveBeenCalledTimes(1); + expect(taskManager.schedule).toHaveBeenCalledWith({ + id: 'id1', + taskType: `alerting:fakeType`, + params: { + alertId: 'id1', + spaceId: 'default', + consumer: 'fakeConsumer', + }, + schedule: { + interval: '5m', + }, + enabled: true, + state: { + alertInstances: {}, + alertTypeState: {}, + previousStartedAt: null, + }, + scope: ['alerting'], + }); + + expect(unsecuredSavedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.bulkCreate).toHaveBeenCalledWith( + expect.arrayContaining([ + expect.objectContaining({ + id: 'id1', + attributes: expect.objectContaining({ + enabled: true, + }), + }), + expect.objectContaining({ + id: 'id2', + attributes: expect.objectContaining({ + enabled: true, + }), + }), + ]), + { overwrite: true } + ); + + expect(result).toStrictEqual({ + errors: [], + rules: [returnedRule1, returnedRule2], + total: 2, + taskIdsFailedToBeEnabled: [], + }); + }); }); describe('auditLogger', () => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts index 9cb6c356edaed..13826b720fa76 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts @@ -536,6 +536,53 @@ describe('enable()', () => { }); }); + test('schedules task when task with scheduledTaskId exists but is unrecognized', async () => { + taskManager.schedule.mockResolvedValueOnce({ + id: '1', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + taskManager.get.mockResolvedValue({ ...mockTask, status: TaskStatus.Unrecognized }); + await rulesClient.enable({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(2); + expect(taskManager.bulkEnable).not.toHaveBeenCalled(); + expect(taskManager.removeIfExists).toHaveBeenCalledWith('task-123'); + expect(taskManager.schedule).toHaveBeenCalledWith({ + id: '1', + taskType: `alerting:myType`, + params: { + alertId: '1', + spaceId: 'default', + consumer: 'myApp', + }, + schedule: { + interval: '10s', + }, + enabled: true, + state: { + alertInstances: {}, + alertTypeState: {}, + previousStartedAt: null, + }, + scope: ['alerting'], + }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenNthCalledWith(2, 'alert', '1', { + scheduledTaskId: '1', + }); + }); + test('throws error when scheduling task fails', async () => { encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce({ ...existingRule, diff --git a/x-pack/plugins/alerting/server/rules_client/tests/lib.ts b/x-pack/plugins/alerting/server/rules_client/tests/lib.ts index 7a17c2dc105ad..6328708f4bae0 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/lib.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/lib.ts @@ -9,6 +9,7 @@ import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { IEventLogClient } from '@kbn/event-log-plugin/server'; import { actionsClientMock } from '@kbn/actions-plugin/server/mocks'; import { eventLogClientMock } from '@kbn/event-log-plugin/server/mocks'; +import { TaskStatus } from '@kbn/task-manager-plugin/server'; import { ConstructorOptions } from '../rules_client'; import { RuleTypeRegistry } from '../../rule_type_registry'; import { RecoveredActionGroup } from '../../../common'; @@ -51,6 +52,22 @@ export function getBeforeSetup( rulesClientParams.createAPIKey.mockResolvedValue({ apiKeysEnabled: false }); rulesClientParams.getUserName.mockResolvedValue('elastic'); taskManager.runSoon.mockResolvedValue({ id: '' }); + taskManager.get.mockResolvedValue({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: { + alertId: '1', + }, + ownerId: null, + enabled: false, + }); taskManager.bulkRemoveIfExist.mockResolvedValue({ statuses: [{ id: 'taskId', type: 'alert', success: true }], }); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/scheduled_task_id.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/scheduled_task_id.ts index d8570564d32d2..b7ad0e47947e1 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/scheduled_task_id.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/scheduled_task_id.ts @@ -23,6 +23,7 @@ export default function createScheduledTaskIdTests({ getService }: FtrProviderCo const supertest = getService('supertest'); const supertestWithoutAuth = getService('supertestWithoutAuth'); const esArchiver = getService('esArchiver'); + const retry = getService('retry'); describe('scheduled task id', () => { const objectRemover = new ObjectRemover(supertest); @@ -116,5 +117,36 @@ export default function createScheduledTaskIdTests({ getService }: FtrProviderCo }); expect(taskRecord.task.enabled).to.eql(true); }); + + it('deletes associated task for rule if task is unrecognized', async () => { + const RULE_ID = '46be60d4-ae63-48ed-ab6f-f4d9b4defacf'; + // We've archived a disabled rule with a scheduled task ID that references + // a task with a removed task type. Task manager will mark the task as unrecognized. + // When we enable the rule, the unrecognized task should be removed and a new + // task created in its place + + // scheduled task should exist and be unrecognized + await retry.try(async () => { + const taskRecordLoaded = await getScheduledTask(RULE_ID); + expect(taskRecordLoaded.task.status).to.equal('unrecognized'); + }); + + // enable the rule + await supertestWithoutAuth + .post(`${getUrlPrefix(``)}/api/alerting/rule/${RULE_ID}/_enable`) + .set('kbn-xsrf', 'foo'); + await retry.try(async () => { + const response = await supertestWithoutAuth.get( + `${getUrlPrefix(``)}/api/alerting/rule/${RULE_ID}` + ); + + expect(response.status).to.eql(200); + expect(response.body.enabled).to.be(true); + }); + + // new scheduled task should exist with ID and status should not be unrecognized + const newTaskRecordLoaded = await getScheduledTask(RULE_ID); + expect(newTaskRecordLoaded.task.status).not.to.equal('unrecognized'); + }); }); } diff --git a/x-pack/test/functional/es_archives/rules_scheduled_task_id/data.json b/x-pack/test/functional/es_archives/rules_scheduled_task_id/data.json index 159380a281de5..25032f09eeb51 100644 --- a/x-pack/test/functional/es_archives/rules_scheduled_task_id/data.json +++ b/x-pack/test/functional/es_archives/rules_scheduled_task_id/data.json @@ -71,4 +71,79 @@ "updated_at": "2021-11-05T16:21:37.629Z" } } -} \ No newline at end of file +} + +{ + "type": "doc", + "value": { + "id": "alert:46be60d4-ae63-48ed-ab6f-f4d9b4defacf", + "index": ".kibana_1", + "source": { + "alert": { + "actions": [ + ], + "alertTypeId": "example.always-firing", + "apiKey": "QIUT8u0/kbOakEHSj50jDpVR90MrqOxanEscboYOoa8PxQvcA5jfHash+fqH3b+KNjJ1LpnBcisGuPkufY9j1e32gKzwGZV5Bfys87imHvygJvIM8uKiFF8bQ8Y4NTaxOJO9fAmZPrFy07ZcQMCAQz+DUTgBFqs=", + "apiKeyOwner": "elastic", + "consumer": "alerts", + "createdAt": "2020-06-17T15:35:38.497Z", + "createdBy": "elastic", + "enabled": false, + "muteAll": false, + "mutedInstanceIds": [ + ], + "name": "always-firing-alert", + "params": { + }, + "schedule": { + "interval": "1m" + }, + "scheduledTaskId": "46be60d4-ae63-48ed-ab6f-f4d9b4defacf", + "tags": [ + ], + "throttle": null, + "updatedBy": "elastic" + }, + "migrationVersion": { + "alert": "7.16.0" + }, + "references": [ + ], + "type": "alert", + "updated_at": "2020-06-17T15:35:39.839Z" + } + } +} + +{ + "type": "doc", + "value": { + "id": "task:46be60d4-ae63-48ed-ab6f-f4d9b4defacf", + "index": ".kibana_task_manager_1", + "source": { + "migrationVersion": { + "task": "7.16.0" + }, + "task": { + "attempts": 0, + "ownerId": null, + "params": "{\"alertId\":\"46be60d4-ae63-48ed-ab6f-f4d9b4defacf\",\"spaceId\":\"default\"}", + "retryAt": null, + "runAt": "2021-11-05T16:21:52.148Z", + "schedule": { + "interval": "1m" + }, + "scheduledAt": "2021-11-05T15:28:42.055Z", + "scope": [ + "alerting" + ], + "startedAt": null, + "status": "idle", + "taskType": "sampleTaskRemovedType" + }, + "references": [], + "type": "task", + "updated_at": "2021-11-05T16:21:37.629Z" + } + } +} From f4e6ef75be9d34eb0776038a4d701d2a03fe5221 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sat, 11 Mar 2023 00:59:15 -0500 Subject: [PATCH 12/12] [api-docs] 2023-03-11 Daily api_docs build (#153153) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/273 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 45 +- api_docs/alerting.mdx | 4 +- api_docs/apm.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_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.devdocs.json | 134 ++++- api_docs/content_management.mdx | 7 +- 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/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/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 +- api_docs/kbn_alerts.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.devdocs.json | 24 + 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 +- .../kbn_apm_synthtrace_client.devdocs.json | 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 +- .../kbn_content_management_table_list.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 +- ...core_saved_objects_api_server_internal.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_internal.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_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_datemath.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_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.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_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_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_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_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_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.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_react_field.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_rison.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- ...bn_security_solution_side_nav.devdocs.json | 524 ++++++++++++++++++ api_docs/kbn_security_solution_side_nav.mdx | 36 ++ ...ity_solution_storybook_config.devdocs.json | 62 +++ ...kbn_security_solution_storybook_config.mdx | 30 + .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- ...kbn_securitysolution_grouping.devdocs.json | 4 +- 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_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_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_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_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_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/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/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 14 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.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.devdocs.json | 32 ++ api_docs/security.mdx | 4 +- api_docs/security_solution.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/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.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 +- 491 files changed, 1368 insertions(+), 508 deletions(-) create mode 100644 api_docs/kbn_security_solution_side_nav.devdocs.json create mode 100644 api_docs/kbn_security_solution_side_nav.mdx create mode 100644 api_docs/kbn_security_solution_storybook_config.devdocs.json create mode 100644 api_docs/kbn_security_solution_storybook_config.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 30349abe412bd..a7242b7ca8677 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-03-10 +date: 2023-03-11 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 ad378d396b996..5b2d0ca604946 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-03-10 +date: 2023-03-11 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 88165bbe0282f..f2526d0664621 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 4cfb55b465603..c2c9a1adee6bf 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -99,7 +99,7 @@ "section": "def-common.RuleLastRun", "text": "RuleLastRun" }, - " | null | undefined; nextRun?: Date | null | undefined; running?: boolean | null | undefined; viewInAppRelativeUrl?: string | undefined; }" + " | null | undefined; nextRun?: Date | null | undefined; revision: number; running?: boolean | null | undefined; viewInAppRelativeUrl?: string | undefined; }" ], "path": "x-pack/plugins/alerting/public/alert_navigation_registry/types.ts", "deprecated": false, @@ -1297,6 +1297,21 @@ "path": "x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "alerting", + "id": "def-server.BulkEditOptionsFilter.shouldIncrementRevision", + "type": "Function", + "tags": [], + "label": "shouldIncrementRevision", + "description": [], + "signature": [ + "ShouldIncrementRevision", + " | undefined" + ], + "path": "x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1371,6 +1386,21 @@ "path": "x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "alerting", + "id": "def-server.BulkEditOptionsIds.shouldIncrementRevision", + "type": "Function", + "tags": [], + "label": "shouldIncrementRevision", + "description": [], + "signature": [ + "ShouldIncrementRevision", + " | undefined" + ], + "path": "x-pack/plugins/alerting/server/rules_client/methods/bulk_edit.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -6612,6 +6642,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "alerting", + "id": "def-common.Rule.revision", + "type": "number", + "tags": [], + "label": "revision", + "description": [], + "path": "x-pack/plugins/alerting/common/rule.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "alerting", "id": "def-common.Rule.running", @@ -8861,7 +8902,7 @@ "section": "def-common.RuleLastRun", "text": "RuleLastRun" }, - " | null | undefined; nextRun?: Date | null | undefined; running?: boolean | null | undefined; viewInAppRelativeUrl?: string | undefined; }" + " | null | undefined; nextRun?: Date | null | undefined; revision: number; running?: boolean | null | undefined; viewInAppRelativeUrl?: string | undefined; }" ], "path": "x-pack/plugins/alerting/common/rule.ts", "deprecated": false, diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index d5860c6cf2e05..6280fee004533 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 531 | 1 | 515 | 40 | +| 534 | 1 | 518 | 41 | ## Client diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 7f54327337a9d..942937093c640 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 361b784fecaa9..7558ffe165bc2 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-03-10 +date: 2023-03-11 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 d43d9a821f234..ea7c9b619eda9 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-03-10 +date: 2023-03-11 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 5b469de2060ad..5475390eb0c0f 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-03-10 +date: 2023-03-11 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 ad5747518bbbb..57e21e59c2fbd 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-03-10 +date: 2023-03-11 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 14c16cadcda98..8c6a7bf3cac86 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-03-10 +date: 2023-03-11 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 1d9da8cdd9c46..79ba0cd7ff5d8 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-03-10 +date: 2023-03-11 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 ab8178905a5a1..2f4ab0e6adf55 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 5b7d631d9cdf3..dd588d46fc014 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-03-10 +date: 2023-03-11 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 fe527aa258bcb..326fe4798d98b 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-03-10 +date: 2023-03-11 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 6e81737321c12..2e0059b3e5da4 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-03-10 +date: 2023-03-11 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 3457f8e396a02..a4b3cbff94d08 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-03-10 +date: 2023-03-11 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 28b3b4560c570..365f36fdc1512 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.devdocs.json b/api_docs/content_management.devdocs.json index 0b70a55a41998..a42ebaac30398 100644 --- a/api_docs/content_management.devdocs.json +++ b/api_docs/content_management.devdocs.json @@ -51,7 +51,7 @@ "section": "def-common.GetIn", "text": "GetIn" }, - ", O = unknown>(input: I) => { queryKey: readonly [string, string]; queryFn: () => Promise; }; search: , O = unknown>(_input: I) => { queryKey: readonly [string, string]; queryFn: () => Promise; }; search: , O = unknown>(input: I) => { queryKey: readonly [string, \"search\", unknown]; queryFn: () => Promise; }; }" + ", O = unknown>(_input: I) => { queryKey: readonly [string, \"search\", unknown]; queryFn: () => Promise; }; }" ], "path": "src/plugins/content_management/public/content_client/content_client.tsx", "deprecated": false, @@ -108,6 +108,21 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "contentManagement", + "id": "def-public.ContentClient.Unnamed.$2", + "type": "Object", + "tags": [], + "label": "contentTypeRegistry", + "description": [], + "signature": [ + "ContentTypeRegistry" + ], + "path": "src/plugins/content_management/public/content_client/content_client.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true } ], "returnComment": [] @@ -1666,6 +1681,20 @@ "path": "src/plugins/content_management/server/core/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "contentManagement", + "id": "def-server.StorageContext.version", + "type": "Object", + "tags": [], + "label": "version", + "description": [], + "signature": [ + "{ request: `v${number}`; latest: `v${number}`; }" + ], + "path": "src/plugins/content_management/server/core/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1767,6 +1796,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "contentManagement", + "id": "def-common.BulkGetIn.version", + "type": "Uncategorized", + "tags": [], + "label": "version", + "description": [], + "signature": [ + "`v${number}` | undefined" + ], + "path": "src/plugins/content_management/common/rpc/bulk_get.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "contentManagement", "id": "def-common.BulkGetIn.options", @@ -1833,6 +1876,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "contentManagement", + "id": "def-common.CreateIn.version", + "type": "Uncategorized", + "tags": [], + "label": "version", + "description": [], + "signature": [ + "`v${number}` | undefined" + ], + "path": "src/plugins/content_management/common/rpc/create.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "contentManagement", "id": "def-common.CreateIn.options", @@ -1896,6 +1953,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "contentManagement", + "id": "def-common.DeleteIn.version", + "type": "Uncategorized", + "tags": [], + "label": "version", + "description": [], + "signature": [ + "`v${number}` | undefined" + ], + "path": "src/plugins/content_management/common/rpc/delete.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "contentManagement", "id": "def-common.DeleteIn.options", @@ -1959,6 +2030,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "contentManagement", + "id": "def-common.GetIn.version", + "type": "Uncategorized", + "tags": [], + "label": "version", + "description": [], + "signature": [ + "`v${number}` | undefined" + ], + "path": "src/plugins/content_management/common/rpc/get.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "contentManagement", "id": "def-common.GetIn.options", @@ -2083,6 +2168,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "contentManagement", + "id": "def-common.SearchIn.version", + "type": "Uncategorized", + "tags": [], + "label": "version", + "description": [], + "signature": [ + "`v${number}` | undefined" + ], + "path": "src/plugins/content_management/common/rpc/search.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "contentManagement", "id": "def-common.SearchIn.options", @@ -2160,6 +2259,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "contentManagement", + "id": "def-common.UpdateIn.version", + "type": "Uncategorized", + "tags": [], + "label": "version", + "description": [], + "signature": [ + "`v${number}` | undefined" + ], + "path": "src/plugins/content_management/common/rpc/update.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "contentManagement", "id": "def-common.UpdateIn.options", @@ -2224,24 +2337,23 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false - } - ], - "objects": [ + }, { "parentPluginId": "contentManagement", - "id": "def-common.procedureNames", - "type": "Object", + "id": "def-common.Version", + "type": "Type", "tags": [], - "label": "procedureNames", + "label": "Version", "description": [], "signature": [ - "readonly [\"get\", \"bulkGet\", \"create\", \"update\", \"delete\", \"search\"]" + "`v${number}`" ], - "path": "src/plugins/content_management/common/rpc/constants.ts", + "path": "src/plugins/content_management/common/types.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false } - ] + ], + "objects": [] } } \ No newline at end of file diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 14817b7e7c194..85ce45a4d8392 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 110 | 0 | 96 | 3 | +| 118 | 0 | 104 | 4 | ## Client @@ -56,9 +56,6 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh ## Common -### Objects - - ### Interfaces diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 1b30f08a0834f..ce6b682ba8bd0 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-03-10 +date: 2023-03-11 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 af08cd66cb9eb..d7f8488dd9c1b 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-03-10 +date: 2023-03-11 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 8081c76755bee..3635549de24a6 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-03-10 +date: 2023-03-11 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 fdb7a920dbc7f..a12231f2cfe0a 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-03-10 +date: 2023-03-11 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 50880b2250eae..f2cbcd0f5aa10 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-03-10 +date: 2023-03-11 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 60070caafe170..24111766e9a12 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-03-10 +date: 2023-03-11 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 289af4cd2c54a..7fa209ebe5384 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-03-10 +date: 2023-03-11 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 2bb7d82695f54..70b2429d5feec 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-03-10 +date: 2023-03-11 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 c699a4e05bdba..c5f9c0b1b614d 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-03-10 +date: 2023-03-11 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 2c8e71607b877..544307ed78461 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-03-10 +date: 2023-03-11 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 6939c6ee3a366..f83222467fbf8 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-03-10 +date: 2023-03-11 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 04fd8a50bc454..3e3e8fe92e179 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-03-10 +date: 2023-03-11 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 4b3edcaaad39c..32a6d91558f6b 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 934b2bcb8f990..e03e9fa43bb3d 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0741eab40ca8e..0440f3be133d2 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 630abe0b00709..0993c2fe9f103 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-03-10 +date: 2023-03-11 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 795e546c70a58..fda78093529c6 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-03-10 +date: 2023-03-11 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 a85eebe798b65..07b11b7acaf6f 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-03-10 +date: 2023-03-11 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 a02090f642d40..fb6416c0bdc78 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index dcdd7961fc96d..8f5791022f8ca 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-03-10 +date: 2023-03-11 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 5dd8b392502f6..bf7a9f373ad61 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-03-10 +date: 2023-03-11 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 8e26eaa7b7ae0..59b126d827eaf 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-03-10 +date: 2023-03-11 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 e981f09eec8cf..809fca8fe0178 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-03-10 +date: 2023-03-11 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 c8b666bc3e4e0..671f5a8cf24e3 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-03-10 +date: 2023-03-11 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 abd898a5da057..48680d1f42d3f 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-03-10 +date: 2023-03-11 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 4b05724b5e175..8ef1e6087c0aa 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index ddaa4093fe09c..c1faec180512c 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-03-10 +date: 2023-03-11 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 b0fd13dd27206..2c355bbb6ff48 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-03-10 +date: 2023-03-11 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 d19fdb4e098af..1ddbf900f2440 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-03-10 +date: 2023-03-11 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 7ee169c958645..2bd2f71aa9a5a 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-03-10 +date: 2023-03-11 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 6d58c7f8e17e9..76d5856cf86f9 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-03-10 +date: 2023-03-11 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 a4111244ce827..7c37dba5ae5ea 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-03-10 +date: 2023-03-11 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 4904e96b77fc9..05118a173494a 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-03-10 +date: 2023-03-11 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 7487a5f0d568c..a5c6cf6f036aa 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-03-10 +date: 2023-03-11 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 0a1c15ad9cf92..1aba4b43d3226 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-03-10 +date: 2023-03-11 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 7d248b5d987ab..dc41c4edf9f44 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-03-10 +date: 2023-03-11 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 f5e06b6fc04db..0805da4c0d2d5 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-03-10 +date: 2023-03-11 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 d720bb71ec5e5..d28d5484f4fbd 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-03-10 +date: 2023-03-11 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 25d9b4688908b..c498f3aeba64e 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-03-10 +date: 2023-03-11 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 3619424457a40..fb19c12b3263f 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-03-10 +date: 2023-03-11 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 b01cfb33b9487..694054ffff466 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-03-10 +date: 2023-03-11 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 1f355f05636f6..f3240bb3d7c7e 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-03-10 +date: 2023-03-11 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 28e5ee95941b8..d858adde2970c 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-03-10 +date: 2023-03-11 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 8ced4e9f7d176..a69f2ce1c9574 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-03-10 +date: 2023-03-11 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 74035fc23dcdb..a292bc85ae2c6 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-03-10 +date: 2023-03-11 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 b21336cd964a2..f7362579a4b1d 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-03-10 +date: 2023-03-11 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 44c99b313b85c..adf0a4b398a39 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-03-10 +date: 2023-03-11 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 e9b9bd4c807e5..d7f4e0ead6464 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-03-10 +date: 2023-03-11 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 ff5e1e7e51f76..1ce590cd463f9 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-03-10 +date: 2023-03-11 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 5378fe05881de..bc19b987de350 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-03-10 +date: 2023-03-11 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 393a664616ba9..30d713a85e534 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-03-10 +date: 2023-03-11 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 aefd82469ae33..c174bbb60fa4b 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-03-10 +date: 2023-03-11 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 142e6d2b0f61e..187233e0ae3a9 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-03-10 +date: 2023-03-11 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 615d9e89a024a..a6ed98643b670 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-03-10 +date: 2023-03-11 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 4ba7c200d7c53..4eae56c5433be 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-03-10 +date: 2023-03-11 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 3b4285063a03c..ce20dc44f33e3 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-03-10 +date: 2023-03-11 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 cdccc5e21c176..2d346face5675 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-03-10 +date: 2023-03-11 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 2d5e12c47a9c9..9054c1ec7df76 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index 469d5b5f39b0f..d6495fa3c1eea 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2023-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index b6ce1710a6c00..74fb688b7ef70 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-03-10 +date: 2023-03-11 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 263766db3fce5..873f05441caa0 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-03-10 +date: 2023-03-11 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 afcc46bea1ba4..47e5ef2e0c986 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.devdocs.json b/api_docs/kbn_analytics_client.devdocs.json index 0a76e063abadc..bc6531328a4e1 100644 --- a/api_docs/kbn_analytics_client.devdocs.json +++ b/api_docs/kbn_analytics_client.devdocs.json @@ -734,6 +734,18 @@ "plugin": "osquery", "path": "x-pack/plugins/osquery/server/lib/telemetry/sender.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" + }, { "plugin": "@kbn/core-analytics-browser-mocks", "path": "packages/core/analytics/core-analytics-browser-mocks/src/analytics_service.mock.ts" @@ -810,6 +822,14 @@ "plugin": "infra", "path": "x-pack/plugins/infra/public/services/telemetry/telemetry_service.test.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts" + }, { "plugin": "@kbn/core-status-server-internal", "path": "packages/core/status/core-status-server-internal/src/status_service.test.ts" @@ -1232,6 +1252,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/public/plugin.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.ts" + }, { "plugin": "@kbn/core-analytics-browser-mocks", "path": "packages/core/analytics/core-analytics-browser-mocks/src/analytics_service.mock.ts" diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index c8ddfb5c280d5..f141f86108156 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-03-10 +date: 2023-03-11 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 244a3441efbd8..5590f30e4129f 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-03-10 +date: 2023-03-11 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 00f8562c148bb..573e59393a696 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-03-10 +date: 2023-03-11 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 fdea72bf23dcd..c85ecffbef05c 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-03-10 +date: 2023-03-11 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 8762ef49ad4af..aa7a00bd14a31 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-03-10 +date: 2023-03-11 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 65de079da51fd..7cc499c705ca4 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-03-10 +date: 2023-03-11 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 e74e8e2616011..457b2c6a1819d 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-03-10 +date: 2023-03-11 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 d8cfd0a05e836..bcb362214e4a1 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-03-10 +date: 2023-03-11 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.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index 5d07732e93a5a..ec56227258393 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -2355,7 +2355,7 @@ "GeoLocation", "; 'client.geo.region_iso_code': string; 'client.geo.region_name': string; 'client.ip': string; 'cloud.account.id': string; 'cloud.account.name': string; 'cloud.availability_zone': string; 'cloud.machine.type': string; 'cloud.project.id': string; 'cloud.project.name': string; 'cloud.provider': string; 'cloud.region': string; 'cloud.service.name': string; 'container.id': string; 'destination.address': string; 'destination.port': number; 'device.id': string; 'device.manufacturer': string; 'device.model.identifier': string; 'device.model.name': string; 'ecs.version': string; 'error.exception': ", "ApmException", - "[]; 'error.grouping_key': string; 'error.grouping_name': string; 'error.id': string; 'event.ingested': number; 'event.name': string; 'event.outcome': string; 'event.outcome_numeric': number | { sum: number; value_count: number; }; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.id': string; 'faas.name': string; 'faas.trigger.type': string; 'faas.version': string; 'host.architecture': string; 'host.hostname': string; 'host.name': string; 'host.os.full': string; 'host.os.name': string; 'host.os.platform': string; 'host.os.type': string; 'host.os.version': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.name': string; 'kubernetes.pod.uid': string; 'labels.name': string; 'metricset.name': string; 'network.carrier.icc': string; 'network.carrier.mcc': string; 'network.carrier.mnc': string; 'network.carrier.name': string; 'network.connection.subtype': string; 'network.connection.type': string; 'observer.type': string; 'observer.version_major': number; 'observer.version': string; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'session.id': string; 'trace.id': string; 'transaction.aggregation.overflow_count': number; 'transaction.duration.us': number; 'transaction.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'service.environment': string; 'service.framework.name': string; 'service.framework.version': string; 'service.language.name': string; 'service.language.version': string; 'service.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.target.name': string; 'service.target.type': string; 'service.version': string; 'span.action': string; 'span.destination.service.resource': string; 'span.destination.service.response_time.count': number; 'span.destination.service.response_time.sum.us': number; 'span.duration.us': number; 'span.id': string; 'span.name': string; 'span.self_time.count': number; 'span.self_time.sum.us': number; 'span.subtype': string; 'span.type': string; 'transaction.result': string; 'transaction.sampled': true; 'span.links': { trace: { id: string; }; span: { id: string; }; }[]; 'url.original': string; }> & Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; }> & Partial<{ 'metricset.interval': string; 'transaction.duration.summary': string; }>" + "[]; 'error.grouping_key': string; 'error.grouping_name': string; 'error.id': string; 'event.ingested': number; 'event.name': string; 'event.outcome': string; 'event.outcome_numeric': number | { sum: number; value_count: number; }; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.id': string; 'faas.name': string; 'faas.trigger.type': string; 'faas.version': string; 'host.architecture': string; 'host.hostname': string; 'host.name': string; 'host.os.full': string; 'host.os.name': string; 'host.os.platform': string; 'host.os.type': string; 'host.os.version': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.name': string; 'kubernetes.pod.uid': string; 'labels.name': string; 'labels.telemetry_auto_version': string; 'metricset.name': string; 'network.carrier.icc': string; 'network.carrier.mcc': string; 'network.carrier.mnc': string; 'network.carrier.name': string; 'network.connection.subtype': string; 'network.connection.type': string; 'observer.type': string; 'observer.version_major': number; 'observer.version': string; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'session.id': string; 'trace.id': string; 'transaction.aggregation.overflow_count': number; 'transaction.duration.us': number; 'transaction.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'service.environment': string; 'service.framework.name': string; 'service.framework.version': string; 'service.language.name': string; 'service.language.version': string; 'service.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.target.name': string; 'service.target.type': string; 'service.version': string; 'span.action': string; 'span.destination.service.resource': string; 'span.destination.service.response_time.count': number; 'span.destination.service.response_time.sum.us': number; 'span.duration.us': number; 'span.id': string; 'span.name': string; 'span.self_time.count': number; 'span.self_time.sum.us': number; 'span.subtype': string; 'span.type': string; 'transaction.result': string; 'transaction.sampled': true; 'span.links': { trace: { id: string; }; span: { id: string; }; }[]; 'url.original': string; }> & Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; }> & Partial<{ 'metricset.interval': string; 'transaction.duration.summary': string; }>" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/apm_fields.ts", "deprecated": false, diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index ecad64726c15c..70d34db7dc88f 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-03-10 +date: 2023-03-11 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 b21c06c726f6a..d6bcb040e368b 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-03-10 +date: 2023-03-11 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 3a7f2c38a14ea..ef134726f0225 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-03-10 +date: 2023-03-11 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 ea9582ba413cf..52161cf3ef10c 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-03-10 +date: 2023-03-11 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 f7fb50a6cb4e0..405708963244f 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-03-10 +date: 2023-03-11 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 df1ed4206a8b8..c45cccb5c6b83 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-03-10 +date: 2023-03-11 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 2e6a3eaa372d4..554a83b7bab19 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-03-10 +date: 2023-03-11 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 f69a190ec2562..f28d58121e641 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-03-10 +date: 2023-03-11 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 4e9ac2efc9add..745ad26c4b45f 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-03-10 +date: 2023-03-11 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 eca865a18ed92..aec92bb5235e6 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-03-10 +date: 2023-03-11 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 c2b9942a18287..82c9ca7b7aa60 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-03-10 +date: 2023-03-11 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 3f15a715435eb..28c129d450209 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-03-10 +date: 2023-03-11 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 786e09695076e..f4031b94d7398 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-03-10 +date: 2023-03-11 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 604ea9cb7f142..64d4ab114c11b 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-03-10 +date: 2023-03-11 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 ec01e6fab09b5..42a27238f15ff 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-03-10 +date: 2023-03-11 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 326667dd334e8..3dd44b2bc09ba 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-03-10 +date: 2023-03-11 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 0ec90ebfae512..994761bc4d8aa 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-03-10 +date: 2023-03-11 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 df2c04281f594..8620b30a3fb5f 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-03-10 +date: 2023-03-11 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_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index 1ae08e753aa9c..a474c1eb28e20 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2023-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 3c3ad6d56179f..b0dfc26fa0da7 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-03-10 +date: 2023-03-11 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 8c7c003c4e337..9157c133c35e4 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-03-10 +date: 2023-03-11 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 549fed38efe80..da7e1aed42bcd 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-03-10 +date: 2023-03-11 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 557ffa03d859d..e1335faf237ac 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-03-10 +date: 2023-03-11 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 41f6793358502..6228b29ad417e 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-03-10 +date: 2023-03-11 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 14e7da09b8999..1529f925758d3 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-03-10 +date: 2023-03-11 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 d87ba04b72d4a..19db0427d48c5 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-03-10 +date: 2023-03-11 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 561b8edf96652..e4ef40db3e1b1 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-03-10 +date: 2023-03-11 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 4875a9321149c..5c4aa86a43fae 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-03-10 +date: 2023-03-11 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 7a466aaa2632f..9ba660d6ee39b 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-03-10 +date: 2023-03-11 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 a3585582cf62d..5609b707ddf4f 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-03-10 +date: 2023-03-11 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 20dc6fd8bc937..5ba3047316595 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-03-10 +date: 2023-03-11 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 f80ef1f5af113..f62676839507e 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-03-10 +date: 2023-03-11 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 1615d72e09247..22d2690b360dc 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-03-10 +date: 2023-03-11 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 fa276c8156d03..0549df893f8c9 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-03-10 +date: 2023-03-11 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 dd23ab6513dd1..b3111a80702ab 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-03-10 +date: 2023-03-11 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 15de68fc0562c..b941faacfd78e 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-03-10 +date: 2023-03-11 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 8ba24b5e23c16..b14bbeeb98664 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-03-10 +date: 2023-03-11 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 5640e3e2533d3..a37f661d8160d 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-03-10 +date: 2023-03-11 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 33eab555453e1..48089f6088716 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-03-10 +date: 2023-03-11 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 3a2400b8ce4f5..a9c74b2e563d8 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-03-10 +date: 2023-03-11 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 24d5b3549bc67..22ffbbea42c21 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-03-10 +date: 2023-03-11 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 1170e4e166e3f..b278d13c284f8 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-03-10 +date: 2023-03-11 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 3236911f88583..8ae536ba9d97e 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-03-10 +date: 2023-03-11 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 d09a7e884645e..ab22942ef9848 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-03-10 +date: 2023-03-11 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 5c93eb291279d..f7d89e311ed58 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-03-10 +date: 2023-03-11 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 f890209d49fea..77fd7b953b711 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-03-10 +date: 2023-03-11 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 ce398261c26f7..d362ba40cad39 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-03-10 +date: 2023-03-11 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 dc6b8cef5fdef..e2a3efd0e99c0 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-03-10 +date: 2023-03-11 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 451a26514bc23..6e80583e8f2e7 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-03-10 +date: 2023-03-11 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 4933ac2785efe..8091df0498a36 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-03-10 +date: 2023-03-11 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 e9feec26efe2f..41acd7ef8da1d 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-03-10 +date: 2023-03-11 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 e896920d8bd08..eb04c2cb4c2f2 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-03-10 +date: 2023-03-11 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 e944a26718684..56158c5aa0c7a 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-03-10 +date: 2023-03-11 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 1370e11ef0896..356e74edb0bff 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-03-10 +date: 2023-03-11 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 0796ccfcdbb99..e880df415507a 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-03-10 +date: 2023-03-11 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 ca20e3682ad77..5887fe39770e0 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-03-10 +date: 2023-03-11 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 fad48a69466b8..0a97fed28978c 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-03-10 +date: 2023-03-11 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 c67318a89a028..07b26f2097a62 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-03-10 +date: 2023-03-11 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 34c48b645ac6e..84070040cef20 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-03-10 +date: 2023-03-11 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 da2976ca7edaa..72ad6ba6e342c 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-03-10 +date: 2023-03-11 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 5e6a8825f98ab..48b2955ba7077 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-03-10 +date: 2023-03-11 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 7fc6f780da264..a7dd6c2021a5b 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-03-10 +date: 2023-03-11 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 960963421f66b..dec47c9f8ae35 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-03-10 +date: 2023-03-11 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 8524a5eb280d3..129e3056b8b37 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-03-10 +date: 2023-03-11 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 493e8ad389925..dee43931664de 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-03-10 +date: 2023-03-11 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 c87a87cdacb7a..b1c76e53d5a4a 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-03-10 +date: 2023-03-11 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 a94f18d554ce1..5e07ae4d66e2d 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-03-10 +date: 2023-03-11 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 ff32fb1f54d6c..69b9b0901ff42 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-03-10 +date: 2023-03-11 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 eac523e3edd70..1b038f8d65944 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-03-10 +date: 2023-03-11 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 f35613a36dc42..63bc359c81e91 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-03-10 +date: 2023-03-11 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 5d5ba5f3735bd..6f92f08306633 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-03-10 +date: 2023-03-11 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 3ca723e72ae1c..b1aac42915d45 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-03-10 +date: 2023-03-11 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 d79f57e6dc217..c6eda1e29dab2 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-03-10 +date: 2023-03-11 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 70e791606877b..bbefb0c79a309 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-03-10 +date: 2023-03-11 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 94789884aa9bb..c119662083a12 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-03-10 +date: 2023-03-11 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 4b5728ba09980..58d36897e5d86 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-03-10 +date: 2023-03-11 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 656f7e6ddeb1e..0c82025133c35 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-03-10 +date: 2023-03-11 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 a688df6986f46..b9759450ce7f5 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-03-10 +date: 2023-03-11 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 2b395a6d624c5..bb0fc09b0aeac 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-03-10 +date: 2023-03-11 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 aa004193260d4..300657e06e922 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-03-10 +date: 2023-03-11 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 8e0527eddb6fe..e95ce83a35536 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-03-10 +date: 2023-03-11 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 ba7e61659b09f..796878b90d417 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-03-10 +date: 2023-03-11 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 7104b7db49cb3..d7188b939a0a6 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-03-10 +date: 2023-03-11 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 ea77c52aebe72..bd09fc00260c6 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-03-10 +date: 2023-03-11 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 c1fb2ab8896e3..9c05af43d3ed7 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-03-10 +date: 2023-03-11 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 46542d2f32f60..c60ad009a7dfa 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-03-10 +date: 2023-03-11 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 ac413c1892fed..4e53fb9f8afdd 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-03-10 +date: 2023-03-11 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 89a1c9892d2b3..8d5ddbce6f8b5 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-03-10 +date: 2023-03-11 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 9c1234ca8a0b1..9c69fa0d39abe 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-03-10 +date: 2023-03-11 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 4294a5659bd22..d2cfe17aa088d 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-03-10 +date: 2023-03-11 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 79614fb71fc5f..c7c62491357cc 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-03-10 +date: 2023-03-11 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 075bc1b15dd93..7eb3652e4d6d7 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-03-10 +date: 2023-03-11 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 785f6400a085a..77a1814ef4d93 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-03-10 +date: 2023-03-11 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 de7c8c3653b61..4d30539e43984 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-03-10 +date: 2023-03-11 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 ced1318c4f12e..7405e82dd59e6 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-03-10 +date: 2023-03-11 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 1581ef8a566b1..bb05fe0540534 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-03-10 +date: 2023-03-11 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 3981b72cd9238..18aa4a6916ee2 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-03-10 +date: 2023-03-11 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 6aba518ee4c16..e7190ed71d60e 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-03-10 +date: 2023-03-11 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 6fb456063809c..670eb07b7b225 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-03-10 +date: 2023-03-11 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 f1e2e92435810..2f73275c02d8c 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-03-10 +date: 2023-03-11 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 a775edf97852c..7a7d06e4396d2 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-03-10 +date: 2023-03-11 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 6cfa7a047a99b..08f9edc1b2928 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-03-10 +date: 2023-03-11 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 095f4a2f78a84..0300a6336a081 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-03-10 +date: 2023-03-11 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 ecba6efc0c364..30eb3a21032aa 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-03-10 +date: 2023-03-11 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 593026209e43f..790a0da79742f 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-03-10 +date: 2023-03-11 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 af646714c5044..cd57f6aa0dbca 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-03-10 +date: 2023-03-11 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 2a0e61ef77d0c..23892b8a14f34 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-03-10 +date: 2023-03-11 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 18ab496b9d260..e074c81460117 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-03-10 +date: 2023-03-11 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 afb059be362f2..bdba141adb99b 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-03-10 +date: 2023-03-11 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 2abd42e0d2bc0..636c56f1c3145 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-03-10 +date: 2023-03-11 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 0bea403f78a4b..7e0decdf21484 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-03-10 +date: 2023-03-11 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 e63ba581452ee..e2b6069c8b849 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-03-10 +date: 2023-03-11 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 39c1d04392cc7..3ec7042509088 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-03-10 +date: 2023-03-11 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 3e082510748df..2409edf73f9c6 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-03-10 +date: 2023-03-11 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 981e556579724..1d94dcdd63794 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-03-10 +date: 2023-03-11 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 c8b46f21299a8..2ce3b000b488a 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-03-10 +date: 2023-03-11 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 ff60eb1a6efbd..61af9c38fd6c3 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-03-10 +date: 2023-03-11 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 54ed09d9e6bc2..40d2ed4706d9b 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-03-10 +date: 2023-03-11 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 dd8f757f40d4b..9403f13abf09c 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-03-10 +date: 2023-03-11 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 fc507e6c1da85..cc221fb596dd9 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-03-10 +date: 2023-03-11 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 381ee36670227..c0ef4a3147786 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-03-10 +date: 2023-03-11 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 be7b64ae650f3..f736f52af9bbb 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-03-10 +date: 2023-03-11 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 4c0f083adf28e..e99a80d54eef2 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-03-10 +date: 2023-03-11 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 599b700f4bded..806b3d193ae62 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-03-10 +date: 2023-03-11 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 0ad490c4e78e2..700727f1ee48c 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-03-10 +date: 2023-03-11 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 7253b5306c1e3..52a914f2fdb00 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-03-10 +date: 2023-03-11 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 6837d1ae92db1..4ec58835f159a 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-03-10 +date: 2023-03-11 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 a4747ec41264e..b905877707fe3 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-03-10 +date: 2023-03-11 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 0d48f1b2727dd..41f23c1a3bafc 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-03-10 +date: 2023-03-11 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 42a4411d3fc79..0319583b35a92 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-03-10 +date: 2023-03-11 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 918dcd2655689..b23fe22f0a029 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-03-10 +date: 2023-03-11 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 df5e3e876481a..bd4aa27eb6c90 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-03-10 +date: 2023-03-11 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 8ee37129d0964..8ed04e026be0d 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-03-10 +date: 2023-03-11 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 9b4eb73bc4ca5..98104c6438c66 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-03-10 +date: 2023-03-11 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 ff3ca1934716e..3f32e4e887d25 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-03-10 +date: 2023-03-11 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_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index 1ffda3db9f486..bea28dbab4c58 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2023-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.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 f4f7bed1e51f7..13325a81589ae 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-03-10 +date: 2023-03-11 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 21ba39b7a5379..6f893e09b9d69 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-03-10 +date: 2023-03-11 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 9522be0941227..f9eeaa3d8e733 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-03-10 +date: 2023-03-11 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 e574626455586..c03bba870ba4e 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-03-10 +date: 2023-03-11 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 f8da46128ac7c..7b6a3c2be1e08 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-03-10 +date: 2023-03-11 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 b3b51eefa765e..dc17b70fabe61 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-03-10 +date: 2023-03-11 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 7760a0f052e01..9438127deac19 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-03-10 +date: 2023-03-11 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 8f34dbad948c8..75c1c8db402a7 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-03-10 +date: 2023-03-11 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 a279d0046586b..7115268161b94 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-03-10 +date: 2023-03-11 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 b7bcefd39e7eb..adcd49c1d094f 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-03-10 +date: 2023-03-11 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 6522cb38e8a30..1b20b28c0184f 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-03-10 +date: 2023-03-11 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 dce44c001d460..e69d6f08d6653 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-03-10 +date: 2023-03-11 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 2dd4fbdbe058a..61d3b9154f6a7 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-03-10 +date: 2023-03-11 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 9bf0df4801920..d2c6919f6c17e 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-03-10 +date: 2023-03-11 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 4478b7fa69c86..9d76e414aa1e2 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-03-10 +date: 2023-03-11 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 9bef429d94907..6a52907c34028 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-03-10 +date: 2023-03-11 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 757a69c6563bf..441a38fcdab6d 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-03-10 +date: 2023-03-11 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 d3f05dd630897..29f2b845de65d 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-03-10 +date: 2023-03-11 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 58089aeb18631..873a5e911e0e9 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-03-10 +date: 2023-03-11 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 3004fb9eab38d..d2851386c953e 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-03-10 +date: 2023-03-11 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 bbd26fef62bfd..5d3be1550b859 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-03-10 +date: 2023-03-11 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 4efcec5780bc0..85cf9367f8e24 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-03-10 +date: 2023-03-11 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 09681c0cf00ad..2c41fada77df4 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-03-10 +date: 2023-03-11 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 aa950702fe2da..4b10114e2633a 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-03-10 +date: 2023-03-11 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 0ad68c375f0d8..68ff0a785e6a4 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-03-10 +date: 2023-03-11 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 b13bf5af22977..13b5f4da4d171 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-03-10 +date: 2023-03-11 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_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index ee7884a8132f6..9df7d7c5e841d 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2023-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index dc3d29a07263b..4ce17adb0d91e 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-03-10 +date: 2023-03-11 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 2eb3209adf2dd..1324b7710c0c2 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-03-10 +date: 2023-03-11 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 160954d8fa592..b4fa1fc92000b 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-03-10 +date: 2023-03-11 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 ade762576da2d..f63455de3bd92 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-03-10 +date: 2023-03-11 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 f0918b73d94f3..910f266af688b 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-03-10 +date: 2023-03-11 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 2455c5b42093f..1db38a3c7281d 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-03-10 +date: 2023-03-11 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 92fb0f5705a73..aad65759dafaa 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-03-10 +date: 2023-03-11 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 c209d84a8408f..720fcb3a042cb 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-03-10 +date: 2023-03-11 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 79de786dba39c..139739ca84870 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-03-10 +date: 2023-03-11 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 ee5f7a05df403..8b0f3e2dead6e 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-03-10 +date: 2023-03-11 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 773bbdee80662..e2fc96441d85c 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-03-10 +date: 2023-03-11 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_crypto.mdx b/api_docs/kbn_crypto.mdx index d0e7a9a89b98e..17bfda9a70fbb 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-03-10 +date: 2023-03-11 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 cde107ec53343..cea3d631e648e 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-03-10 +date: 2023-03-11 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 5a03eb11ef275..1d08f81337fd7 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 43ff915fe4e9b..f1aee20423896 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 3cb2e0b78c57a..818198621ea70 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-03-10 +date: 2023-03-11 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 1cd81bf3313b4..6e73366cc369d 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-03-10 +date: 2023-03-11 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 5c27430f404ef..9561e5ccb55d3 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-03-10 +date: 2023-03-11 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 a39c9d6177ac8..3b7510f10edcd 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index da9a677a8a82b..f3453825a595a 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-03-10 +date: 2023-03-11 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 9da75b119d84e..b57294aaab4a0 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 8dd7e1a9a9ea0..bc0bf7e11f4a4 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-03-10 +date: 2023-03-11 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 1b45fd9bba54e..a3cb1eb793aab 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-03-10 +date: 2023-03-11 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 86dbb56f6b92a..97ec0b559082b 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-03-10 +date: 2023-03-11 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_es.mdx b/api_docs/kbn_es.mdx index 8bc1c9d5c62f1..0858ce5b98e0e 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-03-10 +date: 2023-03-11 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 25daf2992f1db..fd0ed1e237867 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-03-10 +date: 2023-03-11 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 b0c592ede5ed8..b3f8c6659b908 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-03-10 +date: 2023-03-11 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 2e58e7f5120cb..6d68f920f7f6d 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-03-10 +date: 2023-03-11 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 d909833c87db8..8394a22892d58 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-03-10 +date: 2023-03-11 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 09559a7f2690d..f3fae249f90a9 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index f0ac504968dfd..6423403779d95 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-03-10 +date: 2023-03-11 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 f160d074a89d0..348362f25d12c 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-03-10 +date: 2023-03-11 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 d541758eed685..02edab05b5ab2 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-03-10 +date: 2023-03-11 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 7686497113a58..183da31add4c2 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-03-10 +date: 2023-03-11 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 9da2980b80622..2c7e2c5e8b0f1 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 507ed32e5ef65..67a6abf25483d 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-03-10 +date: 2023-03-11 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 2557095119ec2..37d85a791ca28 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-03-10 +date: 2023-03-11 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 c947114a0591a..eaa1743772c1a 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-03-10 +date: 2023-03-11 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 b56324c68b913..dcf523184fc19 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-03-10 +date: 2023-03-11 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 31fcb8328a275..01556ba0dfcda 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-03-10 +date: 2023-03-11 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 ab6b5bae0e85c..fc37f8a6546a9 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-03-10 +date: 2023-03-11 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 05dcf0e8e75e4..bf8fd73dd3d28 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-03-10 +date: 2023-03-11 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 bc7e1517b0739..b29963832199e 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-03-10 +date: 2023-03-11 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 2cc338a108872..f9b8745657659 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 29ee28bb77970..78fbb9b125b3a 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-03-10 +date: 2023-03-11 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 f17a68904f6dc..bbc4bbe790ebf 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-03-10 +date: 2023-03-11 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 eb1d82484a216..bc33f12ba9e02 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-03-10 +date: 2023-03-11 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 75de1965a09a1..20abcc41d0618 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-03-10 +date: 2023-03-11 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 6303a042c07bd..2ad21ef9ff750 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-03-10 +date: 2023-03-11 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 02b71d8da5d9d..4713cc2a7b274 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-03-10 +date: 2023-03-11 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 6aebe3d3a891f..859caad485bee 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index c7b34bae4421e..465eab7c9f3e3 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-03-10 +date: 2023-03-11 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 867f01348389c..14a9e57fe8ffb 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-03-10 +date: 2023-03-11 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 be48374d99c52..0b4fb1807ca2c 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 6b26e35ab62df..e2172fbc838d6 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 0de4112167f18..625f7a3fa19f5 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-03-10 +date: 2023-03-11 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_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 9982331145c33..c410ce7f29a92 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-03-10 +date: 2023-03-11 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_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 1ab803e6c8b9e..9bc3693090c54 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-03-10 +date: 2023-03-11 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 86e598d0fed7d..38cf16715b49c 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-03-10 +date: 2023-03-11 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_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index d07a2ef473cb7..64e046c7b4197 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-03-10 +date: 2023-03-11 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 88830aaa5bfe2..4800a0a43be3e 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-03-10 +date: 2023-03-11 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_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 03f7599913e64..0b5a057227362 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-03-10 +date: 2023-03-11 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_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index dcc6dcc3cb7f2..8a423ec675c09 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-03-10 +date: 2023-03-11 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_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 7b6e080ab8545..83459ae342c76 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-03-10 +date: 2023-03-11 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 5471d041e3d96..7c5965c7a3da7 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 29110a4e7812b..68bdf5c13b27c 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-03-10 +date: 2023-03-11 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 38c6a695b0612..c217a9b56b230 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-03-10 +date: 2023-03-11 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 98eaf9d5303ec..da0474775ae8b 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-03-10 +date: 2023-03-11 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 6804e634b611a..1b5134d488519 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-03-10 +date: 2023-03-11 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 b7698286d3c78..f244abbf211ae 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-03-10 +date: 2023-03-11 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 957d1c06eded2..38e8771a209d9 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 7254d0048e47b..5a57cc1e398dc 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 7fdab2d285f51..a2669a7bc816a 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-03-10 +date: 2023-03-11 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 24512dd55c2ec..57ad505b3df64 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-03-10 +date: 2023-03-11 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 1ee908f8788d1..abedf9af482bc 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-03-10 +date: 2023-03-11 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 86e60ec8b6575..39cbc2f468566 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 126fcaf633c6f..3d2e09592f7dc 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 88cd184af23d7..be2b080ad1f10 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.devdocs.json b/api_docs/kbn_security_solution_side_nav.devdocs.json new file mode 100644 index 0000000000000..5aeb3211a5516 --- /dev/null +++ b/api_docs/kbn_security_solution_side_nav.devdocs.json @@ -0,0 +1,524 @@ +{ + "id": "@kbn/security-solution-side-nav", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNav", + "type": "Function", + "tags": [], + "label": "SolutionSideNav", + "description": [], + "signature": [ + "(props: ", + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.SolutionSideNavProps", + "text": "SolutionSideNavProps" + }, + ") => JSX.Element" + ], + "path": "packages/security-solution/side_nav/src/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNav.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.SolutionSideNavProps", + "text": "SolutionSideNavProps" + } + ], + "path": "packages/security-solution/side_nav/src/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.LinkCategory", + "type": "Interface", + "tags": [], + "label": "LinkCategory", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.LinkCategory", + "text": "LinkCategory" + }, + "" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.LinkCategory.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.LinkCategory.linkIds", + "type": "Object", + "tags": [], + "label": "linkIds", + "description": [], + "signature": [ + "readonly T[]" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem", + "type": "Interface", + "tags": [], + "label": "SolutionSideNavItem", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.SolutionSideNavItem", + "text": "SolutionSideNavItem" + }, + "" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.id", + "type": "Uncategorized", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "T" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.href", + "type": "string", + "tags": [], + "label": "href", + "description": [], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.onClick", + "type": "Function", + "tags": [], + "label": "onClick", + "description": [], + "signature": [ + "React.MouseEventHandler | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.items", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.SolutionSideNavItem", + "text": "SolutionSideNavItem" + }, + "[] | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.categories", + "type": "Object", + "tags": [], + "label": "categories", + "description": [], + "signature": [ + "readonly ", + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.LinkCategory", + "text": "LinkCategory" + }, + "[] | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.iconType", + "type": "CompoundType", + "tags": [], + "label": "iconType", + "description": [], + "signature": [ + "IconType", + " | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.labelSize", + "type": "CompoundType", + "tags": [], + "label": "labelSize", + "description": [], + "signature": [ + "\"m\" | \"s\" | \"xs\" | \"l\" | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.appendSeparator", + "type": "CompoundType", + "tags": [], + "label": "appendSeparator", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.isBeta", + "type": "CompoundType", + "tags": [], + "label": "isBeta", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavItem.betaOptions", + "type": "Object", + "tags": [], + "label": "betaOptions", + "description": [], + "signature": [ + "{ text: string; } | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavProps", + "type": "Interface", + "tags": [], + "label": "SolutionSideNavProps", + "description": [], + "path": "packages/security-solution/side_nav/src/solution_side_nav.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavProps.items", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.SolutionSideNavItem", + "text": "SolutionSideNavItem" + }, + "[]" + ], + "path": "packages/security-solution/side_nav/src/solution_side_nav.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavProps.selectedId", + "type": "string", + "tags": [], + "label": "selectedId", + "description": [], + "path": "packages/security-solution/side_nav/src/solution_side_nav.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavProps.footerItems", + "type": "Array", + "tags": [], + "label": "footerItems", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.SolutionSideNavItem", + "text": "SolutionSideNavItem" + }, + "[] | undefined" + ], + "path": "packages/security-solution/side_nav/src/solution_side_nav.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavProps.panelBottomOffset", + "type": "string", + "tags": [], + "label": "panelBottomOffset", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/security-solution/side_nav/src/solution_side_nav.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavProps.panelTopOffset", + "type": "string", + "tags": [], + "label": "panelTopOffset", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/security-solution/side_nav/src/solution_side_nav.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.SolutionSideNavProps.tracker", + "type": "Function", + "tags": [], + "label": "tracker", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.Tracker", + "text": "Tracker" + }, + " | undefined" + ], + "path": "packages/security-solution/side_nav/src/solution_side_nav.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.LinkCategories", + "type": "Type", + "tags": [], + "label": "LinkCategories", + "description": [], + "signature": [ + "readonly ", + { + "pluginId": "@kbn/security-solution-side-nav", + "scope": "common", + "docId": "kibKbnSecuritySolutionSideNavPluginApi", + "section": "def-common.LinkCategory", + "text": "LinkCategory" + }, + "[]" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.Tracker", + "type": "Type", + "tags": [], + "label": "Tracker", + "description": [], + "signature": [ + "(type: string, event: string | string[], count?: number | undefined) => void" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.Tracker.$1", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.Tracker.$2", + "type": "CompoundType", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "string | string[]" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-solution-side-nav", + "id": "def-common.Tracker.$3", + "type": "number", + "tags": [], + "label": "count", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/security-solution/side_nav/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx new file mode 100644 index 0000000000000..e246ce0f568dc --- /dev/null +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSecuritySolutionSideNavPluginApi +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-03-11 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] +--- +import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; + + + +Contact [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 30 | 0 | 30 | 0 | + +## Common + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_security_solution_storybook_config.devdocs.json b/api_docs/kbn_security_solution_storybook_config.devdocs.json new file mode 100644 index 0000000000000..a2606da4952d3 --- /dev/null +++ b/api_docs/kbn_security_solution_storybook_config.devdocs.json @@ -0,0 +1,62 @@ +{ + "id": "@kbn/security-solution-storybook-config", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/security-solution-storybook-config", + "id": "def-common.TITLE", + "type": "string", + "tags": [], + "label": "TITLE", + "description": [ + "The title of the Storybook." + ], + "signature": [ + "\"Security Solution Storybook\"" + ], + "path": "packages/security-solution/storybook/config/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-solution-storybook-config", + "id": "def-common.URL", + "type": "string", + "tags": [], + "label": "URL", + "description": [ + "The remote URL of the root from which Storybook loads stories for Security Solution." + ], + "signature": [ + "\"https://github.com/elastic/kibana/tree/main/packages/security_solution\"" + ], + "path": "packages/security-solution/storybook/config/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx new file mode 100644 index 0000000000000..6f7c66a3ba7af --- /dev/null +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSecuritySolutionStorybookConfigPluginApi +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-03-11 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] +--- +import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 2 | 0 | 0 | 0 | + +## Common + +### Consts, variables and types + + diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index c47a8f6177cd0..3a93a33a1da55 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 444386b17de9e..f85b2c1a52346 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-03-10 +date: 2023-03-11 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 253e5fe8012bc..64e4220e38ae8 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-03-10 +date: 2023-03-11 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 b1e60c7b2d8af..2206539e50564 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-03-10 +date: 2023-03-11 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.devdocs.json b/api_docs/kbn_securitysolution_grouping.devdocs.json index b85a58ac7e7e1..5873d753bbfb6 100644 --- a/api_docs/kbn_securitysolution_grouping.devdocs.json +++ b/api_docs/kbn_securitysolution_grouping.devdocs.json @@ -133,7 +133,7 @@ "label": "useGrouping", "description": [], "signature": [ - "({ defaultGroupingOptions, fields, groupingId, }: GroupingArgs) => Grouping" + "({ defaultGroupingOptions, fields, groupingId, onGroupChangeCallback, tracker, }: GroupingArgs) => Grouping" ], "path": "packages/kbn-securitysolution-grouping/src/hooks/use_grouping.tsx", "deprecated": false, @@ -144,7 +144,7 @@ "id": "def-common.useGrouping.$1", "type": "Object", "tags": [], - "label": "{\n defaultGroupingOptions,\n fields,\n groupingId,\n}", + "label": "{\n defaultGroupingOptions,\n fields,\n groupingId,\n onGroupChangeCallback,\n tracker,\n}", "description": [], "signature": [ "GroupingArgs" diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 8cd6f32a95282..c18119478054a 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-03-10 +date: 2023-03-11 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 93797f1c271f3..f444b3e7bc725 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-03-10 +date: 2023-03-11 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 d03de598aaf92..2751bac05fc36 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-03-10 +date: 2023-03-11 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 2a240a5636cea..7044172d7ce6e 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-03-10 +date: 2023-03-11 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 81fa9d1bcfb1a..fb5bd0a668265 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-03-10 +date: 2023-03-11 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 eb0841f2f80bc..e661b8ef9988a 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-03-10 +date: 2023-03-11 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 6e97ea509c4c3..daafc573ec747 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-03-10 +date: 2023-03-11 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 033ed887e47bd..9378dc4965b48 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-03-10 +date: 2023-03-11 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 7306aac3d7c5a..783a5ec6338bc 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-03-10 +date: 2023-03-11 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 994f8b6397c25..36713c5de9d04 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-03-10 +date: 2023-03-11 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 1899b62d467d9..2edfb99c3c597 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-03-10 +date: 2023-03-11 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 0d76e5e20ac62..6e5fa1f316b14 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-03-10 +date: 2023-03-11 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 fe2ab706813d4..7266ce13577e3 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-03-10 +date: 2023-03-11 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 25ea3a6019ca4..2ea6b425dd298 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-03-10 +date: 2023-03-11 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 ae04c08442c9a..b7e40809dd58b 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 5dc1190eb8eb6..02847517f4037 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-03-10 +date: 2023-03-11 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 c7cbe825efa14..c0322cb3dcd6f 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-03-10 +date: 2023-03-11 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 1bd71ab56868a..76ee53df9a8b3 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-03-10 +date: 2023-03-11 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 dbc6cf5a5dfaf..0e87ff7970e21 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-03-10 +date: 2023-03-11 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 c8f35f98af401..9c84c33eeafde 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-03-10 +date: 2023-03-11 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 039d111125cb9..c5f2b8ec50a7b 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-03-10 +date: 2023-03-11 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 005ad48c669be..6f28f1fe0841b 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-03-10 +date: 2023-03-11 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 7c2d7b0b72d2f..185ef9b99c9b7 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-03-10 +date: 2023-03-11 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_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index d2502f3dea403..2e57cd36d1d75 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-03-10 +date: 2023-03-11 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 14a9255e01481..659084c77e87e 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-03-10 +date: 2023-03-11 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 47312f2e721fb..6eb5935b07a1e 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-03-10 +date: 2023-03-11 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 d9c3e7d350cbe..1516148d9664c 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-03-10 +date: 2023-03-11 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 72d921889a01a..5a119b9b807e7 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-03-10 +date: 2023-03-11 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 10089b9f3ca3a..4dc1847781d4b 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-03-10 +date: 2023-03-11 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 7ad652fb30d4a..bf8233c8598fd 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-03-10 +date: 2023-03-11 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 c26d82eb5ae3c..377c240249c17 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-03-10 +date: 2023-03-11 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 f41f5648652bf..9c45d38d42f1b 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-03-10 +date: 2023-03-11 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 8272552d28cd3..9d55d7550ac41 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-03-10 +date: 2023-03-11 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 c4abaad886d51..627fc63c09283 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-03-10 +date: 2023-03-11 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 17ec462ddfbaa..ac06a916ebd0b 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-03-10 +date: 2023-03-11 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 8d83e1359c0bf..6edb55e3c669e 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-03-10 +date: 2023-03-11 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 5182ff0ff7698..baccae8e2854f 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-03-10 +date: 2023-03-11 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 0feb21bef098a..ab4bbf885975e 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-03-10 +date: 2023-03-11 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 972611a71da41..4f61d0cc6ceb2 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-03-10 +date: 2023-03-11 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 21257ea5cdc7c..af5c4488c25d8 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-03-10 +date: 2023-03-11 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 b6e36a95c21f0..b90d520ae95de 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-03-10 +date: 2023-03-11 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 07b97fe2b8edc..a19056c9612bf 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-03-10 +date: 2023-03-11 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 8ee0e18f10f29..f69a55e4d4468 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-03-10 +date: 2023-03-11 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 82a4be1a59050..069d823f1b06d 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-03-10 +date: 2023-03-11 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 38cee3f286e88..4bff5358cbcf7 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-03-10 +date: 2023-03-11 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 7d5252cc509c3..e4ad7407db8da 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-03-10 +date: 2023-03-11 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 812902465744e..604d255ffc452 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-03-10 +date: 2023-03-11 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 2f0ea8e1835b3..57aff494baa90 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-03-10 +date: 2023-03-11 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 cf0290b24bccc..e857e6123addc 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-03-10 +date: 2023-03-11 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 4c00ae9992fe2..47da41dda451a 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-03-10 +date: 2023-03-11 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 9f7fa93eae8eb..83d1f3f7ea7f4 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-03-10 +date: 2023-03-11 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 f914a7f738831..7cb1791cf48fe 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-03-10 +date: 2023-03-11 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 26806608de934..e3d4502c61db7 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-03-10 +date: 2023-03-11 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 1b6f96ac43b96..09458ad631395 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-03-10 +date: 2023-03-11 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 0ac094dd8928c..acd034ba23fc0 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-03-10 +date: 2023-03-11 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 2260f27819917..6537146a0290f 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-03-10 +date: 2023-03-11 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 ff620ff40816c..8360422030741 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-03-10 +date: 2023-03-11 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 e2bd93b9cf5d0..7237da566693b 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-03-10 +date: 2023-03-11 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 7c23a4a54c6db..e445114710560 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-03-10 +date: 2023-03-11 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 032477905e76c..4331fafd03761 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-03-10 +date: 2023-03-11 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 a33bc4ede4a52..399f19b5c9e4f 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-03-10 +date: 2023-03-11 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 ea83d610dc891..47401bfc0ca78 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-03-10 +date: 2023-03-11 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 8351638353d3e..20747b947828c 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index c31daf78b311a..2aa42d84ef99e 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-03-10 +date: 2023-03-11 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 755ad595a5d77..95137b31e00c9 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-03-10 +date: 2023-03-11 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 8d5037377ca87..6a41fd27e562f 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-03-10 +date: 2023-03-11 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 38bce4fc365fb..64e7d31972bcc 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-03-10 +date: 2023-03-11 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 6543f1dd3c7a2..ff6f2004e6f5e 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-03-10 +date: 2023-03-11 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 06460fd54eaac..80c34897e8792 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index d80a3eeb4a142..2a992663ce1b5 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-03-10 +date: 2023-03-11 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 2714e8a70de87..1925921a3fd01 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-03-10 +date: 2023-03-11 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 0be2b7bc06429..9e405b1a5b402 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-03-10 +date: 2023-03-11 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 b557a9ac067bf..5e09bd9480a5d 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 2784a60897d97..e1ad2e8bf6534 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-03-10 +date: 2023-03-11 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 5b1586534a735..d6b699468701a 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-03-10 +date: 2023-03-11 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 800552f4a14ee..096e27abe70ac 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-03-10 +date: 2023-03-11 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 448454c20c9a9..895acb539c1c0 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-03-10 +date: 2023-03-11 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 6846642746ed5..3a0ee9a8cf6fd 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-03-10 +date: 2023-03-11 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 dbe16c8aaca1f..87da7d7e6e506 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-03-10 +date: 2023-03-11 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 5ec9e70c55283..fa17974543a62 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-03-10 +date: 2023-03-11 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 964384ac94806..e21ad6c11400f 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-03-10 +date: 2023-03-11 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 1a0cf1acc40ca..6ec59b412e48d 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-03-10 +date: 2023-03-11 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 f98e4288e8e9f..7d3b880b3d4ac 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index add7fd3902d10..ae82dbd4aad53 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-03-10 +date: 2023-03-11 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 ac6bce7d14866..8a5ef9eb58b0b 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-03-10 +date: 2023-03-11 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 637de23f0a9dc..2b4be0df422c5 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-03-10 +date: 2023-03-11 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 689516dd62c2f..ea26803bc935a 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-03-10 +date: 2023-03-11 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 cc653cf152347..df030824a3a41 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-03-10 +date: 2023-03-11 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 a844250ea77aa..a3ce311db8c32 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-03-10 +date: 2023-03-11 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 8dbe29c5324bf..b483c6dd54876 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-03-10 +date: 2023-03-11 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 cff6a16450c8d..c1ecaa808d2de 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 1f91207299a31..f64c0077da978 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index cfc9c5a2adf53..1d12a991bbbc0 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 45c49cf8bf3da..e79ea3add3af8 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-03-10 +date: 2023-03-11 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 c1df7ed83be2b..5727841b1d06a 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 577 | 473 | 38 | +| 579 | 475 | 38 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 68015 | 516 | 58711 | 1242 | +| 68060 | 516 | 58752 | 1244 | ## Plugin Directory @@ -30,7 +30,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 259 | 8 | 254 | 26 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 36 | 1 | 32 | 2 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 12 | 0 | 1 | 2 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 531 | 1 | 515 | 40 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 534 | 1 | 518 | 41 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 42 | 0 | 42 | 65 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 89 | 1 | 74 | 2 | @@ -47,7 +47,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | cloudLinks | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Adds the links to the Elastic Cloud console | 0 | 0 | 0 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | The cloud security posture plugin | 17 | 0 | 2 | 2 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 13 | 0 | 13 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Content management app | 110 | 0 | 96 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Content management app | 118 | 0 | 104 | 4 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 272 | 0 | 268 | 11 | | crossClusterReplication | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | @@ -146,7 +146,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 13 | 0 | | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 27 | 0 | 8 | 4 | | 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. | 278 | 0 | 94 | 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. | 280 | 0 | 94 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 118 | 0 | 77 | 28 | | | [@elastic/awp-viz](https://github.com/orgs/elastic/teams/awp-viz) | - | 7 | 0 | 7 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 118 | 0 | 59 | 10 | @@ -451,6 +451,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 6 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 2 | 8 | 0 | | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 101 | 0 | 98 | 0 | +| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 30 | 0 | 30 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/security-solution-platform](https://github.com/orgs/elastic/teams/security-solution-platform) | - | 56 | 1 | 41 | 1 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 341 | 1 | 337 | 32 | | | [@elastic/security-solution-platform](https://github.com/orgs/elastic/teams/security-solution-platform) | - | 67 | 0 | 61 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index f52c5b10301a3..d23dc9be0837b 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-03-10 +date: 2023-03-11 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 02e0432a27d6b..c08f9c06b92a6 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index ff97941721a2d..b7503840a595b 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-03-10 +date: 2023-03-11 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 d3cc629210dc7..7bae9831b0a2d 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-03-10 +date: 2023-03-11 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 ae0d4557a8527..6e051e7a87166 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-03-10 +date: 2023-03-11 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 379b242aa027c..134402a9feb89 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-03-10 +date: 2023-03-11 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 b69f6ad8c9645..086dbbd7dc4a9 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-03-10 +date: 2023-03-11 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 bfcb8c8c85304..e807e54c33b82 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-03-10 +date: 2023-03-11 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 0de4dca313329..b6a097f7a2bbe 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-03-10 +date: 2023-03-11 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 2e6b6321e6e7f..8590265089bac 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-03-10 +date: 2023-03-11 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 3574ea0ec2811..c816c45dd5f5b 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-03-10 +date: 2023-03-11 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 02d8601f55374..93265d3ca77e0 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-03-10 +date: 2023-03-11 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 95989f8ec28c3..136b73bc942e6 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-03-10 +date: 2023-03-11 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 01c5a7c510c13..9a2153c1d0132 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-03-10 +date: 2023-03-11 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 725d1a335597b..5c252af3873e5 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index 6416e926dce7a..3c47006b075ed 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -1676,6 +1676,38 @@ "path": "x-pack/plugins/security/server/audit/audit_events.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.AuditKibana.unauthorized_spaces", + "type": "Object", + "tags": [], + "label": "unauthorized_spaces", + "description": [ + "\nSet of space IDs that are not authorized for an action." + ], + "signature": [ + "readonly string[] | undefined" + ], + "path": "x-pack/plugins/security/server/audit/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.AuditKibana.unauthorized_types", + "type": "Object", + "tags": [], + "label": "unauthorized_types", + "description": [ + "\nSet of types that are not authorized for an action." + ], + "signature": [ + "readonly string[] | undefined" + ], + "path": "x-pack/plugins/security/server/audit/audit_events.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 655e55546d2e1..9436ce3b14f61 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 278 | 0 | 94 | 0 | +| 280 | 0 | 94 | 0 | ## Client diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 7566ba9cbefe5..ab8288a696d9c 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 1b54873be2e17..e415e45d2d41c 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-03-10 +date: 2023-03-11 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 6fb0701f598fc..b363f5c94b8fb 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-03-10 +date: 2023-03-11 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 90d5f015e58d4..4619551015f4d 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-03-10 +date: 2023-03-11 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 308e3720c97c5..0488c719bba43 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-03-10 +date: 2023-03-11 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 90b3747f632c1..eaa3538e08164 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-03-10 +date: 2023-03-11 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 748c6257b7ae1..3670598a4c1f1 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-03-10 +date: 2023-03-11 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 83e01940fd4a5..c4a1147486539 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-03-10 +date: 2023-03-11 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 e11cc26f464a7..54f0f75fb5bb9 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-03-10 +date: 2023-03-11 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 ec6a935fac6b2..04866ea61bcaf 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-03-10 +date: 2023-03-11 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 19e84c6c1aa93..0a5e9ec3da558 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-03-10 +date: 2023-03-11 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 3541daa694ffa..2c7f9d5abd958 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 9fa1f95978fec..b315274d4a16a 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-03-10 +date: 2023-03-11 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 a2e2299287e53..0463e24eccdd7 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-03-10 +date: 2023-03-11 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 eccf5ecd5d822..3f8257e0cd7eb 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-03-10 +date: 2023-03-11 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 791444d2576da..53660a170166e 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -4590,7 +4590,7 @@ "label": "setRuleProperty", "description": [], "signature": [ - "(key: Prop, value: ", + "(key: Prop, value: ", "SanitizedRule", "[Prop] | null) => void" ], diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index ad81ae9349656..accab539d0b53 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-03-10 +date: 2023-03-11 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 a61e792c43d1c..357828eaf87ae 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-03-10 +date: 2023-03-11 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 2677c738fa61f..e00bbd8669f73 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index 03a37b3e688e6..fe81966f69fec 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2023-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 0fdb91034dc1d..4cc2245619eab 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-03-10 +date: 2023-03-11 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 8d950e9505e16..ea3f5185155aa 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-03-10 +date: 2023-03-11 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 00270065568b8..52f999ab21c5b 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 78967573429c1..f857a038d2b98 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-03-10 +date: 2023-03-11 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 eac22737ae649..de028bfb90a8e 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-03-10 +date: 2023-03-11 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 5ea98cba3b15d..24d816744b096 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-03-10 +date: 2023-03-11 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 5824a67a9142b..aef321563817d 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-03-10 +date: 2023-03-11 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 d6adedf2cdc1e..8bb36117629f1 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-03-10 +date: 2023-03-11 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 e2b0c69f053ad..98d7cb972a7d9 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-03-10 +date: 2023-03-11 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 1aa49607df5f5..eaf145c99165a 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-03-10 +date: 2023-03-11 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 a3d38e1004a8a..1f03dc6ca8db8 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-03-10 +date: 2023-03-11 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 12aa0fac9e113..61eba3b6bb21b 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-03-10 +date: 2023-03-11 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 4c01179182d6a..2bc48e9d8c32c 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-03-10 +date: 2023-03-11 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 250a4b5492707..e9fe97fe0b3b5 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-03-10 +date: 2023-03-11 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 9a3c79558fcd5..16b3a6910264e 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-03-10 +date: 2023-03-11 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 081e3bd92292a..1bd5c2a0c78c2 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-03-10 +date: 2023-03-11 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 36bfda716034a..ae88cf88b6ff5 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-03-10 +date: 2023-03-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json';