diff --git a/.backportrc.json b/.backportrc.json index b0595644da22f..931ea6dbfe3a7 100644 --- a/.backportrc.json +++ b/.backportrc.json @@ -4,6 +4,7 @@ "targetBranchChoices": [ "main", "8.x", + "8.17", "8.16", "8.15", "8.14", @@ -55,7 +56,7 @@ ], "branchLabelMapping": { "^v9.0.0$": "main", - "^v8.17.0$": "8.x", + "^v8.18.0$": "8.x", "^v(\\d+).(\\d+).\\d+$": "$1.$2" }, "autoMerge": true, diff --git a/.buildkite/ftr_oblt_serverless_configs.yml b/.buildkite/ftr_oblt_serverless_configs.yml index fbf0406f37be4..ee954577fc758 100644 --- a/.buildkite/ftr_oblt_serverless_configs.yml +++ b/.buildkite/ftr_oblt_serverless_configs.yml @@ -27,3 +27,4 @@ enabled: - x-pack/test_serverless/functional/test_suites/observability/config.screenshots.ts # serverless config files that run deployment-agnostic tests - x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts + - x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.apm.serverless.config.ts diff --git a/.buildkite/ftr_oblt_stateful_configs.yml b/.buildkite/ftr_oblt_stateful_configs.yml index 7655ce6de38cf..6cad97ecc4456 100644 --- a/.buildkite/ftr_oblt_stateful_configs.yml +++ b/.buildkite/ftr_oblt_stateful_configs.yml @@ -52,3 +52,4 @@ enabled: - x-pack/test/functional/apps/apm/config.ts # stateful configs that run deployment-agnostic tests - x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts + - x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.apm.stateful.config.ts diff --git a/.buildkite/ftr_platform_stateful_configs.yml b/.buildkite/ftr_platform_stateful_configs.yml index 3db1d194e59aa..f55fc2f7b4898 100644 --- a/.buildkite/ftr_platform_stateful_configs.yml +++ b/.buildkite/ftr_platform_stateful_configs.yml @@ -375,3 +375,4 @@ enabled: - x-pack/test/custom_branding/config.ts # stateful config files that run deployment-agnostic tests - x-pack/test/api_integration/deployment_agnostic/configs/stateful/platform.stateful.config.ts + - x-pack/test/api_integration/apis/cloud/config.ts diff --git a/.buildkite/ftr_security_serverless_configs.yml b/.buildkite/ftr_security_serverless_configs.yml index 89550c59e6bb8..955354e2acb50 100644 --- a/.buildkite/ftr_security_serverless_configs.yml +++ b/.buildkite/ftr_security_serverless_configs.yml @@ -100,7 +100,9 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/explore/network/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/explore/users/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/explore/overview/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/basic_license_essentials_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/basic_license_essentials_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/sources/indices/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/artifacts/trial_license_complete_tier/configs/serverless.config.ts diff --git a/.buildkite/ftr_security_stateful_configs.yml b/.buildkite/ftr_security_stateful_configs.yml index d3aadb1b7491d..f7caacba05e1b 100644 --- a/.buildkite/ftr_security_stateful_configs.yml +++ b/.buildkite/ftr_security_stateful_configs.yml @@ -80,13 +80,9 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/explore/users/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/explore/overview/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/basic_license_essentials_tier/configs/ess.config.ts - - x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/basic_license_essentials_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/ess.config.ts - - x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/ess.config.ts - - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/basic_license_essentials_tier/configs/ess.config.ts - - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/basic_license_essentials_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/sources/indices/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/artifacts/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/authentication/trial_license_complete_tier/configs/ess.config.ts diff --git a/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml b/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml index 652ce7b35c30d..beccde5ab87f2 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml @@ -22,7 +22,7 @@ spec: SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' allow_rebuilds: true - branch_configuration: main 8.x 8.16 8.15 7.17 + branch_configuration: main 8.x 8.17 8.16 8.15 7.17 default_branch: main repository: elastic/kibana pipeline_file: .buildkite/pipelines/es_snapshots/build.yml @@ -52,6 +52,10 @@ spec: cronline: 0 22 * * * America/New_York message: Daily build branch: '8.x' + Daily build (8.17): + cronline: 0 22 * * * America/New_York + message: Daily build + branch: '8.17' Daily build (8.16): cronline: 0 22 * * * America/New_York message: Daily build @@ -91,7 +95,7 @@ spec: SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' allow_rebuilds: true - branch_configuration: main 8.x 8.16 8.15 7.17 + branch_configuration: main 8.x 8.17 8.16 8.15 7.17 default_branch: main repository: elastic/kibana pipeline_file: .buildkite/pipelines/es_snapshots/promote.yml @@ -140,7 +144,7 @@ spec: ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' REPORT_FAILED_TESTS_TO_GITHUB: 'true' allow_rebuilds: true - branch_configuration: main 8.x 8.16 8.15 7.17 + branch_configuration: main 8.x 8.17 8.16 8.15 7.17 default_branch: main repository: elastic/kibana pipeline_file: .buildkite/pipelines/es_snapshots/verify.yml diff --git a/.buildkite/pipeline-resource-definitions/kibana-on-merge-unsupported-ftrs.yml b/.buildkite/pipeline-resource-definitions/kibana-on-merge-unsupported-ftrs.yml index b2ec63310cc6c..8219f37d349fb 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-on-merge-unsupported-ftrs.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-on-merge-unsupported-ftrs.yml @@ -22,7 +22,7 @@ spec: SLACK_NOTIFICATIONS_CHANNEL: '#kibana-unsupported-ftrs-alerts' ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' allow_rebuilds: true - branch_configuration: main 8.x 8.16 8.15 7.17 + branch_configuration: main 8.x 8.17 8.16 8.15 7.17 default_branch: main repository: elastic/kibana pipeline_file: .buildkite/pipelines/on_merge_unsupported_ftrs.yml diff --git a/.buildkite/pipeline-resource-definitions/kibana-on-merge.yml b/.buildkite/pipeline-resource-definitions/kibana-on-merge.yml index 5b71b58b8a00f..aa56f4561fb6b 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-on-merge.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-on-merge.yml @@ -25,7 +25,7 @@ spec: REPORT_FAILED_TESTS_TO_GITHUB: 'true' ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' allow_rebuilds: true - branch_configuration: main 8.x 8.16 8.15 7.17 + branch_configuration: main 8.x 8.17 8.16 8.15 7.17 default_branch: main repository: elastic/kibana pipeline_file: .buildkite/pipelines/on_merge.yml diff --git a/.buildkite/scripts/common/env.sh b/.buildkite/scripts/common/env.sh index 511f6ead2d43c..1eb86de0bc030 100755 --- a/.buildkite/scripts/common/env.sh +++ b/.buildkite/scripts/common/env.sh @@ -146,7 +146,7 @@ if [[ "${KBN_ENABLE_FIPS:-}" == "true" ]] || is_pr_with_label "ci:enable-fips-ag fi if [[ -f "$KIBANA_DIR/config/kibana.yml" ]]; then - echo -e '\nxpack.security.experimental.fipsMode.enabled: true' >>"$KIBANA_DIR/config/kibana.yml" + echo -e '\nxpack.security.fipsMode.enabled: true' >>"$KIBANA_DIR/config/kibana.yml" fi fi diff --git a/.devcontainer/scripts/env.sh b/.devcontainer/scripts/env.sh index 77c2000663e5f..dccc17130c99c 100755 --- a/.devcontainer/scripts/env.sh +++ b/.devcontainer/scripts/env.sh @@ -9,7 +9,7 @@ setup_fips() { fi if [ -n "$FIPS" ] && [ "$FIPS" = "1" ]; then - sed -i '/xpack.security.experimental.fipsMode.enabled:/ {s/.*/xpack.security.experimental.fipsMode.enabled: true/; t}; $a\xpack.security.experimental.fipsMode.enabled: true' "$KBN_CONFIG_FILE" + sed -i '/xpack.security.fipsMode.enabled:/ {s/.*/xpack.security.fipsMode.enabled: true/; t}; $a\xpack.security.fipsMode.enabled: true' "$KBN_CONFIG_FILE" # Patch node_modules so we can start Kibana in dev mode sed -i 's/hashType = hashType || '\''md5'\'';/hashType = hashType || '\''sha1'\'';/g' "${KBN_DIR}/node_modules/file-loader/node_modules/loader-utils/lib/getHashDigest.js" @@ -21,7 +21,7 @@ setup_fips() { echo "FIPS mode enabled" echo "If manually bootstrapping in FIPS mode use: NODE_OPTIONS='' yarn kbn bootstrap" else - sed -i '/xpack.security.experimental.fipsMode.enabled:/ {s/.*/xpack.security.experimental.fipsMode.enabled: false/; t}; $a\xpack.security.experimental.fipsMode.enabled: false' "$KBN_CONFIG_FILE" + sed -i '/xpack.security.fipsMode.enabled:/ {s/.*/xpack.security.fipsMode.enabled: false/; t}; $a\xpack.security.fipsMode.enabled: false' "$KBN_CONFIG_FILE" fi } diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 268f1d5148d43..5b27bc63d3647 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1116,6 +1116,7 @@ src/plugins/discover/public/context_awareness/profile_providers/security @elasti /x-pack/test/screenshot_creation @elastic/platform-docs # Visualizations +/test/functional/page_objects/unified_search_page.ts @elastic/kibana-visualizations # Assigned per https://github.com/elastic/kibana/pull/200132#discussion_r1847188168 /test/functional/apps/getting_started/*.ts @elastic/kibana-visualizations # Assigned per https://github.com/elastic/kibana/pull/199767#discussion_r1840485031 /x-pack/test/upgrade/apps/graph @elastic/kibana-visualizations /x-pack/test/functional/page_objects/log_wrapper.ts @elastic/kibana-visualizations # Assigned per https://github.com/elastic/kibana/pull/36437 @@ -1204,9 +1205,11 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql ### Observability Plugins # Observability AI Assistant -x-pack/test/observability_ai_assistant_api_integration @elastic/obs-ai-assistant -x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant -x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai-assistant +/x-pack/test_serverless/api_integration/test_suites/common/data_usage @elastic/obs-ai-assistant +/x-pack/test_serverless/functional/test_suites/common/data_usage @elastic/obs-ai-assistant @elastic/kibana-security +/x-pack/test/observability_ai_assistant_api_integration @elastic/obs-ai-assistant +/x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant +/x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai-assistant # Infra Obs ## This plugin mostly contains the codebase for the infra services, but also includes some code for the Logs UI app. @@ -1219,9 +1222,12 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai ## infra/{common,docs,public,server}/{sub-folders}/ -> @elastic/obs-ux-infra_services-team # obs-ux-infra_services-team +/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/ @elastic/obs-ux-infra_services-team +/x-pack/test/api_integration/deployment_agnostic/apis/observability/infra/ @elastic/obs-ux-infra_services-team /x-pack/test/functional/page_objects/asset_details.ts @elastic/obs-ux-infra_services-team # Assigned per https://github.com/elastic/kibana/pull/200157/files/c83fae62151fe634342c498aca69b686b739fe45#r1842202022 /x-pack/test/functional/page_objects/infra_* @elastic/obs-ux-infra_services-team /x-pack/test/functional/es_archives/infra @elastic/obs-ux-infra_services-team +/x-pack/test_serverless/**/test_suites/observability/infra/ @elastic/obs-ux-infra_services-team /test/common/plugins/otel_metrics @elastic/obs-ux-infra_services-team /x-pack/plugins/observability_solution/infra/common @elastic/obs-ux-infra_services-team /x-pack/plugins/observability_solution/infra/docs @elastic/obs-ux-infra_services-team @@ -1246,6 +1252,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/api_integration/services/infraops_source_configuration.ts @elastic/obs-ux-infra_services-team @elastic/obs-ux-logs-team # Assigned per https://github.com/elastic/kibana/pull/34916 ## Logs UI code exceptions -> @elastic/obs-ux-logs-team +/x-pack/test/api_integration/deployment_agnostic/apis/observability/data_quality/ @elastic/obs-ux-logs-team /x-pack/test/upgrade/apps/logs @elastic/obs-ux-logs-team /x-pack/test_serverless/functional/page_objects/svl_oblt_onboarding_stream_log_file.ts @elastic/obs-ux-logs-team /x-pack/test_serverless/functional/page_objects/svl_oblt_onboarding_page.ts @elastic/obs-ux-logs-team @@ -1271,6 +1278,8 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/common/utils/synthtrace @elastic/obs-ux-infra_services-team @elastic/obs-ux-logs-team # Assigned per https://github.com/elastic/kibana/blob/main/packages/kbn-apm-synthtrace/kibana.jsonc#L5 # Infra Monitoring tests +/x-pack/test/common/services/infra_synthtrace_kibana_client.ts @elastic/obs-ux-infra_services-team +/x-pack/test/common/services/infra_log_views.ts @elastic/obs-ux-infra_services-team # Assigned per https://github.com/elastic/kibana/pull/188204 /x-pack/test/api_integration/apis/infra @elastic/obs-ux-infra_services-team /x-pack/test/functional/apps/infra @elastic/obs-ux-infra_services-team /x-pack/test/functional/apps/infra/logs @elastic/obs-ux-logs-team @@ -1292,10 +1301,10 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test_serverless/**/test_suites/observability/custom_threshold_rule/ @elastic/obs-ux-management-team /x-pack/test_serverless/**/test_suites/observability/slos/ @elastic/obs-ux-management-team /x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule @elastic/obs-ux-management-team -/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/burn_rate_rule @elastic/obs-ux-management-team +/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/ @elastic/obs-ux-management-team +/x-pack/test/api_integration/deployment_agnostic/apis/observability/slo/ @elastic/obs-ux-management-team /x-pack/test/api_integration/deployment_agnostic/services/alerting_api @elastic/obs-ux-management-team /x-pack/test/api_integration/deployment_agnostic/services/slo_api @elastic/obs-ux-management-team -/x-pack/test_serverless/**/test_suites/observability/infra/ @elastic/obs-ux-infra_services-team # Elastic Stack Monitoring /x-pack/test/monitoring_api_integration @elastic/stack-monitoring @@ -1309,6 +1318,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/accessibility/apps/group3/stack_monitoring.ts @elastic/stack-monitoring # Fleet +/x-pack/test/functional/es_archives/fleet @elastic/fleet /x-pack/test/api_integration/services/fleet_and_agents.ts @elastic/fleet /x-pack/test/fleet_api_integration @elastic/fleet /x-pack/test/fleet_packages @elastic/fleet @@ -1369,6 +1379,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/api_integration/apis/logs_shared @elastic/obs-ux-logs-team # Observability-ui +/x-pack/test_serverless/functional/test_suites/observability @elastic/observability-ui /x-pack/test_serverless/api_integration/test_suites/observability/index.ts @elastic/observability-ui /x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts @elastic/observability-ui /x-pack/test/functional/page_objects/observability_page.ts @elastic/observability-ui @@ -1384,6 +1395,12 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai ### END Observability Plugins # Presentation +/x-pack/test/functional/fixtures/kbn_archiver/maps.json @elastic/kibana-presentation +/x-pack/test/functional/fixtures/kbn_archiver/canvas @elastic/kibana-presentation +/x-pack/test/functional/es_archives/dashboard/async_search @elastic/kibana-presentation +/test/functional/fixtures/kbn_archiver/dashboard @elastic/kibana-presentation +/test/functional/fixtures/kbn_archiver/canvas @elastic/kibana-presentation +/test/api_integration/apis/dashboards @elastic/kibana-presentation /test/interpreter_functional/snapshots @elastic/kibana-presentation # Assigned per https://github.com/elastic/kibana/pull/54342 /test/functional/services/inspector.ts @elastic/kibana-presentation /x-pack/test/functional/services/canvas_element.ts @elastic/kibana-presentation @@ -1496,6 +1513,28 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /.eslintignore @elastic/kibana-operations # QA - Appex QA +/x-pack/test/functional/fixtures/package_registry_config.yml @elastic/appex-qa # No usages found +/x-pack/test/functional/fixtures/kbn_archiver/packaging.json @elastic/appex-qa # No usages found +/x-pack/test/functional/es_archives/filebeat @elastic/appex-qa +/x-pack/test/functional/es_archives/logstash_functional @elastic/appex-qa +/x-pack/test/functional/es_archives/event_log_legacy_ids @elastic/appex-qa +/x-pack/test/functional/es_archives/dlstest @elastic/appex-qa # No usages found +/x-pack/test/functional/es_archives/beats/list/data.json @elastic/appex-qa # No usages found +/test/functional/fixtures/kbn_archiver/stress_test.json @elastic/appex-qa +/test/functional/fixtures/kbn_archiver/many_fields_data_view.json @elastic/appex-qa +/test/functional/fixtures/kbn_archiver/long_window_logstash_index_pattern.json @elastic/appex-qa +/test/functional/fixtures/kbn_archiver/kibana_sample_data_logs_tsdb.json @elastic/appex-qa +/test/functional/fixtures/kbn_archiver/kibana_sample_data_logs_logsdb.json @elastic/appex-qa +/test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern.json @elastic/appex-qa +/test/functional/fixtures/es_archiver/stress_test @elastic/appex-qa +/test/functional/fixtures/es_archiver/many_fields @elastic/appex-qa +/test/functional/fixtures/es_archiver/logstash_functional @elastic/appex-qa +/test/functional/fixtures/es_archiver/long_window_logstash @elastic/appex-qa +/test/functional/fixtures/es_archiver/kibana_sample_data_logs_* @elastic/appex-qa +/test/functional/fixtures/es_archiver/kibana_sample_data_flights* @elastic/appex-qa +/test/functional/fixtures/es_archiver/getting_started/shakespeare @elastic/appex-qa +/test/api_integration/fixtures/es_archiver/elasticsearch @elastic/appex-qa +/x-pack/test/plugin_functional/services.ts @elastic/appex-qa /test/server_integration/services/index.js @elastic/appex-qa /x-pack/test/stack_functional_integration/configs/config.stack_functional_integration_base.js @elastic/appex-qa /x-pack/test/stack_functional_integration/configs/consume_state.js @elastic/appex-qa @@ -1614,17 +1653,74 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test_serverless/functional/test_suites/common/home_page/ @elastic/appex-qa /x-pack/test_serverless/**/services/ @elastic/appex-qa /packages/kbn-es/src/stateful_resources/roles.yml @elastic/appex-qa -x-pack/test/api_integration/deployment_agnostic/default_configs/ @elastic/appex-qa -x-pack/test/api_integration/deployment_agnostic/services/ @elastic/appex-qa -x-pack/test/**/deployment_agnostic/ @elastic/appex-qa #temporarily to monitor tests migration +/x-pack/test/api_integration/deployment_agnostic/ftr_provider_context.d.ts @elastic/appex-qa +/x-pack/test/api_integration/deployment_agnostic/README.md @elastic/appex-qa +/x-pack/test/api_integration/deployment_agnostic/*configs/ @elastic/appex-qa +/x-pack/test/api_integration/deployment_agnostic/services/ @elastic/appex-qa # Core /test/api_integration/apis/general/*.js @elastic/kibana-core # Assigned per https://github.com/elastic/kibana/pull/199795/files/894a8ede3f9d0398c5af56bf5a82654a9bc0610b#r1846691639 /x-pack/test/plugin_api_integration/plugins/feature_usage_test @elastic/kibana-core -/test/plugin_functional/plugins/rendering_plugin @elastic/kibana-core -/test/plugin_functional/plugins/session_notifications @elastic/kibana-core +/x-pack/test/functional/page_objects/navigational_search.ts @elastic/kibana-core +/x-pack/test/stack_functional_integration/apps/savedobjects_upgrade_testing @elastic/kibana-core +/x-pack/test/functional/page_objects/status_page.ts @elastic/kibana-core +/x-pack/test/functional/page_objects/share_saved_objects_to_space_page.ts @elastic/kibana-core +/x-pack/test/functional/page_objects/banners_page.ts @elastic/kibana-core +/x-pack/test/common/lib/test_data_loader.ts @elastic/kibana-core +/x-pack/test/api_integration/services/usage_api.ts @elastic/kibana-core +/x-pack/test/api_integration/apis/kibana @elastic/kibana-core +/test/api_integration/fixtures/import.ndjson @elastic/kibana-core +/x-pack/test/plugin_api_integration @elastic/kibana-core # Assigned per https://github.com/elastic/kibana/pull/146704 +/x-pack/test/localization/ @elastic/kibana-core # Assigned per https://github.com/elastic/kibana/pull/146704 +/test/ui_capabilities/newsfeed_err @elastic/kibana-core # Assigned per https://github.com/elastic/kibana/pull/66562 +/test/server_integration/services/types.d.ts @elastic/kibana-core # Assigned per https://github.com/elastic/kibana/pull/81140 +/test/server_integration/http @elastic/kibana-core +/test/scripts/run_multiple_kibana_nodes.sh @elastic/kibana-core +/test/functional/services/usage_collection.ts @elastic/kibana-core +/test/api_integration/fixtures/import_managed.ndjson @elastic/kibana-core +/test/functional/services/apps_menu.ts @elastic/kibana-core +/x-pack/test/functional/apps/status_page @elastic/kibana-core +/x-pack/test/cloud_integration @elastic/kibana-core /x-pack/test/cloud_integration/plugins/saml_provider @elastic/kibana-core -/x-pack/test/functional_embedded/plugins/iframe_embedded @elastic/kibana-core +/test/server_integration @elastic/kibana-core +/x-pack/test/functional_cors @elastic/kibana-core +/x-pack/test/stack_functional_integration/apps/telemetry @elastic/kibana-core +/test/plugin_functional/plugins/core* @elastic/kibana-core +/test/plugin_functional/plugins/telemetry @elastic/kibana-core +/test/plugin_functional/plugins/session_notifications @elastic/kibana-core +/test/plugin_functional/plugins/kbn_top_nav/ @elastic/kibana-core +/test/plugin_functional/plugins/app_link_test @elastic/kibana-core +/test/plugin_functional/plugins/saved_object* @elastic/kibana-core +/test/plugin_functional/plugins/rendering_plugin @elastic/kibana-core +/test/plugin_functional/test_suites/application_links @elastic/kibana-core +/test/plugin_functional/test_suites/telemetry @elastic/kibana-core +/test/plugin_functional/test_suites/usage_collection @elastic/kibana-core +/test/plugin_functional/test_suites/saved_objects* @elastic/kibana-core +/test/plugin_functional/test_suites/core* @elastic/kibana-core +/test/interpreter_functional/plugins/kbn_tp_run_pipeline @elastic/kibana-core +/x-pack/test/functional/fixtures/kbn_archiver/saved_objects_management @elastic/kibana-core +/x-pack/test/functional_embedded @elastic/kibana-core +/test/node_roles_functional @elastic/kibana-core +/test/functional/page_objects/newsfeed_page.ts @elastic/kibana-core # assigned per https://github.com/elastic/kibana/pull/160210 +/test/functional/page_objects/home_page.ts @elastic/kibana-core +/test/functional/fixtures/es_archiver/deprecations_service @elastic/kibana-core +/test/health_gateway @elastic/kibana-core +/test/api_integration/apis/saved_objects* @elastic/kibana-core +/test/health_gateway @elastic/kibana-core +/test/node_roles_functional @elastic/kibana-core +/test/functional/firefox/home.config.ts @elastic/kibana-core +/test/functional/apps/status_page/*.ts @elastic/kibana-core +/test/functional/apps/bundles @elastic/kibana-core # Assigned per https://github.com/elastic/kibana/pull/64367 +/test/examples/hello_world @elastic/kibana-core +/test/examples/routing/index.ts @elastic/kibana-core # Assigned per https://github.com/elastic/kibana/pull/69581 +/test/common/plugins/newsfeed @elastic/kibana-core +/test/common/configure_http2.ts @elastic/kibana-core +/test/api_integration/apis/ui_counters @elastic/kibana-core +/test/api_integration/apis/telemetry @elastic/kibana-core +/test/api_integration/apis/status @elastic/kibana-core +/test/api_integration/apis/stats @elastic/kibana-core # Assigned per: https://github.com/elastic/kibana/pull/20577 +/test/api_integration/apis/saved_objects* @elastic/kibana-core +/test/api_integration/apis/core/*.ts @elastic/kibana-core /x-pack/test/functional/apps/saved_objects_management @elastic/kibana-core /x-pack/test/usage_collection @elastic/kibana-core /x-pack/test/licensing_plugin @elastic/kibana-core @@ -1633,6 +1729,8 @@ x-pack/test/**/deployment_agnostic/ @elastic/appex-qa #temporarily to monitor te /x-pack/test/api_integration/apis/status @elastic/kibana-core /x-pack/test/api_integration/apis/stats @elastic/kibana-core /x-pack/test/api_integration/apis/kibana/stats @elastic/kibana-core +/x-pack/test/api_integration/deployment_agnostic/apis/core/ @elastic/kibana-core +/x-pack/test/api_integration/deployment_agnostic/apis/saved_objects_management/ @elastic/kibana-core /x-pack/test_serverless/functional/test_suites/security/config.saved_objects_management.ts @elastic/kibana-core /config/ @elastic/kibana-core /config/serverless.yml @elastic/kibana-core @elastic/kibana-security @@ -1736,12 +1834,36 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib #CC# /x-pack/plugins/security/ @elastic/kibana-security # Response Ops team -/x-pack/test/examples/triggers_actions_ui_examples @elastic/response-ops +/x-pack/test/functional/es_archives/rule_registry @elastic/response-ops +/x-pack/test/functional/es_archives/event_log_multiple_indicies @elastic/response-ops +/x-pack/test/functional/es_archives/task_manager* @elastic/response-ops # Assigned per https://github.com/elastic/kibana/blob/assign-response-ops/x-pack/test/plugin_api_perf/plugins/task_manager_performance/kibana.jsonc#L4 +/x-pack/test/plugin_api_perf @elastic/response-ops # Assigned per https://github.com/elastic/kibana/blob/assign-response-ops/x-pack/test/plugin_api_perf/plugins/task_manager_performance/kibana.jsonc#L4 +/x-pack/test/functional/page_objects/maintenance_windows_page.ts @elastic/response-ops +/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/index.ts @elastic/response-ops +/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts @elastic/response-ops +/x-pack/test/functional_with_es_ssl/config.base.ts @elastic/response-ops # Assigned per https://github.com/elastic/kibana/pull/197070 +/x-pack/test/functional_with_es_ssl/lib/alert_api_actions.ts @elastic/response-ops +/x-pack/test/functional_with_es_ssl/lib/get_test_data.ts @elastic/response-ops +/x-pack/test/functional_with_es_ssl/page_objects/index.ts @elastic/response-ops # Assigned per git blame +/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts @elastic/response-ops +/x-pack/test/functional_with_es_ssl/page_objects/rule_details.ts @elastic/response-ops +/x-pack/test/functional_with_es_ssl/lib/object_remover.ts @elastic/response-ops +/x-pack/test/stack_functional_integration/apps/alerts @elastic/response-ops +/x-pack/test/functional/services/actions @elastic/response-ops +/x-pack/test/api_integration_basic/apis/security_solution/index.ts @elastic/response-ops +/x-pack/test/api_integration_basic/apis/security_solution/cases_privileges.ts @elastic/response-ops +/x-pack/test/upgrade/services/rules_upgrade_services.ts @elastic/response-ops +/x-pack/test/upgrade/apps/rules @elastic/response-ops +/x-pack/test/examples/triggers_actions_ui_examples @elastic/response-ops # Assigned per https://github.com/elastic/kibana/blob/main/x-pack/examples/triggers_actions_ui_example/kibana.jsonc#L4 +/x-pack/test/functional/services/rules @elastic/response-ops +/x-pack/test/plugin_api_integration/plugins/sample_task_plugin @elastic/response-ops +/x-pack/test/functional/fixtures/kbn_archiver/cases @elastic/response-ops +/x-pack/test/functional/es_archives/cases @elastic/response-ops +/x-pack/test/functional_with_es_ssl/plugins/alerts @elastic/response-ops /x-pack/test/functional_with_es_ssl/plugins/cases @elastic/response-ops /x-pack/test/screenshot_creation/apps/response_ops_docs @elastic/response-ops /x-pack/test/rule_registry @elastic/response-ops @elastic/obs-ux-management-team /x-pack/test/accessibility/apps/group3/rules_connectors.ts @elastic/response-ops -/x-pack/test/functional/es_archives/cases/default @elastic/response-ops /x-pack/test_serverless/functional/page_objects/svl_triggers_actions_ui_page.ts @elastic/response-ops /x-pack/test_serverless/functional/page_objects/svl_rule_details_ui_page.ts @elastic/response-ops /x-pack/test_serverless/functional/page_objects/svl_oblt_overview_page.ts @elastic/response-ops @@ -1838,6 +1960,7 @@ x-pack/test/api_integration/apis/management/index_management/inference_endpoints /test/functional/apps/saved_objects_management @elastic/kibana-management /test/functional/apps/console/*.ts @elastic/kibana-management /test/api_integration/apis/console/*.ts @elastic/kibana-management +/x-pack/test/api_integration/deployment_agnostic/apis/console/ @elastic/kibana-management /test/accessibility/apps/management.ts @elastic/kibana-management /test/accessibility/apps/console.ts @elastic/kibana-management /x-pack/test/api_integration/services/index_management.ts @elastic/kibana-management @@ -1864,6 +1987,8 @@ x-pack/test/api_integration/apis/management/index_management/inference_endpoints /x-pack/test_serverless/functional/test_suites/common/dev_tools/ @elastic/kibana-management /x-pack/test_serverless/**/test_suites/common/grok_debugger/ @elastic/kibana-management /x-pack/test/api_integration/apis/management/ @elastic/kibana-management +/x-pack/test/api_integration/deployment_agnostic/apis/management/ @elastic/kibana-management +/x-pack/test/api_integration/deployment_agnostic/apis/painless_lab/ @elastic/kibana-management /x-pack/test/functional/apps/rollup_job/ @elastic/kibana-management /x-pack/test/api_integration/apis/grok_debugger @elastic/kibana-management /x-pack/test/accessibility/apps/group1/advanced_settings.ts @elastic/kibana-management @@ -2222,7 +2347,10 @@ x-pack/plugins/osquery @elastic/security-defend-workflows /x-pack/plugins/security_solution/public/cloud_defend @elastic/kibana-cloud-security-posture # Cloud Security Posture -x-pack/packages/kbn-cloud-security-posture @elastic/kibana-cloud-security-posture +/x-pack/test/functional/es_archives/kubernetes_security @elastic/kibana-cloud-security-posture +/x-pack/test/functional/es_archives/session_view @elastic/kibana-cloud-security-posture +/x-pack/test/session_view @elastic/kibana-cloud-security-posture # Assigned per https://github.com/elastic/kibana/blob/main/api_docs/session_view.mdx#L18 +/x-pack/packages/kbn-cloud-security-posture @elastic/kibana-cloud-security-posture /x-pack/test/kubernetes_security @elastic/kibana-cloud-security-posture /x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.* @elastic/kibana-cloud-security-posture /x-pack/plugins/security_solution/public/cloud_security_posture @elastic/kibana-cloud-security-posture @@ -2269,8 +2397,10 @@ x-pack/plugins/security_solution/server/lib/security_integrations @elastic/secur /x-pack/plugins/security_solution_serverless/**/*.scss @elastic/security-design # Logstash -/x-pack/test/api_integration/apis/logstash @elastic/logstash +/x-pack/test/functional/services/pipeline_* @elastic/logstash +/x-pack/test/functional/page_objects/logstash_page.ts @elastic/logstash /x-pack/test/functional/apps/logstash @elastic/logstash +/x-pack/test/api_integration/apis/logstash @elastic/logstash #CC# /x-pack/plugins/logstash/ @elastic/logstash # EUI team diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8ed73aa521aff..000a80d2b84f8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,7 +15,7 @@ Reviewers should verify this PR satisfies this list as well. - [ ] 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) - [ ] This was checked for breaking HTTP API changes, and any breaking changes have been approved by the breaking-change committee. The `release_note:breaking` label should be applied in these situations. - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed -- [ ] The PR description includes the appropriate Release Notes section, and the correct `release_node:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) +- [ ] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Identify risks diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 15ffcda0b1c93..2220617a3ec38 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: 2024-11-19 +date: 2024-11-21 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 794e351005fe7..e299e5bf513e5 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index cde3c9b45a280..5d9d1d1ef0734 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 45469c9641ea4..b2d2007176ee0 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index c8db2b8506b22..1e6315872aa5d 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index f32c0ac5d97c1..99bac4223f94a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index c8df2802feb6f..2fa76a793cba7 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 87f3d70b86cab..b78a5d5c451e2 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: 2024-11-19 +date: 2024-11-21 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 e6a4379488f5d..13f2e3f9ea1f8 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: 2024-11-19 +date: 2024-11-21 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 a3d554bb36e2f..99e362aa8c45a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.devdocs.json b/api_docs/cases.devdocs.json index a872c5d9426d7..f1e85ca9536dc 100644 --- a/api_docs/cases.devdocs.json +++ b/api_docs/cases.devdocs.json @@ -1355,6 +1355,20 @@ "path": "x-pack/plugins/cases/common/utils/api_tags.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesApiTags.createComment", + "type": "Object", + "tags": [], + "label": "createComment", + "description": [], + "signature": [ + "readonly string[]" + ], + "path": "x-pack/plugins/cases/common/utils/api_tags.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1446,6 +1460,28 @@ "path": "x-pack/plugins/cases/common/ui/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesCapabilities.CREATE_COMMENT_CAPABILITY", + "type": "boolean", + "tags": [], + "label": "[CREATE_COMMENT_CAPABILITY]", + "description": [], + "path": "x-pack/plugins/cases/common/ui/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesCapabilities.CASES_REOPEN_CAPABILITY", + "type": "boolean", + "tags": [], + "label": "[CASES_REOPEN_CAPABILITY]", + "description": [], + "path": "x-pack/plugins/cases/common/ui/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1548,6 +1584,28 @@ "path": "x-pack/plugins/cases/common/ui/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesPermissions.reopenCase", + "type": "boolean", + "tags": [], + "label": "reopenCase", + "description": [], + "path": "x-pack/plugins/cases/common/ui/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesPermissions.createComment", + "type": "boolean", + "tags": [], + "label": "createComment", + "description": [], + "path": "x-pack/plugins/cases/common/ui/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1618,6 +1676,34 @@ "path": "x-pack/plugins/cases/common/utils/capabilities.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesUiCapabilities.reopenCase", + "type": "Object", + "tags": [], + "label": "reopenCase", + "description": [], + "signature": [ + "readonly string[]" + ], + "path": "x-pack/plugins/cases/common/utils/capabilities.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesUiCapabilities.createComment", + "type": "Object", + "tags": [], + "label": "createComment", + "description": [], + "signature": [ + "readonly string[]" + ], + "path": "x-pack/plugins/cases/common/utils/capabilities.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -2086,6 +2172,107 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "cases", + "id": "def-common.CasePatchRequest", + "type": "Type", + "tags": [], + "label": "CasePatchRequest", + "description": [], + "signature": [ + "{ description?: string | undefined; tags?: string[] | undefined; title?: string | undefined; connector?: ({ id: string; } & (({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".casesWebhook; fields: null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".none; fields: null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".serviceNowITSM; fields: { impact: string | null; severity: string | null; urgency: string | null; category: string | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".serviceNowSIR; fields: { category: string | null; destIp: boolean | null; malwareHash: boolean | null; malwareUrl: boolean | null; priority: string | null; sourceIp: boolean | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".swimlane; fields: { caseId: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".theHive; fields: { tlp: number | null; } | null; } & { name: string; }))) | undefined; severity?: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CaseSeverity", + "text": "CaseSeverity" + }, + " | undefined; assignees?: { uid: string; }[] | undefined; category?: string | null | undefined; customFields?: ({ key: string; type: ", + "CustomFieldTypes", + ".TOGGLE; value: boolean | null; } | { key: string; type: ", + "CustomFieldTypes", + ".TEXT; value: string | null; } | { key: string; type: ", + "CustomFieldTypes", + ".NUMBER; value: number | null; })[] | undefined; settings?: { syncAlerts: boolean; } | undefined; } & { status?: ", + { + "pluginId": "@kbn/cases-components", + "scope": "common", + "docId": "kibKbnCasesComponentsPluginApi", + "section": "def-common.CaseStatuses", + "text": "CaseStatuses" + }, + " | undefined; owner?: string | undefined; } & { id: string; version: string; }" + ], + "path": "x-pack/plugins/cases/common/types/api/case/v1.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "cases", "id": "def-common.CasePostRequest", @@ -2383,6 +2570,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "cases", + "id": "def-common.CASES_REOPEN_CAPABILITY", + "type": "string", + "tags": [], + "label": "CASES_REOPEN_CAPABILITY", + "description": [], + "signature": [ + "\"case_reopen\"" + ], + "path": "x-pack/plugins/cases/common/constants/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "cases", "id": "def-common.CASES_SETTINGS_CAPABILITY", @@ -3030,6 +3232,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "cases", + "id": "def-common.CREATE_COMMENT_CAPABILITY", + "type": "string", + "tags": [], + "label": "CREATE_COMMENT_CAPABILITY", + "description": [], + "signature": [ + "\"create_comment\"" + ], + "path": "x-pack/plugins/cases/common/constants/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "cases", "id": "def-common.DELETE_CASES_CAPABILITY", @@ -3049,13 +3266,31 @@ "parentPluginId": "cases", "id": "def-common.FEATURE_ID", "type": "string", - "tags": [], + "tags": [ + "deprecated" + ], "label": "FEATURE_ID", "description": [], "signature": [ "\"generalCases\"" ], "path": "x-pack/plugins/cases/common/constants/application.ts", + "deprecated": true, + "trackAdoption": false, + "references": [], + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.FEATURE_ID_V2", + "type": "string", + "tags": [], + "label": "FEATURE_ID_V2", + "description": [], + "signature": [ + "\"generalCasesV2\"" + ], + "path": "x-pack/plugins/cases/common/constants/application.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 89669e6216ab4..195e5e9e06dfe 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.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 | |-------------------|-----------|------------------------|-----------------| -| 115 | 0 | 95 | 28 | +| 126 | 0 | 106 | 28 | ## Client diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index eb3f0a727f824..13412e5c0f8ce 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: 2024-11-19 +date: 2024-11-21 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 d3f43e2fcfa23..1569ebf0422f4 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 966039815d5a9..f3120771b11d6 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: 2024-11-19 +date: 2024-11-21 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 99e2ba8117d16..6c14aaa2f71e4 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index bb0ce2f47ee82..1b0ab744e1f80 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: 2024-11-19 +date: 2024-11-21 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 b7b69f1fe6d44..1237f703ccc1e 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 566e4d3b547cb..d4525449445fb 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 04d154ce26f2a..a34692f145a57 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: 2024-11-19 +date: 2024-11-21 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 7a4445adf130c..a9959856a65be 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: 2024-11-19 +date: 2024-11-21 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 c5850f35f0236..c836aa3572a40 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: 2024-11-19 +date: 2024-11-21 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 afc96b9710028..9245ad0d947d6 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: 2024-11-19 +date: 2024-11-21 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 1201d7bf57eb0..d19c18837cd09 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 48a744edd86f6..1514252041696 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index dff7c532d9a36..45a7cec042012 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: 2024-11-19 +date: 2024-11-21 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 98991a193f217..cd800a03712c0 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.devdocs.json b/api_docs/data_usage.devdocs.json index 934e8ba7e64af..09fcffd5c58eb 100644 --- a/api_docs/data_usage.devdocs.json +++ b/api_docs/data_usage.devdocs.json @@ -117,6 +117,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "dataUsage", + "id": "def-common.DEFAULT_SELECTED_OPTIONS", + "type": "number", + "tags": [], + "label": "DEFAULT_SELECTED_OPTIONS", + "description": [], + "signature": [ + "50" + ], + "path": "x-pack/plugins/data_usage/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "dataUsage", "id": "def-common.PLUGIN_ID", diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index aa57bb5b18841..2a13775442420 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 9 | 0 | 9 | 0 | +| 10 | 0 | 10 | 0 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 59124e672fe7e..d5dfcd256900e 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: 2024-11-19 +date: 2024-11-21 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 9fdb5bf3b0b9b..f40054b03b42d 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: 2024-11-19 +date: 2024-11-21 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 63de40341cc8b..1406364224921 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index a01d35465699d..1a8d015414474 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -14194,22 +14194,6 @@ "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx" }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts" @@ -14437,10 +14421,6 @@ { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts" } ] }, @@ -26686,6 +26666,20 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.HasEsDataFailureReason", + "type": "Enum", + "tags": [], + "label": "HasEsDataFailureReason", + "description": [ + "\nValid `failureReason` attribute values for `has_es_data` API error responses" + ], + "path": "src/plugins/data_views/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "misc": [ diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 9361036078db5..c0cb56f241752 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1224 | 0 | 443 | 4 | +| 1225 | 0 | 443 | 4 | ## Client diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 6bfc35dc21917..4fc37f1fbea74 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 8e4d2eae5adb4..6fd15abcb08bc 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index fbcf91dfb05c5..b849470e8f934 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,10 +17,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, controls, lens, @kbn/lens-embeddable-utils, triggersActionsUi, dataVisualizer, canvas, logsShared, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, infra, securitySolution, timelines, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | +| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, controls, lens, @kbn/lens-embeddable-utils, triggersActionsUi, dataVisualizer, canvas, logsShared, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, securitySolution, timelines, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | | | ml, securitySolution | - | | | actions, savedObjectsTagging, ml, enterpriseSearch | - | -| | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, aiops, dataVisualizer, ml, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | +| | @kbn/core-saved-objects-browser-internal, @kbn/core, visualizations, aiops, dataVisualizer, ml, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | | | @kbn/core, embeddable, savedObjects, visualizations, canvas, graph, ml | - | | | @kbn/core-saved-objects-base-server-internal, @kbn/core-saved-objects-migration-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-ui-settings-server-internal, @kbn/core-usage-data-server-internal, taskManager, dataViews, spaces, share, actions, data, alerting, dashboard, @kbn/core-saved-objects-migration-server-mocks, lens, cases, savedSearch, canvas, fleet, cloudSecurityPosture, ml, logsShared, graph, lists, maps, infra, visualizations, apmDataAccess, securitySolution, apm, slo, synthetics, uptime, eventAnnotation, links, savedObjectsManagement, @kbn/core-test-helpers-so-type-serializer, @kbn/core-saved-objects-api-server-internal | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | @@ -48,7 +48,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-saved-objects-browser-mocks, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-common, @kbn/core-saved-objects-server, @kbn/core, @kbn/alerting-types, alerting, actions, savedSearch, canvas, enterpriseSearch, securitySolution, taskManager, @kbn/core-saved-objects-server-internal, @kbn/core-saved-objects-api-server | - | -| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core, savedObjectsTagging, home, canvas, savedObjects, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-ui-settings-server-internal | - | +| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core, savedObjectsTagging, home, canvas, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-ui-settings-server-internal | - | | | @kbn/core-saved-objects-migration-server-internal, dataViews, actions, data, alerting, dashboard, lens, cases, savedSearch, canvas, savedObjectsTagging, graph, lists, maps, visualizations, securitySolution, @kbn/core-test-helpers-so-type-serializer | - | | | @kbn/esql-utils, @kbn/securitysolution-utils, securitySolution | - | | | security, securitySolution, cloudLinks, cases | - | @@ -71,13 +71,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | actions, alerting | - | | | monitoring | - | | | @kbn/core-saved-objects-api-browser, @kbn/core, savedObjectsManagement, savedObjects, visualizations, savedObjectsTagging, eventAnnotation, lens, maps, graph, dashboard, kibanaUtils, expressions, data, savedObjectsTaggingOss, embeddable, uiActionsEnhanced, controls, canvas, dashboardEnhanced, globalSearchProviders | - | -| | @kbn/core-saved-objects-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, home, savedObjects, visualizations, lens, visTypeTimeseries, @kbn/core-saved-objects-browser-mocks | - | -| | @kbn/core-saved-objects-browser-internal, savedObjects, @kbn/core-saved-objects-browser-mocks | - | +| | @kbn/core-saved-objects-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, home, visualizations, lens, visTypeTimeseries, @kbn/core-saved-objects-browser-mocks | - | +| | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks | - | | | home, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, visualizations | - | | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | -| | savedObjects, @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, @kbn/core-saved-objects-browser-internal | - | -| | @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, savedObjects, @kbn/core-saved-objects-browser-internal | - | +| | @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, @kbn/core-saved-objects-browser-internal | - | +| | @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, discover, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | @@ -86,7 +86,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-internal | - | -| | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, graph | - | +| | @kbn/core-saved-objects-browser-internal, @kbn/core, visualizations, graph | - | | | @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | @@ -132,7 +132,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | lens | - | | | lens | - | | | lens, dashboard, investigateApp | - | -| | @kbn/core, lens, savedObjects | - | +| | @kbn/core, lens | - | | | canvas | - | | | canvas | - | | | canvas | - | @@ -200,6 +200,7 @@ Safe to remove. | | alerting | | | alerting | | | alerting | +| | cases | | | data | | | data | | | data | @@ -234,6 +235,7 @@ Safe to remove. | | lists | | | lists | | | lists | +| | observability | | | savedObjects | | | security | | | serverless | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index ccd10e2cfe25b..1a945320752fb 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -574,7 +574,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context) | - | | | [canvas_workpad_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/canvas_workpad_service.ts#:~:text=ResolvedSimpleSavedObject), [canvas_workpad_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/canvas_workpad_service.ts#:~:text=ResolvedSimpleSavedObject), [canvas_workpad_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/canvas_workpad_service.ts#:~:text=ResolvedSimpleSavedObject), [canvas_workpad_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/canvas_workpad_service.ts#:~:text=ResolvedSimpleSavedObject) | - | | | [workpad_route_context.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/workpad_route_context.ts#:~:text=migrationVersion) | - | -| | [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes) | - | +| | [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes), [has_workpads.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts#:~:text=SavedObjectAttributes), [has_workpads.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/custom_elements/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/workpad/find.ts#:~:text=SavedObjectAttributes)+ 2 more | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/shareable_runtime/types.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/shareable_runtime/types.ts#:~:text=SavedObject), [canvas_workpad_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/canvas_workpad_service.ts#:~:text=SavedObject), [canvas_workpad_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/canvas_workpad_service.ts#:~:text=SavedObject), [use_upload_workpad.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/home/hooks/use_upload_workpad.ts#:~:text=SavedObject), [use_upload_workpad.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/home/hooks/use_upload_workpad.ts#:~:text=SavedObject) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/shareable_runtime/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/shareable_runtime/types.ts#:~:text=SavedObjectAttributes) | - | | | [saved_lens.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_lens.ts#:~:text=SavedObjectReference), [saved_lens.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_lens.ts#:~:text=SavedObjectReference), [saved_map.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_map.ts#:~:text=SavedObjectReference), [saved_map.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_map.ts#:~:text=SavedObjectReference), [saved_search.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_search.ts#:~:text=SavedObjectReference), [saved_search.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_search.ts#:~:text=SavedObjectReference), [saved_visualization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_visualization.ts#:~:text=SavedObjectReference), [saved_visualization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_visualization.ts#:~:text=SavedObjectReference), [embeddable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=SavedObjectReference), [embeddable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=SavedObjectReference) | - | @@ -952,7 +952,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [use_waffle_filters.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts#:~:text=title) | - | | | [saved_object_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/server/lib/sources/saved_object_type.ts#:~:text=migrations) | - | @@ -1229,15 +1228,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectsClientContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SavedObjectsClientContract), [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=SavedObjectsClientContract), [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=SavedObjectsClientContract)+ 5 more | - | -| | [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=create), [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=create), [create_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/create_source.ts#:~:text=create), [create_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/create_source.ts#:~:text=create), [save_saved_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_saved_object.ts#:~:text=create), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=create), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=create), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=create), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=create), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=create)+ 1 more | - | -| | [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=find), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=find), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=find) | - | -| | [initialize_saved_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts#:~:text=get) | - | -| | [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SimpleSavedObject), [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SimpleSavedObject), [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SimpleSavedObject) | - | -| | [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=SavedObjectsCreateOptions), [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=SavedObjectsCreateOptions), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=SavedObjectsCreateOptions), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=SavedObjectsCreateOptions), [save_with_confirmation.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts#:~:text=SavedObjectsCreateOptions) | - | -| | [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=simpleSavedObjectMock), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=simpleSavedObjectMock) | - | -| | [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=SavedObject), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts#:~:text=SavedObject) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SavedObjectAttributes), [find_object_by_title.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts#:~:text=SavedObjectAttributes), [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=SavedObjectAttributes), [save_with_confirmation.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts#:~:text=SavedObjectAttributes), [create_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/create_source.ts#:~:text=SavedObjectAttributes)+ 4 more | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectAttributes) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectReference), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectReference), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectReference), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectReference), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectReference), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=SavedObjectReference) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 2a7eb147ca9cd..491d92ded6b66 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index e5377fb8c2d3f..f2d8fe46d51aa 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: 2024-11-19 +date: 2024-11-21 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 e99b433dfbc38..235836c647e7d 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: 2024-11-19 +date: 2024-11-21 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 fd3da7356071b..3bb8d0f4eb5f4 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 2c704f162afb0..162b8cc5bbd7f 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index fa35eb3dc4311..0ebae55d5e329 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.devdocs.json b/api_docs/elastic_assistant.devdocs.json index 3fe39450a7c86..60d0345bc415b 100644 --- a/api_docs/elastic_assistant.devdocs.json +++ b/api_docs/elastic_assistant.devdocs.json @@ -1664,7 +1664,7 @@ "section": "def-server.KibanaRequest", "text": "KibanaRequest" }, - " | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, any>" + " | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; } | { subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, any>" ], "path": "x-pack/plugins/elastic_assistant/server/types.ts", "deprecated": false, diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 214643c86d4fd..7b3168e0d3b8f 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index eb73d8a16367a..bae2f28e6eb87 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: 2024-11-19 +date: 2024-11-21 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 a0a77ff91bce6..4e570fabcd39d 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: 2024-11-19 +date: 2024-11-21 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 3ec4dc1bbc1a8..2f3b7b193a85f 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: 2024-11-19 +date: 2024-11-21 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 bb8a84fc6707e..ed5a7c678b458 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index 2c038dc679e6c..9921e22e8f9f0 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index ccc097f34276b..752bdf4a2aeac 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 4edcc3f06209b..fb1a1a53d1f24 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index d4214278b40f0..f2a267ba2ab10 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 605066c06cb5f..7ce5d8e613e6f 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 58c1d189c6f4e..7b08a1921c476 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index b4755e1ecc65a..05ab5523be5b7 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index a92f4b64c6ece..942dda6e349b9 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 177b9f6d5a490..512096cde33f3 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 6aa589c37d0fc..47947b3175cac 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: 2024-11-19 +date: 2024-11-21 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 248364b05143f..0c6cf2d2ac901 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: 2024-11-19 +date: 2024-11-21 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 c9b6d3e8a4bea..8ae22034d42f1 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: 2024-11-19 +date: 2024-11-21 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 6946b78c84f09..f2ada2b68de5d 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: 2024-11-19 +date: 2024-11-21 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 4cfa3f7e9de51..ebec6f1a110e2 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: 2024-11-19 +date: 2024-11-21 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 6c6c3000d10a6..d3efbdc5592fc 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: 2024-11-19 +date: 2024-11-21 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 d96b4db3ffa39..7d905dfd58f46 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: 2024-11-19 +date: 2024-11-21 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 54764722481de..455994f5020ac 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: 2024-11-19 +date: 2024-11-21 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 c697f7294ed75..2d08a7e56693e 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: 2024-11-19 +date: 2024-11-21 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 66c7479849e76..af37cd3d61a18 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: 2024-11-19 +date: 2024-11-21 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 5673b23367a73..147f2a4d95a23 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: 2024-11-19 +date: 2024-11-21 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 8725c8a4feee0..69388215ac8c6 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: 2024-11-19 +date: 2024-11-21 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 b42ed0eb9a953..bcd0c044979b5 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: 2024-11-19 +date: 2024-11-21 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 a281303cf1a2c..e50bbe3dbb9b9 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.devdocs.json b/api_docs/features.devdocs.json index ffb0475bb6b5f..b2c5e5c97a10b 100644 --- a/api_docs/features.devdocs.json +++ b/api_docs/features.devdocs.json @@ -56,7 +56,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", + "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", { "pluginId": "features", "scope": "common", @@ -64,7 +64,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; scope?: readonly ", + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; scope?: readonly ", { "pluginId": "features", "scope": "common", @@ -238,7 +238,7 @@ "label": "privileges", "description": [], "signature": [ - "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null" + "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -291,7 +291,7 @@ "label": "reserved", "description": [], "signature": [ - "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined" + "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -499,7 +499,7 @@ "\nIf your feature requires access to specific owners of cases (aka plugins that have created cases), then specify your access needs here. The values here should\nbe unique identifiers for the owners of cases you want access to." ], "signature": [ - "{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; } | undefined" + "{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; } | undefined" ], "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", "deprecated": false, @@ -1481,7 +1481,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", + "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", { "pluginId": "features", "scope": "common", @@ -1489,7 +1489,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; scope?: readonly ", + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; scope?: readonly ", { "pluginId": "features", "scope": "common", @@ -1663,7 +1663,7 @@ "label": "privileges", "description": [], "signature": [ - "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null" + "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -1716,7 +1716,7 @@ "label": "reserved", "description": [], "signature": [ - "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined" + "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -2103,7 +2103,7 @@ "\nIf your feature requires access to specific owners of cases (aka plugins that have created cases), then specify your access needs here. The values here should\nbe unique identifiers for the owners of cases you want access to." ], "signature": [ - "{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; } | undefined" + "{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; } | undefined" ], "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", "deprecated": false, @@ -3502,7 +3502,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", + "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", { "pluginId": "features", "scope": "common", @@ -3510,7 +3510,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; scope?: readonly ", + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; scope?: readonly ", { "pluginId": "features", "scope": "common", @@ -3684,7 +3684,7 @@ "label": "privileges", "description": [], "signature": [ - "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null" + "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }> | null" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -3737,7 +3737,7 @@ "label": "reserved", "description": [], "signature": [ - "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined" + "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | Readonly<{ default: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; minimal: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[]; }> | undefined; }>; }>[]; }> | undefined" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -3832,7 +3832,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>" + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>" ], "path": "x-pack/plugins/features/common/sub_feature.ts", "deprecated": false, @@ -3869,7 +3869,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]" + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]" ], "path": "x-pack/plugins/features/common/sub_feature.ts", "deprecated": false, @@ -3913,7 +3913,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }" + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; replacedBy?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; app?: readonly string[] | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }" ], "path": "x-pack/plugins/features/common/sub_feature.ts", "deprecated": false, @@ -4257,7 +4257,7 @@ "\nIf your feature requires access to specific owners of cases (aka plugins that have created cases), then specify your access needs here. The values here should\nbe unique identifiers for the owners of cases you want access to." ], "signature": [ - "{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; } | undefined" + "{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; } | undefined" ], "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", "deprecated": false, diff --git a/api_docs/features.mdx b/api_docs/features.mdx index f85a2f3d784d9..7fcf12e869f32 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: 2024-11-19 +date: 2024-11-21 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 ab83dedcd01a5..1363566eec4b6 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.devdocs.json b/api_docs/fields_metadata.devdocs.json index a4807cac5bbd4..987d36d475bf3 100644 --- a/api_docs/fields_metadata.devdocs.json +++ b/api_docs/fields_metadata.devdocs.json @@ -338,14 +338,45 @@ "label": "getClient", "description": [], "signature": [ - "() => ", - "IFieldsMetadataClient" + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + ") => Promise<", + "IFieldsMetadataClient", + ">" ], "path": "x-pack/plugins/fields_metadata/server/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], - "children": [] + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.FieldsMetadataServerStart.getClient.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "x-pack/plugins/fields_metadata/server/services/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "lifecycle": "start", diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index bf531aea5845c..897af0987a77d 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 44 | 0 | 44 | 9 | +| 45 | 0 | 45 | 9 | ## Client diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 63582ce718e59..84d2ad5ade54f 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: 2024-11-19 +date: 2024-11-21 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 f8e261028bb21..056251e8671d0 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: 2024-11-19 +date: 2024-11-21 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 2b63158df2b2e..00e1845910b57 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 44cdbaf201098..4d371badd779c 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -22472,7 +22472,7 @@ "signature": [ "{ monitoring: ", "FullAgentPolicyMonitoring", - "; download: { sourceURI: string; }; features: Record; protection?: { enabled: boolean; uninstall_token_hash: string; signing_key: string; } | undefined; } | undefined" + "; download: { sourceURI: string; }; features: Record; protection?: { enabled: boolean; uninstall_token_hash: string; signing_key: string; } | undefined; logging?: { level?: string | undefined; to_files?: boolean | undefined; files?: { rotateeverybytes?: number | undefined; keepfiles?: number | undefined; interval?: string | undefined; } | undefined; } | undefined; limits?: { go_max_procs?: number | undefined; } | undefined; } | undefined" ], "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", "deprecated": false, @@ -25684,6 +25684,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "fleet", + "id": "def-common.PackageSpecManifest.policy_templates_behavior", + "type": "CompoundType", + "tags": [], + "label": "policy_templates_behavior", + "description": [], + "signature": [ + "\"all\" | \"combined_policy\" | \"individual_policies\" | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/package_spec.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "fleet", "id": "def-common.PackageSpecManifest.policy_templates", @@ -28718,7 +28732,7 @@ "section": "def-common.RegistryDataStream", "text": "RegistryDataStream" }, - "[] | undefined; policy_templates?: ", + "[] | undefined; policy_templates_behavior?: \"all\" | \"combined_policy\" | \"individual_policies\" | undefined; policy_templates?: ", { "pluginId": "fleet", "scope": "common", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 00999c00d8251..a2ff0c9e17514 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1427 | 5 | 1302 | 81 | +| 1428 | 5 | 1303 | 81 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 78b526ba751eb..0a3f583b9ab56 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: 2024-11-19 +date: 2024-11-21 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 15dc75c8db520..c7cbe48b1cb6d 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: 2024-11-19 +date: 2024-11-21 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 520030ad4c702..5176f9087bf90 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; -Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) for questions regarding this plugin. +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index c9509b74857f4..94f1e5af744cf 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: 2024-11-19 +date: 2024-11-21 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 f8e4c358ce3b1..b31b634dda0c4 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: 2024-11-19 +date: 2024-11-21 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 b02fca3e4caf3..7740b25acbea5 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.devdocs.json b/api_docs/inference.devdocs.json index d9b4b8cc287de..340b5e87d7f0d 100644 --- a/api_docs/inference.devdocs.json +++ b/api_docs/inference.devdocs.json @@ -259,14 +259,202 @@ } ], "interfaces": [ + { + "parentPluginId": "inference", + "id": "def-server.BoundInferenceClient", + "type": "Interface", + "tags": [], + "label": "BoundInferenceClient", + "description": [ + "\nA version of the {@link InferenceClient} that is pre-bound to a set of parameters." + ], + "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "inference", + "id": "def-server.BoundInferenceClient.chatComplete", + "type": "Function", + "tags": [], + "label": "chatComplete", + "description": [ + "\n`chatComplete` requests the LLM to generate a response to\na prompt or conversation, which might be plain text\nor a tool call, or a combination of both." + ], + "signature": [ + " = ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ToolOptions", + "text": "ToolOptions" + }, + ", TStream extends boolean = false>(options: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.UnboundChatCompleteOptions", + "text": "UnboundChatCompleteOptions" + }, + ") => ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ChatCompleteCompositeResponse", + "text": "ChatCompleteCompositeResponse" + }, + "" + ], + "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "inference", + "id": "def-server.BoundInferenceClient.chatComplete.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ [P in \"system\" | \"stream\" | \"messages\" | Exclude]: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ChatCompleteOptions", + "text": "ChatCompleteOptions" + }, + "[P]; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "inference", + "id": "def-server.BoundInferenceClient.output", + "type": "Function", + "tags": [], + "label": "output", + "description": [ + "\n`output` asks the LLM to generate a structured (JSON)\nresponse based on a schema and a prompt or conversation." + ], + "signature": [ + "(options: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.UnboundOutputOptions", + "text": "UnboundOutputOptions" + }, + ") => ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.OutputCompositeResponse", + "text": "OutputCompositeResponse" + }, + "" + ], + "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "inference", + "id": "def-server.BoundInferenceClient.output.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ id: TId; input: string; schema?: TOutputSchema | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.Message", + "text": "Message" + }, + "[] | undefined; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "inference", + "id": "def-server.BoundInferenceClient.getConnectorById", + "type": "Function", + "tags": [], + "label": "getConnectorById", + "description": [ + "\n`getConnectorById` returns an inference connector by id.\nNon-inference connectors will throw an error." + ], + "signature": [ + "(id: string) => Promise<", + "InferenceConnector", + ">" + ], + "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "inference", + "id": "def-server.BoundInferenceClient.getConnectorById.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "inference", "id": "def-server.InferenceClient", "type": "Interface", "tags": [], "label": "InferenceClient", - "description": [], - "path": "x-pack/plugins/inference/server/types.ts", + "description": [ + "\nAn inference client, scoped to a request, that can be used to interact with LLMs." + ], + "path": "x-pack/plugins/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -314,7 +502,7 @@ }, "" ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/plugins/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -383,7 +571,7 @@ }, "" ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/plugins/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -425,7 +613,7 @@ "InferenceConnector", ">" ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/plugins/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -439,7 +627,7 @@ "signature": [ "string" ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/plugins/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -460,7 +648,9 @@ "type": "Interface", "tags": [], "label": "InferenceServerSetup", - "description": [], + "description": [ + "\nSetup contract of the inference plugin." + ], "path": "x-pack/plugins/inference/server/types.ts", "deprecated": false, "trackAdoption": false, @@ -474,7 +664,9 @@ "type": "Interface", "tags": [], "label": "InferenceServerStart", - "description": [], + "description": [ + "\nStart contract of the inference plugin, exposing APIs to interact with LLMs." + ], "path": "x-pack/plugins/inference/server/types.ts", "deprecated": false, "trackAdoption": false, @@ -486,10 +678,22 @@ "tags": [], "label": "getClient", "description": [ - "\nCreates an inference client, scoped to a request.\n" + "\nCreates an {@link InferenceClient}, scoped to a request.\n" ], "signature": [ - "(options: InferenceClientCreateOptions) => ", + "(options: T) => T extends ", + "InferenceBoundClientCreateOptions", + " ? ", + { + "pluginId": "inference", + "scope": "server", + "docId": "kibInferencePluginApi", + "section": "def-server.BoundInferenceClient", + "text": "BoundInferenceClient" + }, + " : ", { "pluginId": "inference", "scope": "server", @@ -505,14 +709,12 @@ { "parentPluginId": "inference", "id": "def-server.InferenceServerStart.getClient.$1", - "type": "Object", + "type": "Uncategorized", "tags": [], "label": "options", - "description": [ - "{@link InferenceClientCreateOptions }" - ], + "description": [], "signature": [ - "InferenceClientCreateOptions" + "T" ], "path": "x-pack/plugins/inference/server/types.ts", "deprecated": false, @@ -588,7 +790,7 @@ "text": "OutputAPI" } ], - "path": "x-pack/plugins/inference/common/create_output_api.ts", + "path": "x-pack/plugins/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -608,7 +810,7 @@ "text": "ChatCompleteAPI" } ], - "path": "x-pack/plugins/inference/common/create_output_api.ts", + "path": "x-pack/plugins/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -671,7 +873,7 @@ "AugmentedRequired", " | FromToolSchemaArray | undefined; }, never> | undefined; }>" ], - "path": "x-pack/plugins/inference/common/create_output_api.ts", + "path": "x-pack/plugins/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -691,7 +893,7 @@ "text": "ChatCompleteAPI" } ], - "path": "x-pack/plugins/inference/common/create_output_api.ts", + "path": "x-pack/plugins/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "isRequired": true diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index a4151609f299e..693737a92933a 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 33 | 0 | 28 | 4 | +| 40 | 0 | 29 | 6 | ## Client diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 43fcdd5c3c0e3..434a5cda36754 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index a11be6fffdc49..4677ef9c33bc4 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index d9176041beb7a..14ad9f019094e 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 14d99fc63281f..a0a3b3b3bf57c 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index e6f6764a356b2..a1cfe5c9e0faa 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index cc4b86185fe18..f44348c55d9ec 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index a6248ae451710..43320995e8b82 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 8de6735114c00..fadf5af285d77 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 7211202d5e414..e88606afab2fb 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index cef8c80d64e32..4b57cb6114d34 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index 7a1061b03294e..8b82b97c84f29 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index bc762d1a96919..c1209374d09a7 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index dd8498a8b37af..bae3ae5f9e975 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 7ed9264f3f0b7..3830141b97b41 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 3ce053f404602..a5ab701dffcef 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index 9513f4a553c82..0fe53b4186330 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 21ca6c4333503..a13b45aea607f 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index a9810fbc7370a..da59f95b0ac34 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 492db1820cbd2..d0c972b819dc5 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: 2024-11-19 +date: 2024-11-21 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_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index c02e400c48bee..39ca11c0b92e2 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 3536eb23c7828..c25444ab821a8 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: 2024-11-19 +date: 2024-11-21 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 2b338d76c63bb..3c4886bacd512 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 668006e7a3156..d30b66f8bf74f 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 47462e78cae6a..068d5cde12152 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: 2024-11-19 +date: 2024-11-21 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_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index b95e219a264ab..09205a4c94e47 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index e480fab6ec314..fff4ace4cd87c 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index b33bd63fbc954..44a306942353f 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: 2024-11-19 +date: 2024-11-21 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_types.mdx b/api_docs/kbn_apm_types.mdx index e68a5a9f47030..a0971e5833930 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index c77bb3263d999..a7274999244e0 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index 240ee99bfae64..53f1e4eb02427 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 766de80d968cc..9c42ea97b6127 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 666bb7cc6f6f3..9e92cbb9c1248 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 1262ce7b9365a..a9a384a8d0f16 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index fa48f8bae4d6f..ba4cdb2a073dd 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 3d2757d7c533a..9d74090ff1722 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index 5a330ce6bf31c..6f5cefeb79a2e 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index ba0de8e88b091..93e3ce21f1846 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: 2024-11-19 +date: 2024-11-21 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 44a34c0062638..fad7b833508e8 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: 2024-11-19 +date: 2024-11-21 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 b323db375b3d8..6561cc9d361b8 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: 2024-11-19 +date: 2024-11-21 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 848283f921b12..c3fe33cf22c96 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: 2024-11-19 +date: 2024-11-21 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 27567347f997e..83f7d6bf77fa5 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: 2024-11-19 +date: 2024-11-21 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 f5b4db096c4de..ed8f0931ce4a2 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: 2024-11-19 +date: 2024-11-21 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 48bdfa24cb82f..19cca02617cc2 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index cd017d402dbb3..6814bc0874a47 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index f736c020ccc34..8445a51a410eb 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_graph.mdx b/api_docs/kbn_cloud_security_posture_graph.mdx index 61b89ff227ab5..1eaf4119c1b55 100644 --- a/api_docs/kbn_cloud_security_posture_graph.mdx +++ b/api_docs/kbn_cloud_security_posture_graph.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-graph title: "@kbn/cloud-security-posture-graph" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-graph plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-graph'] --- import kbnCloudSecurityPostureGraphObj from './kbn_cloud_security_posture_graph.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 3d59b249d8138..58cecb251925d 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 98efccc631fe7..6ca0bf8dbbbc1 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index cc27d36435a8b..42d340f6cd3f9 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 9a4385430be10..711eacfab67ab 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: 2024-11-19 +date: 2024-11-21 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 4fd25c7b51c10..8f3df3f7462f0 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: 2024-11-19 +date: 2024-11-21 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 a408b815ec858..59d1c6da34859 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: 2024-11-19 +date: 2024-11-21 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 23f194af624f0..f2fa523fa3a0c 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: 2024-11-19 +date: 2024-11-21 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 57c9577c46d38..814ff801c7c24 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: 2024-11-19 +date: 2024-11-21 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_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index 89eb750caa396..f3c9f4ecac5aa 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index 43fd55100ed05..1c66fb38c2e80 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_common.mdx b/api_docs/kbn_content_management_favorites_common.mdx index c647ff4e9af0a..a5276f6c00f85 100644 --- a/api_docs/kbn_content_management_favorites_common.mdx +++ b/api_docs/kbn_content_management_favorites_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-common title: "@kbn/content-management-favorites-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-common'] --- import kbnContentManagementFavoritesCommonObj from './kbn_content_management_favorites_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index 1080358ce4ad3..767cc034eab3c 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index a86dfef8351a2..d5b91e064f197 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 432971b2baa45..a2d2ac40bb15a 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 666a3526ecaa4..b7839f368adc3 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 3fc4386bebc9d..e2ad4db192870 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 08e028c1d08ad..c800c52efe003 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index e476b6f205973..cecb596118f11 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index fb289f54c34bd..3a27c89cb84df 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.devdocs.json b/api_docs/kbn_core_analytics_browser.devdocs.json index 962fabc7e1efd..2f2c5fc3f3d9f 100644 --- a/api_docs/kbn_core_analytics_browser.devdocs.json +++ b/api_docs/kbn_core_analytics_browser.devdocs.json @@ -734,6 +734,22 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/bulk_actions_route.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, { "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 0238ba23a7f7b..33dbf26243e81 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: 2024-11-19 +date: 2024-11-21 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 800fe438a79f6..4e0df08f4a552 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: 2024-11-19 +date: 2024-11-21 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 788bb745d90b4..00ab6e68fb3a4 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_analytics_server.devdocs.json index d9bdd2cd16864..fe50bcb0679dd 100644 --- a/api_docs/kbn_core_analytics_server.devdocs.json +++ b/api_docs/kbn_core_analytics_server.devdocs.json @@ -742,6 +742,22 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/bulk_actions_route.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/helpers.ts" + }, { "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 2b9c75ed2bf3d..e5c1e7dce6d69 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: 2024-11-19 +date: 2024-11-21 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 6f7fffcdfa216..a636655d5fd58 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: 2024-11-19 +date: 2024-11-21 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 c7c22ef1fc9ef..7b9f807df8b07 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_application_browser.devdocs.json index e39e481fd8065..a26570399596d 100644 --- a/api_docs/kbn_core_application_browser.devdocs.json +++ b/api_docs/kbn_core_application_browser.devdocs.json @@ -372,7 +372,7 @@ "\nReturns a confirm action, resulting on prompting a message to the user before leaving the\napplication, allowing him to choose if he wants to stay on the app or confirm that he\nwants to leave.\n" ], "signature": [ - "(text: string, title?: string | undefined, callback?: (() => void) | undefined, confirmButtonText?: string | undefined, buttonColor?: \"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"danger\" | undefined) => ", + "(text: string, title?: string | undefined, callback?: (() => void) | undefined, confirmButtonText?: string | undefined, buttonColor?: \"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | undefined) => ", { "pluginId": "@kbn/core-application-browser", "scope": "public", @@ -463,7 +463,7 @@ "(optional) color for the confirmation button\nso we can show to the user the right UX for him to saved his/her/their changes" ], "signature": [ - "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"danger\" | undefined" + "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | undefined" ], "path": "packages/core/application/core-application-browser/src/app_leave.ts", "deprecated": false, @@ -582,7 +582,7 @@ "label": "buttonColor", "description": [], "signature": [ - "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"danger\" | undefined" + "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | undefined" ], "path": "packages/core/application/core-application-browser/src/app_leave.ts", "deprecated": false, diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 41e98c61c7b10..18d3a66e68d7b 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: 2024-11-19 +date: 2024-11-21 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 9ab8b905be0a4..b06e0766f09e4 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: 2024-11-19 +date: 2024-11-21 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 ba80dacb6b538..734d25fcc09c5 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: 2024-11-19 +date: 2024-11-21 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 36bdcfaab3c47..c4d027dcb7476 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: 2024-11-19 +date: 2024-11-21 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 8912e77c01483..792c6159ebfec 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: 2024-11-19 +date: 2024-11-21 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 76247ada48e80..a019633e989bb 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: 2024-11-19 +date: 2024-11-21 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 4022e94b9c205..38ce361d9a1a3 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: 2024-11-19 +date: 2024-11-21 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 d0d3d77db6ebf..a216578761253 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: 2024-11-19 +date: 2024-11-21 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 410580465903f..ed9717297365d 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: 2024-11-19 +date: 2024-11-21 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 c8ba1cae31acd..ae41686a880ca 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: 2024-11-19 +date: 2024-11-21 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 3c69bcccbf111..48f5caf967c3f 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: 2024-11-19 +date: 2024-11-21 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 d9439db1fbd9c..be1ad6aac074e 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: 2024-11-19 +date: 2024-11-21 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 58abd5481c9ab..893b338bb862a 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: 2024-11-19 +date: 2024-11-21 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 069928c2ab5ce..3915a7ab2ec12 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: 2024-11-19 +date: 2024-11-21 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 ab617838b8f53..09cea0c1bfce0 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index 3c3be73393fdb..31736959b7379 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -3765,7 +3765,7 @@ "label": "AppDeepLinkId", "description": [], "signature": [ - "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"profiling\" | \"metrics\" | \"management\" | \"apm\" | \"synthetics\" | \"ux\" | \"canvas\" | \"logs\" | \"dashboards\" | \"slo\" | \"observabilityAIAssistant\" | \"home\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:logPatternAnalysis\" | \"ml:logRateAnalysis\" | \"ml:singleMetricViewer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"ml:suppliedConfigurations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:cross_cluster_replication\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"searchInferenceEndpoints\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"searchInferenceEndpoints:inferenceEndpoints\" | \"elasticsearchStart\" | \"elasticsearchIndices\" | \"enterpriseSearchElasticsearch\" | \"enterpriseSearchVectorSearch\" | \"enterpriseSearchSemanticSearch\" | \"enterpriseSearchAISearch\" | \"elasticsearchIndices:createIndex\" | \"observability-logs-explorer\" | \"last-used-logs-viewer\" | \"observabilityOnboarding\" | \"inventory\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:services\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:functions\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"inventory:datastreams\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:notes\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:entity_analytics-entity_store_management\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:agents\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\"" + "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"profiling\" | \"metrics\" | \"management\" | \"apm\" | \"synthetics\" | \"ux\" | \"canvas\" | \"logs\" | \"dashboards\" | \"slo\" | \"observabilityAIAssistant\" | \"home\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:logPatternAnalysis\" | \"ml:logRateAnalysis\" | \"ml:singleMetricViewer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"ml:suppliedConfigurations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:cross_cluster_replication\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"searchInferenceEndpoints\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"serverlessWebCrawlers\" | \"searchPlayground\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"searchInferenceEndpoints:inferenceEndpoints\" | \"elasticsearchStart\" | \"elasticsearchIndices\" | \"enterpriseSearchElasticsearch\" | \"enterpriseSearchVectorSearch\" | \"enterpriseSearchSemanticSearch\" | \"enterpriseSearchAISearch\" | \"elasticsearchIndices:createIndex\" | \"observability-logs-explorer\" | \"last-used-logs-viewer\" | \"observabilityOnboarding\" | \"inventory\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:services\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:functions\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"inventory:datastreams\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:notes\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:entity_analytics-entity_store_management\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:agents\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\"" ], "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", "deprecated": false, diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index e62f887465c64..77d0746ba7e31 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: 2024-11-19 +date: 2024-11-21 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 2c196fad44448..d0f967e19697f 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: 2024-11-19 +date: 2024-11-21 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 4c86c5f52196b..75a8c1df24362 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: 2024-11-19 +date: 2024-11-21 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 612934008322c..5a6223efc41ab 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: 2024-11-19 +date: 2024-11-21 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 77c1e8e61e6f8..5b63bb76a31a9 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: 2024-11-19 +date: 2024-11-21 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 393957b100011..c1fcf5e3150bf 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: 2024-11-19 +date: 2024-11-21 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 db3ad9c744bea..e2afd29b2ffc7 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: 2024-11-19 +date: 2024-11-21 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 216c37c384611..749b00fee24bd 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: 2024-11-19 +date: 2024-11-21 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 2a4f666101ee1..e20ba27035de4 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: 2024-11-19 +date: 2024-11-21 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 2e1c29033464f..9178bf4fcb1fa 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: 2024-11-19 +date: 2024-11-21 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 ea85a33b09557..c52c194bc59ad 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: 2024-11-19 +date: 2024-11-21 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 2c14b71be0709..79a83a3ee0e8c 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: 2024-11-19 +date: 2024-11-21 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 7a25f842e3a98..1f7ba3de3d091 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: 2024-11-19 +date: 2024-11-21 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 2cc42811c0f6e..3d3df0ed16a2c 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: 2024-11-19 +date: 2024-11-21 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 e5b802e754ab7..86baf1509f00a 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: 2024-11-19 +date: 2024-11-21 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 04d10852eac21..1211aa19cf3ca 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: 2024-11-19 +date: 2024-11-21 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 7bfa7570b377c..5443a1d98ba12 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: 2024-11-19 +date: 2024-11-21 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 94a7334e088ea..f1898b8cb94dc 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: 2024-11-19 +date: 2024-11-21 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 3b41f4c7680d2..4befedb7a3bdf 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: 2024-11-19 +date: 2024-11-21 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 2d1952fec0ac0..edd46788484fc 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: 2024-11-19 +date: 2024-11-21 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 787622f205096..d23ee93ecce71 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: 2024-11-19 +date: 2024-11-21 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 33192322e4abb..245d90b0a05e0 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: 2024-11-19 +date: 2024-11-21 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 f30d9adb9a1f6..8b6a9f5eb56eb 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: 2024-11-19 +date: 2024-11-21 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 c08744f061496..419baaacd3250 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: 2024-11-19 +date: 2024-11-21 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 c5f61648bd317..ab0e8c7e1b2d6 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: 2024-11-19 +date: 2024-11-21 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 4cb12e63ff41a..e23b3af43dc27 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: 2024-11-19 +date: 2024-11-21 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 1a5758e2e5652..9c89941edc1ec 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: 2024-11-19 +date: 2024-11-21 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 aa3fa1d30d1bf..8bde8cb7a86a3 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: 2024-11-19 +date: 2024-11-21 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 deecbca75d8ff..5fc0c0638dcaf 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: 2024-11-19 +date: 2024-11-21 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 f97ad06a613c5..e8572966eb662 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: 2024-11-19 +date: 2024-11-21 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 3b80afc0526e0..cabd0b5fdb350 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: 2024-11-19 +date: 2024-11-21 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 5e3e80b579bac..30b5d9685d0de 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: 2024-11-19 +date: 2024-11-21 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 a1c7646dc7a52..2ef585460980f 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: 2024-11-19 +date: 2024-11-21 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 d85d3caaf1175..40251fcfcf457 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: 2024-11-19 +date: 2024-11-21 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 a971abc5ee8c0..61da134286225 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: 2024-11-19 +date: 2024-11-21 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 1a79b55ab4c44..0ebfe9701455f 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: 2024-11-19 +date: 2024-11-21 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 f7652302429f5..b55004d07f7ff 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: 2024-11-19 +date: 2024-11-21 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_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index 896725387f216..b938721888d72 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index 6cd0e3221aab2..83d01dbe00fbc 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index 9ca45dc6fb9aa..35f8b5a27e3cf 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index 5b4803595ef4e..8cc2571be7785 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index 57dccbfc29ec7..9549a883a2182 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index 51b3fcaf34305..4714c7ab736af 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index b8e8e77183f88..8b6a87f26e3c8 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: 2024-11-19 +date: 2024-11-21 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 ed011886ccb39..a8822a273e38b 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: 2024-11-19 +date: 2024-11-21 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 1e7bd8f6c7991..5ec7591293d86 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: 2024-11-19 +date: 2024-11-21 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 8fa4d01d88e16..ac74ca5410c5e 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: 2024-11-19 +date: 2024-11-21 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 d9005ba407dc5..2472ceb404d49 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: 2024-11-19 +date: 2024-11-21 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 44affb1d5b18f..6679574695d87 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: 2024-11-19 +date: 2024-11-21 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 628fb6d0bc1f0..8f842b5153db2 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: 2024-11-19 +date: 2024-11-21 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 053274647e7bb..9bf1bd85b68a7 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: 2024-11-19 +date: 2024-11-21 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 0f542e5180dd5..0055a5b096174 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: 2024-11-19 +date: 2024-11-21 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 0640a6d6fb56c..564e2f4858ab1 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: 2024-11-19 +date: 2024-11-21 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 952ce7dcfbafc..97a043092f2f3 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index e9776fff2334a..cf76b2a6b8cff 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -4969,6 +4969,10 @@ "plugin": "watcher", "path": "x-pack/plugins/watcher/server/routes/api/register_load_history_route.ts" }, + { + "plugin": "productDocBase", + "path": "x-pack/plugins/ai_infra/product_doc_base/server/routes/installation.ts" + }, { "plugin": "customBranding", "path": "x-pack/plugins/custom_branding/server/routes/info.ts" @@ -7511,6 +7515,14 @@ "plugin": "watcher", "path": "x-pack/plugins/watcher/server/routes/api/register_list_fields_route.ts" }, + { + "plugin": "productDocBase", + "path": "x-pack/plugins/ai_infra/product_doc_base/server/routes/installation.ts" + }, + { + "plugin": "productDocBase", + "path": "x-pack/plugins/ai_infra/product_doc_base/server/routes/installation.ts" + }, { "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" @@ -15178,7 +15190,11 @@ }, { "plugin": "cloud", - "path": "x-pack/plugins/cloud/server/routes/elasticsearch_routes.ts" + "path": "x-pack/plugins/cloud/server/routes/elasticsearch_route.ts" + }, + { + "plugin": "cloud", + "path": "x-pack/plugins/cloud/server/routes/get_cloud_data_route.ts" }, { "plugin": "dataViews", @@ -15296,6 +15312,10 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/server/routes/workpad/resolve.ts" }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts" + }, { "plugin": "canvas", "path": "x-pack/plugins/canvas/server/routes/templates/list.ts" @@ -15660,6 +15680,14 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/find_route.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/get_defend_insight.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/get_defend_insights.ts" + }, { "plugin": "logsShared", "path": "x-pack/plugins/observability_solution/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -16000,6 +16028,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/privileges.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/status.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/get.ts" @@ -16527,6 +16559,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/update.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/start.ts" @@ -16674,6 +16710,10 @@ "deprecated": false, "trackAdoption": true, "references": [ + { + "plugin": "cloud", + "path": "x-pack/plugins/cloud/server/routes/set_cloud_data_route.ts" + }, { "plugin": "dataViews", "path": "src/plugins/data_views/server/rest_api_routes/public/fields/update_fields.ts" @@ -17198,6 +17238,10 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/create_route.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/defend_insights/post_defend_insights.ts" + }, { "plugin": "logsShared", "path": "x-pack/plugins/observability_solution/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -17546,6 +17590,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/stop.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/enablement.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts" @@ -17722,6 +17770,10 @@ "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.test.ts" }, + { + "plugin": "cloud", + "path": "x-pack/plugins/cloud/server/routes/set_cloud_data_route.test.ts" + }, { "plugin": "ecsDataQualityDashboard", "path": "x-pack/plugins/ecs_data_quality_dashboard/server/__mocks__/server.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 03588726dfbb5..b6911eb416b22 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: 2024-11-19 +date: 2024-11-21 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 2719822c7e21a..84343b0fba157 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: 2024-11-19 +date: 2024-11-21 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 b999b5e544dfd..bbd40661b1bae 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: 2024-11-19 +date: 2024-11-21 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 fdbe6fffd8f2d..8501dd937afdf 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: 2024-11-19 +date: 2024-11-21 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 861b792cc4c10..6956740b17bd1 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: 2024-11-19 +date: 2024-11-21 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 4709e4cb197fc..031eb6224fcab 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: 2024-11-19 +date: 2024-11-21 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 6e5ef309ae1ee..40d46f06ce72f 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: 2024-11-19 +date: 2024-11-21 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 c44b21b1c26d7..a0fe8525acb20 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: 2024-11-19 +date: 2024-11-21 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 c5592332e3dcd..fe86a037b9e6c 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: 2024-11-19 +date: 2024-11-21 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 74220604c717f..16e55b81417db 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: 2024-11-19 +date: 2024-11-21 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 f54df075d8981..6757f8a435eda 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: 2024-11-19 +date: 2024-11-21 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 dd92cb4957ef2..17336f531dd65 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: 2024-11-19 +date: 2024-11-21 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 7fb35881b63da..b3438db8e9f33 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: 2024-11-19 +date: 2024-11-21 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 2ef27eb90a560..d7b35bee7e9ac 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: 2024-11-19 +date: 2024-11-21 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 1c83436fb026c..78f093e8d34e1 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: 2024-11-19 +date: 2024-11-21 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 3afe790148f36..70689c354e86c 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: 2024-11-19 +date: 2024-11-21 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 62ada7a77eef6..66054de8718ed 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: 2024-11-19 +date: 2024-11-21 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 6f1bce8c59f61..ea343857484a2 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: 2024-11-19 +date: 2024-11-21 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 0f989505ec60a..59b4191c6703b 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: 2024-11-19 +date: 2024-11-21 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 24705d2bbff82..b3ce5bdf99e87 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: 2024-11-19 +date: 2024-11-21 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 fe672db632eb1..5cef01f3a5215 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: 2024-11-19 +date: 2024-11-21 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 baf8baa98472f..37bc841819f8a 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: 2024-11-19 +date: 2024-11-21 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 ae39936bfeb9e..64d0ed4e76e7b 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: 2024-11-19 +date: 2024-11-21 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 9abc2eac564d5..7955524bcd81b 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: 2024-11-19 +date: 2024-11-21 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 d24775debc489..d5d93f0f68565 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: 2024-11-19 +date: 2024-11-21 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 99139726edfb5..79e07da77353d 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: 2024-11-19 +date: 2024-11-21 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 01abfac45b349..d56e42f9731d1 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: 2024-11-19 +date: 2024-11-21 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 81e6aad648819..c83e906e74a06 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: 2024-11-19 +date: 2024-11-21 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 0e4201f6276ac..b7457037dcb7a 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: 2024-11-19 +date: 2024-11-21 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 a2d52bb4183f9..62bd66c0dfdfc 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: 2024-11-19 +date: 2024-11-21 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 bde6c694bd45d..5f1290d46531b 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: 2024-11-19 +date: 2024-11-21 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 504c8a1f80a5f..e96f53f683c8e 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_overlays_browser.devdocs.json index 9fa49593ede09..b47a113ddc3a5 100644 --- a/api_docs/kbn_core_overlays_browser.devdocs.json +++ b/api_docs/kbn_core_overlays_browser.devdocs.json @@ -454,7 +454,7 @@ "label": "buttonColor", "description": [], "signature": [ - "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"danger\" | undefined" + "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | undefined" ], "path": "packages/core/overlays/core-overlays-browser/src/modal.ts", "deprecated": false, diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 90bbe4d12ebef..f07f6ef4af5b6 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: 2024-11-19 +date: 2024-11-21 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 838f4edd8f6df..74cb87e1f4708 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: 2024-11-19 +date: 2024-11-21 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 2cbfdf2480666..9b4faa1b1bde5 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: 2024-11-19 +date: 2024-11-21 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 563a9a98f743a..3b1deaf2d232d 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: 2024-11-19 +date: 2024-11-21 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 c0141ecbec359..80d17b1a8e5cd 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 9686c7440aaad..691a5b16a7e7d 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 97395c287b4fc..a17f3a235aec3 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 6a1d436f62193..cd794bf378339 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: 2024-11-19 +date: 2024-11-21 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 c5381e918da47..ab4a672f64d8b 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: 2024-11-19 +date: 2024-11-21 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 332f759dd08a8..70e81e43e282d 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: 2024-11-19 +date: 2024-11-21 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 2a017f8eee589..b9bff7d6cbefb 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: 2024-11-19 +date: 2024-11-21 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.mdx b/api_docs/kbn_core_rendering_browser.mdx index b1fb64d74ea52..8caf430ec9a81 100644 --- a/api_docs/kbn_core_rendering_browser.mdx +++ b/api_docs/kbn_core_rendering_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser title: "@kbn/core-rendering-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser'] --- import kbnCoreRenderingBrowserObj from './kbn_core_rendering_browser.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index ce28fe3fd1eb5..ca4429b258734 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: 2024-11-19 +date: 2024-11-21 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 d37bb4016603d..e1c615603ab52 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: 2024-11-19 +date: 2024-11-21 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 5a5b30ea068cd..50e5daefa0c40 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: 2024-11-19 +date: 2024-11-21 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 6986186c409b0..4b4919ee3ee93 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json index 0a442923c41cc..99e9141acff1b 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -898,34 +898,6 @@ "plugin": "home", "path": "src/plugins/home/public/application/kibana_services.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/types.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/types.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/plugin.ts" @@ -946,38 +918,6 @@ "plugin": "lens", "path": "x-pack/plugins/lens/public/persistence/saved_objects_utils/find_object_by_title.test.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/application/contexts/query_input_bar_context.ts" @@ -1042,54 +982,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/create_source.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/create_source.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_saved_object.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-mocks", "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.test.ts" @@ -1575,10 +1471,6 @@ "deprecated": true, "trackAdoption": false, "references": [ - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-mocks", "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" @@ -1587,14 +1479,6 @@ "plugin": "dashboardEnhanced", "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/collect_config_container.tsx" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" @@ -1675,10 +1559,6 @@ "plugin": "dashboardEnhanced", "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/collect_config_container.tsx" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" @@ -2347,14 +2227,6 @@ "plugin": "@kbn/core", "path": "src/core/public/index.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/utils/saved_objects_utils/save_with_confirmation.ts" @@ -2371,18 +2243,6 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/helpers/saved_objects_utils/save_with_confirmation.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/utils/saved_objects_utils/save_with_confirmation.test.ts" @@ -2911,18 +2771,6 @@ "plugin": "@kbn/core", "path": "src/core/public/index.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts" diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index e725b2c648a5a..8d5d29dd892b7 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.devdocs.json b/api_docs/kbn_core_saved_objects_api_server.devdocs.json index 7b8b82e990599..faaa627699590 100644 --- a/api_docs/kbn_core_saved_objects_api_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_server.devdocs.json @@ -2794,6 +2794,14 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/server/routes/workpad/find.ts" }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts" diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index bd6eecdb721dd..c08852ddcb733 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 68ddf22f343ca..ca000f7b5a281 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: 2024-11-19 +date: 2024-11-21 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 85707a27f7a57..69de2ec0a0e1b 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: 2024-11-19 +date: 2024-11-21 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 77e64c59e27cb..ca867b3ac33b2 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: 2024-11-19 +date: 2024-11-21 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 be23263af9827..eaa9266d245b1 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: 2024-11-19 +date: 2024-11-21 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 42ae9d39e58c9..e677e9ed28a73 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_saved_objects_browser_mocks.devdocs.json index abe1d72f17fc3..374933232c97b 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.devdocs.json +++ b/api_docs/kbn_core_saved_objects_browser_mocks.devdocs.json @@ -109,14 +109,6 @@ { "plugin": "lens", "path": "x-pack/plugins/lens/public/persistence/saved_objects_utils/find_object_by_title.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" } ], "children": [ diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 5bfc831e66b52..537e840488e83 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index aa154124910a8..4df24e4d3b7f9 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -1265,14 +1265,6 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/home/hooks/use_upload_workpad.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.test.ts" - }, { "plugin": "@kbn/core", "path": "src/core/types/index.ts" @@ -1655,30 +1647,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/types.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/create_source.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/create_source.ts" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/utils/saved_visualize_utils.ts" @@ -1727,18 +1695,6 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/helpers/saved_workspace_utils.ts" }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, - { - "plugin": "savedObjects", - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.test.ts" - }, { "plugin": "@kbn/core", "path": "src/core/types/index.ts" diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index e2272be3f5b6a..98fdf691571fe 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: 2024-11-19 +date: 2024-11-21 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 5771d8c5f0cf9..212b678b0b904 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: 2024-11-19 +date: 2024-11-21 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 838de5f7d7d6b..629fca1802abe 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: 2024-11-19 +date: 2024-11-21 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 dee4e46c8b499..918b4a870f907 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: 2024-11-19 +date: 2024-11-21 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 f826fa326cd58..da1974d54ea97 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_core_saved_objects_server.devdocs.json index 92271de1c5c74..8bf437c26eadb 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -6323,6 +6323,14 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/server/routes/workpad/find.ts" }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts" diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 570d16949cd8a..b2facf379bd1a 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: 2024-11-19 +date: 2024-11-21 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 cd5dd581a7fac..a13c5cb56682d 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: 2024-11-19 +date: 2024-11-21 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 1952eaad20966..443925713277d 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: 2024-11-19 +date: 2024-11-21 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 139d216c00776..430f4aff4b0ce 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: 2024-11-19 +date: 2024-11-21 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_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 423aa2d1448e3..202cfa1dcefad 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 8c1dea36b8bca..ab1673604e7f1 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 717621b4bfdb6..85277110a1d86 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index a128b7a117455..265849d601e61 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 0c269a0727025..52a48cb9c1ab0 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index f8683c2577aa3..067dce23af60b 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 6fb66f6c06895..dd3a32801f675 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index fb76669555f16..1e8704f97c9af 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: 2024-11-19 +date: 2024-11-21 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_server.mdx b/api_docs/kbn_core_status_server.mdx index 7a0eeaaa698ca..93f682b536a30 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: 2024-11-19 +date: 2024-11-21 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 f6d6aa0488ed9..6ac064c1b2280 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: 2024-11-19 +date: 2024-11-21 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 f33ab4a5b5375..8a91fa37f60c5 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: 2024-11-19 +date: 2024-11-21 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 8567fc1586ece..1d5ccec0ca130 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: 2024-11-19 +date: 2024-11-21 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 4e110bb1b7cab..68b1ac53623de 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: 2024-11-19 +date: 2024-11-21 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 c6384e292335c..3061bd5eb1de0 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index afffaa34e0a51..b0fd535727e41 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 589aa24b39c65..42d1c703b4ed5 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: 2024-11-19 +date: 2024-11-21 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 f79b57c587ad0..16919bfde35bd 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: 2024-11-19 +date: 2024-11-21 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 754e0198048c6..5b1abc56b7138 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 6bd750930627a..59e6097cbac61 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: 2024-11-19 +date: 2024-11-21 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 f4ce185dd9d59..0b300cb2498bf 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: 2024-11-19 +date: 2024-11-21 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 e6db69bc68ed1..5b6cfb7966701 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: 2024-11-19 +date: 2024-11-21 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 3eea8cd886513..082fde2ba5c2d 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: 2024-11-19 +date: 2024-11-21 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 eb756979dc5f6..a21ecc8ae4f4c 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: 2024-11-19 +date: 2024-11-21 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 8b8fb11fe1481..a5acd794c0e83 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: 2024-11-19 +date: 2024-11-21 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 d2f4c1c441c14..ec1c4c7ce0014 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: 2024-11-19 +date: 2024-11-21 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 0d0bc1dcee77a..7d05f2067550b 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: 2024-11-19 +date: 2024-11-21 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 00e9e839a0db0..2a51f0d726a77 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: 2024-11-19 +date: 2024-11-21 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 eabb2f46cb4bd..0821f72eacf78 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: 2024-11-19 +date: 2024-11-21 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 442e71a9f6156..08dfdbdfb053a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index fbfe0dceec743..5c4b3251ca760 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 786cce114571d..59eb0f991cfba 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 0a10fa69a0e7b..e29c351102dfa 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 22b0fb9a7a3aa..5b3ca6c5d07dc 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index fe5871d447573..a107b7e5e0f4c 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index e956c586cb892..0183eac713b86 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 96a0f64e49d3e..655b94d61cf73 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index fbe8e741314b1..23b74612c4fac 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 626052ad5a5f0..b6567c6ddc414 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 66dee42f2766e..4b396dbf873ce 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: 2024-11-19 +date: 2024-11-21 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 dee6d1cbe8ac4..fdd7f650a3c95 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 00758126c0150..f6251d4e83abd 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 5840b3d7c3138..e708acd376a26 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index d0289958b9870..3de801a91cb83 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 042936752b9b2..92dce2fcba973 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 1c7f745b042cc..3fbe60ca6ec4b 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 026499051bd5b..2b3b912ce43ed 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 9603d5f66141f..8cff157633d4b 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index f9bbad38c755f..424e2950558cf 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index f53c8e1ea7901..2b741853d1f89 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 2baf8b49cc0be..7a5784f637af3 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index c8c699dc2b0e8..db2db572a3e94 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index b55655888de0e..b7620feb08325 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index cc0dae7862e27..8c2c3e2becd98 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index fc8e9e51ccf89..89ba7309fb8fa 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.devdocs.json b/api_docs/kbn_deeplinks_search.devdocs.json index 22c6f92587549..99f4a86079d7f 100644 --- a/api_docs/kbn_deeplinks_search.devdocs.json +++ b/api_docs/kbn_deeplinks_search.devdocs.json @@ -30,7 +30,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"appSearch\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"searchInferenceEndpoints\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"searchInferenceEndpoints:inferenceEndpoints\" | \"elasticsearchStart\" | \"elasticsearchIndices\" | \"enterpriseSearchElasticsearch\" | \"enterpriseSearchVectorSearch\" | \"enterpriseSearchSemanticSearch\" | \"enterpriseSearchAISearch\" | \"elasticsearchIndices:createIndex\"" + "\"appSearch\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"searchInferenceEndpoints\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"serverlessWebCrawlers\" | \"searchPlayground\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"searchInferenceEndpoints:inferenceEndpoints\" | \"elasticsearchStart\" | \"elasticsearchIndices\" | \"enterpriseSearchElasticsearch\" | \"enterpriseSearchVectorSearch\" | \"enterpriseSearchSemanticSearch\" | \"enterpriseSearchAISearch\" | \"elasticsearchIndices:createIndex\"" ], "path": "packages/deeplinks/search/deep_links.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 8434dd2812706..f546d2581b3ae 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index c7e5616644dd6..7a54ce4541cc4 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 678bee03bbb91..6ca2a59154a78 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index e0bd3ffff3e1c..848607ba7f201 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 173c5bdfbb7b8..3c923b576c3c7 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index cdeb8f4e5dd50..cf4d19a539f2f 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 68b482d6ab786..48e817d1241f7 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 60c1ec6b19158..2ede4ab5841bf 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: 2024-11-19 +date: 2024-11-21 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 a620b04e1cfb3..03a0fac60154e 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: 2024-11-19 +date: 2024-11-21 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 5f919b092faaf..a3c683c74ac15 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: 2024-11-19 +date: 2024-11-21 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 987517215fe3c..7d82809b67ba9 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_contextual_components.mdx b/api_docs/kbn_discover_contextual_components.mdx index 6bf0157b91390..afe0da2abfc59 100644 --- a/api_docs/kbn_discover_contextual_components.mdx +++ b/api_docs/kbn_discover_contextual_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-contextual-components title: "@kbn/discover-contextual-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-contextual-components plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-contextual-components'] --- import kbnDiscoverContextualComponentsObj from './kbn_discover_contextual_components.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.devdocs.json b/api_docs/kbn_discover_utils.devdocs.json index e09e611f21e95..3d5f8e6ae0a3b 100644 --- a/api_docs/kbn_discover_utils.devdocs.json +++ b/api_docs/kbn_discover_utils.devdocs.json @@ -3821,7 +3821,7 @@ "label": "color", "description": [], "signature": [ - "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"danger\" | undefined" + "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | undefined" ], "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", "deprecated": false, diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index e922477193925..19e5cecb19319 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index d71ced5558ea4..50ca91a1d6821 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -739,7 +739,7 @@ "label": "security", "description": [], "signature": [ - "{ readonly apiKeyServiceSettings: string; readonly clusterPrivileges: string; readonly definingRoles: string; readonly elasticsearchSettings: string; readonly elasticsearchEnableSecurity: string; readonly elasticsearchEnableApiKeys: string; readonly indicesPrivileges: string; readonly kibanaTLS: string; readonly kibanaPrivileges: string; readonly mappingRoles: string; readonly mappingRolesFieldRules: string; readonly runAsPrivilege: string; }" + "{ readonly apiKeyServiceSettings: string; readonly clusterPrivileges: string; readonly definingRoles: string; readonly elasticsearchSettings: string; readonly elasticsearchEnableSecurity: string; readonly elasticsearchEnableApiKeys: string; readonly indicesPrivileges: string; readonly kibanaTLS: string; readonly kibanaPrivileges: string; readonly mappingRoles: string; readonly mappingRolesFieldRules: string; readonly runAsPrivilege: string; readonly deprecatedV1Endpoints: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index fd95f1dc1864e..ac10ce3fbf68f 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: 2024-11-19 +date: 2024-11-21 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 a82ec1c5b5b5e..745a275f08563 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index a692eaeeb8483..54398f78c1fe7 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index fb665a8c3436f..6ea50719d6ccd 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index a7626a5ce88e7..36f88465cb20a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 4a8097be68930..096a503eea7ed 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 3b209a2be792e..bba93d768f08e 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.devdocs.json b/api_docs/kbn_elastic_assistant_common.devdocs.json index 647e12b251582..a864611adb34f 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -968,7 +968,7 @@ "\nInterface for features available to the elastic assistant" ], "signature": [ - "{ readonly assistantModelEvaluation: boolean; }" + "{ readonly assistantModelEvaluation: boolean; readonly defendInsights: boolean; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/capabilities/index.ts", "deprecated": false, @@ -1368,7 +1368,7 @@ "label": "ChatCompleteProps", "description": [], "signature": [ - "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" + "{ connectorId: string; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; persist: boolean; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -1383,7 +1383,7 @@ "label": "ChatCompleteRequestBody", "description": [], "signature": [ - "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" + "{ connectorId: string; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; persist: boolean; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -1398,7 +1398,7 @@ "label": "ChatCompleteRequestBodyInput", "description": [], "signature": [ - "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" + "{ connectorId: string; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; persist: boolean; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -1833,6 +1833,372 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DEFEND_INSIGHTS", + "type": "string", + "tags": [], + "label": "DEFEND_INSIGHTS", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DEFEND_INSIGHTS_BY_ID", + "type": "string", + "tags": [], + "label": "DEFEND_INSIGHTS_BY_ID", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DEFEND_INSIGHTS_TOOL_ID", + "type": "string", + "tags": [], + "label": "DEFEND_INSIGHTS_TOOL_ID", + "description": [], + "signature": [ + "\"defend-insights\"" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsight", + "type": "Type", + "tags": [], + "label": "DefendInsight", + "description": [ + "\nA Defend insight generated from endpoint events" + ], + "signature": [ + "{ group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightCreateProps", + "type": "Type", + "tags": [], + "label": "DefendInsightCreateProps", + "description": [], + "signature": [ + "{ status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightEvent", + "type": "Type", + "tags": [], + "label": "DefendInsightEvent", + "description": [ + "\nA Defend insight event" + ], + "signature": [ + "{ id: string; value: string; endpointId: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightGenerationInterval", + "type": "Type", + "tags": [], + "label": "DefendInsightGenerationInterval", + "description": [ + "\nRun durations for the Defend insight" + ], + "signature": [ + "{ date: string; durationMs: number; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightGetRequestParams", + "type": "Type", + "tags": [], + "label": "DefendInsightGetRequestParams", + "description": [], + "signature": [ + "{ id: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insight_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightGetRequestParamsInput", + "type": "Type", + "tags": [], + "label": "DefendInsightGetRequestParamsInput", + "description": [], + "signature": [ + "{ id: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insight_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightGetResponse", + "type": "Type", + "tags": [], + "label": "DefendInsightGetResponse", + "description": [], + "signature": [ + "{ data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; } | null | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insight_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsights", + "type": "Type", + "tags": [], + "label": "DefendInsights", + "description": [ + "\nArray of Defend insights" + ], + "signature": [ + "{ group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsGetRequestQuery", + "type": "Type", + "tags": [], + "label": "DefendInsightsGetRequestQuery", + "description": [], + "signature": [ + "{ type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: string[] | undefined; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: string[] | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsGetRequestQueryInput", + "type": "Type", + "tags": [], + "label": "DefendInsightsGetRequestQueryInput", + "description": [], + "signature": [ + "{ type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: unknown; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: unknown; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsGetResponse", + "type": "Type", + "tags": [], + "label": "DefendInsightsGetResponse", + "description": [], + "signature": [ + "{ data: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }[]; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsPostRequestBody", + "type": "Type", + "tags": [], + "label": "DefendInsightsPostRequestBody", + "description": [], + "signature": [ + "{ subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/post_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsPostRequestBodyInput", + "type": "Type", + "tags": [], + "label": "DefendInsightsPostRequestBodyInput", + "description": [], + "signature": [ + "{ subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/post_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsPostResponse", + "type": "Type", + "tags": [], + "label": "DefendInsightsPostResponse", + "description": [], + "signature": [ + "{ id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/post_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsResponse", + "type": "Type", + "tags": [], + "label": "DefendInsightsResponse", + "description": [], + "signature": [ + "{ id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightStatus", + "type": "Type", + "tags": [], + "label": "DefendInsightStatus", + "description": [ + "\nThe status of the Defend insight." + ], + "signature": [ + "\"running\" | \"succeeded\" | \"failed\" | \"canceled\"" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightStatusEnum", + "type": "Type", + "tags": [], + "label": "DefendInsightStatusEnum", + "description": [], + "signature": [ + "{ running: \"running\"; succeeded: \"succeeded\"; failed: \"failed\"; canceled: \"canceled\"; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsUpdateProps", + "type": "Type", + "tags": [], + "label": "DefendInsightsUpdateProps", + "description": [], + "signature": [ + "{ id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }[]" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightType", + "type": "Type", + "tags": [], + "label": "DefendInsightType", + "description": [ + "\nThe insight type (ie. incompatible_antivirus)" + ], + "signature": [ + "\"incompatible_antivirus\" | \"noisy_process_tree\"" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightTypeEnum", + "type": "Type", + "tags": [], + "label": "DefendInsightTypeEnum", + "description": [], + "signature": [ + "{ incompatible_antivirus: \"incompatible_antivirus\"; noisy_process_tree: \"noisy_process_tree\"; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightUpdateProps", + "type": "Type", + "tags": [], + "label": "DefendInsightUpdateProps", + "description": [], + "signature": [ + "{ id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.DeleteConversationRequestParams", @@ -2698,7 +3064,7 @@ "label": "GetCapabilitiesResponse", "description": [], "signature": [ - "{ assistantModelEvaluation: boolean; }" + "{ assistantModelEvaluation: boolean; defendInsights: boolean; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/capabilities/get_capabilities_route.gen.ts", "deprecated": false, @@ -4301,7 +4667,7 @@ "label": "ChatCompleteProps", "description": [], "signature": [ - "Zod.ZodObject<{ conversationId: Zod.ZodOptional; promptId: Zod.ZodOptional; isStream: Zod.ZodOptional; responseLanguage: Zod.ZodOptional; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; connectorId: Zod.ZodString; model: Zod.ZodOptional; persist: Zod.ZodBoolean; messages: Zod.ZodArray; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" + "Zod.ZodObject<{ conversationId: Zod.ZodOptional; promptId: Zod.ZodOptional; isStream: Zod.ZodOptional; responseLanguage: Zod.ZodOptional; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; connectorId: Zod.ZodString; model: Zod.ZodOptional; persist: Zod.ZodBoolean; messages: Zod.ZodArray; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; persist: boolean; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; persist: boolean; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -4316,7 +4682,7 @@ "label": "ChatCompleteRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ conversationId: Zod.ZodOptional; promptId: Zod.ZodOptional; isStream: Zod.ZodOptional; responseLanguage: Zod.ZodOptional; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; connectorId: Zod.ZodString; model: Zod.ZodOptional; persist: Zod.ZodBoolean; messages: Zod.ZodArray; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" + "Zod.ZodObject<{ conversationId: Zod.ZodOptional; promptId: Zod.ZodOptional; isStream: Zod.ZodOptional; responseLanguage: Zod.ZodOptional; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; connectorId: Zod.ZodString; model: Zod.ZodOptional; persist: Zod.ZodBoolean; messages: Zod.ZodArray; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; persist: boolean; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; persist: boolean; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -4693,13 +5059,283 @@ "\nDefault features available to the elastic assistant" ], "signature": [ - "{ readonly assistantModelEvaluation: false; }" + "{ readonly assistantModelEvaluation: false; readonly defendInsights: false; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/capabilities/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsight", + "type": "Object", + "tags": [], + "label": "DefendInsight", + "description": [], + "signature": [ + "Zod.ZodObject<{ group: Zod.ZodString; events: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightCreateProps", + "type": "Object", + "tags": [], + "label": "DefendInsightCreateProps", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodOptional; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; eventsContextCount: Zod.ZodOptional; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightEvent", + "type": "Object", + "tags": [], + "label": "DefendInsightEvent", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; endpointId: Zod.ZodString; value: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; value: string; endpointId: string; }, { id: string; value: string; endpointId: string; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightGenerationInterval", + "type": "Object", + "tags": [], + "label": "DefendInsightGenerationInterval", + "description": [], + "signature": [ + "Zod.ZodObject<{ date: Zod.ZodString; durationMs: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { date: string; durationMs: number; }, { date: string; durationMs: number; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightGetRequestParams", + "type": "Object", + "tags": [], + "label": "DefendInsightGetRequestParams", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insight_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightGetResponse", + "type": "Object", + "tags": [], + "label": "DefendInsightGetResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ data: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>>>; }, \"strip\", Zod.ZodTypeAny, { data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; } | null | undefined; }, { data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; } | null | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insight_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsights", + "type": "Object", + "tags": [], + "label": "DefendInsights", + "description": [], + "signature": [ + "Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsGetRequestQuery", + "type": "Object", + "tags": [], + "label": "DefendInsightsGetRequestQuery", + "description": [], + "signature": [ + "Zod.ZodObject<{ ids: Zod.ZodOptional, string[], unknown>>; connector_id: Zod.ZodOptional; type: Zod.ZodOptional>; status: Zod.ZodOptional>; endpoint_ids: Zod.ZodOptional, string[], unknown>>; size: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: string[] | undefined; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: string[] | undefined; }, { type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: unknown; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: unknown; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsGetResponse", + "type": "Object", + "tags": [], + "label": "DefendInsightsGetResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ data: Zod.ZodArray; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { data: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }[]; }, { data: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }[]; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsPostRequestBody", + "type": "Object", + "tags": [], + "label": "DefendInsightsPostRequestBody", + "description": [], + "signature": [ + "Zod.ZodObject<{ endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; anonymizationFields: Zod.ZodArray; field: Zod.ZodString; allowed: Zod.ZodOptional; anonymized: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; model: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; }, \"strip\", Zod.ZodTypeAny, { subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, { subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/post_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsPostResponse", + "type": "Object", + "tags": [], + "label": "DefendInsightsPostResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/post_defend_insights_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsResponse", + "type": "Object", + "tags": [], + "label": "DefendInsightsResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightStatus", + "type": "Object", + "tags": [], + "label": "DefendInsightStatus", + "description": [], + "signature": [ + "Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightStatusEnum", + "type": "Object", + "tags": [], + "label": "DefendInsightStatusEnum", + "description": [], + "signature": [ + "{ running: \"running\"; succeeded: \"succeeded\"; failed: \"failed\"; canceled: \"canceled\"; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightsUpdateProps", + "type": "Object", + "tags": [], + "label": "DefendInsightsUpdateProps", + "description": [], + "signature": [ + "Zod.ZodArray; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; eventsContextCount: Zod.ZodOptional; insights: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }>, \"many\">" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightType", + "type": "Object", + "tags": [], + "label": "DefendInsightType", + "description": [], + "signature": [ + "Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightTypeEnum", + "type": "Object", + "tags": [], + "label": "DefendInsightTypeEnum", + "description": [], + "signature": [ + "{ incompatible_antivirus: \"incompatible_antivirus\"; noisy_process_tree: \"noisy_process_tree\"; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DefendInsightUpdateProps", + "type": "Object", + "tags": [], + "label": "DefendInsightUpdateProps", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; eventsContextCount: Zod.ZodOptional; insights: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.DeleteConversationRequestParams", @@ -5128,7 +5764,7 @@ "label": "GetCapabilitiesResponse", "description": [], "signature": [ - "Zod.ZodObject<{ assistantModelEvaluation: Zod.ZodBoolean; }, \"strip\", Zod.ZodTypeAny, { assistantModelEvaluation: boolean; }, { assistantModelEvaluation: boolean; }>" + "Zod.ZodObject<{ assistantModelEvaluation: Zod.ZodBoolean; defendInsights: Zod.ZodBoolean; }, \"strip\", Zod.ZodTypeAny, { assistantModelEvaluation: boolean; defendInsights: boolean; }, { assistantModelEvaluation: boolean; defendInsights: boolean; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/capabilities/get_capabilities_route.gen.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index f42536ea17c7d..e54aa2aed59a9 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 400 | 0 | 369 | 0 | +| 442 | 0 | 405 | 0 | ## Common diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 8c69abfd80f53..21863e3fbdad3 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 6c9c415911c2d..428ae051c999e 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: 2024-11-19 +date: 2024-11-21 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 06145c7ba312f..26920afd57cd2 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: 2024-11-19 +date: 2024-11-21 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 755cebff3136a..d9e7dba22f2ff 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: 2024-11-19 +date: 2024-11-21 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 ccd0f83dc5d5d..bbad835c8af4e 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: 2024-11-19 +date: 2024-11-21 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 19458d31a669e..a636172e3c6de 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: 2024-11-19 +date: 2024-11-21 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 7987bf1bbbab7..62a042e1c2eb0 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 13efc684ac7ca..480bce3dcb81f 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index 6bbe12c4b1fb6..e5e268bc2a4a0 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index df33de78cf1d9..615db65785e48 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index aab83dacfe4c6..07b05bda29849 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 530a15ae394ec..3579f9116d9b5 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 6b99272aca714..1e2557d1c7773 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index e85640171fc37..c23769ac87a59 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: 2024-11-19 +date: 2024-11-21 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 e17596edc6b3d..1a216d7e602d3 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index bdd432f47b048..3a30a732e3b2b 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 841ba70daf87b..92b5688546ae8 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: 2024-11-19 +date: 2024-11-21 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_formatters.mdx b/api_docs/kbn_formatters.mdx index 1e914935970e3..760de78ed15b1 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 605edf5d45601..403976ff613b8 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: 2024-11-19 +date: 2024-11-21 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_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 81c5b11c9efd6..2b32b9a4fd6cd 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index ce2c60c2a5f4f..ef47a15a44147 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 659df6b6d540e..fda3a0f63a5e4 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 00cf265caa547..6a2cbb6d34707 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index d92d1f03133bf..7d83ffe837d15 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 849a9e6d7c09c..8615df90c789e 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index eb1676d34ed0a..79ff6cc4c0b70 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: 2024-11-19 +date: 2024-11-21 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 3792f9f266a08..10f5568826075 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: 2024-11-19 +date: 2024-11-21 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 d1f9de4058f5d..35c787ef66149 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: 2024-11-19 +date: 2024-11-21 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 f6c5ed5cbc04d..0da28a1d0c546 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: 2024-11-19 +date: 2024-11-21 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 e6df5ff079ec4..d5953c819f52b 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: 2024-11-19 +date: 2024-11-21 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 b60c354d6619d..bafdee0be5f89 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: 2024-11-19 +date: 2024-11-21 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 a4be4f0677a82..c55c9407466b6 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: 2024-11-19 +date: 2024-11-21 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 8ea07e0ee09dc..d4fa91b284d98 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: 2024-11-19 +date: 2024-11-21 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 c0f1d4b97bf7d..56d78034cf53c 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_adapter.mdx b/api_docs/kbn_index_adapter.mdx index 2be722d9e4758..14c580f8f4209 100644 --- a/api_docs/kbn_index_adapter.mdx +++ b/api_docs/kbn_index_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-adapter title: "@kbn/index-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-adapter plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-adapter'] --- import kbnIndexAdapterObj from './kbn_index_adapter.devdocs.json'; diff --git a/api_docs/kbn_index_lifecycle_management_common_shared.mdx b/api_docs/kbn_index_lifecycle_management_common_shared.mdx index acd4f2dc9de42..ec86e99d29500 100644 --- a/api_docs/kbn_index_lifecycle_management_common_shared.mdx +++ b/api_docs/kbn_index_lifecycle_management_common_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-lifecycle-management-common-shared title: "@kbn/index-lifecycle-management-common-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-lifecycle-management-common-shared plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-lifecycle-management-common-shared'] --- import kbnIndexLifecycleManagementCommonSharedObj from './kbn_index_lifecycle_management_common_shared.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index bb926e7aff8cc..523c807b8160f 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; diff --git a/api_docs/kbn_inference_common.devdocs.json b/api_docs/kbn_inference_common.devdocs.json index e087e53be14e1..9cb8c900b21db 100644 --- a/api_docs/kbn_inference_common.devdocs.json +++ b/api_docs/kbn_inference_common.devdocs.json @@ -1752,6 +1752,200 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.BoundChatCompleteAPI", + "type": "Type", + "tags": [], + "label": "BoundChatCompleteAPI", + "description": [ + "\nVersion of {@link ChatCompleteAPI} that got pre-bound to a set of static parameters" + ], + "signature": [ + " = ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ToolOptions", + "text": "ToolOptions" + }, + ", TStream extends boolean = false>(options: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.UnboundChatCompleteOptions", + "text": "UnboundChatCompleteOptions" + }, + ") => ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ChatCompleteCompositeResponse", + "text": "ChatCompleteCompositeResponse" + }, + "" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.BoundChatCompleteAPI.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ [P in \"system\" | \"stream\" | \"messages\" | Exclude]: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ChatCompleteOptions", + "text": "ChatCompleteOptions" + }, + "[P]; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.BoundChatCompleteOptions", + "type": "Type", + "tags": [], + "label": "BoundChatCompleteOptions", + "description": [ + "\nStatic options used to call the {@link BoundChatCompleteAPI}" + ], + "signature": [ + "{ connectorId: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ChatCompleteOptions", + "text": "ChatCompleteOptions" + }, + "[\"connectorId\"]; functionCalling?: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ChatCompleteOptions", + "text": "ChatCompleteOptions" + }, + "[\"functionCalling\"] | undefined; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.BoundOutputAPI", + "type": "Type", + "tags": [], + "label": "BoundOutputAPI", + "description": [ + "\nVersion of {@link OutputAPI} that got pre-bound to a set of static parameters" + ], + "signature": [ + "(options: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.UnboundOutputOptions", + "text": "UnboundOutputOptions" + }, + ") => ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.OutputCompositeResponse", + "text": "OutputCompositeResponse" + }, + "" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.BoundOutputAPI.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ id: TId; input: string; schema?: TOutputSchema | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.Message", + "text": "Message" + }, + "[] | undefined; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.BoundOutputOptions", + "type": "Type", + "tags": [], + "label": "BoundOutputOptions", + "description": [ + "\nStatic options used to call the {@link BoundOutputAPI}" + ], + "signature": [ + "{ connectorId: string; functionCalling?: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.FunctionCallingMode", + "text": "FunctionCallingMode" + }, + " | undefined; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/inference-common", "id": "def-common.ChatCompleteAPI", @@ -2760,6 +2954,56 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.UnboundChatCompleteOptions", + "type": "Type", + "tags": [], + "label": "UnboundChatCompleteOptions", + "description": [ + "\nOptions used to call the {@link BoundChatCompleteAPI}" + ], + "signature": [ + "{ [P in \"system\" | \"stream\" | \"messages\" | Exclude]: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ChatCompleteOptions", + "text": "ChatCompleteOptions" + }, + "[P]; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.UnboundOutputOptions", + "type": "Type", + "tags": [], + "label": "UnboundOutputOptions", + "description": [ + "\nOptions used to call the {@link BoundOutputAPI}" + ], + "signature": [ + "{ id: TId; input: string; schema?: TOutputSchema | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.Message", + "text": "Message" + }, + "[] | undefined; }" + ], + "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/inference-common", "id": "def-common.UserMessage", diff --git a/api_docs/kbn_inference_common.mdx b/api_docs/kbn_inference_common.mdx index 329bd362de0ed..fecaa91691853 100644 --- a/api_docs/kbn_inference_common.mdx +++ b/api_docs/kbn_inference_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference-common title: "@kbn/inference-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference-common'] --- import kbnInferenceCommonObj from './kbn_inference_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 124 | 0 | 41 | 1 | +| 132 | 0 | 43 | 1 | ## Common diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index ec3c5b50696cb..d04f8999c319f 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 773270fbaede0..7ff11d928a5a0 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 96a376405f214..2c9ec23e43597 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index 8dd6387e9fcbf..56d33ae279608 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 626b407eb2f83..47b92944910d4 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 6d96ad4512742..65405b333c77f 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index f0696724c4cba..c1ac75b7d5248 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index d758caef8530f..00e9362bb48db 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: 2024-11-19 +date: 2024-11-21 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 1844df77977ae..6e3c9605d1183 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: 2024-11-19 +date: 2024-11-21 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 fc7747e45458a..4a365ca7db4c7 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 32b2a18a9ad31..817f08012a182 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 8014e287a5ee7..4142177d70b34 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: 2024-11-19 +date: 2024-11-21 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.mdx b/api_docs/kbn_language_documentation.mdx index 0c3017f7206d0..fe979ad8f24c0 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index dc8b058d520f6..4193296e70c45 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 0b857c511bc78..3e16958f8e745 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index fa34390905109..5c30a12e52e35 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: 2024-11-19 +date: 2024-11-21 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 c5b45e8b4fe31..1e1b932392dc6 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index d2ec98f1c0595..8d36628cb0ee3 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index cf5a7aa80ff98..3b1a48183b448 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 8dc29d6d64620..c3c5ee776eba3 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index a481c4bc7eabb..60d8f1f7be110 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 77d5e01b3b62d..a7dbb075ecbf9 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 8052d75a031cd..b7088887fa9ba 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 68aad3978bd14..ae637e29ebb19 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 63afd2efda9c1..641f84d5d8710 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 4435445037419..badf4a47fa2f2 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index eb7a6fbf0dbd8..2cae7456e145d 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 063e5bc3799c8..915502e9c2a8d 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index e2cfd0ac56378..6e49814a9c919 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index a3f883ed94495..4221195b419a9 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 80303979e793e..27a85fea6bb4b 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_manifest.mdx b/api_docs/kbn_manifest.mdx index cc46b145585d9..d8ca63d02c6d1 100644 --- a/api_docs/kbn_manifest.mdx +++ b/api_docs/kbn_manifest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-manifest title: "@kbn/manifest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/manifest plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/manifest'] --- import kbnManifestObj from './kbn_manifest.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 5d102899034f1..24277ed63ea8e 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index 8f31240c28f3c..d204c7c2bdcc1 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index d1f767281e4a9..64e4c3399c413 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index a34cac1277726..b39de81ffe89d 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index c727a3b21d752..7f7db49345bdc 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 53a8bb9b275ff..5a8ea941cb543 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 674ef0dd45ff7..4c0e97e55d50e 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index a4593811d2578..3ed94df682099 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 082edcd726da5..602e0a0de8e99 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 2c06b6d16d11f..dc0f55229dbb9 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 7ad62d6781f28..9e3e00d044bbc 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 5646e8364214a..0dcb62e65f33e 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index 464bb537016a4..35d4efca2d36b 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 3f4071ea9ac0e..61b3f117d3d29 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 8f134b49723c0..0bade866bd90f 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: 2024-11-19 +date: 2024-11-21 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 c8f90b44d6962..a0eaa2f8f23d3 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 0d588060308eb..037683c362f53 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index cfed877d5f12f..0fdd4eb8b2fbe 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: 2024-11-19 +date: 2024-11-21 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 898061cfcf982..cc3e4ccdae3c5 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 5a13b2fc38f74..e3555302b5c0a 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index 1ba4c748a5859..b6a95ccff39d9 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index d41088d23d8e9..f63d8269cb2ba 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 3275a7f1d678d..63506fa4d0d5a 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 8c18827d654bd..01cb4d046aa8f 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index a3f08fba7f8b4..fc61254b63d7b 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index bd04380328e90..3b71ca06e0628 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: 2024-11-19 +date: 2024-11-21 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_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index a15fb9f3e8829..c662840b8de56 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 37a0635121546..45f84d226aed4 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 62519710c59f7..adb1152679db1 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 4ed5e4a5f97ae..d7880b352efa5 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index ae66a145c9406..efa77b18492c0 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index f22302915d2e7..b2c5023bc5211 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 810fb76125954..29007587cb7bd 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 18bff52795b65..1a116dddf27dc 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index cda8d84e8e4db..aba8a0824bd68 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index f8c2cc2edb1f6..62f34f2b8d1b1 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 57bfe752ba66b..05d05bfcb9e8f 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index fdb897dbf3ca0..b54576abfa1c3 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 79594ec6a7ae2..8558b1e4af835 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index 4bd374f8e8b43..be42734555ba5 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.devdocs.json'; diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index 4ce275c081397..574bd62f71889 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index c128992462fce..a9c9177b6e61f 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index e9cfda360f57f..df0284d38667e 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 4392fa5df183b..c8da7d5e17df1 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: 2024-11-19 +date: 2024-11-21 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 67edcf7c8d849..bb221e30da99a 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: 2024-11-19 +date: 2024-11-21 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 398d5a27ecf33..79f3fe2eb3557 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 0be4bc90cf332..2304068ffd75f 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index a98583e453757..637b61f5efe72 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: 2024-11-19 +date: 2024-11-21 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_check.mdx b/api_docs/kbn_plugin_check.mdx index cbca4fb99b6b3..157aa7501e233 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 04778804a1e57..20c3b78bc326e 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: 2024-11-19 +date: 2024-11-21 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 1dd03c0bc9571..3f4f3c5660522 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index fa135c5056fce..476d4ce89579a 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 922a1caac7dd1..a21c48d8885da 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index 7b285887ef184..ccee3d90265e7 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_product_doc_common.devdocs.json b/api_docs/kbn_product_doc_common.devdocs.json new file mode 100644 index 0000000000000..57e3e65f89df3 --- /dev/null +++ b/api_docs/kbn_product_doc_common.devdocs.json @@ -0,0 +1,454 @@ +{ + "id": "@kbn/product-doc-common", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.getArtifactName", + "type": "Function", + "tags": [], + "label": "getArtifactName", + "description": [], + "signature": [ + "({ productName, productVersion, excludeExtension, }: { productName: \"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"; productVersion: string; excludeExtension?: boolean | undefined; }) => string" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.getArtifactName.$1", + "type": "Object", + "tags": [], + "label": "{\n productName,\n productVersion,\n excludeExtension = false,\n}", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.getArtifactName.$1.productName", + "type": "CompoundType", + "tags": [], + "label": "productName", + "description": [], + "signature": [ + "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.getArtifactName.$1.productVersion", + "type": "string", + "tags": [], + "label": "productVersion", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.getArtifactName.$1.excludeExtension", + "type": "CompoundType", + "tags": [], + "label": "excludeExtension", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.getProductDocIndexName", + "type": "Function", + "tags": [], + "label": "getProductDocIndexName", + "description": [], + "signature": [ + "(productName: \"security\" | \"kibana\" | \"observability\" | \"elasticsearch\") => string" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.getProductDocIndexName.$1", + "type": "CompoundType", + "tags": [], + "label": "productName", + "description": [], + "signature": [ + "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.isArtifactContentFilePath", + "type": "Function", + "tags": [], + "label": "isArtifactContentFilePath", + "description": [], + "signature": [ + "(path: string) => boolean" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact_content.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.isArtifactContentFilePath.$1", + "type": "string", + "tags": [], + "label": "path", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact_content.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.parseArtifactName", + "type": "Function", + "tags": [], + "label": "parseArtifactName", + "description": [], + "signature": [ + "(artifactName: string) => { productName: \"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"; productVersion: string; } | undefined" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.parseArtifactName.$1", + "type": "string", + "tags": [], + "label": "artifactName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ArtifactManifest", + "type": "Interface", + "tags": [], + "label": "ArtifactManifest", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ArtifactManifest.formatVersion", + "type": "string", + "tags": [], + "label": "formatVersion", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ArtifactManifest.productName", + "type": "CompoundType", + "tags": [], + "label": "productName", + "description": [], + "signature": [ + "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ArtifactManifest.productVersion", + "type": "string", + "tags": [], + "label": "productVersion", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes", + "type": "Interface", + "tags": [], + "label": "ProductDocumentationAttributes", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.content_title", + "type": "string", + "tags": [], + "label": "content_title", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.content_body", + "type": "Object", + "tags": [], + "label": "content_body", + "description": [], + "signature": [ + "SemanticTextField" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.product_name", + "type": "CompoundType", + "tags": [], + "label": "product_name", + "description": [], + "signature": [ + "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.root_type", + "type": "string", + "tags": [], + "label": "root_type", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.slug", + "type": "string", + "tags": [], + "label": "slug", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.url", + "type": "string", + "tags": [], + "label": "url", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.version", + "type": "string", + "tags": [], + "label": "version", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.ai_subtitle", + "type": "string", + "tags": [], + "label": "ai_subtitle", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.ai_summary", + "type": "Object", + "tags": [], + "label": "ai_summary", + "description": [], + "signature": [ + "SemanticTextField" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.ai_questions_answered", + "type": "Object", + "tags": [], + "label": "ai_questions_answered", + "description": [], + "signature": [ + "SemanticTextArrayField" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductDocumentationAttributes.ai_tags", + "type": "Array", + "tags": [], + "label": "ai_tags", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.DocumentationProduct", + "type": "Enum", + "tags": [], + "label": "DocumentationProduct", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/product.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.productDocIndexPattern", + "type": "string", + "tags": [], + "label": "productDocIndexPattern", + "description": [], + "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.productDocIndexPrefix", + "type": "string", + "tags": [], + "label": "productDocIndexPrefix", + "description": [], + "signature": [ + "\".kibana-ai-product-doc\"" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/product-doc-common", + "id": "def-common.ProductName", + "type": "Type", + "tags": [], + "label": "ProductName", + "description": [], + "signature": [ + "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" + ], + "path": "x-pack/packages/ai-infra/product-doc-common/src/product.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_product_doc_common.mdx b/api_docs/kbn_product_doc_common.mdx new file mode 100644 index 0000000000000..59ebe236b18e2 --- /dev/null +++ b/api_docs/kbn_product_doc_common.mdx @@ -0,0 +1,39 @@ +--- +#### +#### 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: kibKbnProductDocCommonPluginApi +slug: /kibana-dev-docs/api/kbn-product-doc-common +title: "@kbn/product-doc-common" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/product-doc-common plugin +date: 2024-11-21 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-common'] +--- +import kbnProductDocCommonObj from './kbn_product_doc_common.devdocs.json'; + + + +Contact [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 31 | 0 | 31 | 0 | + +## Common + +### Functions + + +### Interfaces + + +### Enums + + +### Consts, variables and types + + diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 96ebcb96dcbda..d993c50b76d6d 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 8c52041cc08ca..ff7e5932dfae3 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 6e68801f861d1..908596c6df7df 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index ad1a232f33f50..4e637c4f9ee20 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 16f2e3a10ec0d..4eec32d476c6a 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index fbb48d167900b..1216737900365 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 0d9b39a6cf83b..ab4003cd378b5 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 93d2d0bb55520..a623a898af80a 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 18ae8bd1ebb68..e42af9ac33061 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 9c0366f806992..5d27902d79740 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 4b5d043b09b7d..5e7bf7ab1d52b 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 746f934a2e0cc..17c469e5da034 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: 2024-11-19 +date: 2024-11-21 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 baeb2bf83af85..4ec926131b6d9 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: 2024-11-19 +date: 2024-11-21 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 96c23e1ee8e1f..7e8bdddb96acd 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: 2024-11-19 +date: 2024-11-21 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 3568c0317a12d..1c95ba49a9427 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index c3f78a25560f4..22aff9da3c4a1 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index f74eb1f5e7ffe..39d746ae0ec03 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 353e32689bf68..27f8aa773175b 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 5186ba61fc29c..849154e169c71 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index ee0f0050b0ca2..4344f71b28a67 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 30e1ae6f1ebd9..166ed726f35fe 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 882287b076cfc..4fac66d95b692 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 1012e1ddbb15b..faa9390ae816f 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 7883d3c8367cd..a75b3a1947d29 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 038754dbd0401..304e2e10aa84c 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 1afbf0cb9b41e..02c11cf2964ec 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 61d06c7eb962b..fc7ca043cf5eb 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 7de7a7bf8ff49..1f4a84085b17f 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_response_ops_rule_params.mdx b/api_docs/kbn_response_ops_rule_params.mdx index 8d4ecd41730ca..9672a3d8186dd 100644 --- a/api_docs/kbn_response_ops_rule_params.mdx +++ b/api_docs/kbn_response_ops_rule_params.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-rule-params title: "@kbn/response-ops-rule-params" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-rule-params plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-rule-params'] --- import kbnResponseOpsRuleParamsObj from './kbn_response_ops_rule_params.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 9026dc2269ed2..58e2388ff6c07 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index fcaed7155b4ea..cecdf738e3977 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 8319b6e34bfc8..359fe44cd54b8 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 095bd1c3b6f34..48eff4b394b2d 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 06981705e8a05..af7c1ace16831 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 946c5075f7762..ce1937fc00b1a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 58ecebd027e1c..9e1e4548f4af0 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index 4606f65cf3f8e..b1f38a58ff642 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index 61e0051116758..35ae55dbad73c 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index e576e05be45b8..805bb7a91c04d 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 7b988050e45e5..22b88be7b204a 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index c5992a0d39585..868f7b7cf3f42 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 6578554198181..6aadff94423a7 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 663731b4c8c94..076564ea46dcf 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 846d86f36d714..d5e3a065bb411 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index c4079c031c338..1d471a24ed814 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 6783991d9f0bf..2d5fa98e2c931 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 1722c602451b8..4bce0257f9691 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.devdocs.json b/api_docs/kbn_security_authorization_core.devdocs.json index a46a78d6cbc0e..767e9d81fcd86 100644 --- a/api_docs/kbn_security_authorization_core.devdocs.json +++ b/api_docs/kbn_security_authorization_core.devdocs.json @@ -419,7 +419,7 @@ "label": "CasesSupportedOperations", "description": [], "signature": [ - "\"getTags\" | \"pushCase\" | \"createCase\" | \"createComment\" | \"getCase\" | \"getComment\" | \"getReporters\" | \"getUserActions\" | \"findConfigurations\" | \"updateCase\" | \"updateComment\" | \"deleteCase\" | \"deleteComment\" | \"createConfiguration\" | \"updateConfiguration\"" + "\"getTags\" | \"createComment\" | \"reopenCase\" | \"pushCase\" | \"createCase\" | \"getCase\" | \"getComment\" | \"getReporters\" | \"getUserActions\" | \"findConfigurations\" | \"updateCase\" | \"updateComment\" | \"deleteCase\" | \"deleteComment\" | \"createConfiguration\" | \"updateConfiguration\"" ], "path": "x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts", "deprecated": false, diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index f8f715bc0d53b..1d312218c338a 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index 015542126dd71..4c672c043e930 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index e96d10a12687d..ca17d40f0544b 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index c90cf79223e83..c1f2fd0b5ccde 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 899501eb9f32f..16ea109e9b7dd 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index d2c44490a1bb0..4a24b52b13e17 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 213eff3dddf6b..042f1bf631164 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 477f3b6831d78..62d8ad2257ea4 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 4cc577dd55b4b..26c5cc329e3a3 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.devdocs.json b/api_docs/kbn_security_solution_features.devdocs.json index 032915d7f4cbc..8549994fd336f 100644 --- a/api_docs/kbn_security_solution_features.devdocs.json +++ b/api_docs/kbn_security_solution_features.devdocs.json @@ -477,7 +477,7 @@ "section": "def-common.RecursivePartial", "text": "RecursivePartial" }, - "<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; } | undefined>; disabled?: ", + "<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; createComment?: readonly string[] | undefined; reopenCase?: readonly string[] | undefined; } | undefined>; disabled?: ", { "pluginId": "@kbn/utility-types", "scope": "common", diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index f3179e59ab39f..ef93de6b7ea17 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index c25a1b05e1cbc..daec63a5e4136 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 523d146d2fb5b..270c2d5e793f4 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 5902142affea1..344aa870b361d 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_security_ui_components.devdocs.json b/api_docs/kbn_security_ui_components.devdocs.json index 56319c6bea165..63e0344530ee8 100644 --- a/api_docs/kbn_security_ui_components.devdocs.json +++ b/api_docs/kbn_security_ui_components.devdocs.json @@ -1,26 +1,10 @@ { "id": "@kbn/security-ui-components", "client": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { "classes": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable", + "id": "def-public.FeatureTable", "type": "Class", "tags": [], "label": "FeatureTable", @@ -28,9 +12,9 @@ "signature": [ { "pluginId": "@kbn/security-ui-components", - "scope": "common", + "scope": "public", "docId": "kibKbnSecurityUiComponentsPluginApi", - "section": "def-common.FeatureTable", + "section": "def-public.FeatureTable", "text": "FeatureTable" }, " extends React.Component" @@ -41,7 +25,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable.defaultProps", + "id": "def-public.FeatureTable.defaultProps", "type": "Object", "tags": [], "label": "defaultProps", @@ -52,7 +36,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable.defaultProps.privilegeIndex", + "id": "def-public.FeatureTable.defaultProps.privilegeIndex", "type": "number", "tags": [], "label": "privilegeIndex", @@ -63,7 +47,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable.defaultProps.showLocks", + "id": "def-public.FeatureTable.defaultProps.showLocks", "type": "boolean", "tags": [], "label": "showLocks", @@ -71,23 +55,12 @@ "path": "x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable.defaultProps.showTitle", - "type": "boolean", - "tags": [], - "label": "showTitle", - "description": [], - "path": "x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx", - "deprecated": false, - "trackAdoption": false } ] }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable.Unnamed", + "id": "def-public.FeatureTable.Unnamed", "type": "Function", "tags": [], "label": "Constructor", @@ -101,7 +74,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable.Unnamed.$1", + "id": "def-public.FeatureTable.Unnamed.$1", "type": "Object", "tags": [], "label": "props", @@ -119,7 +92,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTable.render", + "id": "def-public.FeatureTable.render", "type": "Function", "tags": [], "label": "render", @@ -138,7 +111,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator", + "id": "def-public.PrivilegeFormCalculator", "type": "Class", "tags": [], "label": "PrivilegeFormCalculator", @@ -151,7 +124,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.Unnamed", + "id": "def-public.PrivilegeFormCalculator.Unnamed", "type": "Function", "tags": [], "label": "Constructor", @@ -165,7 +138,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.Unnamed.$1", + "id": "def-public.PrivilegeFormCalculator.Unnamed.$1", "type": "Object", "tags": [], "label": "kibanaPrivileges", @@ -186,7 +159,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.Unnamed.$2", + "id": "def-public.PrivilegeFormCalculator.Unnamed.$2", "type": "Object", "tags": [], "label": "role", @@ -210,7 +183,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getBasePrivilege", + "id": "def-public.PrivilegeFormCalculator.getBasePrivilege", "type": "Function", "tags": [], "label": "getBasePrivilege", @@ -234,7 +207,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getBasePrivilege.$1", + "id": "def-public.PrivilegeFormCalculator.getBasePrivilege.$1", "type": "number", "tags": [], "label": "privilegeIndex", @@ -254,7 +227,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.isWildcardBasePrivilege", + "id": "def-public.PrivilegeFormCalculator.isWildcardBasePrivilege", "type": "Function", "tags": [], "label": "isWildcardBasePrivilege", @@ -270,7 +243,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.isWildcardBasePrivilege.$1", + "id": "def-public.PrivilegeFormCalculator.isWildcardBasePrivilege.$1", "type": "number", "tags": [], "label": "privilegeIndex", @@ -290,7 +263,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId", + "id": "def-public.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId", "type": "Function", "tags": [], "label": "getDisplayedPrimaryFeaturePrivilegeId", @@ -306,7 +279,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId.$1", + "id": "def-public.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId.$1", "type": "string", "tags": [], "label": "featureId", @@ -323,7 +296,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId.$2", + "id": "def-public.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId.$2", "type": "number", "tags": [], "label": "privilegeIndex", @@ -340,7 +313,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId.$3", + "id": "def-public.PrivilegeFormCalculator.getDisplayedPrimaryFeaturePrivilegeId.$3", "type": "boolean", "tags": [], "label": "allSpacesSelected", @@ -360,7 +333,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges", + "id": "def-public.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges", "type": "Function", "tags": [], "label": "hasCustomizedSubFeaturePrivileges", @@ -376,7 +349,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges.$1", + "id": "def-public.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges.$1", "type": "string", "tags": [], "label": "featureId", @@ -393,7 +366,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges.$2", + "id": "def-public.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges.$2", "type": "number", "tags": [], "label": "privilegeIndex", @@ -410,7 +383,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges.$3", + "id": "def-public.PrivilegeFormCalculator.hasCustomizedSubFeaturePrivileges.$3", "type": "boolean", "tags": [], "label": "allSpacesSelected", @@ -430,7 +403,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege", + "id": "def-public.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege", "type": "Function", "tags": [], "label": "getEffectivePrimaryFeaturePrivilege", @@ -454,7 +427,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege.$1", + "id": "def-public.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege.$1", "type": "string", "tags": [], "label": "featureId", @@ -471,7 +444,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege.$2", + "id": "def-public.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege.$2", "type": "number", "tags": [], "label": "privilegeIndex", @@ -488,7 +461,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege.$3", + "id": "def-public.PrivilegeFormCalculator.getEffectivePrimaryFeaturePrivilege.$3", "type": "CompoundType", "tags": [], "label": "allSpacesSelected", @@ -508,7 +481,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted", + "id": "def-public.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted", "type": "Function", "tags": [], "label": "isIndependentSubFeaturePrivilegeGranted", @@ -524,7 +497,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted.$1", + "id": "def-public.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted.$1", "type": "string", "tags": [], "label": "featureId", @@ -541,7 +514,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted.$2", + "id": "def-public.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted.$2", "type": "string", "tags": [], "label": "privilegeId", @@ -558,7 +531,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted.$3", + "id": "def-public.PrivilegeFormCalculator.isIndependentSubFeaturePrivilegeGranted.$3", "type": "number", "tags": [], "label": "privilegeIndex", @@ -578,7 +551,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege", + "id": "def-public.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege", "type": "Function", "tags": [], "label": "getSelectedMutuallyExclusiveSubFeaturePrivilege", @@ -610,7 +583,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege.$1", + "id": "def-public.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege.$1", "type": "string", "tags": [], "label": "featureId", @@ -627,7 +600,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege.$2", + "id": "def-public.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege.$2", "type": "Object", "tags": [], "label": "subFeatureGroup", @@ -650,7 +623,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege.$3", + "id": "def-public.PrivilegeFormCalculator.getSelectedMutuallyExclusiveSubFeaturePrivilege.$3", "type": "number", "tags": [], "label": "privilegeIndex", @@ -670,7 +643,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.canCustomizeSubFeaturePrivileges", + "id": "def-public.PrivilegeFormCalculator.canCustomizeSubFeaturePrivileges", "type": "Function", "tags": [], "label": "canCustomizeSubFeaturePrivileges", @@ -686,7 +659,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.canCustomizeSubFeaturePrivileges.$1", + "id": "def-public.PrivilegeFormCalculator.canCustomizeSubFeaturePrivileges.$1", "type": "string", "tags": [], "label": "featureId", @@ -703,7 +676,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.canCustomizeSubFeaturePrivileges.$2", + "id": "def-public.PrivilegeFormCalculator.canCustomizeSubFeaturePrivileges.$2", "type": "number", "tags": [], "label": "privilegeIndex", @@ -723,7 +696,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization", + "id": "def-public.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization", "type": "Function", "tags": [], "label": "updateSelectedFeaturePrivilegesForCustomization", @@ -739,7 +712,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$1", + "id": "def-public.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$1", "type": "string", "tags": [], "label": "featureId", @@ -756,7 +729,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$2", + "id": "def-public.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$2", "type": "number", "tags": [], "label": "privilegeIndex", @@ -773,7 +746,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$3", + "id": "def-public.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$3", "type": "boolean", "tags": [], "label": "willBeCustomizing", @@ -790,7 +763,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$4", + "id": "def-public.PrivilegeFormCalculator.updateSelectedFeaturePrivilegesForCustomization.$4", "type": "boolean", "tags": [], "label": "allSpacesSelected", @@ -810,7 +783,7 @@ }, { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.hasSupersededInheritedPrivileges", + "id": "def-public.PrivilegeFormCalculator.hasSupersededInheritedPrivileges", "type": "Function", "tags": [], "label": "hasSupersededInheritedPrivileges", @@ -826,7 +799,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.PrivilegeFormCalculator.hasSupersededInheritedPrivileges.$1", + "id": "def-public.PrivilegeFormCalculator.hasSupersededInheritedPrivileges.$1", "type": "number", "tags": [], "label": "privilegeIndex", @@ -851,7 +824,7 @@ "functions": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTableCell", + "id": "def-public.FeatureTableCell", "type": "Function", "tags": [], "label": "FeatureTableCell", @@ -865,7 +838,7 @@ "children": [ { "parentPluginId": "@kbn/security-ui-components", - "id": "def-common.FeatureTableCell.$1", + "id": "def-public.FeatureTableCell.$1", "type": "Object", "tags": [], "label": "{ feature, className }", @@ -887,5 +860,21 @@ "enums": [], "misc": [], "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] } } \ No newline at end of file diff --git a/api_docs/kbn_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index aa7487f0bc657..2d2dc2412a017 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; @@ -21,13 +21,13 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 48 | 0 | 13 | 0 | +| 47 | 0 | 12 | 0 | -## Common +## Client ### Functions - + ### Classes - + diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 48a49229dd27e..43de76b593313 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 69653a9cb55e6..ba3bd450b707a 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index bfdff85393751..6ccdcb49ee593 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: 2024-11-19 +date: 2024-11-21 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 1fae7a7cf0730..a52cff0a76c3f 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: 2024-11-19 +date: 2024-11-21 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 040d9c112624a..551a83972750d 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: 2024-11-19 +date: 2024-11-21 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 480c5d63613ca..7f73729283d75 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: 2024-11-19 +date: 2024-11-21 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 2e880ce5c6690..d688c7cf2c6f8 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: 2024-11-19 +date: 2024-11-21 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 59d2e2f88f63f..8b67f7a4b26cb 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: 2024-11-19 +date: 2024-11-21 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 752b5d3f8b7ac..fd9ddcadc6e28 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: 2024-11-19 +date: 2024-11-21 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 d43572d3671cc..95c47fb3dc03a 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: 2024-11-19 +date: 2024-11-21 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 c87c9a7ad6a69..274d8116bfff5 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: 2024-11-19 +date: 2024-11-21 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 b6c4dfc52234c..0cd774fdbfbd8 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: 2024-11-19 +date: 2024-11-21 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 59bc21dea6024..30adbd63daafa 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: 2024-11-19 +date: 2024-11-21 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 a0f7dd123815a..03565a17044a2 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: 2024-11-19 +date: 2024-11-21 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 78d2ea6f9dd59..cbcecb0bf37e2 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: 2024-11-19 +date: 2024-11-21 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 c790ecaca5dc4..b76a357d484f8 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: 2024-11-19 +date: 2024-11-21 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 9637b9ca23433..01ada51de564b 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: 2024-11-19 +date: 2024-11-21 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 ad7aba34e8d52..4bb4ec9f0ac2c 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: 2024-11-19 +date: 2024-11-21 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 9251648d483e4..09e98c1d1db49 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 08e844eff3f21..4b5f9b3efce1a 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index 7baed599e0a66..f7aaec3f41000 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 5fa20acb2c9c2..27079ba2e0122 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index a1d4f1ebf7c76..ae6e0b24f79e8 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 40f536f5db04c..b067d28daa13a 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index eefe6dfe43c07..4871a1059737b 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index f0043ba81718b..5f0651eaa3563 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 573b940b664f8..1f04b23f7f295 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 7318743c1fa23..1f9b026693310 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: 2024-11-19 +date: 2024-11-21 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 1f56ef696cc4d..2256f0d29be62 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 1dda7ad1df6b7..9f61f9688b9de 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 12dffe58bd719..741318151f8cc 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: 2024-11-19 +date: 2024-11-21 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 b7b5d81db5e0f..5112e0c7b2203 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: 2024-11-19 +date: 2024-11-21 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 181651e0f070d..d5509a2cded34 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index e13ed972a270b..194258558f8c8 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 513f3b43a27d7..34bdbcca0fe3c 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 99d28e41826a0..4d26ed432df08 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: 2024-11-19 +date: 2024-11-21 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 39b714b6dac28..68a9363d6709a 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: 2024-11-19 +date: 2024-11-21 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 41c98a856fa0b..de47f3f5b7197 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: 2024-11-19 +date: 2024-11-21 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 d776a9e4882bf..115b4567293b9 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: 2024-11-19 +date: 2024-11-21 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 38a7b7cd57660..722babc144aaf 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: 2024-11-19 +date: 2024-11-21 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 c492a4b0cc47a..098ed4da98145 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: 2024-11-19 +date: 2024-11-21 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 25796de07ba76..2b7b197d10848 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: 2024-11-19 +date: 2024-11-21 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 612b80b339754..77b81ae12b086 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: 2024-11-19 +date: 2024-11-21 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 f241be306e2c6..98006cdbc3919 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: 2024-11-19 +date: 2024-11-21 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 bd51a7c0a5beb..fee05603b179a 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: 2024-11-19 +date: 2024-11-21 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 3efe48b48af3e..af4de6cb7f840 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: 2024-11-19 +date: 2024-11-21 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 ae6c16ace663b..2798aa82e82e3 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: 2024-11-19 +date: 2024-11-21 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 d6d913d3e6a81..be3a6214d2bfa 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: 2024-11-19 +date: 2024-11-21 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 6992f6bf41fbe..b318c7d6bcdd4 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: 2024-11-19 +date: 2024-11-21 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 1ec876462ab87..6173e7150dbc0 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: 2024-11-19 +date: 2024-11-21 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 0bd1cb9503d0f..4ea37ab8473e7 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: 2024-11-19 +date: 2024-11-21 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 8f4ab699ba811..b6add920c4b43 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: 2024-11-19 +date: 2024-11-21 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 ce922e469aaa8..ca710143f8d3b 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: 2024-11-19 +date: 2024-11-21 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 ae5b222ff8219..f9d15a0014b41 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: 2024-11-19 +date: 2024-11-21 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 816206d9a88f8..f763d69361ab7 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: 2024-11-19 +date: 2024-11-21 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 dc97819a52142..17272302f4d7d 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: 2024-11-19 +date: 2024-11-21 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 36cac0f02a973..71caa40b24ee7 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: 2024-11-19 +date: 2024-11-21 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 86f21ab6a8f35..ae968f944210f 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json index 84ed8404705fc..aa11474d34560 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json @@ -259,7 +259,7 @@ "The background color of the prompt; defaults to `plain`." ], "signature": [ - "\"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined" + "\"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | \"transparent\" | undefined" ], "path": "packages/shared-ux/prompt/no_data_views/types/index.d.ts", "deprecated": false, 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 59032a0a26de5..e8cc1d353c99b 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: 2024-11-19 +date: 2024-11-21 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 3e14908f62104..e79a540f135ee 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: 2024-11-19 +date: 2024-11-21 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 22d6ebd07d476..53128b11e88da 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: 2024-11-19 +date: 2024-11-21 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 999e4996731a0..d9a39cbcc84d2 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: 2024-11-19 +date: 2024-11-21 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 e2c9e92483dd7..2ce14191dc717 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: 2024-11-19 +date: 2024-11-21 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 ad68ebb50c23a..9affdd932e5a6 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: 2024-11-19 +date: 2024-11-21 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 5a62b599fc9e6..7c822cda82e95 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: 2024-11-19 +date: 2024-11-21 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_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 499034cae475f..2329279b3c31b 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 06ed280a7243c..926f858c52bb4 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 1cf9823de35f1..1191ab5a7e495 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: 2024-11-19 +date: 2024-11-21 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 5849842e95def..e0a0bada66982 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: 2024-11-19 +date: 2024-11-21 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 86c0a5b60bb34..62ddb5933dcc6 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 58808bafb8c26..e714651f18c4e 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index 97f887d6916e9..d5e1cd8cf4ce8 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index 01be6b681684d..20d96ec0077ac 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index 224cc31048ac4..a0258aa6bda62 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index febd634486838..75892d2a79407 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: 2024-11-19 +date: 2024-11-21 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 58880300d5bde..078a0a219523e 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: 2024-11-19 +date: 2024-11-21 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 8ebca570d046e..907362dad0c5b 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 010d69a1b8aa7..91ea0cc4af824 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index b7851081801d0..decec16cad572 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 36b2444bb48a1..9b0f85be9c682 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: 2024-11-19 +date: 2024-11-21 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 40461c7c08ff8..68613d16ec423 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 1a69ab75edb2e..e79253c601729 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 6796757558f19..2d9bc10bba9f0 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: 2024-11-19 +date: 2024-11-21 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 1522caa831c31..71b0f6da111b9 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index ea5afd5d95344..a2a696aa7daae 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index beb39dd02b954..7c04b4ac52eae 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_transpose_utils.mdx b/api_docs/kbn_transpose_utils.mdx index f7c50e163efdd..3d0043d6c8b2a 100644 --- a/api_docs/kbn_transpose_utils.mdx +++ b/api_docs/kbn_transpose_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-transpose-utils title: "@kbn/transpose-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/transpose-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/transpose-utils'] --- import kbnTransposeUtilsObj from './kbn_transpose_utils.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 7f18eac98ec52..17cab8367cf35 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index a6dd8c821d8ab..292514d316309 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index ecfda351e476a..e84f1a2e0b4ae 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: 2024-11-19 +date: 2024-11-21 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 87d01260b4357..bb39af52216ac 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: 2024-11-19 +date: 2024-11-21 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 6b26b2ad9952f..70b2b5887a308 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: 2024-11-19 +date: 2024-11-21 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.devdocs.json b/api_docs/kbn_ui_shared_deps_src.devdocs.json index 2a61ae29701c1..c47aa3ad72002 100644 --- a/api_docs/kbn_ui_shared_deps_src.devdocs.json +++ b/api_docs/kbn_ui_shared_deps_src.devdocs.json @@ -454,6 +454,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/ui-shared-deps-src", + "id": "def-common.externals.elasticeuithemeborealis", + "type": "string", + "tags": [], + "label": "'@elastic/eui-theme-borealis'", + "description": [], + "path": "packages/kbn-ui-shared-deps-src/src/definitions.js", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/ui-shared-deps-src", "id": "def-common.externals.hellopangeadnd", diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index c9249e50d8971..4c5a108267c8c 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 60 | 0 | 51 | 0 | +| 61 | 0 | 52 | 0 | ## Common diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index c9a665af3aacf..7f8dce491f339 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 6e92450416f2c..a0105cf4335ef 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index e73502404b937..8f016b1b426c2 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 679c8a1a627bf..ec1f9eab9b5cc 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 69b103c013ea3..f0682a3576797 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index 743ab3d4ff54a..a4ef48f8bd72a 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 08e527d88a14c..4be5b4e8e7218 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index c60ec0e607d48..214a6e0891802 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: 2024-11-19 +date: 2024-11-21 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 ae809e17f6738..afac65072e3d6 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: 2024-11-19 +date: 2024-11-21 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 fd12297b5b8c9..e66e0200d8f42 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: 2024-11-19 +date: 2024-11-21 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 3d49b2cf72612..1d6a170a37a93 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.devdocs.json b/api_docs/kbn_visualization_ui_components.devdocs.json index 832b2a1f2b0f9..c89a8276981bb 100644 --- a/api_docs/kbn_visualization_ui_components.devdocs.json +++ b/api_docs/kbn_visualization_ui_components.devdocs.json @@ -224,7 +224,7 @@ "label": "DimensionTrigger", "description": [], "signature": [ - "({ id, label, color, dataTestSubj, }: { label: React.ReactNode; id?: string | undefined; color?: \"default\" | \"warning\" | \"success\" | \"subdued\" | \"accent\" | \"danger\" | \"ghost\" | ", + "({ id, label, color, dataTestSubj, }: { label: React.ReactNode; id?: string | undefined; color?: \"default\" | \"warning\" | \"success\" | \"subdued\" | \"accent\" | \"accentSecondary\" | \"danger\" | \"ghost\" | ", "Property", ".Color | undefined; dataTestSubj?: string | undefined; }) => React.JSX.Element" ], @@ -279,7 +279,7 @@ "label": "color", "description": [], "signature": [ - "\"default\" | \"warning\" | \"success\" | \"subdued\" | \"accent\" | \"danger\" | \"ghost\" | ", + "\"default\" | \"warning\" | \"success\" | \"subdued\" | \"accent\" | \"accentSecondary\" | \"danger\" | \"ghost\" | ", "Property", ".Color | undefined" ], @@ -315,7 +315,7 @@ "label": "DragDropBuckets", "description": [], "signature": [ - "({\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}: { items: T[]; droppableId: string; children: React.ReactElement>[]; onDragStart?: (() => void) | undefined; onDragEnd?: ((items: T[]) => void) | undefined; bgColor?: \"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined; }) => React.JSX.Element" + "({\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}: { items: T[]; droppableId: string; children: React.ReactElement>[]; onDragStart?: (() => void) | undefined; onDragEnd?: ((items: T[]) => void) | undefined; bgColor?: \"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | \"transparent\" | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/buckets.tsx", "deprecated": false, @@ -427,7 +427,7 @@ "label": "bgColor", "description": [], "signature": [ - "\"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined" + "\"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"accentSecondary\" | \"danger\" | \"transparent\" | undefined" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/buckets.tsx", "deprecated": false, diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 0710e42dc8eba..57b1c5e34ba5b 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 5f8fa23f162c4..c4464a3c18466 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 1aaae7295b988..58c5c776ed7c7 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 6aa5f611d5ce0..a93f8f30179f0 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod.mdx b/api_docs/kbn_zod.mdx index a53a340bc5e8e..4a69c28e05a1e 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 5c179412886ef..066fa4ceb849a 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index fefc3fbc8e142..f1c1b3c76a574 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: 2024-11-19 +date: 2024-11-21 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 bf766ea8f113f..f74aab026fe94 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: 2024-11-19 +date: 2024-11-21 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 f2caa5e23d7b3..5dc7829a3eb36 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: 2024-11-19 +date: 2024-11-21 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 a9db4da2dc551..cee4bdd78e02e 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: 2024-11-19 +date: 2024-11-21 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 373bbe2f38835..b0eb9b67d6a01 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: 2024-11-19 +date: 2024-11-21 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 384de74cedc5c..8a2d0ac7e6ba0 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: 2024-11-19 +date: 2024-11-21 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 d7749a9229353..389d94a01d448 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: 2024-11-19 +date: 2024-11-21 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 5344bf70f5584..84f2a4b3fbc2a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 311c805a8d2ed..5eb042cf54473 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 08c95634e190a..5102bee3fc1df 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/llm_tasks.devdocs.json b/api_docs/llm_tasks.devdocs.json new file mode 100644 index 0000000000000..be33e1e8cbf53 --- /dev/null +++ b/api_docs/llm_tasks.devdocs.json @@ -0,0 +1,117 @@ +{ + "id": "llmTasks", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "llmTasks", + "id": "def-server.LlmTasksPluginSetup", + "type": "Interface", + "tags": [], + "label": "LlmTasksPluginSetup", + "description": [ + "\nDescribes public llmTasks plugin contract returned at the `setup` stage." + ], + "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "llmTasks", + "id": "def-server.LlmTasksPluginStart", + "type": "Interface", + "tags": [], + "label": "LlmTasksPluginStart", + "description": [ + "\nDescribes public llmTasks plugin contract returned at the `start` stage." + ], + "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "llmTasks", + "id": "def-server.LlmTasksPluginStart.retrieveDocumentationAvailable", + "type": "Function", + "tags": [], + "label": "retrieveDocumentationAvailable", + "description": [ + "\nChecks if all prerequisites to use the `retrieveDocumentation` task\nare respected. Can be used to check if the task can be registered\nas LLM tool for example." + ], + "signature": [ + "() => Promise" + ], + "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "llmTasks", + "id": "def-server.LlmTasksPluginStart.retrieveDocumentation", + "type": "Function", + "tags": [ + "see" + ], + "label": "retrieveDocumentation", + "description": [ + "\nPerform the `retrieveDocumentation` task.\n" + ], + "signature": [ + "(options: ", + "RetrieveDocumentationParams", + ") => Promise<", + "RetrieveDocumentationResult", + ">" + ], + "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "llmTasks", + "id": "def-server.LlmTasksPluginStart.retrieveDocumentation.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "RetrieveDocumentationParams" + ], + "path": "x-pack/plugins/ai_infra/llm_tasks/server/tasks/retrieve_documentation/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/llm_tasks.mdx b/api_docs/llm_tasks.mdx new file mode 100644 index 0000000000000..56ef0d197cff0 --- /dev/null +++ b/api_docs/llm_tasks.mdx @@ -0,0 +1,33 @@ +--- +#### +#### 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: kibLlmTasksPluginApi +slug: /kibana-dev-docs/api/llmTasks +title: "llmTasks" +image: https://source.unsplash.com/400x175/?github +description: API docs for the llmTasks plugin +date: 2024-11-21 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'llmTasks'] +--- +import llmTasksObj from './llm_tasks.devdocs.json'; + + + +Contact [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 5 | 0 | 1 | 2 | + +## Server + +### Setup + + +### Start + + diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 78b3a7e9b4bc5..14223d95ab138 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index af8344bcb022e..21e796a93792a 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 7894519385f1e..8f930c9ed031b 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 158469eae5cd5..95bb39e62a21d 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: 2024-11-19 +date: 2024-11-21 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 8a2518435d53d..86606b256483f 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: 2024-11-19 +date: 2024-11-21 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 fde7bdc426948..80633263acd5a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 5a252eaae4b4d..6d874c2cc560f 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index ea44e1ec9a966..6832946f87db3 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index f944972b77892..1bf96889378f4 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 7ae60fd1f5356..c35d40a8df5e0 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: 2024-11-19 +date: 2024-11-21 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 5b62e6e0d1283..d0bb1e9401f42 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.devdocs.json b/api_docs/navigation.devdocs.json index 9e31f4d2ddd76..be99b3dfc8165 100644 --- a/api_docs/navigation.devdocs.json +++ b/api_docs/navigation.devdocs.json @@ -554,7 +554,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & LabelAsString) | (", "CommonProps", @@ -570,7 +570,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & ", "DisambiguateSet", @@ -590,7 +590,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & LabelAsString) | (", "CommonProps", @@ -608,7 +608,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & ", "DisambiguateSet", @@ -628,7 +628,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & ", "DisambiguateSet", @@ -648,7 +648,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & LabelAsString) | (", "CommonProps", @@ -666,7 +666,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & ", "DisambiguateSet", @@ -686,7 +686,7 @@ "ToolTipPositions", " | undefined; anchorProps?: (", "CommonProps", - " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", + " & React.HTMLAttributes) | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"accentSecondary\" | \"hollow\" | undefined; size?: \"m\" | \"s\" | undefined; alignment?: \"middle\" | \"baseline\" | undefined; } & ", "DisambiguateSet", " & ", "DisambiguateSet", diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 496072f43a492..a37c83a3cf90c 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: 2024-11-19 +date: 2024-11-21 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 c7f9280661b62..d39208b14056b 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 119862d079f69..1617974265fff 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 605975c60b42b..7512916ce9b63 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 2f0e88abcdded..7ff6ef019cc98 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -14233,13 +14233,31 @@ "parentPluginId": "observability", "id": "def-common.casesFeatureId", "type": "string", - "tags": [], + "tags": [ + "deprecated" + ], "label": "casesFeatureId", "description": [], "signature": [ "\"observabilityCases\"" ], "path": "x-pack/plugins/observability_solution/observability/common/index.ts", + "deprecated": true, + "trackAdoption": false, + "references": [], + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-common.casesFeatureIdV2", + "type": "string", + "tags": [], + "label": "casesFeatureIdV2", + "description": [], + "signature": [ + "\"observabilityCasesV2\"" + ], + "path": "x-pack/plugins/observability_solution/observability/common/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index f728ea4fa7e9b..1ea3ce96b8b32 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 694 | 2 | 686 | 23 | +| 695 | 2 | 687 | 23 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index d9cce36dffe60..a0dbc9da88b8a 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 3536df0a49b49..ab2fff2e24a51 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index d4567385c8703..e2f06fcb63ff8 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 4afb5190018cf..5f803916afb3d 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 306031fa78045..fa1e551dd424d 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index 972e399f0af9f..24d7546318454 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -340,7 +340,7 @@ "label": "allCasesPermissions", "description": [], "signature": [ - "() => { all: boolean; create: boolean; read: boolean; update: boolean; delete: boolean; push: boolean; connectors: boolean; settings: boolean; }" + "() => { all: boolean; create: boolean; read: boolean; update: boolean; delete: boolean; push: boolean; connectors: boolean; settings: boolean; createComment: boolean; reopenCase: boolean; }" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/utils/cases_permissions.ts", "deprecated": false, @@ -1157,7 +1157,7 @@ "label": "noCasesPermissions", "description": [], "signature": [ - "() => { all: boolean; create: boolean; read: boolean; update: boolean; delete: boolean; push: boolean; connectors: boolean; settings: boolean; }" + "() => { all: boolean; create: boolean; read: boolean; update: boolean; delete: boolean; push: boolean; connectors: boolean; settings: boolean; createComment: boolean; reopenCase: boolean; }" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/utils/cases_permissions.ts", "deprecated": false, @@ -3772,7 +3772,7 @@ "label": "casesFeatureId", "description": [], "signature": [ - "\"observabilityCases\"" + "\"observabilityCasesV2\"" ], "path": "x-pack/plugins/observability_solution/observability_shared/common/index.ts", "deprecated": false, @@ -6934,7 +6934,7 @@ "label": "casesFeatureId", "description": [], "signature": [ - "\"observabilityCases\"" + "\"observabilityCasesV2\"" ], "path": "x-pack/plugins/observability_solution/observability_shared/common/index.ts", "deprecated": false, diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 8dd043f350144..e221d5a371f97 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 46cd632977208..aa424d1adefa8 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index f4bccf19eb2aa..4e7c6ea097ecd 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index b250a83cfafaa..95450e2f2c024 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: 2024-11-19 +date: 2024-11-21 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 | |--------------|----------|------------------------| -| 884 | 754 | 47 | +| 887 | 757 | 47 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 54380 | 247 | 40840 | 2011 | +| 54482 | 247 | 40923 | 2017 | ## Plugin Directory @@ -37,7 +37,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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. | 60 | 1 | 59 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 115 | 0 | 95 | 28 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 126 | 0 | 106 | 28 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 268 | 2 | 253 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 83 | 0 | 20 | 1 | | cloudChat | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Chat available on Elastic Cloud deployments for quicker assistance. | 0 | 0 | 0 | 0 | @@ -57,11 +57,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3209 | 31 | 2594 | 24 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 6 | 0 | 6 | 0 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 9 | 0 | 9 | 0 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 10 | 0 | 10 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 1224 | 0 | 443 | 4 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 1225 | 0 | 443 | 4 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 4 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of data set quality, where users can easily get an overview on the data sets they have. | 14 | 0 | 14 | 8 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 15 | 0 | 9 | 2 | @@ -99,11 +99,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2241 | 17 | 1769 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 270 | 0 | 110 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 292 | 5 | 253 | 3 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes services for async usage and search of fields metadata. | 44 | 0 | 44 | 9 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes services for async usage and search of fields metadata. | 45 | 0 | 45 | 9 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 89 | 0 | 89 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 3 | 0 | 3 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1427 | 5 | 1302 | 81 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1428 | 5 | 1303 | 81 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -111,11 +111,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | graph | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 0 | 0 | 0 | 0 | | grokdebugger | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Guided onboarding framework | 59 | 0 | 58 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 149 | 0 | 111 | 1 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 149 | 0 | 111 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 1 | 0 | 1 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 244 | 0 | 239 | 1 | -| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 33 | 0 | 28 | 4 | +| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 40 | 0 | 29 | 6 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 24 | 0 | 24 | 5 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 | @@ -136,6 +136,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 119 | 0 | 42 | 10 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | A dashboard panel for creating links to dashboards or external links. | 5 | 0 | 5 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 227 | 0 | 98 | 52 | +| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 5 | 0 | 1 | 2 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 15 | 0 | 13 | 7 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin provides a LogsExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption. | 120 | 4 | 120 | 23 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 314 | 0 | 285 | 34 | @@ -152,7 +153,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 694 | 2 | 686 | 23 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 695 | 2 | 687 | 23 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 296 | 1 | 294 | 27 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 4 | 0 | 4 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | @@ -163,6 +164,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems. | 11 | 0 | 11 | 4 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 159 | 2 | 129 | 10 | +| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 10 | 0 | 10 | 4 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 16 | 1 | 16 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 22 | 0 | 22 | 7 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 23 | 0 | 23 | 0 | @@ -170,7 +172,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 21 | 0 | 21 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 263 | 0 | 226 | 10 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 24 | 0 | 19 | 2 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 114 | 2 | 109 | 5 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 97 | 2 | 96 | 3 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 25 | 0 | 25 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 148 | 0 | 139 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 36 | 0 | 30 | 3 | @@ -514,7 +516,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 16 | 0 | 8 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 42 | 0 | 41 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 169 | 0 | 140 | 10 | -| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 400 | 0 | 369 | 0 | +| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 442 | 0 | 405 | 0 | | | [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entities) | - | 45 | 0 | 45 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 55 | 0 | 40 | 7 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | @@ -552,7 +554,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting](https://github.com/orgs/elastic/teams/security-threat-hunting) | - | 85 | 0 | 80 | 2 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 75 | 0 | 73 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 126 | 3 | 126 | 0 | -| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 124 | 0 | 41 | 1 | +| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 132 | 0 | 43 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 1 | 7 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | @@ -639,6 +641,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 92 | 0 | 80 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 224 | 0 | 188 | 6 | | | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 1 | 0 | 1 | 0 | +| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 31 | 0 | 31 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 168 | 0 | 55 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 | @@ -699,7 +702,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 54 | 0 | 49 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 29 | 0 | 23 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 2 | 0 | 0 | 0 | -| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 48 | 0 | 13 | 0 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 47 | 0 | 12 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 56 | 1 | 41 | 0 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 92 | 0 | 70 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 341 | 1 | 337 | 32 | @@ -792,7 +795,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 86 | 0 | 86 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 0 | 28 | 0 | -| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 60 | 0 | 51 | 0 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 61 | 0 | 52 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 8 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 184 | 0 | 108 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index fcdb0202034e3..665069d662f81 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index d31ed581bc93b..4626a728109cd 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/product_doc_base.devdocs.json b/api_docs/product_doc_base.devdocs.json new file mode 100644 index 0000000000000..c6d82bc6f79ef --- /dev/null +++ b/api_docs/product_doc_base.devdocs.json @@ -0,0 +1,185 @@ +{ + "id": "productDocBase", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "productDocBase", + "id": "def-public.ProductDocBasePluginSetup", + "type": "Interface", + "tags": [], + "label": "ProductDocBasePluginSetup", + "description": [], + "path": "x-pack/plugins/ai_infra/product_doc_base/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "productDocBase", + "id": "def-public.ProductDocBasePluginStart", + "type": "Interface", + "tags": [], + "label": "ProductDocBasePluginStart", + "description": [], + "path": "x-pack/plugins/ai_infra/product_doc_base/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "productDocBase", + "id": "def-public.ProductDocBasePluginStart.installation", + "type": "Object", + "tags": [], + "label": "installation", + "description": [], + "signature": [ + "InstallationAPI" + ], + "path": "x-pack/plugins/ai_infra/product_doc_base/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "productDocBase", + "id": "def-server.SearchApi", + "type": "Type", + "tags": [], + "label": "SearchApi", + "description": [], + "signature": [ + "(options: ", + "DocSearchOptions", + ") => Promise<", + "DocSearchResponse", + ">" + ], + "path": "x-pack/plugins/ai_infra/product_doc_base/server/services/search/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "productDocBase", + "id": "def-server.SearchApi.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "DocSearchOptions" + ], + "path": "x-pack/plugins/ai_infra/product_doc_base/server/services/search/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "objects": [], + "setup": { + "parentPluginId": "productDocBase", + "id": "def-server.ProductDocBaseSetupContract", + "type": "Interface", + "tags": [], + "label": "ProductDocBaseSetupContract", + "description": [], + "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "productDocBase", + "id": "def-server.ProductDocBaseStartContract", + "type": "Interface", + "tags": [], + "label": "ProductDocBaseStartContract", + "description": [], + "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "productDocBase", + "id": "def-server.ProductDocBaseStartContract.search", + "type": "Function", + "tags": [], + "label": "search", + "description": [], + "signature": [ + "(options: ", + "DocSearchOptions", + ") => Promise<", + "DocSearchResponse", + ">" + ], + "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "productDocBase", + "id": "def-server.ProductDocBaseStartContract.search.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "DocSearchOptions" + ], + "path": "x-pack/plugins/ai_infra/product_doc_base/server/services/search/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "productDocBase", + "id": "def-server.ProductDocBaseStartContract.management", + "type": "Object", + "tags": [], + "label": "management", + "description": [], + "signature": [ + "DocumentationManagerAPI" + ], + "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/product_doc_base.mdx b/api_docs/product_doc_base.mdx new file mode 100644 index 0000000000000..0ea4e5a08aec0 --- /dev/null +++ b/api_docs/product_doc_base.mdx @@ -0,0 +1,44 @@ +--- +#### +#### 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: kibProductDocBasePluginApi +slug: /kibana-dev-docs/api/productDocBase +title: "productDocBase" +image: https://source.unsplash.com/400x175/?github +description: API docs for the productDocBase plugin +date: 2024-11-21 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'productDocBase'] +--- +import productDocBaseObj from './product_doc_base.devdocs.json'; + + + +Contact [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 10 | 0 | 10 | 4 | + +## Client + +### Setup + + +### Start + + +## Server + +### Setup + + +### Start + + +### Consts, variables and types + + diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 182321a4503db..35cb99c2e0f58 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index fe9da1d9da48c..d5c042cf4145d 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 85dd281521417..21b14d908e920 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: 2024-11-19 +date: 2024-11-21 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 db7489c8e0f67..024619d7709ec 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: 2024-11-19 +date: 2024-11-21 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 82eb5d37a29f3..e8c682d169833 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: 2024-11-19 +date: 2024-11-21 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 7472749738569..16ed7cc70c215 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: 2024-11-19 +date: 2024-11-21 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 4122d9f383e73..befdc463c64b2 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.devdocs.json b/api_docs/saved_objects.devdocs.json index 340a56e3620f2..79f331186c699 100644 --- a/api_docs/saved_objects.devdocs.json +++ b/api_docs/saved_objects.devdocs.json @@ -227,139 +227,6 @@ } ], "functions": [ - { - "parentPluginId": "savedObjects", - "id": "def-public.checkForDuplicateTitle", - "type": "Function", - "tags": [], - "label": "checkForDuplicateTitle", - "description": [ - "\ncheck for an existing SavedObject with the same title in ES\nreturns Promise when it's no duplicate, or the modal displaying the warning\nthat's there's a duplicate is confirmed, else it returns a rejected Promise" - ], - "signature": [ - "(savedObject: Pick<", - { - "pluginId": "savedObjects", - "scope": "public", - "docId": "kibSavedObjectsPluginApi", - "section": "def-public.SavedObject", - "text": "SavedObject" - }, - "<", - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttributes", - "text": "SavedObjectAttributes" - }, - ">, \"id\" | \"title\" | \"getDisplayName\" | \"lastSavedTitle\" | \"copyOnSave\" | \"getEsType\">, isTitleDuplicateConfirmed: boolean, onTitleDuplicate: (() => void) | undefined, services: Pick<", - "SavedObjectKibanaServices", - ", \"overlays\" | \"savedObjectsClient\">, startServices: ", - "StartServices", - ") => Promise" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjects", - "id": "def-public.checkForDuplicateTitle.$1", - "type": "Object", - "tags": [], - "label": "savedObject", - "description": [], - "signature": [ - "Pick<", - { - "pluginId": "savedObjects", - "scope": "public", - "docId": "kibSavedObjectsPluginApi", - "section": "def-public.SavedObject", - "text": "SavedObject" - }, - "<", - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttributes", - "text": "SavedObjectAttributes" - }, - ">, \"id\" | \"title\" | \"getDisplayName\" | \"lastSavedTitle\" | \"copyOnSave\" | \"getEsType\">" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.checkForDuplicateTitle.$2", - "type": "boolean", - "tags": [], - "label": "isTitleDuplicateConfirmed", - "description": [], - "signature": [ - "boolean" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.checkForDuplicateTitle.$3", - "type": "Function", - "tags": [], - "label": "onTitleDuplicate", - "description": [], - "signature": [ - "(() => void) | undefined" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.checkForDuplicateTitle.$4", - "type": "Object", - "tags": [], - "label": "services", - "description": [], - "signature": [ - "Pick<", - "SavedObjectKibanaServices", - ", \"overlays\" | \"savedObjectsClient\">" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.checkForDuplicateTitle.$5", - "type": "Object", - "tags": [], - "label": "startServices", - "description": [], - "signature": [ - "StartServices" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "savedObjects", "id": "def-public.isErrorNonFatal", @@ -451,245 +318,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation", - "type": "Function", - "tags": [ - "resolved" - ], - "label": "saveWithConfirmation", - "description": [ - "\nAttempts to create the current object using the serialized source. If an object already\nexists, a warning message requests an overwrite confirmation." - ], - "signature": [ - "(source: ", - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttributes", - "text": "SavedObjectAttributes" - }, - ", savedObject: { getEsType(): string; title: string; displayName: string; }, options: ", - { - "pluginId": "@kbn/core-saved-objects-api-browser", - "scope": "public", - "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", - "section": "def-public.SavedObjectsCreateOptions", - "text": "SavedObjectsCreateOptions" - }, - ", services: { savedObjectsClient: ", - { - "pluginId": "@kbn/core-saved-objects-api-browser", - "scope": "public", - "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", - "section": "def-public.SavedObjectsClientContract", - "text": "SavedObjectsClientContract" - }, - "; overlays: ", - { - "pluginId": "@kbn/core-overlays-browser", - "scope": "public", - "docId": "kibKbnCoreOverlaysBrowserPluginApi", - "section": "def-public.OverlayStart", - "text": "OverlayStart" - }, - "; }, startServices: ", - "StartServices", - ") => Promise<", - { - "pluginId": "@kbn/core-saved-objects-api-browser", - "scope": "public", - "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", - "section": "def-public.SimpleSavedObject", - "text": "SimpleSavedObject" - }, - "<", - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttributes", - "text": "SavedObjectAttributes" - }, - ">>" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$1", - "type": "Object", - "tags": [], - "label": "source", - "description": [ - "- serialized version of this object what will be indexed into elasticsearch." - ], - "signature": [ - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttributes", - "text": "SavedObjectAttributes" - } - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$2", - "type": "Object", - "tags": [], - "label": "savedObject", - "description": [], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$2.getEsType", - "type": "Function", - "tags": [], - "label": "getEsType", - "description": [], - "signature": [ - "() => string" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$2.title", - "type": "string", - "tags": [], - "label": "title", - "description": [], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$2.displayName", - "type": "string", - "tags": [], - "label": "displayName", - "description": [], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$3", - "type": "Object", - "tags": [], - "label": "options", - "description": [ - "- options to pass to the saved object create method" - ], - "signature": [ - { - "pluginId": "@kbn/core-saved-objects-api-browser", - "scope": "public", - "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", - "section": "def-public.SavedObjectsCreateOptions", - "text": "SavedObjectsCreateOptions" - } - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$4", - "type": "Object", - "tags": [], - "label": "services", - "description": [], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$4.savedObjectsClient", - "type": "Object", - "tags": [], - "label": "savedObjectsClient", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-saved-objects-api-browser", - "scope": "public", - "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", - "section": "def-public.SavedObjectsClientContract", - "text": "SavedObjectsClientContract" - } - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$4.overlays", - "type": "Object", - "tags": [], - "label": "overlays", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-overlays-browser", - "scope": "public", - "docId": "kibKbnCoreOverlaysBrowserPluginApi", - "section": "def-public.OverlayStart", - "text": "OverlayStart" - } - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "savedObjects", - "id": "def-public.saveWithConfirmation.$5", - "type": "Object", - "tags": [], - "label": "startServices", - "description": [], - "signature": [ - "StartServices" - ], - "path": "src/plugins/saved_objects/public/saved_object/helpers/save_with_confirmation.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [ - "- A promise that is resolved with the objects id if the object is\nsuccessfully indexed. If the overwrite confirmation was rejected, an error is thrown with\na confirmRejected = true parameter so that case can be handled differently than\na create or index error." - ], - "initialIsOpen": false - }, { "parentPluginId": "savedObjects", "id": "def-public.showSaveModal", diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 1de39b0c710aa..9002722e62888 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.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 | |-------------------|-----------|------------------------|-----------------| -| 114 | 2 | 109 | 5 | +| 97 | 2 | 96 | 3 | ## Client diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 8cf1ce9957e37..f9b1b25650028 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: 2024-11-19 +date: 2024-11-21 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 925106bd8d08c..c8fc1d33b75cb 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: 2024-11-19 +date: 2024-11-21 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 ca588d2b735f8..d73a0d968a5ea 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: 2024-11-19 +date: 2024-11-21 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 74da07b00bf00..f444631d9fe6f 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: 2024-11-19 +date: 2024-11-21 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 8e33b2a2c1702..63135706ee86d 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: 2024-11-19 +date: 2024-11-21 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 461ebbc12aa3b..a52873bb72c92 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: 2024-11-19 +date: 2024-11-21 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 e80ec2240e25d..d091f2a7a4024 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index 8dd97cd61ed81..ea42113c9880c 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 6cb52a719810d..af36c43ddc61b 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 399d01272324e..2b86f4d0a05f4 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.devdocs.json b/api_docs/search_indices.devdocs.json index a50dd817dbf4d..8b486873528f8 100644 --- a/api_docs/search_indices.devdocs.json +++ b/api_docs/search_indices.devdocs.json @@ -85,7 +85,7 @@ "label": "startAppId", "description": [], "signature": [ - "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"profiling\" | \"metrics\" | \"management\" | \"apm\" | \"synthetics\" | \"ux\" | \"canvas\" | \"logs\" | \"dashboards\" | \"slo\" | \"observabilityAIAssistant\" | \"home\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:logPatternAnalysis\" | \"ml:logRateAnalysis\" | \"ml:singleMetricViewer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"ml:suppliedConfigurations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:cross_cluster_replication\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"searchInferenceEndpoints\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"searchInferenceEndpoints:inferenceEndpoints\" | \"elasticsearchStart\" | \"elasticsearchIndices\" | \"enterpriseSearchElasticsearch\" | \"enterpriseSearchVectorSearch\" | \"enterpriseSearchSemanticSearch\" | \"enterpriseSearchAISearch\" | \"elasticsearchIndices:createIndex\" | \"observability-logs-explorer\" | \"last-used-logs-viewer\" | \"observabilityOnboarding\" | \"inventory\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:services\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:functions\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"inventory:datastreams\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:notes\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:entity_analytics-entity_store_management\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:agents\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\"" + "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"profiling\" | \"metrics\" | \"management\" | \"apm\" | \"synthetics\" | \"ux\" | \"canvas\" | \"logs\" | \"dashboards\" | \"slo\" | \"observabilityAIAssistant\" | \"home\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:logPatternAnalysis\" | \"ml:logRateAnalysis\" | \"ml:singleMetricViewer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"ml:suppliedConfigurations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:cross_cluster_replication\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"searchInferenceEndpoints\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"serverlessWebCrawlers\" | \"searchPlayground\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"searchInferenceEndpoints:inferenceEndpoints\" | \"elasticsearchStart\" | \"elasticsearchIndices\" | \"enterpriseSearchElasticsearch\" | \"enterpriseSearchVectorSearch\" | \"enterpriseSearchSemanticSearch\" | \"enterpriseSearchAISearch\" | \"elasticsearchIndices:createIndex\" | \"observability-logs-explorer\" | \"last-used-logs-viewer\" | \"observabilityOnboarding\" | \"inventory\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:services\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:functions\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"inventory:datastreams\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:notes\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:entity_analytics-entity_store_management\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:agents\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\"" ], "path": "x-pack/plugins/search_indices/public/types.ts", "deprecated": false, diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index df245f5f03571..bfb1be750ed27 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 157d2776a67e7..2c5f9be6d516e 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index ddb5240a9c75c..17b4ebc5d7c38 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 6b8495406fab3..0f9569ece6c47 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index 06d005330608b..9d1c4fbc5f7a4 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -5832,7 +5832,7 @@ "label": "CasesSupportedOperations", "description": [], "signature": [ - "\"getTags\" | \"pushCase\" | \"createCase\" | \"createComment\" | \"getCase\" | \"getComment\" | \"getReporters\" | \"getUserActions\" | \"findConfigurations\" | \"updateCase\" | \"updateComment\" | \"deleteCase\" | \"deleteComment\" | \"createConfiguration\" | \"updateConfiguration\"" + "\"getTags\" | \"createComment\" | \"reopenCase\" | \"pushCase\" | \"createCase\" | \"getCase\" | \"getComment\" | \"getReporters\" | \"getUserActions\" | \"findConfigurations\" | \"updateCase\" | \"updateComment\" | \"deleteCase\" | \"deleteComment\" | \"createConfiguration\" | \"updateConfiguration\"" ], "path": "x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts", "deprecated": false, diff --git a/api_docs/security.mdx b/api_docs/security.mdx index f3ebd9cff5f9e..98e74151d2c5c 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index be3a215235f75..f62340cda6832 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -420,7 +420,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" + "\"assistantModelEvaluation\" | \"defendInsights\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -500,7 +500,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" + "\"assistantModelEvaluation\" | \"defendInsights\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1780,7 +1780,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3028,7 +3028,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3139,7 +3139,7 @@ "label": "CASES_FEATURE_ID", "description": [], "signature": [ - "\"securitySolutionCases\"" + "\"securitySolutionCasesV2\"" ], "path": "x-pack/plugins/security_solution/common/constants.ts", "deprecated": false, @@ -3201,7 +3201,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3267,7 +3267,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesDisabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly graphVisualizationInFlyoutEnabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; readonly siemMigrationsEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesDisabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly graphVisualizationInFlyoutEnabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; readonly siemMigrationsEnabled: false; readonly defendInsights: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index eabc79c042d67..ef3ed24aa5650 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 94fdf277f8368..7453a707f7ead 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index e70dcc4730fc3..fd04e2723620c 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index d2d0f195fa048..4e0e4747a7d12 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 6210a8772fd0e..c59f3944e647d 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 2d7e7a0e7d7c4..cabc797d4ecf3 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 8b40bb2dd322e..d790fe5f0b367 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: 2024-11-19 +date: 2024-11-21 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 2139cb04491bb..71d617e50d2a6 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index b22401ebe551a..f9afcc4d75e9a 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 46db8d0a9994e..2b3ae1dd8efa1 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: 2024-11-19 +date: 2024-11-21 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 1d7f1b0c7bfc6..8fff51a834507 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: 2024-11-19 +date: 2024-11-21 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 15d17a8701e2a..11e8fd244aa69 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: 2024-11-19 +date: 2024-11-21 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 a77013bb1792d..2e22fde60dc60 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/streams.mdx b/api_docs/streams.mdx index 51481a76fb2b0..f46c3dc108559 100644 --- a/api_docs/streams.mdx +++ b/api_docs/streams.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/streams title: "streams" image: https://source.unsplash.com/400x175/?github description: API docs for the streams plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'streams'] --- import streamsObj from './streams.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 7a13f204d27d5..3592eb3d99768 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: 2024-11-19 +date: 2024-11-21 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 bfb78a2f949e4..9dda7db62fce7 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: 2024-11-19 +date: 2024-11-21 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 5861a8251a767..8e2ed2e37ab17 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index b92670a8084b8..de520e776a0d6 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: 2024-11-19 +date: 2024-11-21 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 ed0ce98e5da82..b9504112c4082 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: 2024-11-19 +date: 2024-11-21 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 50635b3ce597b..bfc668f544402 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: 2024-11-19 +date: 2024-11-21 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 d1d34de64765d..1e3e5067625d5 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 2ab50bd744c93..27bb87dcc1619 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: 2024-11-19 +date: 2024-11-21 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 33176238a3d4c..fa21f3c784200 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: 2024-11-19 +date: 2024-11-21 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 2bd93d9aac558..e60be97daf17f 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index a44fb45c590f5..d0153f7ab1a20 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index ca05464f6756d..d20afbd886578 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: 2024-11-19 +date: 2024-11-21 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 18690587f94c9..b40b57b653542 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: 2024-11-19 +date: 2024-11-21 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 a3918a98aeaf0..31d331031e745 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 1f30689e4767a..cd769820dffd1 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 1da3998e7d737..c5bbdd7a08a75 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: 2024-11-19 +date: 2024-11-21 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 8b5f81cd130c9..84f59a769f77d 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: 2024-11-19 +date: 2024-11-21 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 d2c6eb2eac9fb..0b81b1e37ee3b 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: 2024-11-19 +date: 2024-11-21 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 28d6baa8e07b6..6473fc5b33b3c 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: 2024-11-19 +date: 2024-11-21 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 82630aad9287a..e24404aafee1e 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: 2024-11-19 +date: 2024-11-21 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 8ecee7156cd84..32f18b5f3a039 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: 2024-11-19 +date: 2024-11-21 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 2fed52ab7e710..ad2abc11bc255 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: 2024-11-19 +date: 2024-11-21 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 f9106d16c532f..a6be2f123dcc1 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: 2024-11-19 +date: 2024-11-21 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 599a402469c0f..6b491ece98cd6 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: 2024-11-19 +date: 2024-11-21 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 b87b3c9886a1f..ed3b3063b0f81 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: 2024-11-19 +date: 2024-11-21 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 8aaa38ef75b15..d13a56fcbe286 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: 2024-11-19 +date: 2024-11-21 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 f4cde283ff9d8..7e3e9cc4ea265 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: 2024-11-19 +date: 2024-11-21 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 55367e6537d98..7d1d44be5c6db 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: 2024-11-19 +date: 2024-11-21 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 c11feff9f4f74..3fb0e3cb7105a 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: 2024-11-19 +date: 2024-11-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/dev_docs/key_concepts/feature_privileges.mdx b/dev_docs/key_concepts/feature_privileges.mdx index 7666ca1e82399..87f650133be25 100644 --- a/dev_docs/key_concepts/feature_privileges.mdx +++ b/dev_docs/key_concepts/feature_privileges.mdx @@ -179,8 +179,10 @@ public setup(core: CoreSetup, deps: FeatureControlExampleDeps) { { path: '/internal/my_plugin/sensitive_action', validate: false, - options: { - tags: ['access:my_closed_example_api'], + security: { + authz: { + requiredPrivileges: ['my_closed_example_api'] + } }, }, async (context, request, response) => { @@ -193,8 +195,11 @@ public setup(core: CoreSetup, deps: FeatureControlExampleDeps) { ); } ``` + + For more information on the `security.authz` object and API authorization, please refer to our guide on + -Notice, we've added an `options.tags` property for the API route that returns sensitive information. This tag is then used in the privileges object as follow +Notice, we've added a `security.authz.requiredPrivileges` property for the API route that returns sensitive information. This added configuration is then used in the privileges object as follow ```ts { @@ -347,7 +352,6 @@ A deep dive into every option for the Kibana Feature configuration and what they } ``` - ### FeatureKibanaPrivileges Interface #### excludeFromBasePrivileges (optional) diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 85c5bcfbf1127..ea55777b595fc 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -10,7 +10,9 @@ Review important information about the {kib} 8.x releases. +* <> * <> +* <> * <> * <> * <> @@ -80,6 +82,27 @@ Review important information about the {kib} 8.x releases. include::upgrade-notes.asciidoc[] +[[release-notes-8.16.1]] +== {kib} 8.16.1 + +The 8.16.1 release includes the following bug fixes. + +[float] +[[fixes-v8.16.1]] +=== Bug fixes +Dashboards & Visualizations:: +* Fixes an issue preventing a custom panel title from being saved correctly ({kibana-pull}200548[#200548]). +Elastic Observability solution:: +* Changes the order of the errors shown on Infrastructure applications to be more relevant ({kibana-pull}200531[#200531]). +* Fixes the summary calculation for a calendar-aligned and occurrences-based SLO ({kibana-pull}199873[#199873]). +* Fixes the `kustomize` command ({kibana-pull}199758[#199758]). +Elastic Security solution:: +For the Elastic Security 8.16.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +Platform:: +* Fixes an issue with duplicate references to objects when copying saved objects to other spaces ({kibana-pull}200053[#200053]). +* Fixes button colors in the "Share data view to spaces" flyout ({kibana-pull}196004[#196004]). + + [[release-notes-8.16.0]] == {kib} 8.16.0 @@ -484,6 +507,27 @@ Management:: * Fixes the pagination of the source documents data grid in Transforms ({kibana-pull}196119[#196119]). * Fixes autocomplete suggestions after a comma in Console ({kibana-pull}189656[#189656]). +[[release-notes-8.15.5]] +== {kib} 8.15.5 + +The 8.15.5 release includes the following bug fixes. + +[float] +[[fixes-v8.15.5]] +=== Bug fixes +Canvas:: +* Fixes an issue with Canvas not rendering maps with queries or filters ({kibana-pull}199339[#199339]). +Discover:: +* Fixes an issue where the `has_es_data` check was causing {kib} to hang ({kibana-pull}200476[#200476]). +Elastic Observability solution:: +* Changes the order of the errors shown on Infrastructure applications to be more relevant ({kibana-pull}200531[#200531]). +* Fixes the summary calculation for a calendar-aligned and occurrences-based SLO ({kibana-pull}199873[#199873]). +Elastic Security solution:: +For the Elastic Security 8.15.5 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +Platform:: +* Fixes an issue with duplicate references to objects when copying saved objects to other spaces ({kibana-pull}200053[#200053]). +* Fixes button colors in the "Share data view to spaces" flyout ({kibana-pull}196004[#196004]). + [[release-notes-8.15.4]] == {kib} 8.15.4 diff --git a/docs/user/canvas.asciidoc b/docs/user/canvas.asciidoc index 21803b90034ad..e0ae6c0e6a818 100644 --- a/docs/user/canvas.asciidoc +++ b/docs/user/canvas.asciidoc @@ -5,6 +5,8 @@ [partintro] -- +*Note:* Canvas is only available for upgraded installations with existing workpads. + *Canvas* is a data visualization and presentation tool that allows you to pull live data from {es}, then combine the data with colors, images, text, and your imagination to create dynamic, multi-page, pixel-perfect displays. If you are a little bit creative, a little bit technical, and a whole lot curious, then *Canvas* is for you. diff --git a/docs/user/reporting/automating-report-generation.asciidoc b/docs/user/reporting/automating-report-generation.asciidoc index 9587674b59e61..b4334b7c7ea80 100644 --- a/docs/user/reporting/automating-report-generation.asciidoc +++ b/docs/user/reporting/automating-report-generation.asciidoc @@ -16,11 +16,9 @@ To create the POST URL for PDF reports: . Open the dashboard, visualization, or **Canvas** workpad you want to view as a report. -. From the toolbar, click *Share > PDF Reports*, then choose an option: +* If you are using *Dashboard* or *Visualize Library*, from the toolbar, click *Share > Export*, select the PDF option then click *Copy POST URL*. -* If you are using *Dashboard* or *Visulize Library*, click *Copy POST URL*. - -* If you are using *Canvas*, click *Advanced options > Copy POST URL*. +* If you are using *Canvas*, from the toolbar, click *Share > PDF Reports*, then click *Advanced options > Copy POST URL*. To create the POST URL for CSV reports: @@ -28,7 +26,7 @@ To create the POST URL for CSV reports: . Open the saved search you want to share. -. In the toolbar, click *Share > CSV Reports > Copy POST URL*. +. In the toolbar, click *Share > Export > Copy POST URL*. [float] [[use-watcher]] diff --git a/docs/user/security/fips-140-2.asciidoc b/docs/user/security/fips-140-2.asciidoc index 2b4b195f38b05..eada7bcc59cc7 100644 --- a/docs/user/security/fips-140-2.asciidoc +++ b/docs/user/security/fips-140-2.asciidoc @@ -29,7 +29,7 @@ For {kib}, adherence to FIPS 140-2 is ensured by: ==== Configuring {kib} for FIPS 140-2 -Apart from setting `xpack.security.experimental.fipsMode.enabled` to `true` in your {kib} config, a number of security related +Apart from setting `xpack.security.fipsMode.enabled` to `true` in your {kib} config, a number of security related settings need to be reviewed and configured in order to run {kib} successfully in a FIPS 140-2 compliant Node.js environment. @@ -56,8 +56,3 @@ As an example, avoid PKCS#12 specific settings such as: * `server.ssl.truststore.path` * `elasticsearch.ssl.keystore.path` * `elasticsearch.ssl.truststore.path` - -===== Limitations - -Configuring {kib} to run in FIPS mode is still considered to be experimental. Not all features are guaranteed to -function as expected. diff --git a/examples/feature_flags_example/public/application.tsx b/examples/feature_flags_example/public/application.tsx index eab558d9301bd..ecc8fc22faf1b 100644 --- a/examples/feature_flags_example/public/application.tsx +++ b/examples/feature_flags_example/public/application.tsx @@ -10,22 +10,19 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { AppMountParameters, CoreStart } from '@kbn/core/public'; -import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; -import { KibanaRootContextProvider } from '@kbn/react-kibana-context-root'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { FeatureFlagsExampleApp } from './components/app'; export const renderApp = (coreStart: CoreStart, { element }: AppMountParameters) => { const { notifications, http, featureFlags } = coreStart; ReactDOM.render( - - - - - , + + + , element ); diff --git a/examples/feature_flags_example/public/components/app.tsx b/examples/feature_flags_example/public/components/app.tsx index 97f850b5dd475..87579b0c93e3b 100644 --- a/examples/feature_flags_example/public/components/app.tsx +++ b/examples/feature_flags_example/public/components/app.tsx @@ -59,8 +59,7 @@ export const FeatureFlagsExampleApp = ({ featureFlags }: FeatureFlagsExampleAppD

Rendered together

`useObservable` causes a full re-render of the component, updating the{' '} - statically - evaluated flags as well. + statically evaluated flags as well.

diff --git a/examples/feature_flags_example/tsconfig.json b/examples/feature_flags_example/tsconfig.json index 77eb5d09ca85b..7f7a1e300b100 100644 --- a/examples/feature_flags_example/tsconfig.json +++ b/examples/feature_flags_example/tsconfig.json @@ -14,12 +14,11 @@ "exclude": ["target/**/*"], "kbn_references": [ "@kbn/core", - "@kbn/shared-ux-page-kibana-template", - "@kbn/react-kibana-context-root", "@kbn/core-feature-flags-server", "@kbn/core-plugins-server", "@kbn/config-schema", "@kbn/developer-examples-plugin", "@kbn/core-feature-flags-browser", + "@kbn/react-kibana-context-render", ] } diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index d30ac3c4552e2..9b446eacf7bb9 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -6355,18 +6355,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -7113,18 +7122,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -7361,18 +7379,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -8145,18 +8172,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -9190,18 +9226,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -9947,18 +9992,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -10195,18 +10249,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -10980,18 +11043,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -11890,6 +11962,42 @@ }, "type": "object" }, + "limits": { + "additionalProperties": false, + "properties": { + "go_max_procs": { + "type": "number" + } + }, + "type": "object" + }, + "logging": { + "additionalProperties": false, + "properties": { + "files": { + "additionalProperties": false, + "properties": { + "interval": { + "type": "string" + }, + "keepfiles": { + "type": "number" + }, + "rotateeverybytes": { + "type": "number" + } + }, + "type": "object" + }, + "level": { + "type": "string" + }, + "to_files": { + "type": "boolean" + } + }, + "type": "object" + }, "monitoring": { "additionalProperties": false, "properties": { diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index 4b56e3581c66f..7adb2e8140491 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -6355,18 +6355,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -7113,18 +7122,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -7361,18 +7379,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -8145,18 +8172,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -9190,18 +9226,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -9947,18 +9992,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -10195,18 +10249,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -10980,18 +11043,27 @@ "nullable": true }, "agent_download_timeout": { - "default": "2h", "nullable": true }, "agent_limits_go_max_procs": { "nullable": true }, + "agent_logging_files_interval": { + "nullable": true + }, + "agent_logging_files_keepfiles": { + "nullable": true + }, + "agent_logging_files_rotateeverybytes": { + "nullable": true + }, "agent_logging_level": { - "default": "info", "nullable": true }, "agent_logging_metrics_period": { - "default": "30s", + "nullable": true + }, + "agent_logging_to_files": { "nullable": true } }, @@ -11890,6 +11962,42 @@ }, "type": "object" }, + "limits": { + "additionalProperties": false, + "properties": { + "go_max_procs": { + "type": "number" + } + }, + "type": "object" + }, + "logging": { + "additionalProperties": false, + "properties": { + "files": { + "additionalProperties": false, + "properties": { + "interval": { + "type": "string" + }, + "keepfiles": { + "type": "number" + }, + "rotateeverybytes": { + "type": "number" + } + }, + "type": "object" + }, + "level": { + "type": "string" + }, + "to_files": { + "type": "boolean" + } + }, + "type": "object" + }, "monitoring": { "additionalProperties": false, "properties": { diff --git a/oas_docs/kibana.info.serverless.yaml b/oas_docs/kibana.info.serverless.yaml index b2f451373e7a1..b56ec070027aa 100644 --- a/oas_docs/kibana.info.serverless.yaml +++ b/oas_docs/kibana.info.serverless.yaml @@ -2,10 +2,6 @@ openapi: 3.0.3 info: title: Kibana Serverless APIs description: | - **Technical preview** - This functionality is in technical preview and may be changed or removed in a future release. - Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. - The Kibana REST APIs for Elastic serverless enable you to manage resources such as connectors, data views, and saved objects. The API calls are stateless. Each request that you make happens in isolation from other calls diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 4b35e4d9c78fc..0581d7a850c68 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -3,10 +3,6 @@ info: contact: name: Kibana Team description: | - **Technical preview** - This functionality is in technical preview and may be changed or removed in a future release. - Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. - The Kibana REST APIs for Elastic serverless enable you to manage resources such as connectors, data views, and saved objects. The API calls are stateless. Each request that you make happens in isolation from other calls @@ -9522,15 +9518,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -10047,15 +10048,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -10221,15 +10227,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -10765,15 +10776,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -11289,15 +11305,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -11813,15 +11834,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -11987,15 +12013,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -12531,15 +12562,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -13153,6 +13189,30 @@ paths: required: - enabled type: object + limits: + additionalProperties: false + type: object + properties: + go_max_procs: + type: number + logging: + additionalProperties: false + type: object + properties: + files: + additionalProperties: false + type: object + properties: + interval: + type: string + keepfiles: + type: number + rotateeverybytes: + type: number + level: + type: string + to_files: + type: boolean monitoring: additionalProperties: false type: object diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 94e987510c649..322160b6231cc 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -12378,15 +12378,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -12902,15 +12907,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -13076,15 +13086,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -13619,15 +13634,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -14142,15 +14162,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -14665,15 +14690,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -14839,15 +14869,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -15382,15 +15417,20 @@ paths: agent_download_target_directory: nullable: true agent_download_timeout: - default: 2h nullable: true agent_limits_go_max_procs: nullable: true + agent_logging_files_interval: + nullable: true + agent_logging_files_keepfiles: + nullable: true + agent_logging_files_rotateeverybytes: + nullable: true agent_logging_level: - default: info nullable: true agent_logging_metrics_period: - default: 30s + nullable: true + agent_logging_to_files: nullable: true agent_features: items: @@ -16002,6 +16042,30 @@ paths: required: - enabled type: object + limits: + additionalProperties: false + type: object + properties: + go_max_procs: + type: number + logging: + additionalProperties: false + type: object + properties: + files: + additionalProperties: false + type: object + properties: + interval: + type: string + keepfiles: + type: number + rotateeverybytes: + type: number + level: + type: string + to_files: + type: boolean monitoring: additionalProperties: false type: object diff --git a/package.json b/package.json index eed5b3a9b61cb..97b697d4bedf4 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,6 @@ "build": "node scripts/build --all-platforms", "build:apidocs": "node scripts/build_api_docs", "checkLicenses": "node scripts/check_licenses --dev", - "cover:functional:merge": "nyc report --temp-dir target/kibana-coverage/functional --report-dir target/coverage/report/functional --reporter=json-summary", - "cover:report": "nyc report --temp-dir target/kibana-coverage/functional --report-dir target/coverage/report --reporter=lcov && open ./target/coverage/report/lcov-report/index.html", "debug": "node --nolazy --inspect scripts/kibana --dev", "debug-break": "node --nolazy --inspect-brk scripts/kibana --dev", "dev-docs": "scripts/dev_docs.sh", @@ -104,6 +102,7 @@ "@appland/sql-parser": "^1.5.1", "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/util": "^5.2.0", + "@aws-sdk/client-bedrock-runtime": "^3.687.0", "@babel/runtime": "^7.24.7", "@dagrejs/dagre": "^1.1.4", "@dnd-kit/core": "^6.1.0", @@ -125,7 +124,7 @@ "@elastic/numeral": "^2.5.1", "@elastic/react-search-ui": "^1.20.2", "@elastic/react-search-ui-views": "^1.20.2", - "@elastic/request-converter": "^8.15.4", + "@elastic/request-converter": "^8.16.1", "@elastic/request-crypto": "^2.0.3", "@elastic/search-ui": "^1.20.2", "@elastic/search-ui-app-search-connector": "^1.20.2", @@ -1019,7 +1018,8 @@ "@kbn/xstate-utils": "link:packages/kbn-xstate-utils", "@kbn/zod": "link:packages/kbn-zod", "@kbn/zod-helpers": "link:packages/kbn-zod-helpers", - "@langchain/community": "0.3.11", + "@langchain/aws": "^0.1.2", + "@langchain/community": "0.3.14", "@langchain/core": "^0.3.16", "@langchain/google-common": "^0.1.1", "@langchain/google-genai": "^0.1.2", @@ -1054,7 +1054,9 @@ "@slack/webhook": "^7.0.1", "@smithy/eventstream-codec": "^3.1.1", "@smithy/eventstream-serde-node": "^3.0.3", - "@smithy/protocol-http": "^4.0.2", + "@smithy/middleware-stack": "^3.0.10", + "@smithy/node-http-handler": "^3.3.1", + "@smithy/protocol-http": "^4.1.7", "@smithy/signature-v4": "^3.1.1", "@smithy/types": "^3.2.0", "@smithy/util-utf8": "^3.0.0", @@ -1342,8 +1344,6 @@ "@emotion/babel-preset-css-prop": "^11.11.0", "@emotion/jest": "^11.11.0", "@frsource/cypress-plugin-visual-regression-diff": "^3.3.10", - "@istanbuljs/nyc-config-typescript": "^1.0.2", - "@istanbuljs/schema": "^0.1.2", "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/transform": "^29.6.1", @@ -1712,7 +1712,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-ban": "^1.6.0", "eslint-plugin-cypress": "^2.15.1", - "eslint-plugin-depend": "^0.11.0", + "eslint-plugin-depend": "^0.12.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-formatjs": "^4.12.2", "eslint-plugin-import": "^2.28.0", @@ -1828,7 +1828,7 @@ "swagger-ui-express": "^5.0.1", "table": "^6.8.1", "tape": "^5.0.1", - "terser": "^5.34.0", + "terser": "^5.36.0", "terser-webpack-plugin": "^4.2.3", "tough-cookie": "^5.0.0", "trace": "^3.2.0", diff --git a/packages/core/application/core-application-common/src/default_app_categories.ts b/packages/core/application/core-application-common/src/default_app_categories.ts index da76c18e62cec..f9bb68199bc87 100644 --- a/packages/core/application/core-application-common/src/default_app_categories.ts +++ b/packages/core/application/core-application-common/src/default_app_categories.ts @@ -23,7 +23,7 @@ export const DEFAULT_APP_CATEGORIES: Record = Object.freeze enterpriseSearch: { id: 'enterpriseSearch', label: i18n.translate('core.ui.searchNavList.label', { - defaultMessage: 'Search', + defaultMessage: 'Elasticsearch', }), order: 2000, euiIconType: 'logoEnterpriseSearch', diff --git a/packages/core/security/core-security-server-internal/src/fips/fips.test.ts b/packages/core/security/core-security-server-internal/src/fips/fips.test.ts index ff610493e1322..724f6accd5204 100644 --- a/packages/core/security/core-security-server-internal/src/fips/fips.test.ts +++ b/packages/core/security/core-security-server-internal/src/fips/fips.test.ts @@ -25,26 +25,26 @@ import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; describe('fips', () => { let securityConfig: SecurityServiceConfigType; describe('#isFipsEnabled', () => { - it('should return `true` if config.experimental.fipsMode.enabled is `true`', () => { - securityConfig = { experimental: { fipsMode: { enabled: true } } }; + it('should return `true` if config.fipsMode.enabled is `true`', () => { + securityConfig = { fipsMode: { enabled: true } }; expect(isFipsEnabled(securityConfig)).toBe(true); }); - it('should return `false` if config.experimental.fipsMode.enabled is `false`', () => { - securityConfig = { experimental: { fipsMode: { enabled: false } } }; + it('should return `false` if config.fipsMode.enabled is `false`', () => { + securityConfig = { fipsMode: { enabled: false } }; expect(isFipsEnabled(securityConfig)).toBe(false); }); - it('should return `false` if config.experimental.fipsMode.enabled is `undefined`', () => { + it('should return `false` if config.fipsMode.enabled is `undefined`', () => { expect(isFipsEnabled(securityConfig)).toBe(false); }); }); describe('checkFipsConfig', () => { - it('should log an error message if FIPS mode is misconfigured - xpack.security.experimental.fipsMode.enabled true, Nodejs FIPS mode false', async () => { - securityConfig = { experimental: { fipsMode: { enabled: true } } }; + it('should log an error message if FIPS mode is misconfigured - xpack.security.fipsMode.enabled true, Nodejs FIPS mode false', async () => { + securityConfig = { fipsMode: { enabled: true } }; const logger = loggingSystemMock.create().get(); let fipsException: undefined | CriticalError; try { @@ -56,16 +56,16 @@ describe('fips', () => { expect(fipsException).toBeInstanceOf(CriticalError); expect(fipsException!.processExitCode).toBe(78); expect(fipsException!.message).toEqual( - 'Configuration mismatch error. xpack.security.experimental.fipsMode.enabled is set to true and the configured Node.js environment has FIPS disabled' + 'Configuration mismatch error. xpack.security.fipsMode.enabled is set to true and the configured Node.js environment has FIPS disabled' ); }); - it('should log an error message if FIPS mode is misconfigured - xpack.security.experimental.fipsMode.enabled false, Nodejs FIPS mode true', async () => { + it('should log an error message if FIPS mode is misconfigured - xpack.security.fipsMode.enabled false, Nodejs FIPS mode true', async () => { mockGetFipsFn.mockImplementationOnce(() => { return 1; }); - securityConfig = { experimental: { fipsMode: { enabled: false } } }; + securityConfig = { fipsMode: { enabled: false } }; const logger = loggingSystemMock.create().get(); let fipsException: undefined | CriticalError; @@ -77,16 +77,16 @@ describe('fips', () => { expect(fipsException).toBeInstanceOf(CriticalError); expect(fipsException!.processExitCode).toBe(78); expect(fipsException!.message).toEqual( - 'Configuration mismatch error. xpack.security.experimental.fipsMode.enabled is set to false and the configured Node.js environment has FIPS enabled' + 'Configuration mismatch error. xpack.security.fipsMode.enabled is set to false and the configured Node.js environment has FIPS enabled' ); }); - it('should log an info message if FIPS mode is properly configured - xpack.security.experimental.fipsMode.enabled true, Nodejs FIPS mode true', async () => { + it('should log an info message if FIPS mode is properly configured - xpack.security.fipsMode.enabled true, Nodejs FIPS mode true', async () => { mockGetFipsFn.mockImplementationOnce(() => { return 1; }); - securityConfig = { experimental: { fipsMode: { enabled: true } } }; + securityConfig = { fipsMode: { enabled: true } }; const logger = loggingSystemMock.create().get(); try { @@ -113,7 +113,7 @@ describe('fips', () => { return 1; }); - securityConfig = { experimental: { fipsMode: { enabled: true } } }; + securityConfig = { fipsMode: { enabled: true } }; }); afterEach(function () { diff --git a/packages/core/security/core-security-server-internal/src/fips/fips.ts b/packages/core/security/core-security-server-internal/src/fips/fips.ts index 0d9dea9e467fe..5fa47d3afc062 100644 --- a/packages/core/security/core-security-server-internal/src/fips/fips.ts +++ b/packages/core/security/core-security-server-internal/src/fips/fips.ts @@ -12,7 +12,7 @@ import { getFips } from 'crypto'; import { CriticalError } from '@kbn/core-base-server-internal'; import { PKCS12ConfigType, SecurityServiceConfigType } from '../utils'; export function isFipsEnabled(config: SecurityServiceConfigType): boolean { - return config?.experimental?.fipsMode?.enabled ?? false; + return config?.fipsMode?.enabled ?? false; } export function checkFipsConfig( @@ -33,7 +33,7 @@ export function checkFipsConfig( // FIPS must be enabled on both, or, log/error an exit Kibana if (isFipsConfigEnabled !== isNodeRunningWithFipsEnabled) { throw new CriticalError( - `Configuration mismatch error. xpack.security.experimental.fipsMode.enabled is set to ${isFipsConfigEnabled} and the configured Node.js environment has FIPS ${ + `Configuration mismatch error. xpack.security.fipsMode.enabled is set to ${isFipsConfigEnabled} and the configured Node.js environment has FIPS ${ isNodeRunningWithFipsEnabled ? 'enabled' : 'disabled' }`, 'invalidConfig', diff --git a/packages/core/security/core-security-server-internal/src/security_service.test.ts b/packages/core/security/core-security-server-internal/src/security_service.test.ts index 0ff1e59db71ec..d725d062b231e 100644 --- a/packages/core/security/core-security-server-internal/src/security_service.test.ts +++ b/packages/core/security/core-security-server-internal/src/security_service.test.ts @@ -32,10 +32,8 @@ describe('SecurityService', function () { const mockConfig = { xpack: { security: { - experimental: { - fipsMode: { - enabled: !!getFips(), - }, + fipsMode: { + enabled: !!getFips(), }, }, }, diff --git a/packages/core/security/core-security-server-internal/src/utils/index.ts b/packages/core/security/core-security-server-internal/src/utils/index.ts index 666afcce38afd..ad4ed95e685ee 100644 --- a/packages/core/security/core-security-server-internal/src/utils/index.ts +++ b/packages/core/security/core-security-server-internal/src/utils/index.ts @@ -11,10 +11,8 @@ export { convertSecurityApi } from './convert_security_api'; export { getDefaultSecurityImplementation } from './default_implementation'; export interface SecurityServiceConfigType { - experimental?: { - fipsMode?: { - enabled: boolean; - }; + fipsMode?: { + enabled: boolean; }; } diff --git a/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts b/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts index 38dae90905cb2..0ec20dca7db8d 100644 --- a/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts +++ b/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts @@ -83,7 +83,7 @@ export function createRootWithSettings( */ let oss = true; if (getFips() === 1) { - set(settings, 'xpack.security.experimental.fipsMode.enabled', true); + set(settings, 'xpack.security.fipsMode.enabled', true); oss = false; delete cliArgs.oss; } diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_form_state/rule_form_state_reducer.ts b/packages/kbn-alerts-ui-shared/src/rule_form/rule_form_state/rule_form_state_reducer.ts index d79ae00988875..2419a1b7f44ac 100644 --- a/packages/kbn-alerts-ui-shared/src/rule_form/rule_form_state/rule_form_state_reducer.ts +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_form_state/rule_form_state_reducer.ts @@ -8,7 +8,7 @@ */ import { RuleActionParams } from '@kbn/alerting-types'; -import { isEmpty, omit } from 'lodash'; +import { isEmpty, omit, isEqual } from 'lodash'; import { RuleFormActionsErrors, RuleFormParamsErrors, RuleUiAction } from '../../common'; import { RuleFormData, RuleFormState } from '../types'; import { validateRuleBase, validateRuleParams } from '../validation'; @@ -119,6 +119,7 @@ const getUpdateWithValidation = selectedRuleTypeModel, multiConsumerSelection, selectedRuleType, + formData: originalFormData, } = ruleFormState; const formData = updater(); @@ -149,12 +150,14 @@ const getUpdateWithValidation = } } + const touched = !isEqual(originalFormData, formData); + return { ...ruleFormState, formData, baseErrors, paramsErrors, - touched: true, + touched, }; }; diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.test.tsx b/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.test.tsx index ac07c580fbd49..9523dad2a8a6f 100644 --- a/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.test.tsx +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.test.tsx @@ -125,4 +125,62 @@ describe('rulePage', () => { fireEvent.click(screen.getByTestId('rulePageReturnButton')); expect(onCancel).toHaveBeenCalled(); }); + + test('should display discard changes modal only if changes are made in the form', () => { + useRuleFormState.mockReturnValue({ + plugins: { + application: { + navigateToUrl, + capabilities: { + actions: { + show: true, + save: true, + execute: true, + }, + }, + }, + }, + baseErrors: {}, + paramsErrors: {}, + touched: true, + formData: formDataMock, + connectors: [], + connectorTypes: [], + aadTemplateFields: [], + }); + + render(); + + fireEvent.click(screen.getByTestId('rulePageFooterCancelButton')); + expect(screen.getByTestId('ruleFormCancelModal')).toBeInTheDocument(); + }); + + test('should not display discard changes modal id no changes are made in the form', () => { + useRuleFormState.mockReturnValue({ + plugins: { + application: { + navigateToUrl, + capabilities: { + actions: { + show: true, + save: true, + execute: true, + }, + }, + }, + }, + baseErrors: {}, + paramsErrors: {}, + touched: false, + formData: formDataMock, + connectors: [], + connectorTypes: [], + aadTemplateFields: [], + }); + + render(); + + fireEvent.click(screen.getByTestId('rulePageFooterCancelButton')); + expect(screen.queryByTestId('ruleFormCancelModal')).not.toBeInTheDocument(); + }); }); diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.tsx b/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.tsx index 68ff6d5db6b19..bdb2838bc9963 100644 --- a/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.tsx +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_page/rule_page.tsx @@ -217,6 +217,7 @@ export const RulePage = (props: RulePageProps) => { setIsCancelModalOpen(false)} onConfirm={onCancel} + data-test-subj="ruleFormCancelModal" buttonColor="danger" defaultFocusedButton="confirm" title={RULE_FORM_CANCEL_MODAL_TITLE} diff --git a/packages/kbn-babel-preset/styled_components_files.js b/packages/kbn-babel-preset/styled_components_files.js index bcfbc7824ce4b..89b71c06d9e84 100644 --- a/packages/kbn-babel-preset/styled_components_files.js +++ b/packages/kbn-babel-preset/styled_components_files.js @@ -15,7 +15,7 @@ module.exports = { USES_STYLED_COMPONENTS: [ /packages[\/\\]kbn-ui-shared-deps-(npm|src)[\/\\]/, /src[\/\\]plugins[\/\\](kibana_react)[\/\\]/, - /x-pack[\/\\]plugins[\/\\](observability_solution\/apm|beats_management|fleet|observability_solution\/infra|lists|observability_solution\/observability|observability_solution\/observability_shared|observability_solution\/exploratory_view|observability_solution\/slo|security_solution|timelines|observability_solution\/synthetics|observability_solution\/ux|observability_solution\/uptime)[\/\\]/, + /x-pack[\/\\]plugins[\/\\](observability_solution\/apm|beats_management|fleet|observability_solution\/infra|lists|observability_solution\/observability|observability_solution\/observability_shared|observability_solution\/exploratory_view|security_solution|timelines|observability_solution\/synthetics|observability_solution\/ux|observability_solution\/uptime)[\/\\]/, /x-pack[\/\\]test[\/\\]plugin_functional[\/\\]plugins[\/\\]resolver_test[\/\\]/, /x-pack[\/\\]packages[\/\\]elastic_assistant[\/\\]/, /x-pack[\/\\]packages[\/\\]security-solution[\/\\]ecs_data_quality_dashboard[\/\\]/, diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index 020b9a97753b4..619bdd6c29321 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -233,6 +233,7 @@ "payload.connector.type", "type" ], + "cloud": [], "cloud-security-posture-settings": [], "config": [ "buildNum" diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 2409b7578da84..d6ec30393e099 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -788,6 +788,10 @@ } } }, + "cloud": { + "dynamic": false, + "properties": {} + }, "cloud-security-posture-settings": { "dynamic": false, "properties": {} diff --git a/packages/kbn-cli-dev-mode/src/watcher.ts b/packages/kbn-cli-dev-mode/src/watcher.ts index 3c9763e0543aa..6dc11371d9582 100644 --- a/packages/kbn-cli-dev-mode/src/watcher.ts +++ b/packages/kbn-cli-dev-mode/src/watcher.ts @@ -26,7 +26,8 @@ const packageMatcher = makeMatcher([ /** * Any code that is outside of a package must match this in order to trigger a restart */ -const nonPackageMatcher = makeMatcher(['config/**/*.yml']); +const nonPackageMatcher = makeMatcher(['config/**/*.yml', 'plugins/**/server/**/*']); +const staticFileMatcher = makeMatcher(['plugins/**/kibana.json']); export interface Options { enabled: boolean; @@ -87,6 +88,10 @@ export class Watcher { if (result.type === 'non-package') { return nonPackageMatcher(result.repoRel) && fire(result.repoRel); } + + if (result.type === 'static') { + return staticFileMatcher(result.repoRel) && fire(result.repoRel); + } } }, { diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index c7d714ebfbbb7..a31e1f1641e8b 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -428,6 +428,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D mappingSimilarity: `${ELASTICSEARCH_DOCS}similarity.html`, mappingSourceFields: `${ELASTICSEARCH_DOCS}mapping-source-field.html`, mappingSourceFieldsDisable: `${ELASTICSEARCH_DOCS}mapping-source-field.html#disable-source-field`, + mappingSyntheticSourceFields: `${ELASTICSEARCH_DOCS}mapping-source-field.html#synthetic-source`, mappingStore: `${ELASTICSEARCH_DOCS}mapping-store.html`, mappingSubobjects: `${ELASTICSEARCH_DOCS}subobjects.html`, mappingTermVector: `${ELASTICSEARCH_DOCS}term-vector.html`, diff --git a/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml b/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml index 5c8446123a4fb..d8fae0858208d 100644 --- a/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml +++ b/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml @@ -46,7 +46,7 @@ viewer: - feature_siem.read - feature_siem.read_alerts - feature_siem.endpoint_list_read - - feature_securitySolutionCases.read + - feature_securitySolutionCasesV2.read - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.read @@ -126,7 +126,7 @@ editor: - feature_siem.process_operations_all - feature_siem.actions_log_management_all # Response actions history - feature_siem.file_operations_all - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.read @@ -150,6 +150,8 @@ t1_analyst: - write - maintenance - names: + - .lists* + - .items* - apm-*-transaction* - traces-apm* - auditbeat-* @@ -175,7 +177,7 @@ t1_analyst: - feature_siem.read - feature_siem.read_alerts - feature_siem.endpoint_list_read - - feature_securitySolutionCases.read + - feature_securitySolutionCasesV2.read - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.read @@ -230,7 +232,7 @@ t2_analyst: - feature_siem.read - feature_siem.read_alerts - feature_siem.endpoint_list_read - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.read @@ -273,6 +275,7 @@ t3_analyst: privileges: - read - write + - view_index_metadata - names: - metrics-endpoint.metadata_current_* - .fleet-agents* @@ -300,7 +303,7 @@ t3_analyst: - feature_siem.actions_log_management_all # Response actions history - feature_siem.file_operations_all - feature_siem.scan_operations_all - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.read @@ -362,7 +365,7 @@ threat_intelligence_analyst: - feature_siem.all - feature_siem.endpoint_list_read - feature_siem.blocklist_all - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.read @@ -430,7 +433,7 @@ rule_author: - feature_siem.host_isolation_exceptions_read - feature_siem.blocklist_all # Elastic Defend Policy Management - feature_siem.actions_log_management_read - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.read @@ -474,6 +477,7 @@ soc_manager: privileges: - read - write + - view_index_metadata - names: - metrics-endpoint.metadata_current_* - .fleet-agents* @@ -502,7 +506,7 @@ soc_manager: - feature_siem.file_operations_all - feature_siem.execute_operations_all - feature_siem.scan_operations_all - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.all @@ -562,7 +566,7 @@ detections_admin: - feature_siem.all - feature_siem.read_alerts - feature_siem.crud_alerts - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.all @@ -621,7 +625,7 @@ platform_engineer: - feature_siem.host_isolation_exceptions_all - feature_siem.blocklist_all # Elastic Defend Policy Management - feature_siem.actions_log_management_read - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.all @@ -694,7 +698,7 @@ endpoint_operations_analyst: - feature_siem.file_operations_all - feature_siem.execute_operations_all - feature_siem.scan_operations_all - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.all @@ -769,7 +773,7 @@ endpoint_policy_manager: - feature_siem.event_filters_all - feature_siem.host_isolation_exceptions_all - feature_siem.blocklist_all # Elastic Defend Policy Management - - feature_securitySolutionCases.all + - feature_securitySolutionCasesV2.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.all diff --git a/packages/kbn-es/src/serverless_resources/security_roles.json b/packages/kbn-es/src/serverless_resources/security_roles.json index 75106ba041d60..424cb898a4f96 100644 --- a/packages/kbn-es/src/serverless_resources/security_roles.json +++ b/packages/kbn-es/src/serverless_resources/security_roles.json @@ -35,7 +35,7 @@ "siem": ["read", "read_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["read"], + "securitySolutionCasesV2": ["read"], "actions": ["read"], "builtInAlerts": ["read"] }, @@ -82,7 +82,7 @@ "siem": ["read", "read_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["read"], + "securitySolutionCasesV2": ["read"], "actions": ["read"], "builtInAlerts": ["read"] }, @@ -150,7 +150,7 @@ "actions_log_management_all", "file_operations_all" ], - "securitySolutionCases": ["all"], + "securitySolutionCasesV2": ["all"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], "actions": ["read"], @@ -210,7 +210,7 @@ "siem": ["all", "read_alerts", "crud_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["all"], + "securitySolutionCasesV2": ["all"], "actions": ["read"], "builtInAlerts": ["all"] }, @@ -263,7 +263,7 @@ "siem": ["all", "read_alerts", "crud_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["all"], + "securitySolutionCasesV2": ["all"], "actions": ["all"], "builtInAlerts": ["all"] }, @@ -311,7 +311,7 @@ "siem": ["all", "read_alerts", "crud_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["all"], + "securitySolutionCasesV2": ["all"], "actions": ["read"], "builtInAlerts": ["all"], "dev_tools": ["all"] @@ -366,7 +366,7 @@ "siem": ["all", "read_alerts", "crud_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["all"], + "securitySolutionCasesV2": ["all"], "actions": ["all"], "builtInAlerts": ["all"] }, diff --git a/packages/kbn-guided-onboarding/src/components/landing_page/classic_version/guide_filters.tsx b/packages/kbn-guided-onboarding/src/components/landing_page/classic_version/guide_filters.tsx index 1a2842c3a6594..73f39f8ce5a6a 100644 --- a/packages/kbn-guided-onboarding/src/components/landing_page/classic_version/guide_filters.tsx +++ b/packages/kbn-guided-onboarding/src/components/landing_page/classic_version/guide_filters.tsx @@ -75,7 +75,7 @@ export const GuideFilters = ({ activeFilter, setActiveFilter, application }: Gui > diff --git a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_filters.tsx b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_filters.tsx index 81d25e5a7d635..00152936a58bf 100644 --- a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_filters.tsx +++ b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_filters.tsx @@ -76,7 +76,7 @@ export const GuideFilters = ({ > diff --git a/packages/kbn-management/settings/utilities/category/get_category_name.ts b/packages/kbn-management/settings/utilities/category/get_category_name.ts index 5569479b48ad6..8ff9851e5862a 100644 --- a/packages/kbn-management/settings/utilities/category/get_category_name.ts +++ b/packages/kbn-management/settings/utilities/category/get_category_name.ts @@ -62,7 +62,7 @@ const names: Record = { defaultMessage: 'Reporting', }), [SEARCH_CATEGORY]: i18n.translate('management.settings.categoryNames.searchLabel', { - defaultMessage: 'Search', + defaultMessage: 'Elasticsearch', }), [SECURITY_SOLUTION_CATEGORY]: i18n.translate( 'management.settings.categoryNames.securitySolutionLabel', diff --git a/packages/kbn-search-api-panels/components/cloud_details.tsx b/packages/kbn-search-api-panels/components/cloud_details.tsx index 26710fb17436b..df2cc6bb6837d 100644 --- a/packages/kbn-search-api-panels/components/cloud_details.tsx +++ b/packages/kbn-search-api-panels/components/cloud_details.tsx @@ -82,7 +82,7 @@ export const CloudDetailsPanel = ({ @@ -123,7 +123,7 @@ export const CloudDetailsPanel = ({ {Boolean(cloudId) && (
diff --git a/renovate.json b/renovate.json index e7ab31d95f756..08c842400d671 100644 --- a/renovate.json +++ b/renovate.json @@ -100,7 +100,7 @@ "enabled": true }, { - "groupName": "@elastic/appex-ai-infra", + "groupName": "@elastic/appex-ai-infra dependencies", "matchDepNames": [ "@aws-crypto/sha256-js", "@aws-crypto/util", @@ -133,6 +133,133 @@ ], "enabled": true }, + { + "groupName": "@elastic/appex-qa dependencies", + "matchDepNames": [ + "cheerio", + "@types/faker", + "@types/pixelmatch", + "@types/pngjs", + "@types/supertest", + "babel-plugin-istanbul", + "faker", + "nyc", + "oboe", + "pixelmatch", + "playwright", + "pngjs", + "sharp", + "superagent", + "supertest", + "xmlbuilder" + ], + "reviewers": [ + "team:appex-qa" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:QA", + "release_note:skip", + "backport:all-open" + ], + "enabled": true + }, + { + "groupName": "@elastic/appex-sharedux dependencies", + "matchDepNames": [ + "@elastic/filesaver", + "@elastic/numeral", + "@wojtekmaj/enzyme-adapter-react-17", + "base64-js", + "blurhash", + "classnames", + "deep-freeze-strict", + "enzyme", + "enzyme-to-json", + "fflate", + "history", + "lz-string", + "monaco-editor", + "rison-node", + "styled-components", + "@types/base64-js", + "@types/classnames", + "@types/deep-freeze-strict", + "@types/enzyme", + "@types/history", + "@types/lz-string", + "@types/styled-components" + ], + "reviewers": [ + "team:appex-sharedux" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:SharedUX", + "release_note:skip", + "backport:all-open" + ], + "enabled": true + }, + { + "groupName": "@elastic/appex-sharedux emotion dependencies", + "matchDepNames": [ + "@emotion/cache", + "@emotion/css", + "@emotion/react", + "@emotion/serialize", + "@emotion/server", + "@emotion/styled" + ], + "reviewers": [ + "team:appex-sharedux" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:SharedUX", + "release_note:skip", + "backport:all-open" + ], + "enabled": true + }, + { + "groupName": "@elastic/appex-sharedux react dependencies", + "matchDepNames": [ + "prop-types", + "react", + "react-dom", + "react-monaco-editor", + "react-router", + "react-router-config", + "react-router-dom", + "react-router-dom-v5-compat", + "react-use", + "@types/prop-types", + "@types/react", + "@types/react-dom", + "@types/react-router", + "@types/react-router-config", + "@types/react-router-dom" + ], + "reviewers": [ + "team:appex-sharedux" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:SharedUX", + "release_note:skip", + "backport:all-open" + ], + "enabled": true + }, { "groupName": "@elastic/charts", "matchDepNames": [ @@ -1173,6 +1300,14 @@ ], "minimumReleaseAge": "7 days", "enabled": true + }, + { + "groupName": "@elastic/request-converter", + "matchDepNames": ["@elastic/request-converter"], + "reviewers": ["team:kibana-management"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "Team:Kibana Management", "Feature:Console"], + "enabled": true } ], "customManagers": [ diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 0f186fba94b54..f16c956107c7b 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -80,6 +80,7 @@ describe('checking migration metadata changes on all registered SO types', () => "cases-rules": "6d1776f5c46a99e1a0f3085c537146c1cdfbc829", "cases-telemetry": "f219eb7e26772884342487fc9602cfea07b3cedc", "cases-user-actions": "483f10db9b3bd1617948d7032a98b7791bf87414", + "cloud": "b549f4f7ab1fd41aab366a66afa52a2a008aefea", "cloud-security-posture-settings": "e0f61c68bbb5e4cfa46ce8994fa001e417df51ca", "config": "179b3e2bc672626aafce3cf92093a113f456af38", "config-global": "8e8a134a2952df700d7d4ec51abb794bbd4cf6da", diff --git a/src/core/server/integration_tests/node/migrator.test.ts b/src/core/server/integration_tests/node/migrator.test.ts index f899d7da5cde0..c0ae1aab8ef29 100644 --- a/src/core/server/integration_tests/node/migrator.test.ts +++ b/src/core/server/integration_tests/node/migrator.test.ts @@ -44,7 +44,7 @@ describe('migrator-only node', () => { '--no-optimizer', '--no-base-path', '--no-watch', - isFipsEnabled ? '--xpack.security.experimental.fipsMode.enabled=true' : '--oss', + isFipsEnabled ? '--xpack.security.fipsMode.enabled=true' : '--oss', ], { stdio: ['pipe', 'pipe', 'pipe'] } ); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts index 3ceba522d08cb..cee7f307ee67d 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts @@ -32,6 +32,7 @@ const previouslyRegisteredTypes = [ 'canvas-element', 'canvas-workpad', 'canvas-workpad-template', + 'cloud', 'cloud-security-posture-settings', 'cases', 'cases-comments', diff --git a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker index b814538466d73..e751997a1fb78 100755 --- a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker +++ b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker @@ -386,7 +386,7 @@ kibana_vars=( xpack.security.authc.selector.enabled xpack.security.cookieName xpack.security.encryptionKey - xpack.security.experimental.fipsMode.enabled + xpack.security.fipsMode.enabled xpack.security.loginAssistanceMessage xpack.security.loginHelp xpack.security.sameSiteCookies diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index 7a64ada1bfff9..186360c03e805 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -51,7 +51,7 @@ export async function runDockerGenerator( */ if (flags.baseImage === 'wolfi') baseImageName = - 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:26caa6beaee2bbf739a82e91a35173892dfe888d0a744b9e46cdc19a90d8656f'; + 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:32099b99697d9da842c1ccacdbef1beee05a68cddb817e858d7656df45ed4c93'; let imageFlavor = ''; if (flags.baseImage === 'ubi') imageFlavor += `-ubi`; diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index ec5588b4c793e..94d604d726562 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -59,7 +59,7 @@ RUN set -e ; \ make install > /dev/null ; \ rm -rf "/usr/share/kibana/openssl-${OPENSSL_VERSION}" ; \ chown -R 1000:0 "${OPENSSL_PATH}"; - + {{/fips}} # Ensure that group permissions are the same as user permissions. # This will help when relying on GID-0 to run Kibana, rather than UID-1000. @@ -156,7 +156,7 @@ RUN /bin/echo -e '\n--enable-fips' >> config/node.options RUN echo '--openssl-config=/usr/share/kibana/config/nodejs.cnf' >> config/node.options COPY --chown=1000:0 openssl/nodejs.cnf "/usr/share/kibana/config/nodejs.cnf" ENV OPENSSL_MODULES=/usr/share/kibana/openssl/lib/ossl-modules -ENV XPACK_SECURITY_EXPERIMENTAL_FIPSMODE_ENABLED=true +ENV XPACK_SECURITY_FIPSMODE_ENABLED=true {{/fips}} RUN ln -s /usr/share/kibana /opt/kibana diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/ironbank/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/ironbank/Dockerfile index f7849bff06ead..9993381fb4332 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/ironbank/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/ironbank/Dockerfile @@ -4,7 +4,7 @@ ################################################################################ ARG BASE_REGISTRY=registry1.dso.mil ARG BASE_IMAGE=ironbank/redhat/ubi/ubi9 -ARG BASE_TAG=9.4 +ARG BASE_TAG=9.5 FROM ${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as prep_files diff --git a/src/dev/code_coverage/nyc_config/nyc.functional.config.js b/src/dev/code_coverage/nyc_config/nyc.functional.config.js deleted file mode 100644 index d3a6160b8b6ae..0000000000000 --- a/src/dev/code_coverage/nyc_config/nyc.functional.config.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -const defaultExclude = require('@istanbuljs/schema/default-exclude'); -const extraExclude = [ - 'data/optimize/**', - '**/{__jest__,__test__,__examples__,__fixtures__,__snapshots__,__stories__,*mock*,*storybook,target,types}/**/*', - '**/{integration_tests,test,tests,test_helpers,test_data,test_samples,test_utils,test_utilities,*scripts}/**/*', - '**/{*e2e*,fixtures,manual_tests,stub*}/**', - '**/*mock*.{ts,tsx}', - '**/*.test.{ts,tsx}', - '**/*.spec.{ts,tsx}', - '**/types.ts', - '**/*.d.ts', - '**/index.{js,ts,tsx}', -]; -// const path = require('path'); - -module.exports = { - // 'temp-dir': process.env.COVERAGE_TEMP_DIR - // ? path.resolve(process.env.COVERAGE_TEMP_DIR, 'functional') - // : 'target/kibana-coverage/functional', - 'temp-dir': process.env.COVERAGE_TEMP_DIR - ? process.env.COVERAGE_TEMP_DIR - : 'target/kibana-coverage/functional', - 'report-dir': 'target/kibana-coverage/functional-combined', - reporter: ['html', 'json-summary'], - include: [ - 'src/{core,plugins}/**/*.{js,mjs,jsx,ts,tsx}', - 'x-pack/plugins/**/*.{js,mjs,jsx,ts,tsx}', - ], - exclude: extraExclude.concat(defaultExclude), -}; diff --git a/src/dev/code_coverage/nyc_config/nyc.server.config.js b/src/dev/code_coverage/nyc_config/nyc.server.config.js deleted file mode 100644 index d9432adb7572b..0000000000000 --- a/src/dev/code_coverage/nyc_config/nyc.server.config.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -const path = require('path'); - -module.exports = { - extends: '@istanbuljs/nyc-config-typescript', - 'report-dir': process.env.KIBANA_DIR - ? path.resolve(process.env.KIBANA_DIR, 'target/kibana-coverage/functional') - : 'target/kibana-coverage/functional', - reporter: ['json'], - all: true, - include: [ - 'src/{core,plugins}/**/*.{js,mjs,jsx,ts,tsx}', - 'x-pack/plugins/**/*.{js,mjs,jsx,ts,tsx}', - ], - exclude: [ - '**/{__jest__,__test__,__examples__,__fixtures__,__snapshots__,__stories__,*mock*,*storybook,target,types}/**/*', - '**/{integration_tests,test,tests,test_helpers,test_data,test_samples,test_utils,test_utilities,*scripts}/**/*', - '**/{*e2e*,fixtures,manual_tests,stub*}/**', - '**/*mock*.{ts,tsx}', - '**/*.test.{ts,tsx}', - '**/*.spec.{ts,tsx}', - '**/types.ts', - '**/*.d.ts', - '**/index.{js,ts,tsx}', - ], -}; diff --git a/src/plugins/custom_integrations/common/index.ts b/src/plugins/custom_integrations/common/index.ts index 884d5357bf912..0c9ecd8488658 100755 --- a/src/plugins/custom_integrations/common/index.ts +++ b/src/plugins/custom_integrations/common/index.ts @@ -67,7 +67,7 @@ export const INTEGRATION_CATEGORY_DISPLAY: { productivity_security: { title: 'Productivity', parent_id: 'security' }, proxy_security: { title: 'Proxy', parent_id: 'security' }, sdk_search: { title: 'SDK', parent_id: 'search' }, - search: { title: 'Search', parent_id: undefined }, + search: { title: 'Elasticsearch', parent_id: undefined }, security: { title: 'Security', parent_id: undefined }, stream_processing: { title: 'Stream Processing', parent_id: 'observability' }, support: { title: 'Support', parent_id: undefined }, diff --git a/src/plugins/data_views/common/constants.ts b/src/plugins/data_views/common/constants.ts index b1e68fd44745c..4b1cf465efcc9 100644 --- a/src/plugins/data_views/common/constants.ts +++ b/src/plugins/data_views/common/constants.ts @@ -79,3 +79,12 @@ export const EXISTING_INDICES_PATH = '/internal/data_views/_existing_indices'; export const DATA_VIEWS_FIELDS_EXCLUDED_TIERS = 'data_views:fields_excluded_data_tiers'; export const DEFAULT_DATA_VIEW_ID = 'defaultIndex'; + +/** + * Valid `failureReason` attribute values for `has_es_data` API error responses + */ +export enum HasEsDataFailureReason { + localDataTimeout = 'local_data_timeout', + remoteDataTimeout = 'remote_data_timeout', + unknown = 'unknown', +} diff --git a/src/plugins/data_views/common/index.ts b/src/plugins/data_views/common/index.ts index 2b5ca664d56fc..d359489681a2e 100644 --- a/src/plugins/data_views/common/index.ts +++ b/src/plugins/data_views/common/index.ts @@ -13,6 +13,7 @@ export { META_FIELDS, DATA_VIEW_SAVED_OBJECT_TYPE, MAX_DATA_VIEW_FIELD_DESCRIPTION_LENGTH, + HasEsDataFailureReason, } from './constants'; export { LATEST_VERSION } from './content_management/v1/constants'; diff --git a/src/plugins/data_views/common/types.ts b/src/plugins/data_views/common/types.ts index 45f747691fc4b..8c229a01d0477 100644 --- a/src/plugins/data_views/common/types.ts +++ b/src/plugins/data_views/common/types.ts @@ -571,4 +571,5 @@ export interface ClientConfigType { scriptedFieldsEnabled?: boolean; dataTiersExcludedForFields?: string; fieldListCachingEnabled?: boolean; + hasEsDataTimeout: number; } diff --git a/src/plugins/data_views/public/services/has_data.test.ts b/src/plugins/data_views/public/services/has_data.test.ts index fc032ee44bc41..1171cd677b64f 100644 --- a/src/plugins/data_views/public/services/has_data.test.ts +++ b/src/plugins/data_views/public/services/has_data.test.ts @@ -10,6 +10,7 @@ import { coreMock } from '@kbn/core/public/mocks'; import { HasData } from './has_data'; +import { HttpFetchError } from '@kbn/core-http-browser-internal/src/http_fetch_error'; describe('when calling hasData service', () => { describe('hasDataView', () => { @@ -170,6 +171,78 @@ describe('when calling hasData service', () => { expect(await response).toBe(false); }); + + it('should return true and show an error toast when checking for remote cluster data times out', async () => { + const coreStart = coreMock.createStart(); + const http = coreStart.http; + + // Mock getIndices + const spy = jest.spyOn(http, 'get').mockImplementation(() => + Promise.reject( + new HttpFetchError( + 'Timeout while checking for Elasticsearch data', + 'TimeoutError', + new Request(''), + undefined, + { + statusCode: 504, + message: 'Timeout while checking for Elasticsearch data', + attributes: { + failureReason: 'remote_data_timeout', + }, + } + ) + ) + ); + const hasData = new HasData(); + const hasDataService = hasData.start(coreStart, true); + const response = hasDataService.hasESData(); + + expect(spy).toHaveBeenCalledTimes(1); + expect(await response).toBe(true); + expect(coreStart.notifications.toasts.addDanger).toHaveBeenCalledTimes(1); + expect(coreStart.notifications.toasts.addDanger).toHaveBeenCalledWith({ + title: 'Remote cluster timeout', + text: 'Checking for data on remote clusters timed out. One or more remote clusters may be unavailable.', + }); + }); + + it('should return true and not show an error toast when checking for remote cluster data times out, but onRemoteDataTimeout is overridden', async () => { + const coreStart = coreMock.createStart(); + const http = coreStart.http; + + // Mock getIndices + const responseBody = { + statusCode: 504, + message: 'Timeout while checking for Elasticsearch data', + attributes: { + failureReason: 'remote_data_timeout', + }, + }; + const spy = jest + .spyOn(http, 'get') + .mockImplementation(() => + Promise.reject( + new HttpFetchError( + 'Timeout while checking for Elasticsearch data', + 'TimeoutError', + new Request(''), + undefined, + responseBody + ) + ) + ); + const hasData = new HasData(); + const hasDataService = hasData.start(coreStart, true); + const onRemoteDataTimeout = jest.fn(); + const response = hasDataService.hasESData({ onRemoteDataTimeout }); + + expect(spy).toHaveBeenCalledTimes(1); + expect(await response).toBe(true); + expect(coreStart.notifications.toasts.addDanger).not.toHaveBeenCalled(); + expect(onRemoteDataTimeout).toHaveBeenCalledTimes(1); + expect(onRemoteDataTimeout).toHaveBeenCalledWith(responseBody); + }); }); describe('resolve/cluster not available', () => { diff --git a/src/plugins/data_views/public/services/has_data.ts b/src/plugins/data_views/public/services/has_data.ts index aad546c446cf3..bcf80ca337460 100644 --- a/src/plugins/data_views/public/services/has_data.ts +++ b/src/plugins/data_views/public/services/has_data.ts @@ -8,10 +8,22 @@ */ import { CoreStart, HttpStart } from '@kbn/core/public'; -import { DEFAULT_ASSETS_TO_IGNORE } from '../../common'; +import { IHttpFetchError, ResponseErrorBody, isHttpFetchError } from '@kbn/core-http-browser'; +import { isObject } from 'lodash'; +import { i18n } from '@kbn/i18n'; +import { DEFAULT_ASSETS_TO_IGNORE, HasEsDataFailureReason } from '../../common'; import { HasDataViewsResponse, IndicesViaSearchResponse } from '..'; import { IndicesResponse, IndicesResponseModified } from '../types'; +export interface HasEsDataParams { + /** + * Callback to handle the case where checking for remote data times out. + * If not provided, the default behavior is to show a toast notification. + * @param body The error response body + */ + onRemoteDataTimeout?: (body: ResponseErrorBody) => void; +} + export class HasData { private removeAliases = (source: IndicesResponseModified): boolean => !source.item.indices; @@ -38,28 +50,55 @@ export class HasData { return hasLocalESData; }; - const hasESDataViaResolveCluster = async () => { + const hasESDataViaResolveCluster = async ( + onRemoteDataTimeout: (body: ResponseErrorBody) => void + ) => { try { const { hasEsData } = await http.get<{ hasEsData: boolean }>( '/internal/data_views/has_es_data', - { - version: '1', - } + { version: '1' } ); + return hasEsData; } catch (e) { + if ( + this.isResponseError(e) && + e.body?.statusCode === 504 && + e.body?.attributes?.failureReason === HasEsDataFailureReason.remoteDataTimeout + ) { + onRemoteDataTimeout(e.body); + + // In the case of a remote cluster timeout, + // we can't be sure if there is data or not, + // so just assume there is + return true; + } + // fallback to previous implementation return hasESDataViaResolveIndex(); } }; + const showRemoteDataTimeoutToast = () => + core.notifications.toasts.addDanger({ + title: i18n.translate('dataViews.hasData.remoteDataTimeoutTitle', { + defaultMessage: 'Remote cluster timeout', + }), + text: i18n.translate('dataViews.hasData.remoteDataTimeoutText', { + defaultMessage: + 'Checking for data on remote clusters timed out. One or more remote clusters may be unavailable.', + }), + }); + return { /** * Check to see if ES data exists */ - hasESData: async (): Promise => { + hasESData: async ({ + onRemoteDataTimeout = showRemoteDataTimeoutToast, + }: HasEsDataParams = {}): Promise => { if (callResolveCluster) { - return hasESDataViaResolveCluster(); + return hasESDataViaResolveCluster(onRemoteDataTimeout); } return hasESDataViaResolveIndex(); }, @@ -82,6 +121,9 @@ export class HasData { // ES Data + private isResponseError = (e: Error): e is IHttpFetchError => + isHttpFetchError(e) && isObject(e.body) && 'message' in e.body && 'statusCode' in e.body; + private responseToItemArray = (response: IndicesResponse): IndicesResponseModified[] => { const { indices = [], aliases = [] } = response; const source: IndicesResponseModified[] = []; diff --git a/src/plugins/data_views/server/index.ts b/src/plugins/data_views/server/index.ts index d72a50d20e31c..143bea2ba5d51 100644 --- a/src/plugins/data_views/server/index.ts +++ b/src/plugins/data_views/server/index.ts @@ -47,7 +47,6 @@ const configSchema = schema.object({ schema.boolean({ defaultValue: false }), schema.never() ), - dataTiersExcludedForFields: schema.conditional( schema.contextRef('serverless'), true, @@ -60,6 +59,7 @@ const configSchema = schema.object({ schema.boolean({ defaultValue: false }), schema.boolean({ defaultValue: true }) ), + hasEsDataTimeout: schema.number({ defaultValue: 5000 }), }); type ConfigType = TypeOf; diff --git a/src/plugins/data_views/server/plugin.ts b/src/plugins/data_views/server/plugin.ts index 8decac6c36b1f..9e79da893949a 100644 --- a/src/plugins/data_views/server/plugin.ts +++ b/src/plugins/data_views/server/plugin.ts @@ -63,9 +63,11 @@ export class DataViewsServerPlugin registerRoutes({ http: core.http, + logger: this.logger, getStartServices: core.getStartServices, isRollupsEnabled: () => this.rollupsEnabled, dataViewRestCounter, + hasEsDataTimeout: config.hasEsDataTimeout, }); expressions.registerFunction(getIndexPatternLoad({ getStartServices: core.getStartServices })); diff --git a/src/plugins/data_views/server/rest_api_routes/internal/has_es_data.test.ts b/src/plugins/data_views/server/rest_api_routes/internal/has_es_data.test.ts new file mode 100644 index 0000000000000..7ca07d25bf773 --- /dev/null +++ b/src/plugins/data_views/server/rest_api_routes/internal/has_es_data.test.ts @@ -0,0 +1,319 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { MockedKeys } from '@kbn/utility-types-jest'; +import { IKibanaResponse, Logger, RequestHandlerContext } from '@kbn/core/server'; +import { httpServerMock } from '@kbn/core/server/mocks'; +import { createHandler, crossClusterPatterns, patterns } from './has_es_data'; +import { loggerMock } from '@kbn/logging-mocks'; + +const mockEsDataTimeout = 5000; + +describe('has_es_data route', () => { + let mockLogger: MockedKeys; + + beforeEach(() => { + mockLogger = loggerMock.create(); + }); + + it('should return hasEsData: true if there are matching local indices', async () => { + const mockESClient = { + indices: { + resolveCluster: jest.fn().mockResolvedValue({ + local: { matching_indices: true }, + }), + }, + }; + const mockContext = { + core: { + elasticsearch: { client: { asCurrentUser: mockESClient } }, + }, + } as unknown as RequestHandlerContext; + const mockRequest = httpServerMock.createKibanaRequest(); + const mockResponse = httpServerMock.createResponseFactory(); + jest + .spyOn(mockResponse, 'ok') + .mockImplementation((params) => params as unknown as IKibanaResponse); + const handler = createHandler(mockLogger, mockEsDataTimeout); + const response = await handler(mockContext, mockRequest, mockResponse); + expect(mockESClient.indices.resolveCluster).toBeCalledTimes(1); + expect(mockESClient.indices.resolveCluster).toBeCalledWith( + { + name: patterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockResponse.ok).toBeCalledTimes(1); + expect(mockResponse.ok).toBeCalledWith({ body: { hasEsData: true } }); + expect(response).toEqual({ body: { hasEsData: true } }); + }); + + it('should return hasEsData: true if there are no matching local indices but matching remote indices', async () => { + const mockESClient = { + indices: { + resolveCluster: jest + .fn() + .mockImplementation(({ name }) => + name === patterns + ? { local: { matching_indices: false } } + : name === crossClusterPatterns + ? { remote: { matching_indices: true } } + : {} + ), + }, + }; + const mockContext = { + core: { + elasticsearch: { client: { asCurrentUser: mockESClient } }, + }, + } as unknown as RequestHandlerContext; + const mockRequest = httpServerMock.createKibanaRequest(); + const mockResponse = httpServerMock.createResponseFactory(); + jest + .spyOn(mockResponse, 'ok') + .mockImplementation((params) => params as unknown as IKibanaResponse); + const handler = createHandler(mockLogger, mockEsDataTimeout); + const response = await handler(mockContext, mockRequest, mockResponse); + expect(mockESClient.indices.resolveCluster).toBeCalledTimes(2); + expect(mockESClient.indices.resolveCluster).toHaveBeenNthCalledWith( + 1, + { + name: patterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockESClient.indices.resolveCluster).toHaveBeenNthCalledWith( + 2, + { + name: crossClusterPatterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockResponse.ok).toBeCalledTimes(1); + expect(mockResponse.ok).toBeCalledWith({ body: { hasEsData: true } }); + expect(response).toEqual({ body: { hasEsData: true } }); + }); + + it('should return hasEsData: false if there are no matching local or remote indices', async () => { + const mockESClient = { + indices: { + resolveCluster: jest.fn().mockResolvedValue({ + local: { matching_indices: false }, + remote: { matching_indices: false }, + }), + }, + }; + const mockContext = { + core: { + elasticsearch: { client: { asCurrentUser: mockESClient } }, + }, + } as unknown as RequestHandlerContext; + const mockRequest = httpServerMock.createKibanaRequest(); + const mockResponse = httpServerMock.createResponseFactory(); + jest + .spyOn(mockResponse, 'ok') + .mockImplementation((params) => params as unknown as IKibanaResponse); + const handler = createHandler(mockLogger, mockEsDataTimeout); + const response = await handler(mockContext, mockRequest, mockResponse); + expect(mockESClient.indices.resolveCluster).toBeCalledTimes(2); + expect(mockESClient.indices.resolveCluster).toHaveBeenNthCalledWith( + 1, + { + name: patterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockESClient.indices.resolveCluster).toHaveBeenNthCalledWith( + 2, + { + name: crossClusterPatterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockResponse.ok).toBeCalledTimes(1); + expect(mockResponse.ok).toBeCalledWith({ body: { hasEsData: false } }); + expect(response).toEqual({ body: { hasEsData: false } }); + }); + + it('should return a 504 response and log a warning if the local data request times out', async () => { + const mockESClient = { + indices: { + resolveCluster: jest.fn().mockRejectedValue({ name: 'TimeoutError' }), + }, + }; + const mockContext = { + core: { + elasticsearch: { client: { asCurrentUser: mockESClient } }, + }, + } as unknown as RequestHandlerContext; + const mockRequest = httpServerMock.createKibanaRequest(); + const mockResponse = httpServerMock.createResponseFactory(); + jest + .spyOn(mockResponse, 'customError') + .mockImplementation((params) => params as unknown as IKibanaResponse); + const handler = createHandler(mockLogger, mockEsDataTimeout); + const response = await handler(mockContext, mockRequest, mockResponse); + expect(mockESClient.indices.resolveCluster).toBeCalledTimes(1); + expect(mockESClient.indices.resolveCluster).toBeCalledWith( + { + name: patterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockResponse.customError).toBeCalledTimes(1); + expect(mockResponse.customError).toBeCalledWith({ + statusCode: 504, + body: { + message: 'Timeout while checking for Elasticsearch data', + attributes: { failureReason: 'local_data_timeout' }, + }, + }); + expect(response).toEqual({ + statusCode: 504, + body: { + message: 'Timeout while checking for Elasticsearch data', + attributes: { failureReason: 'local_data_timeout' }, + }, + }); + expect(mockLogger.warn).toBeCalledTimes(1); + expect(mockLogger.warn).toBeCalledWith( + 'Timeout while checking for Elasticsearch data: local_data_timeout. Current timeout value is 5000ms. ' + + 'Use "data_views.hasEsDataTimeout" in kibana.yml to change it, or set to 0 to disable timeouts.' + ); + }); + + it('should return a 504 response and log a warning if the remote data request times out', async () => { + const mockESClient = { + indices: { + resolveCluster: jest.fn().mockImplementation(({ name }) => { + if (name === patterns) { + return { local: { matching_indices: false } }; + } + + if (name === crossClusterPatterns) { + // eslint-disable-next-line no-throw-literal + throw { name: 'TimeoutError' }; + } + + return {}; + }), + }, + }; + const mockContext = { + core: { + elasticsearch: { client: { asCurrentUser: mockESClient } }, + }, + } as unknown as RequestHandlerContext; + const mockRequest = httpServerMock.createKibanaRequest(); + const mockResponse = httpServerMock.createResponseFactory(); + jest + .spyOn(mockResponse, 'customError') + .mockImplementation((params) => params as unknown as IKibanaResponse); + const handler = createHandler(mockLogger, mockEsDataTimeout); + const response = await handler(mockContext, mockRequest, mockResponse); + expect(mockESClient.indices.resolveCluster).toBeCalledTimes(2); + expect(mockESClient.indices.resolveCluster).toHaveBeenNthCalledWith( + 1, + { + name: patterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockESClient.indices.resolveCluster).toHaveBeenNthCalledWith( + 2, + { + name: crossClusterPatterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockResponse.customError).toBeCalledTimes(1); + expect(mockResponse.customError).toBeCalledWith({ + statusCode: 504, + body: { + message: 'Timeout while checking for Elasticsearch data', + attributes: { failureReason: 'remote_data_timeout' }, + }, + }); + expect(response).toEqual({ + statusCode: 504, + body: { + message: 'Timeout while checking for Elasticsearch data', + attributes: { failureReason: 'remote_data_timeout' }, + }, + }); + expect(mockLogger.warn).toBeCalledTimes(1); + expect(mockLogger.warn).toBeCalledWith( + 'Timeout while checking for Elasticsearch data: remote_data_timeout. Current timeout value is 5000ms. ' + + 'Use "data_views.hasEsDataTimeout" in kibana.yml to change it, or set to 0 to disable timeouts.' + ); + }); + + it('should return a 500 response and log an error if the request fails for an unknown reason', async () => { + const someError = new Error('Some error'); + const mockESClient = { + indices: { + resolveCluster: jest.fn().mockRejectedValue(someError), + }, + }; + const mockContext = { + core: { + elasticsearch: { client: { asCurrentUser: mockESClient } }, + }, + } as unknown as RequestHandlerContext; + const mockRequest = httpServerMock.createKibanaRequest(); + const mockResponse = httpServerMock.createResponseFactory(); + jest + .spyOn(mockResponse, 'customError') + .mockImplementation((params) => params as unknown as IKibanaResponse); + const handler = createHandler(mockLogger, mockEsDataTimeout); + const response = await handler(mockContext, mockRequest, mockResponse); + expect(mockESClient.indices.resolveCluster).toBeCalledTimes(1); + expect(mockESClient.indices.resolveCluster).toBeCalledWith( + { + name: patterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: mockEsDataTimeout } + ); + expect(mockResponse.customError).toBeCalledTimes(1); + expect(mockResponse.customError).toBeCalledWith({ + statusCode: 500, + body: { + message: 'Error while checking for Elasticsearch data', + attributes: { failureReason: 'unknown' }, + }, + }); + expect(response).toEqual({ + statusCode: 500, + body: { + message: 'Error while checking for Elasticsearch data', + attributes: { failureReason: 'unknown' }, + }, + }); + expect(mockLogger.error).toBeCalledTimes(1); + expect(mockLogger.error).toBeCalledWith(someError); + }); +}); diff --git a/src/plugins/data_views/server/rest_api_routes/internal/has_es_data.ts b/src/plugins/data_views/server/rest_api_routes/internal/has_es_data.ts index 4f3fb9f19a6ff..72b2e508ba529 100644 --- a/src/plugins/data_views/server/rest_api_routes/internal/has_es_data.ts +++ b/src/plugins/data_views/server/rest_api_routes/internal/has_es_data.ts @@ -7,34 +7,124 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { IRouter, RequestHandlerContext } from '@kbn/core/server'; -import type { VersionedRoute } from '@kbn/core-http-server'; +import type { ElasticsearchClient, IRouter, Logger, RequestHandlerContext } from '@kbn/core/server'; +import type { KibanaResponseFactory, VersionedRoute } from '@kbn/core-http-server'; import { schema } from '@kbn/config-schema'; -import { DEFAULT_ASSETS_TO_IGNORE } from '../../../common'; +import { DEFAULT_ASSETS_TO_IGNORE, HasEsDataFailureReason } from '../../../common'; type Handler = Parameters['addVersion']>[1]; -const patterns = ['*', '-.*'].concat( +export const patterns = ['*', '-.*'].concat( DEFAULT_ASSETS_TO_IGNORE.DATA_STREAMS_TO_IGNORE.map((ds) => `-${ds}`) ); -const crossClusterPatterns = patterns.map((ds) => `*:${ds}`); +export const crossClusterPatterns = patterns.map((ds) => `*:${ds}`); -export const handler: Handler = async (ctx: RequestHandlerContext, req, res) => { - const core = await ctx.core; - const elasticsearchClient = core.elasticsearch.client.asCurrentUser; - const response = await elasticsearchClient.indices.resolveCluster({ - name: patterns.concat(crossClusterPatterns), - allow_no_indices: true, - ignore_unavailable: true, - }); +export const createHandler = + (parentLogger: Logger, hasEsDataTimeout: number): Handler => + async (ctx, _, res) => { + const logger = parentLogger.get('hasEsData'); + const core = await ctx.core; + const elasticsearchClient = core.elasticsearch.client.asCurrentUser; + const commonParams: Omit = { + elasticsearchClient, + logger, + res, + hasEsDataTimeout, + }; - const hasEsData = !!Object.values(response).find((cluster) => cluster.matching_indices); + const localDataResponse = await hasEsData({ + ...commonParams, + matchPatterns: patterns, + timeoutReason: HasEsDataFailureReason.localDataTimeout, + }); - return res.ok({ body: { hasEsData } }); + if (localDataResponse) { + return localDataResponse; + } + + const remoteDataResponse = await hasEsData({ + ...commonParams, + matchPatterns: crossClusterPatterns, + timeoutReason: HasEsDataFailureReason.remoteDataTimeout, + }); + + if (remoteDataResponse) { + return remoteDataResponse; + } + + return res.ok({ body: { hasEsData: false } }); + }; + +interface HasEsDataParams { + elasticsearchClient: ElasticsearchClient; + logger: Logger; + res: KibanaResponseFactory; + matchPatterns: string[]; + hasEsDataTimeout: number; + timeoutReason: HasEsDataFailureReason; +} + +const timeoutMessage = 'Timeout while checking for Elasticsearch data'; +const errorMessage = 'Error while checking for Elasticsearch data'; + +const hasEsData = async ({ + elasticsearchClient, + logger, + res, + matchPatterns, + hasEsDataTimeout, + timeoutReason, +}: HasEsDataParams) => { + try { + const response = await elasticsearchClient.indices.resolveCluster( + { + name: matchPatterns, + allow_no_indices: true, + ignore_unavailable: true, + }, + { requestTimeout: hasEsDataTimeout === 0 ? undefined : hasEsDataTimeout } + ); + + const hasData = Object.values(response).some((cluster) => cluster.matching_indices); + + if (hasData) { + return res.ok({ body: { hasEsData: true } }); + } + } catch (e) { + if (e.name === 'TimeoutError') { + const warningMessage = + `${timeoutMessage}: ${timeoutReason}. Current timeout value is ${hasEsDataTimeout}ms. ` + + `Use "data_views.hasEsDataTimeout" in kibana.yml to change it, or set to 0 to disable timeouts.`; + + logger.warn(warningMessage); + + return res.customError({ + statusCode: 504, + body: { + message: timeoutMessage, + attributes: { failureReason: timeoutReason }, + }, + }); + } + + logger.error(e); + + return res.customError({ + statusCode: 500, + body: { + message: errorMessage, + attributes: { failureReason: HasEsDataFailureReason.unknown }, + }, + }); + } }; -export const registerHasEsDataRoute = (router: IRouter): void => { +export const registerHasEsDataRoute = ( + router: IRouter, + logger: Logger, + hasEsDataTimeout: number +): void => { router.versioned .get({ path: '/internal/data_views/has_es_data', @@ -51,9 +141,18 @@ export const registerHasEsDataRoute = (router: IRouter): void => { hasEsData: schema.boolean(), }), }, + 400: { + body: () => + schema.object({ + message: schema.string(), + attributes: schema.object({ + failureReason: schema.string(), + }), + }), + }, }, }, }, - handler + createHandler(logger, hasEsDataTimeout) ); }; diff --git a/src/plugins/data_views/server/routes.ts b/src/plugins/data_views/server/routes.ts index e5803423d819e..9e8501f928f14 100644 --- a/src/plugins/data_views/server/routes.ts +++ b/src/plugins/data_views/server/routes.ts @@ -7,8 +7,8 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { HttpServiceSetup, StartServicesAccessor } from '@kbn/core/server'; -import { UsageCounter } from '@kbn/usage-collection-plugin/server'; +import type { HttpServiceSetup, Logger, StartServicesAccessor } from '@kbn/core/server'; +import type { UsageCounter } from '@kbn/usage-collection-plugin/server'; import { routes } from './rest_api_routes/public'; import type { DataViewsServerPluginStart, DataViewsServerPluginStartDependencies } from './types'; @@ -20,19 +20,23 @@ import { registerFields } from './rest_api_routes/internal/fields'; interface RegisterRoutesArgs { http: HttpServiceSetup; + logger: Logger; getStartServices: StartServicesAccessor< DataViewsServerPluginStartDependencies, DataViewsServerPluginStart >; isRollupsEnabled: () => boolean; dataViewRestCounter?: UsageCounter; + hasEsDataTimeout: number; } export function registerRoutes({ http, + logger, getStartServices, - dataViewRestCounter, isRollupsEnabled, + dataViewRestCounter, + hasEsDataTimeout, }: RegisterRoutesArgs) { const router = http.createRouter(); @@ -42,5 +46,5 @@ export function registerRoutes({ registerFieldForWildcard(router, getStartServices, isRollupsEnabled); registerFields(router, getStartServices, isRollupsEnabled); registerHasDataViewsRoute(router); - registerHasEsDataRoute(router); + registerHasEsDataRoute(router, logger, hasEsDataTimeout); } diff --git a/src/plugins/data_views/tsconfig.json b/src/plugins/data_views/tsconfig.json index 312de968d6408..45992b3548f8e 100644 --- a/src/plugins/data_views/tsconfig.json +++ b/src/plugins/data_views/tsconfig.json @@ -34,6 +34,9 @@ "@kbn/core-saved-objects-server", "@kbn/logging", "@kbn/crypto-browser", + "@kbn/core-http-browser", + "@kbn/core-http-browser-internal", + "@kbn/logging-mocks", ], "exclude": [ "target/**/*", diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx index 16017fda0ffbc..84232d47fd337 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx @@ -80,7 +80,12 @@ export function TopNavMenuItem(props: TopNavMenuData & { isMobileMenu?: boolean ) : props.emphasize ? ( // fill is not compatible with EuiHeaderLink - + {getButtonContainer()} ) : ( diff --git a/src/plugins/ui_actions/public/actions/action_internal.ts b/src/plugins/ui_actions/public/actions/action_internal.ts index ccef920ecc465..6f979849bdc41 100644 --- a/src/plugins/ui_actions/public/actions/action_internal.ts +++ b/src/plugins/ui_actions/public/actions/action_internal.ts @@ -29,6 +29,7 @@ export class ActionInternal public readonly subscribeToCompatibilityChanges?: Action['subscribeToCompatibilityChanges']; public readonly couldBecomeCompatible?: Action['couldBecomeCompatible']; + public errorLogged?: boolean; constructor(public readonly definition: ActionDefinition) { this.id = this.definition.id; @@ -38,6 +39,7 @@ export class ActionInternal this.grouping = this.definition.grouping; this.showNotification = this.definition.showNotification; this.disabled = this.definition.disabled; + this.errorLogged = false; if (this.definition.subscribeToCompatibilityChanges) { this.subscribeToCompatibilityChanges = definition.subscribeToCompatibilityChanges; @@ -77,7 +79,16 @@ export class ActionInternal public async isCompatible(context: Context): Promise { if (!this.definition.isCompatible) return true; - return await this.definition.isCompatible(context); + try { + return await this.definition.isCompatible(context); + } catch (e) { + if (!this.errorLogged) { + // eslint-disable-next-line no-console + console.error(e); + this.errorLogged = true; + } + return false; + } } public async getHref(context: Context): Promise { diff --git a/src/plugins/unified_histogram/public/chart/histogram.tsx b/src/plugins/unified_histogram/public/chart/histogram.tsx index e63cf775158aa..7e8c6ea382bd4 100644 --- a/src/plugins/unified_histogram/public/chart/histogram.tsx +++ b/src/plugins/unified_histogram/public/chart/histogram.tsx @@ -10,12 +10,12 @@ import { useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; import React, { useState } from 'react'; -import type { DataView } from '@kbn/data-views-plugin/public'; +import type { DataView, DataViewSpec } from '@kbn/data-views-plugin/public'; import type { DefaultInspectorAdapters, Datatable } from '@kbn/expressions-plugin/common'; import type { IKibanaSearchResponse } from '@kbn/search-types'; import type { estypes } from '@elastic/elasticsearch'; import type { TimeRange } from '@kbn/es-query'; -import type { +import { EmbeddableComponentProps, LensEmbeddableInput, LensEmbeddableOutput, @@ -59,6 +59,32 @@ export interface HistogramProps { withDefaultActions: EmbeddableComponentProps['withDefaultActions']; } +/** + * To prevent flakiness in the chart, we need to ensure that the data view config is valid. + * This requires that there are not multiple different data view ids in the given configuration. + * @param dataView + * @param visContext + * @param adHocDataViews + */ +const checkValidDataViewConfig = ( + dataView: DataView, + visContext: UnifiedHistogramVisContext, + adHocDataViews: { [key: string]: DataViewSpec } | undefined +) => { + if (!dataView.id) { + return false; + } + + if (!dataView.isPersisted() && !adHocDataViews?.[dataView.id]) { + return false; + } + + if (dataView.id !== visContext.requestData.dataViewId) { + return false; + } + return true; +}; + const computeTotalHits = ( hasLensSuggestions: boolean, adapterTables: @@ -204,6 +230,10 @@ export function Histogram({ } `; + if (!checkValidDataViewConfig(dataView, visContext, lensProps.attributes.state.adHocDataViews)) { + return <>; + } + return ( <>
{ + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); let message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -69,15 +75,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); - messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -93,18 +99,22 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await dataViews.switchTo('my-example-logs'); + await dataViews.switchToAndValidate('my-example-logs'); + await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); await unifiedFieldList.clickFieldListItemAdd('message'); - let messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + let messageCell: WebElementWrapper; await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); let message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -120,16 +130,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await browser.refresh(); await header.waitUntilLoadingHasFinished(); + await context.waitUntilContextLoadingHasFinished(); - messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -149,15 +160,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); - messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); diff --git a/test/functional/apps/discover/esql/_esql_view.ts b/test/functional/apps/discover/esql/_esql_view.ts index b1fd957f97a6d..d27df2244b18b 100644 --- a/test/functional/apps/discover/esql/_esql_view.ts +++ b/test/functional/apps/discover/esql/_esql_view.ts @@ -142,9 +142,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should perform test query correctly', async function () { await timePicker.setDefaultAbsoluteRange(); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); await discover.selectTextBaseLang(); - const testQuery = `from logstash-* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + const testQuery = `from logstash-* | sort @timestamp | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); await header.waitUntilLoadingHasFinished(); @@ -158,7 +162,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render when switching to a time range with no data, then back to a time range with data', async () => { await discover.selectTextBaseLang(); - const testQuery = `from logstash-* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + const testQuery = `from logstash-* | sort @timestamp | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); await header.waitUntilLoadingHasFinished(); @@ -181,8 +188,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should query an index pattern that doesnt translate to a dataview correctly', async function () { await discover.selectTextBaseLang(); - const testQuery = `from logstash* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + const testQuery = `from logstash* | sort @timestamp | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); await header.waitUntilLoadingHasFinished(); @@ -296,6 +305,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); await discover.saveSearch('esql_test2'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); const testQuery = 'from logstash-* | limit 100 | drop @timestamp'; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); diff --git a/test/functional/apps/discover/group3/_lens_vis.ts b/test/functional/apps/discover/group3/_lens_vis.ts index 03641ee5bcb41..bf7c41c803f17 100644 --- a/test/functional/apps/discover/group3/_lens_vis.ts +++ b/test/functional/apps/discover/group3/_lens_vis.ts @@ -110,8 +110,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return seriesType; } - // FLAKY: https://github.com/elastic/kibana/issues/184600 - describe.skip('discover lens vis', function () { + describe('discover lens vis', function () { before(async () => { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); @@ -655,8 +654,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await discover.waitUntilSearchingHasFinished(); await testSubjects.missingOrFail('unsavedChangesBadge'); - await discover.chooseLensSuggestion('pie'); - expect(await getCurrentVisTitle()).to.be('Pie'); + await discover.chooseLensSuggestion('waffle'); + expect(await getCurrentVisTitle()).to.be('Waffle'); await testSubjects.existOrFail('partitionVisChart'); expect(await discover.getVisContextSuggestionType()).to.be('lensSuggestion'); diff --git a/test/functional/page_objects/unified_field_list.ts b/test/functional/page_objects/unified_field_list.ts index 4751769f717bd..6a5f16a2cac30 100644 --- a/test/functional/page_objects/unified_field_list.ts +++ b/test/functional/page_objects/unified_field_list.ts @@ -204,10 +204,9 @@ export class UnifiedFieldListPageObject extends FtrService { if (!isActive) { // expand the field to show the "Visualize" button - await field.click(); + await this.clickFieldListItem(fieldName); } - await this.waitUntilFieldPopoverIsOpen(); const visualizeButtonTestSubject = `fieldVisualize-${fieldName}`; // wrap visualize button click in retry to ensure button is clicked and retry if button click is not registered await this.retry.try(async () => { diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts index f56b58cfa88f1..36e5285a529b8 100644 --- a/test/functional/services/data_grid.ts +++ b/test/functional/services/data_grid.ts @@ -166,6 +166,12 @@ export class DataGridService extends FtrService { ); } + public async getCellElementByColumnName(rowIndex: number, columnName: string) { + return await this.find.byCssSelector( + `[data-test-subj="euiDataGridBody"] [data-test-subj="dataGridRowCell"][data-gridcell-column-id="${columnName}"][data-gridcell-visible-row-index="${rowIndex}"]` + ); + } + private async getCellActionButton( rowIndex: number = 0, columnIndex: number = 0, diff --git a/test/plugin_functional/test_suites/panel_actions/index.ts b/test/plugin_functional/test_suites/panel_actions/index.ts index ad4871e961db1..5e18d768acf13 100644 --- a/test/plugin_functional/test_suites/panel_actions/index.ts +++ b/test/plugin_functional/test_suites/panel_actions/index.ts @@ -19,7 +19,8 @@ export default function ({ const kibanaServer = getService('kibanaServer'); const { common, dashboard } = getPageObjects(['common', 'dashboard']); - describe('pluggable panel actions', function () { + // Failing: See https://github.com/elastic/kibana/issues/197475 + describe.skip('pluggable panel actions', function () { before(async () => { await browser.setWindowSize(1300, 900); await kibanaServer.savedObjects.cleanStandardList(); diff --git a/versions.json b/versions.json index c657a16ecc1ac..d7e25ae6b4760 100644 --- a/versions.json +++ b/versions.json @@ -8,11 +8,16 @@ "currentMinor": true }, { - "version": "8.17.0", + "version": "8.18.0", "branch": "8.x", "previousMajor": true, "previousMinor": true }, + { + "version": "8.17.0", + "branch": "8.17", + "previousMajor": true + }, { "version": "8.16.1", "branch": "8.16", diff --git a/x-pack/packages/ai-infra/inference-common/index.ts b/x-pack/packages/ai-infra/inference-common/index.ts index 2791896c801ef..4b5ef3a5cfda1 100644 --- a/x-pack/packages/ai-infra/inference-common/index.ts +++ b/x-pack/packages/ai-infra/inference-common/index.ts @@ -34,6 +34,9 @@ export { type ChatCompleteStreamResponse, type ChatCompleteResponse, type ChatCompletionTokenCount, + type BoundChatCompleteAPI, + type BoundChatCompleteOptions, + type UnboundChatCompleteOptions, withoutTokenCountEvents, withoutChunkEvents, isChatCompletionMessageEvent, @@ -59,6 +62,9 @@ export { type OutputUpdateEvent, type Output, type OutputEvent, + type BoundOutputAPI, + type BoundOutputOptions, + type UnboundOutputOptions, isOutputCompleteEvent, isOutputUpdateEvent, isOutputEvent, diff --git a/x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts b/x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts new file mode 100644 index 0000000000000..083620ed99a93 --- /dev/null +++ b/x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ChatCompleteOptions, ChatCompleteCompositeResponse } from './api'; +import type { ToolOptions } from './tools'; + +/** + * Static options used to call the {@link BoundChatCompleteAPI} + */ +export type BoundChatCompleteOptions< + TToolOptions extends ToolOptions = ToolOptions, + TStream extends boolean = false +> = Pick, 'connectorId' | 'functionCalling'>; + +/** + * Options used to call the {@link BoundChatCompleteAPI} + */ +export type UnboundChatCompleteOptions< + TToolOptions extends ToolOptions = ToolOptions, + TStream extends boolean = false +> = Omit, 'connectorId' | 'functionCalling'>; + +/** + * Version of {@link ChatCompleteAPI} that got pre-bound to a set of static parameters + */ +export type BoundChatCompleteAPI = < + TToolOptions extends ToolOptions = ToolOptions, + TStream extends boolean = false +>( + options: UnboundChatCompleteOptions +) => ChatCompleteCompositeResponse; diff --git a/x-pack/packages/ai-infra/inference-common/src/chat_complete/index.ts b/x-pack/packages/ai-infra/inference-common/src/chat_complete/index.ts index ca69f39b273e5..3daa898ab2e1a 100644 --- a/x-pack/packages/ai-infra/inference-common/src/chat_complete/index.ts +++ b/x-pack/packages/ai-infra/inference-common/src/chat_complete/index.ts @@ -13,6 +13,11 @@ export type { ChatCompleteStreamResponse, ChatCompleteResponse, } from './api'; +export type { + BoundChatCompleteAPI, + BoundChatCompleteOptions, + UnboundChatCompleteOptions, +} from './bound_api'; export { ChatCompletionEventType, type ChatCompletionMessageEvent, diff --git a/x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts b/x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts new file mode 100644 index 0000000000000..967dac20c0568 --- /dev/null +++ b/x-pack/packages/ai-infra/inference-common/src/output/bound_api.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 type { OutputOptions, OutputCompositeResponse } from './api'; +import type { ToolSchema } from '../chat_complete/tool_schema'; + +/** + * Static options used to call the {@link BoundOutputAPI} + */ +export type BoundOutputOptions< + TId extends string = string, + TOutputSchema extends ToolSchema | undefined = ToolSchema | undefined, + TStream extends boolean = false +> = Pick, 'connectorId' | 'functionCalling'>; + +/** + * Options used to call the {@link BoundOutputAPI} + */ +export type UnboundOutputOptions< + TId extends string = string, + TOutputSchema extends ToolSchema | undefined = ToolSchema | undefined, + TStream extends boolean = false +> = Omit, 'connectorId' | 'functionCalling'>; + +/** + * Version of {@link OutputAPI} that got pre-bound to a set of static parameters + */ +export type BoundOutputAPI = < + TId extends string = string, + TOutputSchema extends ToolSchema | undefined = ToolSchema | undefined, + TStream extends boolean = false +>( + options: UnboundOutputOptions +) => OutputCompositeResponse; diff --git a/x-pack/packages/ai-infra/inference-common/src/output/index.ts b/x-pack/packages/ai-infra/inference-common/src/output/index.ts index a3039005b2f7c..d4e17967b50f5 100644 --- a/x-pack/packages/ai-infra/inference-common/src/output/index.ts +++ b/x-pack/packages/ai-infra/inference-common/src/output/index.ts @@ -12,6 +12,7 @@ export type { OutputResponse, OutputStreamResponse, } from './api'; +export type { BoundOutputAPI, BoundOutputOptions, UnboundOutputOptions } from './bound_api'; export { OutputEventType, type OutputCompleteEvent, diff --git a/x-pack/packages/kbn-langchain/server/index.ts b/x-pack/packages/kbn-langchain/server/index.ts index 4ffe3aec864d6..ebd1c0e5b49d4 100644 --- a/x-pack/packages/kbn-langchain/server/index.ts +++ b/x-pack/packages/kbn-langchain/server/index.ts @@ -11,6 +11,7 @@ import { ActionsClientLlm } from './language_models/llm'; import { ActionsClientSimpleChatModel } from './language_models/simple_chat_model'; import { ActionsClientGeminiChatModel } from './language_models/gemini_chat'; import { ActionsClientChatVertexAI } from './language_models/chat_vertex'; +import { ActionsClientChatBedrockConverse } from './language_models/chat_bedrock_converse'; import { parseBedrockStream } from './utils/bedrock'; import { parseGeminiResponse } from './utils/gemini'; import { getDefaultArguments } from './language_models/constants'; @@ -25,4 +26,5 @@ export { ActionsClientGeminiChatModel, ActionsClientLlm, ActionsClientSimpleChatModel, + ActionsClientChatBedrockConverse, }; diff --git a/x-pack/packages/kbn-langchain/server/language_models/bedrock_chat.ts b/x-pack/packages/kbn-langchain/server/language_models/bedrock_chat.ts index ac229b97c8757..70395298d3c98 100644 --- a/x-pack/packages/kbn-langchain/server/language_models/bedrock_chat.ts +++ b/x-pack/packages/kbn-langchain/server/language_models/bedrock_chat.ts @@ -9,11 +9,8 @@ import { BedrockChat as _BedrockChat } from '@langchain/community/chat_models/be import type { ActionsClient } from '@kbn/actions-plugin/server'; import { BaseChatModelParams } from '@langchain/core/language_models/chat_models'; import { Logger } from '@kbn/logging'; -import { Readable } from 'stream'; import { PublicMethodsOf } from '@kbn/utility-types'; - -export const DEFAULT_BEDROCK_MODEL = 'anthropic.claude-3-5-sonnet-20240620-v1:0'; -export const DEFAULT_BEDROCK_REGION = 'us-east-1'; +import { prepareMessages, DEFAULT_BEDROCK_MODEL, DEFAULT_BEDROCK_REGION } from '../utils/bedrock'; export interface CustomChatModelInput extends BaseChatModelParams { actionsClient: PublicMethodsOf; @@ -25,6 +22,11 @@ export interface CustomChatModelInput extends BaseChatModelParams { maxTokens?: number; } +/** + * @deprecated Use the ActionsClientChatBedrockConverse chat model instead. + * ActionsClientBedrockChatModel chat model supports non-streaming only the Bedrock Invoke API. + * The LangChain team will support only the Bedrock Converse API in the future. + */ export class ActionsClientBedrockChatModel extends _BedrockChat { constructor({ actionsClient, connectorId, logger, ...params }: CustomChatModelInput) { super({ @@ -36,32 +38,10 @@ export class ActionsClientBedrockChatModel extends _BedrockChat { fetchFn: async (url, options) => { const inputBody = JSON.parse(options?.body as string); - if (this.streaming && !inputBody.tools?.length) { - const data = (await actionsClient.execute({ - actionId: connectorId, - params: { - subAction: 'invokeStream', - subActionParams: { - messages: inputBody.messages, - temperature: params.temperature ?? inputBody.temperature, - stopSequences: inputBody.stop_sequences, - system: inputBody.system, - maxTokens: params.maxTokens ?? inputBody.max_tokens, - tools: inputBody.tools, - anthropicVersion: inputBody.anthropic_version, - }, - }, - })) as { data: Readable; status: string; message?: string; serviceMessage?: string }; - - if (data.status === 'error') { - throw new Error( - `ActionsClientBedrockChat: action result status is error: ${data?.message} - ${data?.serviceMessage}` - ); - } - - return { - body: Readable.toWeb(data.data), - } as unknown as Response; + if (this.streaming) { + throw new Error( + `ActionsClientBedrockChat does not support streaming, use ActionsClientChatBedrockConverse instead` + ); } const data = (await actionsClient.execute({ @@ -84,7 +64,6 @@ export class ActionsClientBedrockChatModel extends _BedrockChat { message?: string; serviceMessage?: string; }; - if (data.status === 'error') { throw new Error( `ActionsClientBedrockChat: action result status is error: ${data?.message} - ${data?.serviceMessage}` @@ -99,20 +78,3 @@ export class ActionsClientBedrockChatModel extends _BedrockChat { }); } } - -const prepareMessages = (messages: Array<{ role: string; content: string[] }>) => - messages.reduce((acc, { role, content }) => { - const lastMessage = acc[acc.length - 1]; - - if (!lastMessage || lastMessage.role !== role) { - acc.push({ role, content }); - return acc; - } - - if (lastMessage.role === role) { - acc[acc.length - 1].content = lastMessage.content.concat(content); - return acc; - } - - return acc; - }, [] as Array<{ role: string; content: string[] }>); diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/bedrock_runtime_client.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/bedrock_runtime_client.ts new file mode 100644 index 0000000000000..359342870a8b9 --- /dev/null +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/bedrock_runtime_client.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + BedrockRuntimeClient as _BedrockRuntimeClient, + BedrockRuntimeClientConfig, +} from '@aws-sdk/client-bedrock-runtime'; +import { constructStack } from '@smithy/middleware-stack'; +import { PublicMethodsOf } from '@kbn/utility-types'; +import type { ActionsClient } from '@kbn/actions-plugin/server'; + +import { NodeHttpHandler } from './node_http_handler'; + +export interface CustomChatModelInput extends BedrockRuntimeClientConfig { + actionsClient: PublicMethodsOf; + connectorId: string; + streaming?: boolean; +} + +export class BedrockRuntimeClient extends _BedrockRuntimeClient { + middlewareStack: _BedrockRuntimeClient['middlewareStack']; + + constructor({ actionsClient, connectorId, ...fields }: CustomChatModelInput) { + super(fields ?? {}); + this.config.requestHandler = new NodeHttpHandler({ + streaming: fields.streaming ?? true, + actionsClient, + connectorId, + }); + // eliminate middleware steps that handle auth as Kibana connector handles auth + this.middlewareStack = constructStack() as _BedrockRuntimeClient['middlewareStack']; + } +} diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/chat_bedrock_converse.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/chat_bedrock_converse.ts new file mode 100644 index 0000000000000..bdc84130925d6 --- /dev/null +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/chat_bedrock_converse.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { ChatBedrockConverse } from '@langchain/aws'; +import type { ActionsClient } from '@kbn/actions-plugin/server'; +import { BaseChatModelParams } from '@langchain/core/language_models/chat_models'; +import { Logger } from '@kbn/logging'; +import { PublicMethodsOf } from '@kbn/utility-types'; +import { BedrockRuntimeClient } from './bedrock_runtime_client'; +import { DEFAULT_BEDROCK_MODEL, DEFAULT_BEDROCK_REGION } from '../../utils/bedrock'; + +export interface CustomChatModelInput extends BaseChatModelParams { + actionsClient: PublicMethodsOf; + connectorId: string; + logger: Logger; + signal?: AbortSignal; + model?: string; +} + +/** + * Custom chat model class for Bedrock Converse API. + * The ActionsClientChatBedrockConverse chat model supports streaming and + * non-streaming via the Bedrock Converse and ConverseStream APIs. + * + * @param {Object} params - The parameters for the chat model. + * @param {ActionsClient} params.actionsClient - The actions client. + * @param {string} params.connectorId - The connector ID. + * @param {Logger} params.logger - The logger instance. + * @param {AbortSignal} [params.signal] - Optional abort signal. + * @param {string} [params.model] - Optional model name. + */ +export class ActionsClientChatBedrockConverse extends ChatBedrockConverse { + constructor({ actionsClient, connectorId, logger, ...fields }: CustomChatModelInput) { + super({ + ...(fields ?? {}), + credentials: { accessKeyId: '', secretAccessKey: '' }, + model: fields?.model ?? DEFAULT_BEDROCK_MODEL, + region: DEFAULT_BEDROCK_REGION, + }); + this.client = new BedrockRuntimeClient({ + actionsClient, + connectorId, + streaming: this.streaming, + region: DEFAULT_BEDROCK_REGION, + }); + } +} diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/index.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/index.ts new file mode 100644 index 0000000000000..2d22184224166 --- /dev/null +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ActionsClientChatBedrockConverse } from './chat_bedrock_converse'; + +export { ActionsClientChatBedrockConverse }; diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.test.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.test.ts new file mode 100644 index 0000000000000..ba8a1db1fbb00 --- /dev/null +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.test.ts @@ -0,0 +1,125 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { NodeHttpHandler } from './node_http_handler'; +import { HttpRequest } from '@smithy/protocol-http'; +import { actionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; +import { Readable } from 'stream'; +import { fromUtf8 } from '@smithy/util-utf8'; + +const mockActionsClient = actionsClientMock.create(); +const connectorId = 'mock-connector-id'; +const mockOutput = { + output: { + message: { + role: 'assistant', + content: [{ text: 'This is a response from the assistant.' }], + }, + }, + stopReason: 'end_turn', + usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 }, + metrics: { latencyMs: 123 }, + additionalModelResponseFields: {}, + trace: { guardrail: { modelOutput: ['Output text'] } }, +}; +describe('NodeHttpHandler', () => { + let handler: NodeHttpHandler; + + beforeEach(() => { + jest.clearAllMocks(); + handler = new NodeHttpHandler({ + streaming: false, + actionsClient: mockActionsClient, + connectorId, + }); + + mockActionsClient.execute.mockResolvedValue({ + data: mockOutput, + actionId: 'mock-action-id', + status: 'ok', + }); + }); + + it('handles non-streaming requests successfully', async () => { + const request = new HttpRequest({ + body: JSON.stringify({ messages: [] }), + }); + + const result = await handler.handle(request); + + expect(result.response.statusCode).toBe(200); + expect(result.response.headers['content-type']).toBe('application/json'); + expect(result.response.body).toStrictEqual(fromUtf8(JSON.stringify(mockOutput))); + }); + + it('handles streaming requests successfully', async () => { + handler = new NodeHttpHandler({ + streaming: true, + actionsClient: mockActionsClient, + connectorId, + }); + + const request = new HttpRequest({ + body: JSON.stringify({ messages: [] }), + }); + + const readable = new Readable(); + readable.push('streaming data'); + readable.push(null); + + mockActionsClient.execute.mockResolvedValue({ + data: readable, + status: 'ok', + actionId: 'mock-action-id', + }); + + const result = await handler.handle(request); + + expect(result.response.statusCode).toBe(200); + expect(result.response.body).toBe(readable); + }); + + it('throws an error for non-streaming requests with error status', async () => { + const request = new HttpRequest({ + body: JSON.stringify({ messages: [] }), + }); + + mockActionsClient.execute.mockResolvedValue({ + status: 'error', + message: 'error message', + serviceMessage: 'service error message', + actionId: 'mock-action-id', + }); + + await expect(handler.handle(request)).rejects.toThrow( + 'ActionsClientBedrockChat: action result status is error: error message - service error message' + ); + }); + + it('throws an error for streaming requests with error status', async () => { + handler = new NodeHttpHandler({ + streaming: true, + actionsClient: mockActionsClient, + connectorId, + }); + + const request = new HttpRequest({ + body: JSON.stringify({ messages: [] }), + }); + + mockActionsClient.execute.mockResolvedValue({ + status: 'error', + message: 'error message', + serviceMessage: 'service error message', + actionId: 'mock-action-id', + }); + + await expect(handler.handle(request)).rejects.toThrow( + 'ActionsClientBedrockChat: action result status is error: error message - service error message' + ); + }); +}); diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.ts new file mode 100644 index 0000000000000..bd5143ef45d4a --- /dev/null +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { NodeHttpHandler as _NodeHttpHandler } from '@smithy/node-http-handler'; +import { HttpRequest, HttpResponse } from '@smithy/protocol-http'; +import { HttpHandlerOptions, NodeHttpHandlerOptions } from '@smithy/types'; +import { PublicMethodsOf } from '@kbn/utility-types'; +import type { ActionsClient } from '@kbn/actions-plugin/server'; +import { Readable } from 'stream'; +import { fromUtf8 } from '@smithy/util-utf8'; +import { ConverseResponse } from '@aws-sdk/client-bedrock-runtime'; +import { prepareMessages } from '../../utils/bedrock'; + +interface NodeHandlerOptions extends NodeHttpHandlerOptions { + streaming: boolean; + actionsClient: PublicMethodsOf; + connectorId: string; +} + +export class NodeHttpHandler extends _NodeHttpHandler { + streaming: boolean; + actionsClient: PublicMethodsOf; + connectorId: string; + constructor(options: NodeHandlerOptions) { + super(options); + this.streaming = options.streaming; + this.actionsClient = options.actionsClient; + this.connectorId = options.connectorId; + } + + async handle( + request: HttpRequest, + options: HttpHandlerOptions = {} + ): Promise<{ response: HttpResponse }> { + const body = JSON.parse(request.body); + const messages = prepareMessages(body.messages); + + if (this.streaming) { + const data = (await this.actionsClient.execute({ + actionId: this.connectorId, + params: { + subAction: 'converseStream', + subActionParams: { ...body, messages, signal: options.abortSignal }, + }, + })) as { data: Readable; status: string; message?: string; serviceMessage?: string }; + + if (data.status === 'error') { + throw new Error( + `ActionsClientBedrockChat: action result status is error: ${data?.message} - ${data?.serviceMessage}` + ); + } + + return { + response: { + statusCode: 200, + headers: {}, + body: data.data, + }, + }; + } + + const data = (await this.actionsClient.execute({ + actionId: this.connectorId, + params: { + subAction: 'converse', + subActionParams: { ...body, messages, signal: options.abortSignal }, + }, + })) as { data: ConverseResponse; status: string; message?: string; serviceMessage?: string }; + + if (data.status === 'error') { + throw new Error( + `ActionsClientBedrockChat: action result status is error: ${data?.message} - ${data?.serviceMessage}` + ); + } + + return { + response: { + statusCode: 200, + headers: { 'content-type': 'application/json' }, + body: fromUtf8(JSON.stringify(data.data)), + }, + }; + } +} diff --git a/x-pack/packages/kbn-langchain/server/utils/bedrock.ts b/x-pack/packages/kbn-langchain/server/utils/bedrock.ts index 39e5e77864fef..7c8c069e5eb5a 100644 --- a/x-pack/packages/kbn-langchain/server/utils/bedrock.ts +++ b/x-pack/packages/kbn-langchain/server/utils/bedrock.ts @@ -222,3 +222,27 @@ function parseContent(content: Array<{ text?: string; type: string }>): string { } return parsedContent; } + +/** + * Prepare messages for the bedrock API by combining messages from the same role + * @param messages + */ +export const prepareMessages = (messages: Array<{ role: string; content: string[] }>) => + messages.reduce((acc, { role, content }) => { + const lastMessage = acc[acc.length - 1]; + + if (!lastMessage || lastMessage.role !== role) { + acc.push({ role, content }); + return acc; + } + + if (lastMessage.role === role) { + acc[acc.length - 1].content = lastMessage.content.concat(content); + return acc; + } + + return acc; + }, [] as Array<{ role: string; content: string[] }>); + +export const DEFAULT_BEDROCK_MODEL = 'anthropic.claude-3-5-sonnet-20240620-v1:0'; +export const DEFAULT_BEDROCK_REGION = 'us-east-1'; diff --git a/x-pack/packages/security-solution/features/product_features.ts b/x-pack/packages/security-solution/features/product_features.ts index b2c524ff6de1d..67d61f21fae5e 100644 --- a/x-pack/packages/security-solution/features/product_features.ts +++ b/x-pack/packages/security-solution/features/product_features.ts @@ -6,6 +6,6 @@ */ export { getSecurityFeature } from './src/security'; -export { getCasesFeature } from './src/cases'; +export { getCasesFeature, getCasesV2Feature } from './src/cases'; export { getAssistantFeature } from './src/assistant'; export { getAttackDiscoveryFeature } from './src/attack_discovery'; diff --git a/x-pack/packages/security-solution/features/src/cases/index.ts b/x-pack/packages/security-solution/features/src/cases/index.ts index 1dcb33d9c3be3..17e5110538b37 100644 --- a/x-pack/packages/security-solution/features/src/cases/index.ts +++ b/x-pack/packages/security-solution/features/src/cases/index.ts @@ -6,10 +6,21 @@ */ import type { CasesSubFeatureId } from '../product_features_keys'; import type { ProductFeatureParams } from '../types'; -import { getCasesBaseKibanaFeature } from './kibana_features'; -import { getCasesBaseKibanaSubFeatureIds, getCasesSubFeaturesMap } from './kibana_sub_features'; +import { getCasesBaseKibanaFeature } from './v1_features/kibana_features'; +import { + getCasesBaseKibanaSubFeatureIds, + getCasesSubFeaturesMap, +} from './v1_features/kibana_sub_features'; import type { CasesFeatureParams } from './types'; +import { getCasesBaseKibanaFeatureV2 } from './v2_features/kibana_features'; +import { + getCasesBaseKibanaSubFeatureIdsV2, + getCasesSubFeaturesMapV2, +} from './v2_features/kibana_sub_features'; +/** + * @deprecated Use getCasesV2Feature instead + */ export const getCasesFeature = ( params: CasesFeatureParams ): ProductFeatureParams => ({ @@ -17,3 +28,11 @@ export const getCasesFeature = ( baseKibanaSubFeatureIds: getCasesBaseKibanaSubFeatureIds(), subFeaturesMap: getCasesSubFeaturesMap(params), }); + +export const getCasesV2Feature = ( + params: CasesFeatureParams +): ProductFeatureParams => ({ + baseKibanaFeature: getCasesBaseKibanaFeatureV2(params), + baseKibanaSubFeatureIds: getCasesBaseKibanaSubFeatureIdsV2(), + subFeaturesMap: getCasesSubFeaturesMapV2(params), +}); diff --git a/x-pack/packages/security-solution/features/src/cases/types.ts b/x-pack/packages/security-solution/features/src/cases/types.ts index a87a1d787d7c0..17fb10fdd64ee 100644 --- a/x-pack/packages/security-solution/features/src/cases/types.ts +++ b/x-pack/packages/security-solution/features/src/cases/types.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import type { CasesUiCapabilities, CasesApiTags } from '@kbn/cases-plugin/common'; import type { ProductFeatureCasesKey, CasesSubFeatureId } from '../product_features_keys'; import type { ProductFeatureKibanaConfig } from '../types'; diff --git a/x-pack/packages/security-solution/features/src/cases/v1_features/kibana_features.ts b/x-pack/packages/security-solution/features/src/cases/v1_features/kibana_features.ts new file mode 100644 index 0000000000000..db442d894363a --- /dev/null +++ b/x-pack/packages/security-solution/features/src/cases/v1_features/kibana_features.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; +import { KibanaFeatureScope } from '@kbn/features-plugin/common'; +import type { BaseKibanaFeatureConfig } from '../../types'; +import { APP_ID, CASES_FEATURE_ID, CASES_FEATURE_ID_V2 } from '../../constants'; +import type { CasesFeatureParams } from '../types'; + +/** + * @deprecated Use getCasesBaseKibanaFeatureV2 instead + */ +export const getCasesBaseKibanaFeature = ({ + uiCapabilities, + apiTags, + savedObjects, +}: CasesFeatureParams): BaseKibanaFeatureConfig => { + return { + deprecated: { + notice: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.linkSecuritySolutionCase.deprecationMessage', + { + defaultMessage: + 'The {currentId} permissions are deprecated, please see {casesFeatureIdV2}.', + values: { + currentId: CASES_FEATURE_ID, + casesFeatureIdV2: CASES_FEATURE_ID_V2, + }, + } + ), + }, + id: CASES_FEATURE_ID, + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.linkSecuritySolutionCaseTitleDeprecated', + { + defaultMessage: 'Cases (Deprecated)', + } + ), + order: 1100, + category: DEFAULT_APP_CATEGORIES.security, + scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], + app: [CASES_FEATURE_ID, 'kibana'], + catalogue: [APP_ID], + cases: [APP_ID], + privileges: { + all: { + api: [...apiTags.all, ...apiTags.createComment], + app: [CASES_FEATURE_ID, 'kibana'], + catalogue: [APP_ID], + cases: { + create: [APP_ID], + read: [APP_ID], + update: [APP_ID], + push: [APP_ID], + createComment: [APP_ID], + reopenCase: [APP_ID], + }, + savedObject: { + all: [...savedObjects.files], + read: [...savedObjects.files], + }, + ui: uiCapabilities.all, + replacedBy: { + default: [{ feature: CASES_FEATURE_ID_V2, privileges: ['all'] }], + minimal: [ + { + feature: CASES_FEATURE_ID_V2, + privileges: ['minimal_all', 'create_comment', 'case_reopen'], + }, + ], + }, + }, + read: { + api: apiTags.read, + app: [CASES_FEATURE_ID, 'kibana'], + catalogue: [APP_ID], + cases: { + read: [APP_ID], + }, + savedObject: { + all: [], + read: [...savedObjects.files], + }, + ui: uiCapabilities.read, + replacedBy: { + default: [{ feature: CASES_FEATURE_ID_V2, privileges: ['read'] }], + minimal: [{ feature: CASES_FEATURE_ID_V2, privileges: ['minimal_read'] }], + }, + }, + }, + }; +}; diff --git a/x-pack/packages/security-solution/features/src/cases/kibana_sub_features.ts b/x-pack/packages/security-solution/features/src/cases/v1_features/kibana_sub_features.ts similarity index 85% rename from x-pack/packages/security-solution/features/src/cases/kibana_sub_features.ts rename to x-pack/packages/security-solution/features/src/cases/v1_features/kibana_sub_features.ts index 914b23687956b..ade0dbab2bfea 100644 --- a/x-pack/packages/security-solution/features/src/cases/kibana_sub_features.ts +++ b/x-pack/packages/security-solution/features/src/cases/v1_features/kibana_sub_features.ts @@ -7,9 +7,9 @@ import { i18n } from '@kbn/i18n'; import type { SubFeatureConfig } from '@kbn/features-plugin/common'; -import { CasesSubFeatureId } from '../product_features_keys'; -import { APP_ID } from '../constants'; -import type { CasesFeatureParams } from './types'; +import { CasesSubFeatureId } from '../../product_features_keys'; +import { APP_ID, CASES_FEATURE_ID_V2 } from '../../constants'; +import type { CasesFeatureParams } from '../types'; /** * Sub-features that will always be available for Security Cases @@ -21,7 +21,8 @@ export const getCasesBaseKibanaSubFeatureIds = (): CasesSubFeatureId[] => [ ]; /** - * Defines all the Security Assistant subFeatures available. + * @deprecated Use getCasesSubFeaturesMapV2 instead + * @description - Defines all the Security Solution Cases available. * The order of the subFeatures is the order they will be displayed */ export const getCasesSubFeaturesMap = ({ @@ -55,6 +56,7 @@ export const getCasesSubFeaturesMap = ({ delete: [APP_ID], }, ui: uiCapabilities.delete, + replacedBy: [{ feature: CASES_FEATURE_ID_V2, privileges: ['cases_delete'] }], }, ], }, @@ -89,6 +91,7 @@ export const getCasesSubFeaturesMap = ({ settings: [APP_ID], }, ui: uiCapabilities.settings, + replacedBy: [{ feature: CASES_FEATURE_ID_V2, privileges: ['cases_settings'] }], }, ], }, diff --git a/x-pack/packages/security-solution/features/src/cases/v1_features/types.ts b/x-pack/packages/security-solution/features/src/cases/v1_features/types.ts new file mode 100644 index 0000000000000..f17f83ddecce8 --- /dev/null +++ b/x-pack/packages/security-solution/features/src/cases/v1_features/types.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 { ProductFeatureCasesKey, CasesSubFeatureId } from '../../product_features_keys'; +import type { ProductFeatureKibanaConfig } from '../../types'; + +export type DefaultCasesProductFeaturesConfig = Record< + ProductFeatureCasesKey, + ProductFeatureKibanaConfig +>; diff --git a/x-pack/packages/security-solution/features/src/cases/kibana_features.ts b/x-pack/packages/security-solution/features/src/cases/v2_features/kibana_features.ts similarity index 84% rename from x-pack/packages/security-solution/features/src/cases/kibana_features.ts rename to x-pack/packages/security-solution/features/src/cases/v2_features/kibana_features.ts index dd49a60328288..c0c025335d054 100644 --- a/x-pack/packages/security-solution/features/src/cases/kibana_features.ts +++ b/x-pack/packages/security-solution/features/src/cases/v2_features/kibana_features.ts @@ -9,17 +9,17 @@ import { i18n } from '@kbn/i18n'; import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; import { KibanaFeatureScope } from '@kbn/features-plugin/common'; -import type { BaseKibanaFeatureConfig } from '../types'; -import { APP_ID, CASES_FEATURE_ID } from '../constants'; -import type { CasesFeatureParams } from './types'; +import type { BaseKibanaFeatureConfig } from '../../types'; +import { APP_ID, CASES_FEATURE_ID_V2, CASES_FEATURE_ID } from '../../constants'; +import type { CasesFeatureParams } from '../types'; -export const getCasesBaseKibanaFeature = ({ +export const getCasesBaseKibanaFeatureV2 = ({ uiCapabilities, apiTags, savedObjects, }: CasesFeatureParams): BaseKibanaFeatureConfig => { return { - id: CASES_FEATURE_ID, + id: CASES_FEATURE_ID_V2, name: i18n.translate( 'securitySolutionPackages.features.featureRegistry.linkSecuritySolutionCaseTitle', { @@ -41,6 +41,7 @@ export const getCasesBaseKibanaFeature = ({ create: [APP_ID], read: [APP_ID], update: [APP_ID], + push: [APP_ID], }, savedObject: { all: [...savedObjects.files], diff --git a/x-pack/packages/security-solution/features/src/cases/v2_features/kibana_sub_features.ts b/x-pack/packages/security-solution/features/src/cases/v2_features/kibana_sub_features.ts new file mode 100644 index 0000000000000..59aeb866039d4 --- /dev/null +++ b/x-pack/packages/security-solution/features/src/cases/v2_features/kibana_sub_features.ts @@ -0,0 +1,177 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import type { SubFeatureConfig } from '@kbn/features-plugin/common'; +import { CasesSubFeatureId } from '../../product_features_keys'; +import { APP_ID } from '../../constants'; +import type { CasesFeatureParams } from '../types'; + +/** + * Sub-features that will always be available for Security Cases + * regardless of the product type. + */ +export const getCasesBaseKibanaSubFeatureIdsV2 = (): CasesSubFeatureId[] => [ + CasesSubFeatureId.deleteCases, + CasesSubFeatureId.casesSettings, + CasesSubFeatureId.createComment, + CasesSubFeatureId.reopenCase, +]; + +/** + * Defines all the Security Solution Cases subFeatures available. + * The order of the subFeatures is the order they will be displayed + */ +export const getCasesSubFeaturesMapV2 = ({ + uiCapabilities, + apiTags, + savedObjects, +}: CasesFeatureParams) => { + const deleteCasesSubFeature: SubFeatureConfig = { + name: i18n.translate('securitySolutionPackages.features.featureRegistry.deleteSubFeatureName', { + defaultMessage: 'Delete', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + api: apiTags.delete, + id: 'cases_delete', + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.deleteSubFeatureDetails', + { + defaultMessage: 'Delete cases and comments', + } + ), + includeIn: 'all', + savedObject: { + all: [...savedObjects.files], + read: [...savedObjects.files], + }, + cases: { + delete: [APP_ID], + }, + ui: uiCapabilities.delete, + }, + ], + }, + ], + }; + + const casesSettingsCasesSubFeature: SubFeatureConfig = { + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureName', + { + defaultMessage: 'Case settings', + } + ), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: 'cases_settings', + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureDetails', + { + defaultMessage: 'Edit case settings', + } + ), + includeIn: 'all', + savedObject: { + all: [...savedObjects.files], + read: [...savedObjects.files], + }, + cases: { + settings: [APP_ID], + }, + ui: uiCapabilities.settings, + }, + ], + }, + ], + }; + + /* The below sub features were newly added in v2 (8.17) */ + + const casesAddCommentsCasesSubFeature: SubFeatureConfig = { + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.addCommentsSubFeatureName', + { + defaultMessage: 'Create comments & attachments', + } + ), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + api: apiTags.createComment, + id: 'create_comment', + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.addCommentsSubFeatureDetails', + { + defaultMessage: 'Add comments to cases', + } + ), + includeIn: 'all', + savedObject: { + all: [...savedObjects.files], + read: [...savedObjects.files], + }, + cases: { + createComment: [APP_ID], + }, + ui: uiCapabilities.createComment, + }, + ], + }, + ], + }; + const casesreopenCaseSubFeature: SubFeatureConfig = { + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.reopenCaseSubFeatureName', + { + defaultMessage: 'Re-open', + } + ), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: 'case_reopen', + name: i18n.translate( + 'securitySolutionPackages.features.featureRegistry.reopenCaseSubFeatureDetails', + { + defaultMessage: 'Re-open closed cases', + } + ), + includeIn: 'all', + savedObject: { + all: [], + read: [], + }, + cases: { + reopenCase: [APP_ID], + }, + ui: uiCapabilities.reopenCase, + }, + ], + }, + ], + }; + + return new Map([ + [CasesSubFeatureId.deleteCases, deleteCasesSubFeature], + [CasesSubFeatureId.casesSettings, casesSettingsCasesSubFeature], + /* The below sub features were newly added in v2 (8.17) */ + [CasesSubFeatureId.createComment, casesAddCommentsCasesSubFeature], + [CasesSubFeatureId.reopenCase, casesreopenCaseSubFeature], + ]); +}; diff --git a/x-pack/packages/security-solution/features/src/constants.ts b/x-pack/packages/security-solution/features/src/constants.ts index 5027a7c8d393b..c6acab28c4860 100644 --- a/x-pack/packages/security-solution/features/src/constants.ts +++ b/x-pack/packages/security-solution/features/src/constants.ts @@ -9,7 +9,16 @@ export const APP_ID = 'securitySolution' as const; export const SERVER_APP_ID = 'siem' as const; +/** + * @deprecated deprecated in 8.17. Use CASE_FEATURE_ID_V2 instead + */ export const CASES_FEATURE_ID = 'securitySolutionCases' as const; + +// New version created in 8.17 to adopt the roles migration changes +export const CASES_FEATURE_ID_V2 = 'securitySolutionCasesV2' as const; + +export const SECURITY_SOLUTION_CASES_APP_ID = 'securitySolutionCases' as const; + export const ASSISTANT_FEATURE_ID = 'securitySolutionAssistant' as const; export const ATTACK_DISCOVERY_FEATURE_ID = 'securitySolutionAttackDiscovery' as const; diff --git a/x-pack/packages/security-solution/features/src/product_features_keys.ts b/x-pack/packages/security-solution/features/src/product_features_keys.ts index e72e669716c59..42a190b189234 100644 --- a/x-pack/packages/security-solution/features/src/product_features_keys.ts +++ b/x-pack/packages/security-solution/features/src/product_features_keys.ts @@ -148,6 +148,8 @@ export enum SecuritySubFeatureId { export enum CasesSubFeatureId { deleteCases = 'deleteCasesSubFeature', casesSettings = 'casesSettingsSubFeature', + createComment = 'createCommentSubFeature', + reopenCase = 'reopenCaseSubFeature', } /** Sub-features IDs for Security Assistant */ diff --git a/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/__snapshots__/cases.test.ts.snap b/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/__snapshots__/cases.test.ts.snap index 1874a17515e19..2997187697c40 100644 --- a/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/__snapshots__/cases.test.ts.snap +++ b/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/__snapshots__/cases.test.ts.snap @@ -4,7 +4,6 @@ exports[`cases feature_privilege_builder within feature grants all privileges un Array [ "cases:observability/pushCase", "cases:observability/createCase", - "cases:observability/createComment", "cases:observability/getCase", "cases:observability/getComment", "cases:observability/getTags", @@ -17,12 +16,19 @@ Array [ "cases:observability/deleteComment", "cases:observability/createConfiguration", "cases:observability/updateConfiguration", + "cases:observability/createComment", + "cases:observability/reopenCase", ] `; exports[`cases feature_privilege_builder within feature grants create privileges under feature with id securitySolution 1`] = ` Array [ "cases:securitySolution/createCase", +] +`; + +exports[`cases feature_privilege_builder within feature grants createComment privileges under feature with id securitySolution 1`] = ` +Array [ "cases:securitySolution/createComment", ] `; @@ -51,6 +57,12 @@ Array [ ] `; +exports[`cases feature_privilege_builder within feature grants reopenCase privileges under feature with id observability 1`] = ` +Array [ + "cases:observability/reopenCase", +] +`; + exports[`cases feature_privilege_builder within feature grants settings privileges under feature with id observability 1`] = ` Array [ "cases:observability/createConfiguration", diff --git a/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.test.ts b/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.test.ts index ad0563ef7a827..eae3bbc942e34 100644 --- a/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.test.ts +++ b/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.test.ts @@ -48,6 +48,8 @@ describe(`cases`, () => { ['update', 'observability'], ['delete', 'securitySolution'], ['settings', 'observability'], + ['createComment', 'securitySolution'], + ['reopenCase', 'observability'], ])('grants %s privileges under feature with id %s', (operation, featureID) => { const actions = new Actions(); const casesFeaturePrivilege = new FeaturePrivilegeCasesBuilder(actions); @@ -89,6 +91,8 @@ describe(`cases`, () => { delete: ['security'], read: ['obs'], settings: ['security'], + createComment: ['security'], + reopenCase: ['security'], }, savedObject: { all: [], @@ -112,7 +116,6 @@ describe(`cases`, () => { Array [ "cases:security/pushCase", "cases:security/createCase", - "cases:security/createComment", "cases:security/getCase", "cases:security/getComment", "cases:security/getTags", @@ -125,6 +128,8 @@ describe(`cases`, () => { "cases:security/deleteComment", "cases:security/createConfiguration", "cases:security/updateConfiguration", + "cases:security/createComment", + "cases:security/reopenCase", "cases:obs/getCase", "cases:obs/getComment", "cases:obs/getTags", @@ -168,7 +173,6 @@ describe(`cases`, () => { Array [ "cases:security/pushCase", "cases:security/createCase", - "cases:security/createComment", "cases:security/getCase", "cases:security/getComment", "cases:security/getTags", @@ -181,9 +185,10 @@ describe(`cases`, () => { "cases:security/deleteComment", "cases:security/createConfiguration", "cases:security/updateConfiguration", + "cases:security/createComment", + "cases:security/reopenCase", "cases:other-security/pushCase", "cases:other-security/createCase", - "cases:other-security/createComment", "cases:other-security/getCase", "cases:other-security/getComment", "cases:other-security/getTags", @@ -196,6 +201,8 @@ describe(`cases`, () => { "cases:other-security/deleteComment", "cases:other-security/createConfiguration", "cases:other-security/updateConfiguration", + "cases:other-security/createComment", + "cases:other-security/reopenCase", "cases:obs/getCase", "cases:obs/getComment", "cases:obs/getTags", diff --git a/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts b/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts index 7672e1920fd4b..3cf293b935b36 100644 --- a/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts +++ b/x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts @@ -22,7 +22,7 @@ export type CasesSupportedOperations = (typeof allOperations)[number]; */ const pushOperations = ['pushCase'] as const; -const createOperations = ['createCase', 'createComment'] as const; +const createOperations = ['createCase'] as const; const readOperations = [ 'getCase', 'getComment', @@ -31,9 +31,12 @@ const readOperations = [ 'getUserActions', 'findConfigurations', ] as const; +// Update operations do not currently include the ability to re-open a case const updateOperations = ['updateCase', 'updateComment'] as const; const deleteOperations = ['deleteCase', 'deleteComment'] as const; const settingsOperations = ['createConfiguration', 'updateConfiguration'] as const; +const createCommentOperations = ['createComment'] as const; +const reopenOperations = ['reopenCase'] as const; const allOperations = [ ...pushOperations, ...createOperations, @@ -41,6 +44,8 @@ const allOperations = [ ...updateOperations, ...deleteOperations, ...settingsOperations, + ...createCommentOperations, + ...reopenOperations, ] as const; export class FeaturePrivilegeCasesBuilder extends BaseFeaturePrivilegeBuilder { @@ -56,7 +61,6 @@ export class FeaturePrivilegeCasesBuilder extends BaseFeaturePrivilegeBuilder { operations.map((operation) => this.actions.cases.get(owner, operation)) ); }; - return uniq([ ...getCasesPrivilege(allOperations, privilegeDefinition.cases?.all), ...getCasesPrivilege(pushOperations, privilegeDefinition.cases?.push), @@ -65,6 +69,8 @@ export class FeaturePrivilegeCasesBuilder extends BaseFeaturePrivilegeBuilder { ...getCasesPrivilege(updateOperations, privilegeDefinition.cases?.update), ...getCasesPrivilege(deleteOperations, privilegeDefinition.cases?.delete), ...getCasesPrivilege(settingsOperations, privilegeDefinition.cases?.settings), + ...getCasesPrivilege(createCommentOperations, privilegeDefinition.cases?.createComment), + ...getCasesPrivilege(reopenOperations, privilegeDefinition.cases?.reopenCase), ]); } } diff --git a/x-pack/packages/security/ui_components/kibana.jsonc b/x-pack/packages/security/ui_components/kibana.jsonc index 1aad2d80ed7f7..996f7b78e110a 100644 --- a/x-pack/packages/security/ui_components/kibana.jsonc +++ b/x-pack/packages/security/ui_components/kibana.jsonc @@ -1,5 +1,5 @@ { - "type": "shared-common", + "type": "shared-browser", "id": "@kbn/security-ui-components", "owner": "@elastic/kibana-security" } diff --git a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx index 2ed172a49ad8b..6e55fa7ed7bbf 100644 --- a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx +++ b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx @@ -54,6 +54,7 @@ const setup = (config: TestConfig) => { kibanaPrivileges={kibanaPrivileges} onChange={onChange} onChangeAll={onChangeAll} + showAdditionalPermissionsMessage={true} canCustomizeSubFeaturePrivileges={config.canCustomizeSubFeaturePrivileges} privilegeIndex={config.privilegeIndex} allSpacesSelected={true} diff --git a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx index 2f77b55ce5bac..9ee1ea3517dae 100644 --- a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx +++ b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx @@ -45,13 +45,10 @@ interface Props { privilegeIndex: number; onChange: (featureId: string, privileges: string[]) => void; onChangeAll: (privileges: string[]) => void; + showAdditionalPermissionsMessage: boolean; canCustomizeSubFeaturePrivileges: boolean; allSpacesSelected: boolean; disabled?: boolean; - /** - * default is true, to remain backwards compatible - */ - showTitle?: boolean; } interface State { @@ -62,7 +59,6 @@ export class FeatureTable extends Component { public static defaultProps = { privilegeIndex: -1, showLocks: true, - showTitle: true, }; private featureCategories: Map = new Map(); @@ -189,20 +185,7 @@ export class FeatureTable extends Component { return (
- - {this.props.showTitle && ( - - - {i18n.translate( - 'xpack.security.management.editRole.featureTable.featureVisibilityTitle', - { - defaultMessage: 'Customize feature privileges', - } - )} - - - )} - + {!this.props.disabled && ( { }; private getCategoryHelpText = (category: AppCategory) => { - if (category.id === 'management') { + if (category.id === 'management' && this.props.showAdditionalPermissionsMessage) { return i18n.translate( 'xpack.security.management.editRole.featureTable.managementCategoryHelpText', { diff --git a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap index e8b3cc7bebe2a..86f9124702fb2 100644 --- a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap +++ b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap @@ -10,6 +10,45 @@ Object { "presence": "optional", }, "keys": Object { + "apiType": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "matches": Array [ + Object { + "schema": Object { + "allow": Array [ + "converse", + ], + "flags": Object { + "error": [Function], + "only": true, + }, + "type": "any", + }, + }, + Object { + "schema": Object { + "allow": Array [ + "invoke", + ], + "flags": Object { + "error": [Function], + "only": true, + }, + "type": "any", + }, + }, + ], + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "alternatives", + }, "body": Object { "flags": Object { "error": [Function], @@ -131,6 +170,45 @@ Object { "presence": "optional", }, "keys": Object { + "apiType": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "matches": Array [ + Object { + "schema": Object { + "allow": Array [ + "converse", + ], + "flags": Object { + "error": [Function], + "only": true, + }, + "type": "any", + }, + }, + Object { + "schema": Object { + "allow": Array [ + "invoke", + ], + "flags": Object { + "error": [Function], + "only": true, + }, + "type": "any", + }, + }, + ], + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "alternatives", + }, "body": Object { "flags": Object { "error": [Function], @@ -1393,85 +1471,1019 @@ Object { "presence": "optional", }, "keys": Object { - "apiUrl": Object { + "additionalModelRequestFields": Object { "flags": Object { + "default": [Function], "error": [Function], + "presence": "optional", }, - "rules": Array [ + "metas": Array [ Object { - "args": Object { - "method": [Function], - }, - "name": "custom", + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, }, ], - "type": "string", + "type": "any", }, - "defaultModel": Object { + "additionalModelResponseFieldPaths": Object { "flags": Object { - "default": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "default": [Function], "error": [Function], "presence": "optional", }, - "rules": Array [ + "metas": Array [ Object { - "args": Object { - "method": [Function], - }, - "name": "custom", + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, }, ], - "type": "string", - }, - }, - "type": "object", -} -`; - -exports[`Connector type config checks detect connector type changes for: .bedrock 8`] = ` -Object { - "flags": Object { - "default": Object { - "special": "deep", + "type": "any", }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "accessKey": Object { + "guardrailConfig": Object { "flags": Object { + "default": [Function], "error": [Function], + "presence": "optional", }, - "rules": Array [ + "metas": Array [ Object { - "args": Object { - "method": [Function], - }, - "name": "custom", + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, }, ], - "type": "string", + "type": "any", }, - "secret": Object { + "inferenceConfig": Object { "flags": Object { + "default": Object { + "special": "deep", + }, "error": [Function], + "presence": "optional", }, - "rules": Array [ + "keys": Object { + "maxTokens": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + "stopSequences": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "items": Array [ + Object { + "flags": Object { + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + ], + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "array", + }, + "temperature": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + "topP": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + }, + "type": "object", + }, + "messages": Object { + "flags": Object { + "error": [Function], + }, + "items": Array [ Object { - "args": Object { - "method": [Function], + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", }, - "name": "custom", + "keys": Object { + "content": Object { + "flags": Object { + "error": [Function], + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], + "type": "any", + }, + "role": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", }, ], - "type": "string", + "type": "array", }, - }, - "type": "object", -} -`; - + "modelId": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "signal": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, + }, + ], + "type": "any", + }, + "system": Object { + "flags": Object { + "error": [Function], + }, + "items": Array [ + Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "text": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + "toolConfig": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "toolChoice": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + "unknown": true, + }, + "keys": Object {}, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", + }, + "tools": Object { + "flags": Object { + "error": [Function], + }, + "items": Array [ + Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "toolSpec": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "description": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "inputSchema": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "json": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "$schema": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "additionalProperties": Object { + "flags": Object { + "error": [Function], + }, + "type": "boolean", + }, + "properties": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + "unknown": true, + }, + "keys": Object {}, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", + }, + "required": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "items": Array [ + Object { + "flags": Object { + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + ], + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "array", + }, + "type": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + "name": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "object", + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .bedrock 8`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "additionalModelRequestFields": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, + }, + ], + "type": "any", + }, + "additionalModelResponseFieldPaths": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, + }, + ], + "type": "any", + }, + "guardrailConfig": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, + }, + ], + "type": "any", + }, + "inferenceConfig": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "maxTokens": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + "stopSequences": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "items": Array [ + Object { + "flags": Object { + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + ], + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "array", + }, + "temperature": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + "topP": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + }, + "type": "object", + }, + "messages": Object { + "flags": Object { + "error": [Function], + }, + "items": Array [ + Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "content": Object { + "flags": Object { + "error": [Function], + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], + "type": "any", + }, + "role": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + "modelId": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "signal": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, + }, + ], + "type": "any", + }, + "system": Object { + "flags": Object { + "error": [Function], + }, + "items": Array [ + Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "text": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + "toolConfig": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "toolChoice": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + "unknown": true, + }, + "keys": Object {}, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", + }, + "tools": Object { + "flags": Object { + "error": [Function], + }, + "items": Array [ + Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "toolSpec": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "description": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "inputSchema": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "json": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "$schema": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "additionalProperties": Object { + "flags": Object { + "error": [Function], + }, + "type": "boolean", + }, + "properties": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + "unknown": true, + }, + "keys": Object {}, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", + }, + "required": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "items": Array [ + Object { + "flags": Object { + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + ], + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "array", + }, + "type": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + "name": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "object", + }, + }, + "type": "object", +} +`; + exports[`Connector type config checks detect connector type changes for: .bedrock 9`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "apiUrl": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "defaultModel": Object { + "flags": Object { + "default": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .bedrock 10`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "accessKey": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "secret": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .bedrock 11`] = ` Object { "flags": Object { "default": Object { diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts index cc81706fc257c..a1bc118066b9d 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts @@ -61,6 +61,16 @@ describe('getTokenCountFromOpenAIStream', () => { ], }; + const usageChunk = { + object: 'chat.completion.chunk', + choices: [], + usage: { + prompt_tokens: 50, + completion_tokens: 100, + total_tokens: 150, + }, + }; + const PROMPT_TOKEN_COUNT = 36; const COMPLETION_TOKEN_COUNT = 5; @@ -70,55 +80,79 @@ describe('getTokenCountFromOpenAIStream', () => { }); describe('when a stream completes', () => { - beforeEach(async () => { - stream.write('data: [DONE]'); - stream.complete(); - }); + describe('with usage chunk', () => { + it('returns the counts from the usage chunk', async () => { + stream = createStreamMock(); + stream.write(`data: ${JSON.stringify(chunk)}`); + stream.write(`data: ${JSON.stringify(usageChunk)}`); + stream.write('data: [DONE]'); + stream.complete(); - describe('without function tokens', () => { - beforeEach(async () => { tokens = await getTokenCountFromOpenAIStream({ responseStream: stream.transform, logger, body: JSON.stringify(body), }); - }); - it('counts the prompt tokens', () => { - expect(tokens.prompt).toBe(PROMPT_TOKEN_COUNT); - expect(tokens.completion).toBe(COMPLETION_TOKEN_COUNT); - expect(tokens.total).toBe(PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT); + expect(tokens).toEqual({ + prompt: usageChunk.usage.prompt_tokens, + completion: usageChunk.usage.completion_tokens, + total: usageChunk.usage.total_tokens, + }); }); }); - describe('with function tokens', () => { + describe('without usage chunk', () => { beforeEach(async () => { - tokens = await getTokenCountFromOpenAIStream({ - responseStream: stream.transform, - logger, - body: JSON.stringify({ - ...body, - functions: [ - { - name: 'my_function', - description: 'My function description', - parameters: { - type: 'object', - properties: { - my_property: { - type: 'boolean', - description: 'My function property', + stream.write('data: [DONE]'); + stream.complete(); + }); + + describe('without function tokens', () => { + beforeEach(async () => { + tokens = await getTokenCountFromOpenAIStream({ + responseStream: stream.transform, + logger, + body: JSON.stringify(body), + }); + }); + + it('counts the prompt tokens', () => { + expect(tokens.prompt).toBe(PROMPT_TOKEN_COUNT); + expect(tokens.completion).toBe(COMPLETION_TOKEN_COUNT); + expect(tokens.total).toBe(PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT); + }); + }); + + describe('with function tokens', () => { + beforeEach(async () => { + tokens = await getTokenCountFromOpenAIStream({ + responseStream: stream.transform, + logger, + body: JSON.stringify({ + ...body, + functions: [ + { + name: 'my_function', + description: 'My function description', + parameters: { + type: 'object', + properties: { + my_property: { + type: 'boolean', + description: 'My function property', + }, }, }, }, - }, - ], - }), + ], + }), + }); }); - }); - it('counts the function tokens', () => { - expect(tokens.prompt).toBeGreaterThan(PROMPT_TOKEN_COUNT); + it('counts the function tokens', () => { + expect(tokens.prompt).toBeGreaterThan(PROMPT_TOKEN_COUNT); + }); }); }); }); diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts index 790a59fe6097a..5c19a23e6d230 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts @@ -25,44 +25,7 @@ export async function getTokenCountFromOpenAIStream({ prompt: number; completion: number; }> { - const chatCompletionRequest = JSON.parse( - body - ) as OpenAI.ChatCompletionCreateParams.ChatCompletionCreateParamsStreaming; - - // per https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb - const tokensFromMessages = encode( - chatCompletionRequest.messages - .map( - (msg) => - `<|start|>${msg.role}\n${msg.content}\n${ - 'name' in msg - ? msg.name - : 'function_call' in msg && msg.function_call - ? msg.function_call.name + '\n' + msg.function_call.arguments - : '' - }<|end|>` - ) - .join('\n') - ).length; - - // this is an approximation. OpenAI cuts off a function schema - // at a certain level of nesting, so their token count might - // be lower than what we are calculating here. - - const tokensFromFunctions = chatCompletionRequest.functions - ? encode( - chatCompletionRequest.functions - ?.map( - (fn) => - `<|start|>${fn.name}\n${fn.description}\n${JSON.stringify(fn.parameters)}<|end|>` - ) - .join('\n') - ).length - : 0; - - const promptTokens = tokensFromMessages + tokensFromFunctions; - - let responseBody: string = ''; + let responseBody = ''; responseStream.on('data', (chunk: string) => { responseBody += chunk.toString(); @@ -74,7 +37,9 @@ export async function getTokenCountFromOpenAIStream({ logger.error('An error occurred while calculating streaming response tokens'); } - const response = responseBody + let completionUsage: OpenAI.CompletionUsage | undefined; + + const response: ParsedResponse = responseBody .split('\n') .filter((line) => { return line.startsWith('data: ') && !line.endsWith('[DONE]'); @@ -82,31 +47,54 @@ export async function getTokenCountFromOpenAIStream({ .map((line) => { return JSON.parse(line.replace('data: ', '')); }) - .filter( - ( - line - ): line is { - choices: Array<{ - delta: { content?: string; function_call?: { name?: string; arguments: string } }; - }>; - } => { - return ( - 'object' in line && line.object === 'chat.completion.chunk' && line.choices.length > 0 - ); - } - ) + .filter((line): line is OpenAI.ChatCompletionChunk => { + return 'object' in line && line.object === 'chat.completion.chunk'; + }) .reduce( (prev, line) => { - const msg = line.choices[0].delta!; - prev.content += msg.content || ''; - prev.function_call.name += msg.function_call?.name || ''; - prev.function_call.arguments += msg.function_call?.arguments || ''; + if (line.usage) { + completionUsage = line.usage; + } + if (line.choices?.length) { + const msg = line.choices[0].delta!; + prev.content += msg.content || ''; + prev.function_call.name += msg.function_call?.name || ''; + prev.function_call.arguments += msg.function_call?.arguments || ''; + } return prev; }, { content: '', function_call: { name: '', arguments: '' } } ); - const completionTokens = encode( + // not all openAI compatible providers emit completion chunk, so we still have to support + // manually counting the tokens + if (completionUsage) { + return { + prompt: completionUsage.prompt_tokens, + completion: completionUsage.completion_tokens, + total: completionUsage.total_tokens, + }; + } else { + const promptTokens = manuallyCountPromptTokens(body); + const completionTokens = manuallyCountCompletionTokens(response); + return { + prompt: promptTokens, + completion: completionTokens, + total: promptTokens + completionTokens, + }; + } +} + +interface ParsedResponse { + content: string; + function_call: { + name: string; + arguments: string; + }; +} + +const manuallyCountCompletionTokens = (response: ParsedResponse) => { + return encode( JSON.stringify( omitBy( { @@ -117,10 +105,42 @@ export async function getTokenCountFromOpenAIStream({ ) ) ).length; +}; - return { - prompt: promptTokens, - completion: completionTokens, - total: promptTokens + completionTokens, - }; -} +const manuallyCountPromptTokens = (requestBody: string) => { + const chatCompletionRequest: OpenAI.ChatCompletionCreateParams.ChatCompletionCreateParamsStreaming = + JSON.parse(requestBody); + + // per https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb + const tokensFromMessages = encode( + chatCompletionRequest.messages + .map( + (msg) => + `<|start|>${msg.role}\n${msg.content}\n${ + 'name' in msg + ? msg.name + : 'function_call' in msg && msg.function_call + ? msg.function_call.name + '\n' + msg.function_call.arguments + : '' + }<|end|>` + ) + .join('\n') + ).length; + + // this is an approximation. OpenAI cuts off a function schema + // at a certain level of nesting, so their token count might + // be lower than what we are calculating here. + + const tokensFromFunctions = chatCompletionRequest.functions + ? encode( + chatCompletionRequest.functions + ?.map( + (fn) => + `<|start|>${fn.name}\n${fn.description}\n${JSON.stringify(fn.parameters)}<|end|>` + ) + .join('\n') + ).length + : 0; + + return tokensFromMessages + tokensFromFunctions; +}; diff --git a/x-pack/plugins/aiops/public/components/document_count_content/document_count_content/document_count_content.tsx b/x-pack/plugins/aiops/public/components/document_count_content/document_count_content/document_count_content.tsx index 4dbf021e3b10b..9f4f6f1deb5bd 100644 --- a/x-pack/plugins/aiops/public/components/document_count_content/document_count_content/document_count_content.tsx +++ b/x-pack/plugins/aiops/public/components/document_count_content/document_count_content/document_count_content.tsx @@ -31,11 +31,13 @@ export interface DocumentCountContentProps { barStyleAccessor?: BarStyleAccessor; baselineAnnotationStyle?: RectAnnotationSpec['style']; deviationAnnotationStyle?: RectAnnotationSpec['style']; + attachmentsMenu?: React.ReactNode; } export const DocumentCountContent: FC = ({ barColorOverride, barHighlightColorOverride, + attachmentsMenu, ...docCountChartProps }) => { const { data, uiSettings, fieldFormats, charts, embeddingOrigin } = useAiopsAppContext(); @@ -64,7 +66,12 @@ export const DocumentCountContent: FC = ({ return ( - + + + + + {attachmentsMenu && {attachmentsMenu}} + (() => { + const panels = useMemo>(() => { return [ { id: 'attachMainPanel', @@ -205,26 +205,33 @@ export const AttachmentsMenu = ({ ]); return ( - - setIsActionMenuOpen(!isActionMenuOpen)} - /> - } - isOpen={isActionMenuOpen} - closePopover={() => setIsActionMenuOpen(false)} - panelPaddingSize="none" - anchorPosition="downRight" - > - - + <> + {!!panels[0]?.items?.length && ( + + setIsActionMenuOpen(!isActionMenuOpen)} + /> + } + isOpen={isActionMenuOpen} + closePopover={() => setIsActionMenuOpen(false)} + panelPaddingSize="none" + anchorPosition="downRight" + > + + + + )} {dashboardAttachmentReady ? ( ) : null} - + ); }; diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_attachments_menu.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_attachments_menu.tsx new file mode 100644 index 0000000000000..c8c9bad1568a4 --- /dev/null +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_attachments_menu.tsx @@ -0,0 +1,176 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { SaveModalDashboardProps } from '@kbn/presentation-util-plugin/public'; +import { LazySavedObjectSaveModalDashboard } from '@kbn/presentation-util-plugin/public'; +import { withSuspense } from '@kbn/shared-ux-utility'; +import React, { useState, useCallback, useMemo } from 'react'; +import { useTimeRangeUpdates } from '@kbn/ml-date-picker'; +import { EMBEDDABLE_LOG_RATE_ANALYSIS_TYPE } from '@kbn/aiops-log-rate-analysis/constants'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import type { EuiContextMenuProps } from '@elastic/eui'; +import { + EuiButton, + EuiButtonIcon, + EuiContextMenu, + EuiFlexItem, + EuiForm, + EuiFormRow, + EuiPanel, + EuiPopover, + EuiSpacer, + EuiSwitch, +} from '@elastic/eui'; +import { useDataSource } from '../../../hooks/use_data_source'; +import type { LogRateAnalysisEmbeddableState } from '../../../embeddables/log_rate_analysis/types'; +import { useAiopsAppContext } from '../../../hooks/use_aiops_app_context'; + +const SavedObjectSaveModalDashboard = withSuspense(LazySavedObjectSaveModalDashboard); + +export const LogRateAnalysisAttachmentsMenu = () => { + const { + application: { capabilities }, + embeddable, + } = useAiopsAppContext(); + const { dataView } = useDataSource(); + + const [applyTimeRange, setApplyTimeRange] = useState(false); + const [isActionMenuOpen, setIsActionMenuOpen] = useState(false); + const [dashboardAttachmentReady, setDashboardAttachmentReady] = useState(false); + + const timeRange = useTimeRangeUpdates(); + + const canEditDashboards = capabilities.dashboard.createNew; + + const onSave: SaveModalDashboardProps['onSave'] = useCallback( + ({ dashboardId, newTitle, newDescription }) => { + const stateTransfer = embeddable!.getStateTransfer(); + + const embeddableInput: Partial = { + title: newTitle, + description: newDescription, + dataViewId: dataView.id, + hidePanelTitles: false, + ...(applyTimeRange && { timeRange }), + }; + + const state = { + input: embeddableInput, + type: EMBEDDABLE_LOG_RATE_ANALYSIS_TYPE, + }; + + const path = dashboardId === 'new' ? '#/create' : `#/view/${dashboardId}`; + + stateTransfer.navigateToWithEmbeddablePackage('dashboards', { state, path }); + }, + [dataView.id, embeddable, applyTimeRange, timeRange] + ); + + const panels = useMemo>(() => { + return [ + { + id: 'attachMainPanel', + size: 's', + items: [ + ...(canEditDashboards + ? [ + { + name: i18n.translate('xpack.aiops.logRateAnalysis.addToDashboardTitle', { + defaultMessage: 'Add to dashboard', + }), + panel: 'attachToDashboardPanel', + 'data-test-subj': 'aiopsLogRateAnalysisAttachToDashboardButton', + }, + ] + : []), + ], + }, + { + id: 'attachToDashboardPanel', + size: 's', + title: i18n.translate('xpack.aiops.logRateAnalysis.attachToDashboardTitle', { + defaultMessage: 'Add to dashboard', + }), + content: ( + + + + + setApplyTimeRange(e.target.checked)} + /> + + + { + setIsActionMenuOpen(false); + setDashboardAttachmentReady(true); + }} + > + + + + + ), + }, + ]; + }, [canEditDashboards, applyTimeRange]); + + return ( + <> + {!!panels[0]?.items?.length && ( + + setIsActionMenuOpen(!isActionMenuOpen)} + /> + } + isOpen={isActionMenuOpen} + closePopover={() => setIsActionMenuOpen(false)} + panelPaddingSize="none" + anchorPosition="downRight" + > + + + + )} + {dashboardAttachmentReady ? ( + setDashboardAttachmentReady(false)} + onSave={onSave} + /> + ) : null} + + ); +}; diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx index 2821b59353b52..29ac8d0efffc8 100644 --- a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx @@ -38,6 +38,7 @@ import { type LogRateAnalysisResultsData, } from '../log_rate_analysis_results'; import { useAiopsAppContext } from '../../../hooks/use_aiops_app_context'; +import { LogRateAnalysisAttachmentsMenu } from './log_rate_analysis_attachments_menu'; export const DEFAULT_SEARCH_QUERY: estypes.QueryDslQueryContainer = { match_all: {} }; const DEFAULT_SEARCH_BAR_QUERY: estypes.QueryDslQueryContainer = { @@ -216,6 +217,7 @@ export const LogRateAnalysisContent: FC = ({ barColorOverride={barColorOverride} barHighlightColorOverride={barHighlightColorOverride} barStyleAccessor={barStyleAccessor} + attachmentsMenu={} /> )} diff --git a/x-pack/plugins/alerting/server/routes/get_flapping_settings.test.ts b/x-pack/plugins/alerting/server/routes/get_flapping_settings.test.ts index 9ab3c5b41ec80..f35be4a236f67 100644 --- a/x-pack/plugins/alerting/server/routes/get_flapping_settings.test.ts +++ b/x-pack/plugins/alerting/server/routes/get_flapping_settings.test.ts @@ -38,11 +38,15 @@ describe('getFlappingSettingsRoute', () => { Object { "options": Object { "access": "internal", - "tags": Array [ - "access:read-flapping-settings", - ], }, "path": "/internal/alerting/rules/settings/_flapping", + "security": Object { + "authz": Object { + "requiredPrivileges": Array [ + "read-flapping-settings", + ], + }, + }, "validate": false, } `); diff --git a/x-pack/plugins/alerting/server/routes/get_flapping_settings.ts b/x-pack/plugins/alerting/server/routes/get_flapping_settings.ts index a8638c32e5a5c..c17458c62a162 100644 --- a/x-pack/plugins/alerting/server/routes/get_flapping_settings.ts +++ b/x-pack/plugins/alerting/server/routes/get_flapping_settings.ts @@ -37,9 +37,13 @@ export const getFlappingSettingsRoute = ( { path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/settings/_flapping`, validate: false, + security: { + authz: { + requiredPrivileges: [`${API_PRIVILEGES.READ_FLAPPING_SETTINGS}`], + }, + }, options: { access: 'internal', - tags: [`access:${API_PRIVILEGES.READ_FLAPPING_SETTINGS}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts index 1e8d159c17860..cb7e3988bc69f 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts @@ -58,9 +58,16 @@ describe('archiveMaintenanceWindowRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:write-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "write-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.ts index b4ac718489103..2ab64a90b1afa 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.ts @@ -34,9 +34,13 @@ export const archiveMaintenanceWindowRoute = ( params: archiveParamsSchemaV1, body: archiveBodySchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.test.ts index 57fbac5699205..c38f5436b588f 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.test.ts @@ -71,9 +71,16 @@ describe('bulkGetMaintenanceWindowRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:read-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "read-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.ts index e4796a76639ac..614a92701bfb6 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/bulk_get/bulk_get_maintenance_windows_route.ts @@ -31,9 +31,13 @@ export const bulkGetMaintenanceWindowRoute = ( validate: { body: bulkGetBodySchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.test.ts index 171734233c746..b00f4cda86b17 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.test.ts @@ -62,9 +62,16 @@ describe('createMaintenanceWindowRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:write-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "write-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.ts index 652eb94126225..26dfe1fa176f0 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/create_maintenance_window_route.ts @@ -32,9 +32,13 @@ export const createMaintenanceWindowRoute = ( validate: { body: createBodySchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.test.ts index daabef149ff98..f82339eef7e2e 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.test.ts @@ -50,9 +50,16 @@ describe('deleteMaintenanceWindowRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:write-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "write-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.ts index 9d3facaf41f8b..f5d9e28320c3f 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/delete/delete_maintenance_window_route.ts @@ -29,9 +29,13 @@ export const deleteMaintenanceWindowRoute = ( validate: { params: deleteParamsSchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts index 99c1cf7b23f6a..bbabb42b28644 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts @@ -62,9 +62,16 @@ describe('findMaintenanceWindowsRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:read-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "read-maintenance-window", + ], + }, } `); @@ -103,9 +110,16 @@ describe('findMaintenanceWindowsRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:read-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "read-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.ts index 1aa4653e3d8d3..4b75368365bd7 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.ts @@ -49,9 +49,13 @@ export const findMaintenanceWindowsRoute = ( }, }, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts index aa659a30c9b6c..f26d7c4b47866 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts @@ -51,9 +51,16 @@ describe('finishMaintenanceWindowRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:write-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "write-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.ts index 73b5834afd278..40d50dab5e90a 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.ts @@ -31,9 +31,13 @@ export const finishMaintenanceWindowRoute = ( validate: { params: finishParamsSchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts index e6d2eb585a3da..3c617f592915e 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts @@ -51,9 +51,16 @@ describe('getMaintenanceWindowRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:read-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "read-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.ts index 155dc70c2843e..90cfd2f9314ef 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.ts @@ -31,9 +31,13 @@ export const getMaintenanceWindowRoute = ( validate: { params: getParamsSchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts index 3ec493ec85136..3a3ee425cde0d 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts @@ -59,9 +59,16 @@ describe('getActiveMaintenanceWindowsRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:read-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "read-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.ts index 4b487babb0e0d..d8fde5b5a4e12 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.ts @@ -26,9 +26,13 @@ export const getActiveMaintenanceWindowsRoute = ( { path: INTERNAL_ALERTING_API_GET_ACTIVE_MAINTENANCE_WINDOWS_PATH, validate: {}, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.READ_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts index 194366c8b76d0..d11a81f4fe73c 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts @@ -68,9 +68,16 @@ describe('updateMaintenanceWindowRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:write-maintenance-window", - ], + } + `); + + expect(config.security).toMatchInlineSnapshot(` + Object { + "authz": Object { + "requiredPrivileges": Array [ + "write-maintenance-window", + ], + }, } `); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.ts index 44fb680eabc42..475e584cddf4b 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.ts @@ -35,9 +35,13 @@ export const updateMaintenanceWindowRoute = ( body: updateBodySchemaV1, params: updateParamsSchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], + }, + }, options: { access: 'internal', - tags: [`access:${MAINTENANCE_WINDOW_API_PRIVILEGES.WRITE_MAINTENANCE_WINDOW}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.test.ts b/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.test.ts index dc6474fe50a35..dd7eaef96b811 100644 --- a/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.test.ts +++ b/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.test.ts @@ -38,11 +38,15 @@ describe('getQueryDelaySettingsRoute', () => { Object { "options": Object { "access": "internal", - "tags": Array [ - "access:read-query-delay-settings", - ], }, "path": "/internal/alerting/rules/settings/_query_delay", + "security": Object { + "authz": Object { + "requiredPrivileges": Array [ + "read-query-delay-settings", + ], + }, + }, "validate": Object {}, } `); diff --git a/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.ts b/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.ts index 542af574d4459..6d88efcbaa812 100644 --- a/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.ts +++ b/x-pack/plugins/alerting/server/routes/rules_settings/apis/get/get_query_delay_settings.ts @@ -21,9 +21,13 @@ export const getQueryDelaySettingsRoute = ( { path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/settings/_query_delay`, validate: {}, + security: { + authz: { + requiredPrivileges: [`${API_PRIVILEGES.READ_QUERY_DELAY_SETTINGS}`], + }, + }, options: { access: 'internal', - tags: [`access:${API_PRIVILEGES.READ_QUERY_DELAY_SETTINGS}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.test.ts b/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.test.ts index c912a4ff4dec9..7ac53dee40193 100644 --- a/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.test.ts +++ b/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.test.ts @@ -46,9 +46,6 @@ describe('updateQueryDelaySettingsRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:write-query-delay-settings", - ], } `); diff --git a/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.ts b/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.ts index 4d3107f2c9568..e1704ed2f4b45 100644 --- a/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.ts +++ b/x-pack/plugins/alerting/server/routes/rules_settings/apis/update/update_query_delay_settings.ts @@ -27,9 +27,13 @@ export const updateQueryDelaySettingsRoute = ( validate: { body: updateQueryDelaySettingsBodySchemaV1, }, + security: { + authz: { + requiredPrivileges: [`${API_PRIVILEGES.WRITE_QUERY_DELAY_SETTINGS}`], + }, + }, options: { access: 'internal', - tags: [`access:${API_PRIVILEGES.WRITE_QUERY_DELAY_SETTINGS}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/alerting/server/routes/update_flapping_settings.test.ts b/x-pack/plugins/alerting/server/routes/update_flapping_settings.test.ts index 05563afb85176..bca8bfdfbddab 100644 --- a/x-pack/plugins/alerting/server/routes/update_flapping_settings.test.ts +++ b/x-pack/plugins/alerting/server/routes/update_flapping_settings.test.ts @@ -48,9 +48,6 @@ describe('updateFlappingSettingsRoute', () => { expect(config.options).toMatchInlineSnapshot(` Object { "access": "internal", - "tags": Array [ - "access:write-flapping-settings", - ], } `); diff --git a/x-pack/plugins/alerting/server/routes/update_flapping_settings.ts b/x-pack/plugins/alerting/server/routes/update_flapping_settings.ts index d12f185d47e07..e878a7664119d 100644 --- a/x-pack/plugins/alerting/server/routes/update_flapping_settings.ts +++ b/x-pack/plugins/alerting/server/routes/update_flapping_settings.ts @@ -60,9 +60,13 @@ export const updateFlappingSettingsRoute = ( validate: { body: bodySchema, }, + security: { + authz: { + requiredPrivileges: [`${API_PRIVILEGES.WRITE_FLAPPING_SETTINGS}`], + }, + }, options: { access: 'internal', - tags: [`access:${API_PRIVILEGES.WRITE_FLAPPING_SETTINGS}`], }, }, router.handleLegacyErrors( diff --git a/x-pack/plugins/canvas/public/feature_catalogue_entry.ts b/x-pack/plugins/canvas/public/feature_catalogue_entry.ts deleted file mode 100644 index be9661eb891f7..0000000000000 --- a/x-pack/plugins/canvas/public/feature_catalogue_entry.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -import type { FeatureCatalogueCategory } from '@kbn/home-plugin/public'; - -export const featureCatalogueEntry = { - id: 'canvas', - title: 'Canvas', - subtitle: i18n.translate('xpack.canvas.featureCatalogue.canvasSubtitle', { - defaultMessage: 'Design pixel-perfect presentations.', - }), - description: i18n.translate('xpack.canvas.appDescription', { - defaultMessage: 'Showcase your data in a pixel-perfect way.', - }), - icon: 'canvasApp', - path: '/app/canvas', - showOnHomePage: false, - category: 'data' as FeatureCatalogueCategory, - solutionId: 'kibana', - order: 300, -}; diff --git a/x-pack/plugins/canvas/public/plugin.tsx b/x-pack/plugins/canvas/public/plugin.tsx index bd4e920a56f7e..37a0ae1388899 100644 --- a/x-pack/plugins/canvas/public/plugin.tsx +++ b/x-pack/plugins/canvas/public/plugin.tsx @@ -18,6 +18,7 @@ import { AppUpdater, DEFAULT_APP_CATEGORIES, PluginInitializerContext, + AppStatus, } from '@kbn/core/public'; import { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import { SpacesPluginStart } from '@kbn/spaces-plugin/public'; @@ -30,7 +31,6 @@ import { Start as InspectorStart } from '@kbn/inspector-plugin/public'; import { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { ContentManagementPublicStart } from '@kbn/content-management-plugin/public'; -import { featureCatalogueEntry } from './feature_catalogue_entry'; import { CanvasAppLocatorDefinition } from '../common/locator'; import { SESSIONSTORAGE_LASTPATH, CANVAS_APP } from '../common/lib/constants'; import { getSessionStorage } from './lib/storage'; @@ -39,6 +39,7 @@ import { getPluginApi, CanvasApi } from './plugin_api'; import { setupExpressions } from './setup_expressions'; import { addCanvasElementTrigger } from './state/triggers/add_canvas_element_trigger'; import { setKibanaServices, untilPluginStartServicesReady } from './services/kibana_services'; +import { getHasWorkpads } from './services/get_has_workpads'; export type { CoreStart, CoreSetup }; @@ -161,9 +162,11 @@ export class CanvasPlugin }, }); - if (setupPlugins.home) { - setupPlugins.home.featureCatalogue.register(featureCatalogueEntry); - } + getHasWorkpads(coreSetup.http).then((hasWorkpads) => { + this.appUpdater.next(() => ({ + status: hasWorkpads ? AppStatus.accessible : AppStatus.inaccessible, + })); + }); if (setupPlugins.share) { setupPlugins.share.url.locators.create(new CanvasAppLocatorDefinition()); diff --git a/x-pack/plugins/canvas/public/services/get_has_workpads.ts b/x-pack/plugins/canvas/public/services/get_has_workpads.ts new file mode 100644 index 0000000000000..84cfdfc8a29f9 --- /dev/null +++ b/x-pack/plugins/canvas/public/services/get_has_workpads.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpSetup } from '@kbn/core/public'; +import { API_ROUTE_WORKPAD } from '../../common/lib/constants'; + +export async function getHasWorkpads(http: HttpSetup): Promise { + try { + const response = await http.get(`${API_ROUTE_WORKPAD}/hasWorkpads`, { + version: '1', + }); + return (response as { hasWorkpads: boolean })?.hasWorkpads ?? false; + } catch (error) { + return false; + } +} diff --git a/x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts b/x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts new file mode 100644 index 0000000000000..e42c8fe6fb7c9 --- /dev/null +++ b/x-pack/plugins/canvas/server/routes/workpad/has_workpads.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectAttributes } from '@kbn/core/server'; +import { RouteInitializerDeps } from '..'; +import { CANVAS_TYPE, API_ROUTE_WORKPAD } from '../../../common/lib/constants'; + +export function initializeHasWorkpadsRoute(deps: RouteInitializerDeps) { + const { router } = deps; + router.versioned + .get({ + path: `${API_ROUTE_WORKPAD}/hasWorkpads`, + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: {}, + }, + }, + async (context, request, response) => { + const savedObjectsClient = (await context.core).savedObjects.client; + + try { + const workpads = await savedObjectsClient.find({ + type: CANVAS_TYPE, + fields: ['id'], + perPage: 1, + // search across all spaces + namespaces: ['*'], + }); + + return response.ok({ + body: { + hasWorkpads: workpads.total > 0, + }, + }); + } catch (error) { + return response.ok({ + body: { + hasWorkpads: false, + }, + }); + } + } + ); +} diff --git a/x-pack/plugins/canvas/server/routes/workpad/index.ts b/x-pack/plugins/canvas/server/routes/workpad/index.ts index 067b54e7cbebe..fefd1b84fd8a8 100644 --- a/x-pack/plugins/canvas/server/routes/workpad/index.ts +++ b/x-pack/plugins/canvas/server/routes/workpad/index.ts @@ -13,8 +13,10 @@ import { initializeImportWorkpadRoute } from './import'; import { initializeUpdateWorkpadRoute, initializeUpdateWorkpadAssetsRoute } from './update'; import { initializeDeleteWorkpadRoute } from './delete'; import { initializeResolveWorkpadRoute } from './resolve'; +import { initializeHasWorkpadsRoute } from './has_workpads'; export function initWorkpadRoutes(deps: RouteInitializerDeps) { + initializeHasWorkpadsRoute(deps); initializeFindWorkpadsRoute(deps); initializeResolveWorkpadRoute(deps); initializeGetWorkpadRoute(deps); diff --git a/x-pack/plugins/cases/common/constants/application.ts b/x-pack/plugins/cases/common/constants/application.ts index 4b43a17708ab6..01bbea157e7d2 100644 --- a/x-pack/plugins/cases/common/constants/application.ts +++ b/x-pack/plugins/cases/common/constants/application.ts @@ -12,7 +12,9 @@ import { CASE_VIEW_PAGE_TABS } from '../types'; */ export const APP_ID = 'cases' as const; +/** @deprecated Please use FEATURE_ID_V2 instead */ export const FEATURE_ID = 'generalCases' as const; +export const FEATURE_ID_V2 = 'generalCasesV2' as const; export const APP_OWNER = 'cases' as const; export const APP_PATH = '/app/management/insightsAndAlerting/cases' as const; export const CASES_CREATE_PATH = '/create' as const; diff --git a/x-pack/plugins/cases/common/constants/index.ts b/x-pack/plugins/cases/common/constants/index.ts index aa3855807cea2..1fee73f8608c8 100644 --- a/x-pack/plugins/cases/common/constants/index.ts +++ b/x-pack/plugins/cases/common/constants/index.ts @@ -174,6 +174,8 @@ export const DELETE_CASES_CAPABILITY = 'delete_cases' as const; export const PUSH_CASES_CAPABILITY = 'push_cases' as const; export const CASES_SETTINGS_CAPABILITY = 'cases_settings' as const; export const CASES_CONNECTORS_CAPABILITY = 'cases_connectors' as const; +export const CASES_REOPEN_CAPABILITY = 'case_reopen' as const; +export const CREATE_COMMENT_CAPABILITY = 'create_comment' as const; /** * Cases API Tags diff --git a/x-pack/plugins/cases/common/index.ts b/x-pack/plugins/cases/common/index.ts index ead81710c451d..8e3b2644ee01a 100644 --- a/x-pack/plugins/cases/common/index.ts +++ b/x-pack/plugins/cases/common/index.ts @@ -18,6 +18,7 @@ export type { CasesBulkGetResponse, CasePostRequest, + CasePatchRequest, GetRelatedCasesByAlertResponse, UserActionFindResponse, } from './types/api'; @@ -38,6 +39,7 @@ export { CaseSeverity } from './types/domain'; export { APP_ID, FEATURE_ID, + FEATURE_ID_V2, CASES_URL, SECURITY_SOLUTION_OWNER, OBSERVABILITY_OWNER, @@ -55,6 +57,8 @@ export { CASES_CONNECTORS_CAPABILITY, GET_CONNECTORS_CONFIGURE_API_TAG, CASES_SETTINGS_CAPABILITY, + CREATE_COMMENT_CAPABILITY, + CASES_REOPEN_CAPABILITY, } from './constants'; export type { AttachmentAttributes } from './types/domain'; diff --git a/x-pack/plugins/cases/common/ui/types.ts b/x-pack/plugins/cases/common/ui/types.ts index 6d75b30dd119d..99c92e0dbb55b 100644 --- a/x-pack/plugins/cases/common/ui/types.ts +++ b/x-pack/plugins/cases/common/ui/types.ts @@ -11,6 +11,8 @@ import type { DELETE_CASES_CAPABILITY, READ_CASES_CAPABILITY, UPDATE_CASES_CAPABILITY, + CREATE_COMMENT_CAPABILITY, + CASES_REOPEN_CAPABILITY, } from '..'; import type { CASES_CONNECTORS_CAPABILITY, @@ -305,6 +307,8 @@ export interface CasesPermissions { push: boolean; connectors: boolean; settings: boolean; + reopenCase: boolean; + createComment: boolean; } export interface CasesCapabilities { @@ -315,4 +319,6 @@ export interface CasesCapabilities { [PUSH_CASES_CAPABILITY]: boolean; [CASES_CONNECTORS_CAPABILITY]: boolean; [CASES_SETTINGS_CAPABILITY]: boolean; + [CREATE_COMMENT_CAPABILITY]: boolean; + [CASES_REOPEN_CAPABILITY]: boolean; } diff --git a/x-pack/plugins/cases/common/utils/__snapshots__/api_tags.test.ts.snap b/x-pack/plugins/cases/common/utils/__snapshots__/api_tags.test.ts.snap index 9cca596cc84d8..10fdb6da9673a 100644 --- a/x-pack/plugins/cases/common/utils/__snapshots__/api_tags.test.ts.snap +++ b/x-pack/plugins/cases/common/utils/__snapshots__/api_tags.test.ts.snap @@ -6,9 +6,11 @@ Object { "casesSuggestUserProfiles", "bulkGetUserProfiles", "casesGetConnectorsConfigure", - "casesFilesCasesCreate", "casesFilesCasesRead", ], + "createComment": Array [ + "casesFilesCasesCreate", + ], "delete": Array [ "casesFilesCasesDelete", ], @@ -27,9 +29,11 @@ Object { "casesSuggestUserProfiles", "bulkGetUserProfiles", "casesGetConnectorsConfigure", - "observabilityFilesCasesCreate", "observabilityFilesCasesRead", ], + "createComment": Array [ + "observabilityFilesCasesCreate", + ], "delete": Array [ "observabilityFilesCasesDelete", ], @@ -48,9 +52,11 @@ Object { "casesSuggestUserProfiles", "bulkGetUserProfiles", "casesGetConnectorsConfigure", - "securitySolutionFilesCasesCreate", "securitySolutionFilesCasesRead", ], + "createComment": Array [ + "securitySolutionFilesCasesCreate", + ], "delete": Array [ "securitySolutionFilesCasesDelete", ], diff --git a/x-pack/plugins/cases/common/utils/api_tags.ts b/x-pack/plugins/cases/common/utils/api_tags.ts index 3fbad714e55f9..e4750540c5b5e 100644 --- a/x-pack/plugins/cases/common/utils/api_tags.ts +++ b/x-pack/plugins/cases/common/utils/api_tags.ts @@ -18,6 +18,7 @@ export interface CasesApiTags { all: readonly string[]; read: readonly string[]; delete: readonly string[]; + createComment: readonly string[]; } export const getApiTags = (owner: Owner): CasesApiTags => { @@ -30,7 +31,6 @@ export const getApiTags = (owner: Owner): CasesApiTags => { SUGGEST_USER_PROFILES_API_TAG, BULK_GET_USER_PROFILES_API_TAG, GET_CONNECTORS_CONFIGURE_API_TAG, - create, read, ] as const, read: [ @@ -40,5 +40,6 @@ export const getApiTags = (owner: Owner): CasesApiTags => { read, ] as const, delete: [deleteTag] as const, + createComment: [create] as const, }; }; diff --git a/x-pack/plugins/cases/common/utils/capabilities.test.tsx b/x-pack/plugins/cases/common/utils/capabilities.test.tsx index 07b82ea0d0e8f..11f74af8e02d8 100644 --- a/x-pack/plugins/cases/common/utils/capabilities.test.tsx +++ b/x-pack/plugins/cases/common/utils/capabilities.test.tsx @@ -17,6 +17,10 @@ describe('createUICapabilities', () => { "update_cases", "push_cases", "cases_connectors", + "cases_settings", + ], + "createComment": Array [ + "create_comment", ], "delete": Array [ "delete_cases", @@ -25,6 +29,9 @@ describe('createUICapabilities', () => { "read_cases", "cases_connectors", ], + "reopenCase": Array [ + "case_reopen", + ], "settings": Array [ "cases_settings", ], diff --git a/x-pack/plugins/cases/common/utils/capabilities.ts b/x-pack/plugins/cases/common/utils/capabilities.ts index 6b33dd8c8dceb..6897dc6bae774 100644 --- a/x-pack/plugins/cases/common/utils/capabilities.ts +++ b/x-pack/plugins/cases/common/utils/capabilities.ts @@ -13,6 +13,8 @@ import { READ_CASES_CAPABILITY, UPDATE_CASES_CAPABILITY, CASES_SETTINGS_CAPABILITY, + CASES_REOPEN_CAPABILITY, + CREATE_COMMENT_CAPABILITY, } from '../constants'; export interface CasesUiCapabilities { @@ -20,6 +22,8 @@ export interface CasesUiCapabilities { read: readonly string[]; delete: readonly string[]; settings: readonly string[]; + reopenCase: readonly string[]; + createComment: readonly string[]; } /** * Return the UI capabilities for each type of operation. These strings must match the values defined in the UI @@ -32,8 +36,11 @@ export const createUICapabilities = (): CasesUiCapabilities => ({ UPDATE_CASES_CAPABILITY, PUSH_CASES_CAPABILITY, CASES_CONNECTORS_CAPABILITY, + CASES_SETTINGS_CAPABILITY, ] as const, read: [READ_CASES_CAPABILITY, CASES_CONNECTORS_CAPABILITY] as const, delete: [DELETE_CASES_CAPABILITY] as const, settings: [CASES_SETTINGS_CAPABILITY] as const, + reopenCase: [CASES_REOPEN_CAPABILITY] as const, + createComment: [CREATE_COMMENT_CAPABILITY] as const, }); diff --git a/x-pack/plugins/cases/public/client/helpers/can_use_cases.test.ts b/x-pack/plugins/cases/public/client/helpers/can_use_cases.test.ts index 5b82919523f36..69eca9d064602 100644 --- a/x-pack/plugins/cases/public/client/helpers/can_use_cases.test.ts +++ b/x-pack/plugins/cases/public/client/helpers/can_use_cases.test.ts @@ -20,67 +20,67 @@ import { canUseCases } from './can_use_cases'; type CasesCapabilities = Pick< ApplicationStart['capabilities'], - 'securitySolutionCases' | 'observabilityCases' | 'generalCases' + 'securitySolutionCasesV2' | 'observabilityCasesV2' | 'generalCasesV2' >; const hasAll: CasesCapabilities = { - securitySolutionCases: allCasesCapabilities(), - observabilityCases: allCasesCapabilities(), - generalCases: allCasesCapabilities(), + securitySolutionCasesV2: allCasesCapabilities(), + observabilityCasesV2: allCasesCapabilities(), + generalCasesV2: allCasesCapabilities(), }; const hasNone: CasesCapabilities = { - securitySolutionCases: noCasesCapabilities(), - observabilityCases: noCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: noCasesCapabilities(), + observabilityCasesV2: noCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasSecurity: CasesCapabilities = { - securitySolutionCases: allCasesCapabilities(), - observabilityCases: noCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: allCasesCapabilities(), + observabilityCasesV2: noCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasObservability: CasesCapabilities = { - securitySolutionCases: noCasesCapabilities(), - observabilityCases: allCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: noCasesCapabilities(), + observabilityCasesV2: allCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasObservabilityWriteTrue: CasesCapabilities = { - securitySolutionCases: noCasesCapabilities(), - observabilityCases: writeCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: noCasesCapabilities(), + observabilityCasesV2: writeCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasSecurityWriteTrue: CasesCapabilities = { - securitySolutionCases: writeCasesCapabilities(), - observabilityCases: noCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: writeCasesCapabilities(), + observabilityCasesV2: noCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasObservabilityReadTrue: CasesCapabilities = { - securitySolutionCases: noCasesCapabilities(), - observabilityCases: readCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: noCasesCapabilities(), + observabilityCasesV2: readCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasSecurityReadTrue: CasesCapabilities = { - securitySolutionCases: readCasesCapabilities(), - observabilityCases: noCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: readCasesCapabilities(), + observabilityCasesV2: noCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasSecurityWriteAndObservabilityRead: CasesCapabilities = { - securitySolutionCases: writeCasesCapabilities(), - observabilityCases: readCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: writeCasesCapabilities(), + observabilityCasesV2: readCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const hasSecurityConnectors: CasesCapabilities = { - securitySolutionCases: readCasesCapabilities(), - observabilityCases: noCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: readCasesCapabilities(), + observabilityCasesV2: noCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; describe('canUseCases', () => { diff --git a/x-pack/plugins/cases/public/client/helpers/can_use_cases.ts b/x-pack/plugins/cases/public/client/helpers/can_use_cases.ts index 90b0d3b18908f..3e318132f8adf 100644 --- a/x-pack/plugins/cases/public/client/helpers/can_use_cases.ts +++ b/x-pack/plugins/cases/public/client/helpers/can_use_cases.ts @@ -7,7 +7,7 @@ import type { ApplicationStart } from '@kbn/core/public'; import { - FEATURE_ID, + FEATURE_ID_V2, GENERAL_CASES_OWNER, OBSERVABILITY_OWNER, SECURITY_SOLUTION_OWNER, @@ -42,6 +42,8 @@ export const canUseCases = acc.push = acc.push || userCapabilitiesForOwner.push; acc.connectors = acc.connectors || userCapabilitiesForOwner.connectors; acc.settings = acc.settings || userCapabilitiesForOwner.settings; + acc.reopenCase = acc.reopenCase || userCapabilitiesForOwner.reopenCase; + acc.createComment = acc.createComment || userCapabilitiesForOwner.createComment; const allFromAcc = acc.create && @@ -50,7 +52,9 @@ export const canUseCases = acc.delete && acc.push && acc.connectors && - acc.settings; + acc.settings && + acc.reopenCase && + acc.createComment; acc.all = acc.all || userCapabilitiesForOwner.all || allFromAcc; @@ -65,6 +69,8 @@ export const canUseCases = push: false, connectors: false, settings: false, + reopenCase: false, + createComment: false, } ); @@ -75,8 +81,8 @@ export const canUseCases = const getFeatureID = (owner: CasesOwners) => { if (owner === GENERAL_CASES_OWNER) { - return FEATURE_ID; + return FEATURE_ID_V2; } - return `${owner}Cases`; + return `${owner}CasesV2`; }; diff --git a/x-pack/plugins/cases/public/client/helpers/capabilities.test.ts b/x-pack/plugins/cases/public/client/helpers/capabilities.test.ts index ce374243b10b2..ec1b90eee0eb1 100644 --- a/x-pack/plugins/cases/public/client/helpers/capabilities.test.ts +++ b/x-pack/plugins/cases/public/client/helpers/capabilities.test.ts @@ -14,9 +14,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": false, "create": false, + "createComment": false, "delete": false, "push": false, "read": false, + "reopenCase": false, "settings": false, "update": false, } @@ -29,9 +31,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": false, "create": false, + "createComment": false, "delete": false, "push": false, "read": false, + "reopenCase": false, "settings": false, "update": false, } @@ -44,9 +48,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": false, "create": true, + "createComment": false, "delete": false, "push": false, "read": false, + "reopenCase": false, "settings": false, "update": false, } @@ -68,9 +74,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": false, "create": false, + "createComment": false, "delete": false, "push": false, "read": false, + "reopenCase": false, "settings": false, "update": false, } @@ -83,9 +91,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": false, "create": false, + "createComment": false, "delete": false, "push": false, "read": false, + "reopenCase": false, "settings": false, "update": false, } @@ -107,9 +117,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": true, "create": false, + "createComment": false, "delete": true, "push": true, "read": true, + "reopenCase": false, "settings": false, "update": true, } @@ -132,9 +144,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": false, "create": true, + "createComment": false, "delete": true, "push": true, "read": true, + "reopenCase": false, "settings": true, "update": true, } @@ -157,9 +171,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": true, "create": true, + "createComment": false, "delete": true, "push": true, "read": true, + "reopenCase": false, "settings": false, "update": true, } @@ -172,9 +188,11 @@ describe('getUICapabilities', () => { "all": false, "connectors": false, "create": false, + "createComment": false, "delete": false, "push": false, "read": false, + "reopenCase": false, "settings": true, "update": false, } diff --git a/x-pack/plugins/cases/public/client/helpers/capabilities.ts b/x-pack/plugins/cases/public/client/helpers/capabilities.ts index 9be5b5f05f646..634cb3188602d 100644 --- a/x-pack/plugins/cases/public/client/helpers/capabilities.ts +++ b/x-pack/plugins/cases/public/client/helpers/capabilities.ts @@ -14,6 +14,8 @@ import { PUSH_CASES_CAPABILITY, READ_CASES_CAPABILITY, UPDATE_CASES_CAPABILITY, + CASES_REOPEN_CAPABILITY, + CREATE_COMMENT_CAPABILITY, } from '../../../common/constants'; export const getUICapabilities = ( @@ -26,8 +28,19 @@ export const getUICapabilities = ( const push = !!featureCapabilities?.[PUSH_CASES_CAPABILITY]; const connectors = !!featureCapabilities?.[CASES_CONNECTORS_CAPABILITY]; const settings = !!featureCapabilities?.[CASES_SETTINGS_CAPABILITY]; + const reopenCase = !!featureCapabilities?.[CASES_REOPEN_CAPABILITY]; + const createComment = !!featureCapabilities?.[CREATE_COMMENT_CAPABILITY]; - const all = create && read && update && deletePriv && push && connectors && settings; + const all = + create && + read && + update && + deletePriv && + push && + connectors && + settings && + reopenCase && + createComment; return { all, @@ -38,5 +51,7 @@ export const getUICapabilities = ( push, connectors, settings, + reopenCase, + createComment, }; }; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts b/x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts index 7bf4e71e0717a..5e65dd0933e0e 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts @@ -48,7 +48,7 @@ export const useNavigation = jest.fn().mockReturnValue({ export const useApplicationCapabilities = jest.fn().mockReturnValue({ actions: { crud: true, read: true }, - generalCases: { crud: true, read: true }, + generalCasesV2: { crud: true, read: true }, visualize: { crud: true, read: true }, dashboard: { crud: true, read: true }, }); diff --git a/x-pack/plugins/cases/public/common/lib/kibana/hooks.test.tsx b/x-pack/plugins/cases/public/common/lib/kibana/hooks.test.tsx index 8d0beb130edc6..60b798d37822a 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/hooks.test.tsx +++ b/x-pack/plugins/cases/public/common/lib/kibana/hooks.test.tsx @@ -23,7 +23,7 @@ describe('hooks', () => { expect(result.current).toEqual({ actions: { crud: true, read: true }, - generalCases: allCasesPermissions(), + generalCasesV2: allCasesPermissions(), visualize: { crud: true, read: true }, dashboard: { crud: true, read: true }, }); diff --git a/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts b/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts index 3d72e5ca552b9..6a309111ceddb 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts @@ -15,7 +15,7 @@ import type { NavigateToAppOptions } from '@kbn/core/public'; import { getUICapabilities } from '../../../client/helpers/capabilities'; import { convertToCamelCase } from '../../../api/utils'; import { - FEATURE_ID, + FEATURE_ID_V2, DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ, } from '../../../../common/constants'; @@ -166,7 +166,7 @@ interface Capabilities { } interface UseApplicationCapabilities { actions: Capabilities; - generalCases: CasesPermissions; + generalCasesV2: CasesPermissions; visualize: Capabilities; dashboard: Capabilities; } @@ -178,13 +178,13 @@ interface UseApplicationCapabilities { export const useApplicationCapabilities = (): UseApplicationCapabilities => { const capabilities = useKibana().services?.application?.capabilities; - const casesCapabilities = capabilities[FEATURE_ID]; + const casesCapabilities = capabilities[FEATURE_ID_V2]; const permissions = getUICapabilities(casesCapabilities); return useMemo( () => ({ actions: { crud: !!capabilities.actions?.save, read: !!capabilities.actions?.show }, - generalCases: { + generalCasesV2: { all: permissions.all, create: permissions.create, read: permissions.read, @@ -193,6 +193,8 @@ export const useApplicationCapabilities = (): UseApplicationCapabilities => { push: permissions.push, connectors: permissions.connectors, settings: permissions.settings, + reopenCase: permissions.reopenCase, + createComment: permissions.createComment, }, visualize: { crud: !!capabilities.visualize?.save, read: !!capabilities.visualize?.show }, dashboard: { @@ -215,6 +217,8 @@ export const useApplicationCapabilities = (): UseApplicationCapabilities => { permissions.push, permissions.connectors, permissions.settings, + permissions.reopenCase, + permissions.createComment, ] ); }; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.tsx b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.tsx index 0223e4648ac93..48ef98c8dffa8 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.tsx +++ b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.tsx @@ -83,7 +83,7 @@ export const createStartServicesMock = ({ license }: StartServiceArgs = {}): Sta services.application.capabilities = { ...services.application.capabilities, actions: { save: true, show: true }, - generalCases: { + generalCasesV2: { create_cases: true, read_cases: true, update_cases: true, @@ -91,6 +91,8 @@ export const createStartServicesMock = ({ license }: StartServiceArgs = {}): Sta push_cases: true, cases_connectors: true, cases_settings: true, + case_reopen: true, + create_comment: true, }, visualize: { save: true, show: true }, dashboard: { show: true, createNew: true }, diff --git a/x-pack/plugins/cases/public/common/mock/permissions.ts b/x-pack/plugins/cases/public/common/mock/permissions.ts index fce274cd7f338..9e08120a8c275 100644 --- a/x-pack/plugins/cases/public/common/mock/permissions.ts +++ b/x-pack/plugins/cases/public/common/mock/permissions.ts @@ -17,6 +17,8 @@ export const noCasesPermissions = () => push: false, connectors: false, settings: false, + createComment: false, + reopenCase: false, }); export const readCasesPermissions = () => @@ -28,16 +30,52 @@ export const readCasesPermissions = () => push: false, connectors: true, settings: false, + createComment: false, + reopenCase: false, }); export const noCreateCasesPermissions = () => buildCasesPermissions({ create: false }); -export const noUpdateCasesPermissions = () => buildCasesPermissions({ update: false }); +export const noCreateCommentCasesPermissions = () => + buildCasesPermissions({ createComment: false }); +export const noUpdateCasesPermissions = () => + buildCasesPermissions({ update: false, reopenCase: false }); export const noPushCasesPermissions = () => buildCasesPermissions({ push: false }); export const noDeleteCasesPermissions = () => buildCasesPermissions({ delete: false }); +export const noReopenCasesPermissions = () => buildCasesPermissions({ reopenCase: false }); export const writeCasesPermissions = () => buildCasesPermissions({ read: false }); +export const onlyCreateCommentPermissions = () => + buildCasesPermissions({ + read: false, + create: false, + update: false, + delete: true, + push: false, + createComment: true, + reopenCase: false, + }); export const onlyDeleteCasesPermission = () => - buildCasesPermissions({ read: false, create: false, update: false, delete: true, push: false }); + buildCasesPermissions({ + read: false, + create: false, + update: false, + delete: true, + push: false, + createComment: false, + reopenCase: false, + }); +// In practice, a real life user should never have this configuration, but testing for thoroughness +export const onlyReopenCasesPermission = () => + buildCasesPermissions({ + read: false, + create: false, + update: false, + delete: false, + push: false, + createComment: false, + reopenCase: true, + }); export const noConnectorsCasePermission = () => buildCasesPermissions({ connectors: false }); export const noCasesSettingsPermission = () => buildCasesPermissions({ settings: false }); +export const disabledReopenCasePermission = () => buildCasesPermissions({ reopenCase: false }); export const buildCasesPermissions = (overrides: Partial> = {}) => { const create = overrides.create ?? true; @@ -47,7 +85,18 @@ export const buildCasesPermissions = (overrides: Partial push_cases: false, cases_connectors: false, cases_settings: false, + create_comment: false, + case_reopen: false, }); export const readCasesCapabilities = () => buildCasesCapabilities({ @@ -79,6 +132,8 @@ export const readCasesCapabilities = () => delete_cases: false, push_cases: false, cases_settings: false, + create_comment: false, + case_reopen: false, }); export const writeCasesCapabilities = () => { return buildCasesCapabilities({ @@ -95,5 +150,7 @@ export const buildCasesCapabilities = (overrides?: Partial) = push_cases: overrides?.push_cases ?? true, cases_connectors: overrides?.cases_connectors ?? true, cases_settings: overrides?.cases_settings ?? true, + create_comment: overrides?.create_comment ?? true, + case_reopen: overrides?.case_reopen ?? true, }; }; diff --git a/x-pack/plugins/cases/public/components/actions/status/use_should_disable_status.test.tsx b/x-pack/plugins/cases/public/components/actions/status/use_should_disable_status.test.tsx new file mode 100644 index 0000000000000..37957c9fe1f8e --- /dev/null +++ b/x-pack/plugins/cases/public/components/actions/status/use_should_disable_status.test.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { CaseStatuses } from '../../../../common/types/domain'; +import { useUserPermissions } from '../../user_actions/use_user_permissions'; +import { useShouldDisableStatus } from './use_should_disable_status'; + +jest.mock('../../user_actions/use_user_permissions'); +const mockUseUserPermissions = useUserPermissions as jest.Mock; + +describe('useShouldDisableStatus', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should disable status when user has no permissions', () => { + mockUseUserPermissions.mockReturnValue({ + canUpdate: false, + canReopenCase: false, + }); + + const { result } = renderHook(() => useShouldDisableStatus()); + + const cases = [{ status: CaseStatuses.open }]; + expect(result.current(cases)).toBe(true); + }); + + it('should allow status change when user has all permissions', () => { + mockUseUserPermissions.mockReturnValue({ + canUpdate: true, + canReopenCase: true, + }); + + const { result } = renderHook(() => useShouldDisableStatus()); + + const cases = [{ status: CaseStatuses.open }]; + expect(result.current(cases)).toBe(false); + }); + + it('should only allow reopening when user can only reopen cases', () => { + mockUseUserPermissions.mockReturnValue({ + canUpdate: false, + canReopenCase: true, + }); + + const { result } = renderHook(() => useShouldDisableStatus()); + + const cases = [{ status: CaseStatuses.closed }, { status: CaseStatuses.open }]; + + expect(result.current(cases)).toBe(false); + + const closedCases = [{ status: CaseStatuses.closed }]; + expect(result.current(closedCases)).toBe(false); + }); + + it('should prevent reopening closed cases when user cannot reopen', () => { + mockUseUserPermissions.mockReturnValue({ + canUpdate: true, + canReopenCase: false, + }); + + const { result } = renderHook(() => useShouldDisableStatus()); + + const closedCases = [{ status: CaseStatuses.closed }]; + expect(result.current(closedCases)).toBe(true); + + const openCases = [{ status: CaseStatuses.open }]; + expect(result.current(openCases)).toBe(false); + }); + + it('should handle multiple selected cases correctly', () => { + mockUseUserPermissions.mockReturnValue({ + canUpdate: true, + canReopenCase: false, + }); + + const { result } = renderHook(() => useShouldDisableStatus()); + + const mixedCases = [{ status: CaseStatuses.open }, { status: CaseStatuses.closed }]; + + expect(result.current(mixedCases)).toBe(true); + }); +}); diff --git a/x-pack/plugins/cases/public/components/actions/status/use_should_disable_status.tsx b/x-pack/plugins/cases/public/components/actions/status/use_should_disable_status.tsx new file mode 100644 index 0000000000000..e329a3c8787b7 --- /dev/null +++ b/x-pack/plugins/cases/public/components/actions/status/use_should_disable_status.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { useCallback } from 'react'; +import type { CasesUI } from '../../../../common'; +import { CaseStatuses } from '../../../../common/types/domain'; + +import { useUserPermissions } from '../../user_actions/use_user_permissions'; + +export const useShouldDisableStatus = () => { + const { canUpdate, canReopenCase } = useUserPermissions(); + + const shouldDisableStatusFn = useCallback( + (selectedCases: Array>) => { + // Read Only + Disabled => Cannot do anything + const missingAllUpdatePermissions = !canUpdate && !canReopenCase; + if (missingAllUpdatePermissions) return true; + + // All + Enabled reopen => can change status at any point in any way + if (canUpdate && canReopenCase) return false; + + const selectedCasesContainsClosed = selectedCases.some( + (theCase) => theCase.status === CaseStatuses.closed + ); + + if (selectedCasesContainsClosed) { + return !canReopenCase; + } else { + return !canUpdate; + } + }, + [canReopenCase, canUpdate] + ); + + return shouldDisableStatusFn; +}; diff --git a/x-pack/plugins/cases/public/components/actions/status/use_status_action.test.tsx b/x-pack/plugins/cases/public/components/actions/status/use_status_action.test.tsx index bb4aef3379aa3..5ad7f9803dd67 100644 --- a/x-pack/plugins/cases/public/components/actions/status/use_status_action.test.tsx +++ b/x-pack/plugins/cases/public/components/actions/status/use_status_action.test.tsx @@ -13,7 +13,11 @@ import { useStatusAction } from './use_status_action'; import * as api from '../../../containers/api'; import { basicCase } from '../../../containers/mock'; import { CaseStatuses } from '../../../../common/types/domain'; +import { useUserPermissions } from '../../user_actions/use_user_permissions'; +import { useShouldDisableStatus } from './use_should_disable_status'; +jest.mock('../../user_actions/use_user_permissions'); +jest.mock('./use_should_disable_status'); jest.mock('../../../containers/api'); describe('useStatusAction', () => { @@ -24,6 +28,12 @@ describe('useStatusAction', () => { beforeEach(() => { appMockRender = createAppMockRenderer(); jest.clearAllMocks(); + (useShouldDisableStatus as jest.Mock).mockReturnValue(() => false); + + (useUserPermissions as jest.Mock).mockReturnValue({ + canUpdate: true, + canReopenCase: true, + }); }); it('renders an action', async () => { @@ -43,7 +53,7 @@ describe('useStatusAction', () => { Array [ Object { "data-test-subj": "cases-bulk-action-status-open", - "disabled": true, + "disabled": false, "icon": "empty", "key": "cases-bulk-action-status-open", "name": "Open", @@ -172,6 +182,8 @@ describe('useStatusAction', () => { ]; it.each(disabledTests)('disables the status button correctly: %s', async (status, index) => { + (useShouldDisableStatus as jest.Mock).mockReturnValue(() => true); + const { result } = renderHook( () => useStatusAction({ onAction, onActionSuccess, isDisabled: false }), { @@ -197,4 +209,36 @@ describe('useStatusAction', () => { expect(actions[index].disabled).toBe(true); } ); + + it('respects user permissions when everything is false', () => { + (useUserPermissions as jest.Mock).mockReturnValue({ + canUpdate: false, + canReopenCase: false, + }); + + const { result } = renderHook( + () => useStatusAction({ onAction, onActionSuccess, isDisabled: false }), + { + wrapper: appMockRender.AppWrapper, + } + ); + + expect(result.current.canUpdateStatus).toBe(false); + }); + + it('respects user permissions when only reopen is true', () => { + (useUserPermissions as jest.Mock).mockReturnValue({ + canUpdate: false, + canReopenCase: true, + }); + + const { result } = renderHook( + () => useStatusAction({ onAction, onActionSuccess, isDisabled: false }), + { + wrapper: appMockRender.AppWrapper, + } + ); + + expect(result.current.canUpdateStatus).toBe(true); + }); }); diff --git a/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx b/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx index eb00800961085..abbc0535656d3 100644 --- a/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx @@ -14,7 +14,8 @@ import { CaseStatuses } from '../../../../common/types/domain'; import * as i18n from './translations'; import type { UseActionProps } from '../types'; import { statuses } from '../../status'; -import { useCasesContext } from '../../cases_context/use_cases_context'; +import { useUserPermissions } from '../../user_actions/use_user_permissions'; +import { useShouldDisableStatus } from './use_should_disable_status'; const getStatusToasterMessage = (status: CaseStatuses, cases: CasesUI): string => { const totalCases = cases.length; @@ -35,9 +36,6 @@ interface UseStatusActionProps extends UseActionProps { selectedStatus?: CaseStatuses; } -const shouldDisableStatus = (cases: CasesUI, status: CaseStatuses) => - cases.every((theCase) => theCase.status === status); - export const useStatusAction = ({ onAction, onActionSuccess, @@ -45,10 +43,7 @@ export const useStatusAction = ({ selectedStatus, }: UseStatusActionProps) => { const { mutate: updateCases } = useUpdateCases(); - const { permissions } = useCasesContext(); - const canUpdateStatus = permissions.update; - const isActionDisabled = isDisabled || !canUpdateStatus; - + const { canUpdate, canReopenCase } = useUserPermissions(); const handleUpdateCaseStatus = useCallback( (selectedCases: CasesUI, status: CaseStatuses) => { onAction(); @@ -69,6 +64,8 @@ export const useStatusAction = ({ [onAction, updateCases, onActionSuccess] ); + const shouldDisableStatus = useShouldDisableStatus(); + const getStatusIcon = (status: CaseStatuses): string => selectedStatus && selectedStatus === status ? 'check' : 'empty'; @@ -78,7 +75,7 @@ export const useStatusAction = ({ name: statuses[CaseStatuses.open].label, icon: getStatusIcon(CaseStatuses.open), onClick: () => handleUpdateCaseStatus(selectedCases, CaseStatuses.open), - disabled: isActionDisabled || shouldDisableStatus(selectedCases, CaseStatuses.open), + disabled: isDisabled || shouldDisableStatus(selectedCases), 'data-test-subj': 'cases-bulk-action-status-open', key: 'cases-bulk-action-status-open', }, @@ -86,8 +83,7 @@ export const useStatusAction = ({ name: statuses[CaseStatuses['in-progress']].label, icon: getStatusIcon(CaseStatuses['in-progress']), onClick: () => handleUpdateCaseStatus(selectedCases, CaseStatuses['in-progress']), - disabled: - isActionDisabled || shouldDisableStatus(selectedCases, CaseStatuses['in-progress']), + disabled: isDisabled || shouldDisableStatus(selectedCases), 'data-test-subj': 'cases-bulk-action-status-in-progress', key: 'cases-bulk-action-status-in-progress', }, @@ -95,14 +91,14 @@ export const useStatusAction = ({ name: statuses[CaseStatuses.closed].label, icon: getStatusIcon(CaseStatuses.closed), onClick: () => handleUpdateCaseStatus(selectedCases, CaseStatuses.closed), - disabled: isActionDisabled || shouldDisableStatus(selectedCases, CaseStatuses.closed), + disabled: isDisabled || shouldDisableStatus(selectedCases), 'data-test-subj': 'cases-bulk-action-status-closed', key: 'cases-bulk-status-action', }, ]; }; - return { getActions, canUpdateStatus }; + return { getActions, canUpdateStatus: canUpdate || canReopenCase }; }; export type UseStatusAction = ReturnType; diff --git a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx index 5664151aa6df0..60fcb320ddfd0 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx @@ -10,7 +10,12 @@ import { waitFor, act, fireEvent, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { noop } from 'lodash/fp'; -import { noCreateCasesPermissions, TestProviders, createAppMockRenderer } from '../../common/mock'; +import { + onlyCreateCommentPermissions, + noCreateCommentCasesPermissions, + TestProviders, + createAppMockRenderer, +} from '../../common/mock'; import { AttachmentType } from '../../../common/types/domain'; import { SECURITY_SOLUTION_OWNER, MAX_COMMENT_LENGTH } from '../../../common/constants'; @@ -93,19 +98,36 @@ describe('AddComment ', () => { expect(screen.getByTestId('submit-comment')).toHaveAttribute('disabled'); }); - it('should hide the component when the user does not have create permissions', () => { + it('should hide the component when the user does not have createComment permissions', () => { createAttachmentsMock.mockImplementation(() => ({ ...defaultResponse, isLoading: true, })); appMockRender.render( - + ); expect(screen.queryByTestId('loading-spinner')).not.toBeInTheDocument(); + expect(screen.queryByTestId('add-comment-form-wrapper')).not.toBeInTheDocument(); + }); + + it('should show the component when the user does not have create permissions, but has createComment permissions', () => { + createAttachmentsMock.mockImplementation(() => ({ + ...defaultResponse, + isLoading: true, + })); + + appMockRender.render( + + + + ); + + expect(screen.queryByTestId('loading-spinner')).not.toBeInTheDocument(); + expect(screen.queryByTestId('add-comment-form-wrapper')).toBeInTheDocument(); }); it('should post comment on submit click', async () => { diff --git a/x-pack/plugins/cases/public/components/add_comment/index.tsx b/x-pack/plugins/cases/public/components/add_comment/index.tsx index c84f799b1c899..11d3b89eb13d2 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.tsx @@ -191,8 +191,8 @@ export const AddComment = React.memo( size="xl" /> )} - {permissions.create && ( -
+ {permissions.createComment && ( + { jest.clearAllMocks(); }); - describe('empty table', () => { + // FLAKY: https://github.com/elastic/kibana/issues/162852 + describe.skip('empty table', () => { beforeEach(() => { useGetCasesMock.mockReturnValue({ ...defaultGetCases, diff --git a/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx b/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx index 98d0940883a14..bb0ba6ed009e1 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx @@ -17,6 +17,7 @@ import { useActions } from './use_actions'; import { basicCase } from '../../containers/mock'; import * as api from '../../containers/api'; import type { AppMockRenderer } from '../../common/mock'; +import { CaseStatuses } from '../../../common/types/domain'; import { createAppMockRenderer, noDeleteCasesPermissions, @@ -382,5 +383,98 @@ describe('useActions', () => { expect(res.getByTestId(`case-action-popover-button-${basicCase.id}`)).toBeDisabled(); }); }); + + it('shows actions when user only has reopenCase permission and only when case is closed', async () => { + appMockRender = createAppMockRenderer({ + permissions: { + all: false, + read: true, + create: false, + update: false, + delete: false, + reopenCase: true, + push: false, + connectors: true, + settings: false, + createComment: false, + }, + }); + + const { result } = renderHook(() => useActions({ disableActions: false }), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current.actions).not.toBe(null); + const caseWithClosedStatus = { ...basicCase, status: CaseStatuses.closed }; + const comp = result.current.actions!.render(caseWithClosedStatus) as React.ReactElement; + const res = appMockRender.render(comp); + + await user.click(res.getByTestId(`case-action-popover-button-${basicCase.id}`)); + await waitForEuiPopoverOpen(); + + expect(res.queryByTestId(`case-action-status-panel-${basicCase.id}`)).toBeInTheDocument(); + expect(res.queryByTestId(`case-action-severity-panel-${basicCase.id}`)).toBeFalsy(); + expect(res.queryByTestId('cases-bulk-action-delete')).toBeFalsy(); + expect(res.getByTestId('cases-action-copy-id')).toBeInTheDocument(); + expect(res.queryByTestId(`actions-separator-${basicCase.id}`)).toBeFalsy(); + }); + + it('shows actions with combination of reopenCase and other permissions', async () => { + appMockRender = createAppMockRenderer({ + permissions: { + all: false, + read: true, + create: false, + update: false, + delete: true, + reopenCase: true, + push: false, + connectors: true, + settings: false, + createComment: false, + }, + }); + + const { result } = renderHook(() => useActions({ disableActions: false }), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current.actions).not.toBe(null); + const caseWithClosedStatus = { ...basicCase, status: CaseStatuses.closed }; + + const comp = result.current.actions!.render(caseWithClosedStatus) as React.ReactElement; + const res = appMockRender.render(comp); + + await user.click(res.getByTestId(`case-action-popover-button-${basicCase.id}`)); + await waitForEuiPopoverOpen(); + + expect(res.queryByTestId(`case-action-status-panel-${basicCase.id}`)).toBeInTheDocument(); + expect(res.queryByTestId(`case-action-severity-panel-${basicCase.id}`)).toBeFalsy(); + expect(res.getByTestId('cases-bulk-action-delete')).toBeInTheDocument(); + expect(res.getByTestId('cases-action-copy-id')).toBeInTheDocument(); + }); + + it('shows no actions with everything false but read', async () => { + appMockRender = createAppMockRenderer({ + permissions: { + all: false, + read: true, + create: false, + update: false, + delete: false, + reopenCase: false, + push: false, + connectors: true, + settings: false, + createComment: false, + }, + }); + + const { result } = renderHook(() => useActions({ disableActions: false }), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current.actions).toBe(null); + }); }); }); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx index 4c43201b1eab4..e34f64a2a6283 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx @@ -28,6 +28,7 @@ import { EditTagsFlyout } from '../actions/tags/edit_tags_flyout'; import { useAssigneesAction } from '../actions/assignees/use_assignees_action'; import { EditAssigneesFlyout } from '../actions/assignees/edit_assignees_flyout'; import { useCopyIDAction } from '../actions/copy_id/use_copy_id_action'; +import { useShouldDisableStatus } from '../actions/status/use_should_disable_status'; const ActionColumnComponent: React.FC<{ theCase: CaseUI; disableActions: boolean }> = ({ theCase, @@ -38,6 +39,12 @@ const ActionColumnComponent: React.FC<{ theCase: CaseUI; disableActions: boolean const closePopover = useCallback(() => setIsPopoverOpen(false), []); const refreshCases = useRefreshCases(); + const shouldDisable = useShouldDisableStatus(); + + const shouldDisableStatus = useMemo(() => { + return shouldDisable([theCase]); + }, [theCase, shouldDisable]); + const deleteAction = useDeleteAction({ isDisabled: false, onAction: closePopover, @@ -83,7 +90,7 @@ const ActionColumnComponent: React.FC<{ theCase: CaseUI; disableActions: boolean { id: 0, items: mainPanelItems, title: i18n.ACTIONS }, ]; - if (canUpdate) { + if (!shouldDisableStatus) { mainPanelItems.push({ name: ( { const { permissions } = useCasesContext(); - const shouldShowActions = permissions.update || permissions.delete; + const shouldShowActions = permissions.update || permissions.delete || permissions.reopenCase; return { actions: shouldShowActions diff --git a/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.test.tsx b/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.test.tsx index fcf3da36fba96..1838ee3b14f59 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.test.tsx @@ -17,10 +17,12 @@ import { createAppMockRenderer, noDeleteCasesPermissions, onlyDeleteCasesPermission, + noReopenCasesPermissions, + onlyReopenCasesPermission, } from '../../common/mock'; import { useBulkActions } from './use_bulk_actions'; import * as api from '../../containers/api'; -import { basicCase } from '../../containers/mock'; +import { basicCase, basicCaseClosed } from '../../containers/mock'; jest.mock('../../containers/api'); jest.mock('../../containers/user_profiles/api'); @@ -117,7 +119,7 @@ describe('useBulkActions', () => { "items": Array [ Object { "data-test-subj": "cases-bulk-action-status-open", - "disabled": true, + "disabled": false, "icon": "empty", "key": "cases-bulk-action-status-open", "name": "Open", @@ -523,5 +525,72 @@ describe('useBulkActions', () => { expect(res.queryByTestId('bulk-actions-separator')).toBeFalsy(); }); }); + + it('shows the correct actions with no reopen permissions', async () => { + appMockRender = createAppMockRenderer({ permissions: noReopenCasesPermissions() }); + const { result, waitFor: waitForHook } = renderHook( + () => useBulkActions({ onAction, onActionSuccess, selectedCases: [basicCaseClosed] }), + { + wrapper: appMockRender.AppWrapper, + } + ); + + const modals = result.current.modals; + const panels = result.current.panels; + + const res = appMockRender.render( + <> + + {modals} + + ); + + await waitForHook(() => { + expect(res.queryByTestId('case-bulk-action-status')).toBeInTheDocument(); + res.queryByTestId('case-bulk-action-status')?.click(); + }); + + await waitForHook(() => { + expect(res.queryByTestId('cases-bulk-action-status-open')).toBeDisabled(); + expect(res.queryByTestId('cases-bulk-action-status-in-progress')).toBeDisabled(); + expect(res.queryByTestId('cases-bulk-action-status-closed')).toBeDisabled(); + }); + }); + + it('shows the correct actions with reopen permissions', async () => { + appMockRender = createAppMockRenderer({ permissions: onlyReopenCasesPermission() }); + const { result } = renderHook( + () => useBulkActions({ onAction, onActionSuccess, selectedCases: [basicCaseClosed] }), + { + wrapper: appMockRender.AppWrapper, + } + ); + + const { modals, flyouts, panels } = result.current; + const renderResult = appMockRender.render( + <> + + {modals} + {flyouts} + + ); + + await waitFor(() => { + expect(renderResult.queryByTestId('case-bulk-action-status')).toBeInTheDocument(); + expect(renderResult.queryByTestId('case-bulk-action-severity')).toBeInTheDocument(); + expect(renderResult.queryByTestId('bulk-actions-separator')).not.toBeInTheDocument(); + expect(renderResult.queryByTestId('case-bulk-action-delete')).not.toBeInTheDocument(); + }); + + userEvent.click(renderResult.getByTestId('case-bulk-action-status')); + + await waitFor(() => { + expect(renderResult.queryByTestId('cases-bulk-action-status-open')).not.toBeDisabled(); + expect( + renderResult.queryByTestId('cases-bulk-action-status-in-progress') + ).not.toBeDisabled(); + expect(renderResult.queryByTestId('cases-bulk-action-status-closed')).not.toBeDisabled(); + }); + }); }); }); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx b/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx index 009dfbf99f262..98828b00369f5 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx @@ -76,9 +76,6 @@ export const useBulkActions = ({ const panels = useMemo((): EuiContextMenuPanelDescriptor[] => { const mainPanelItems: EuiContextMenuPanelItemDescriptor[] = []; - const panelsToBuild: EuiContextMenuPanelDescriptor[] = [ - { id: 0, items: mainPanelItems, title: i18n.ACTIONS }, - ]; if (canUpdate) { mainPanelItems.push({ @@ -119,7 +116,13 @@ export const useBulkActions = ({ if (canDelete) { mainPanelItems.push(deleteAction.getAction(selectedCases)); } - + const panelsToBuild: EuiContextMenuPanelDescriptor[] = [ + { + id: 0, + items: [...mainPanelItems], // Create a new array instead of using reference + title: i18n.ACTIONS, + }, + ]; if (canUpdate) { panelsToBuild.push({ id: 1, diff --git a/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx b/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx index 6808735a41184..389de5068ed51 100644 --- a/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx @@ -94,7 +94,9 @@ export const CasesTableUtilityBar: FunctionComponent = React.memo( * Granular permission check for each action is performed * in the useBulkActions hook. */ - const showBulkActions = (permissions.update || permissions.delete) && selectedCases.length > 0; + const showBulkActions = + (permissions.update || permissions.delete || permissions.reopenCase) && + selectedCases.length > 0; const visibleCases = pagination?.pageSize && totalCases > pagination.pageSize ? pagination.pageSize : totalCases; diff --git a/x-pack/plugins/cases/public/components/app/index.tsx b/x-pack/plugins/cases/public/components/app/index.tsx index cc6c572275721..eaa334470ab0f 100644 --- a/x-pack/plugins/cases/public/components/app/index.tsx +++ b/x-pack/plugins/cases/public/components/app/index.tsx @@ -39,7 +39,7 @@ const CasesAppComponent: React.FC = ({ getFilesClient, owner: [APP_OWNER], useFetchAlertData: () => [false, {}], - permissions: userCapabilities.generalCases, + permissions: userCapabilities.generalCasesV2, basePath: '/', features: { alerts: { enabled: true, sync: false } }, })} diff --git a/x-pack/plugins/cases/public/components/app/use_available_owners.test.ts b/x-pack/plugins/cases/public/components/app/use_available_owners.test.ts index a26647704785f..4cd015de0c92e 100644 --- a/x-pack/plugins/cases/public/components/app/use_available_owners.test.ts +++ b/x-pack/plugins/cases/public/components/app/use_available_owners.test.ts @@ -21,15 +21,15 @@ jest.mock('../../common/lib/kibana'); const useKibanaMock = useKibana as jest.MockedFunction; const hasAll = { - securitySolutionCases: allCasesCapabilities(), - observabilityCases: allCasesCapabilities(), - generalCases: allCasesCapabilities(), + securitySolutionCasesV2: allCasesCapabilities(), + observabilityCasesV2: allCasesCapabilities(), + generalCasesV2: allCasesCapabilities(), }; const secAllObsReadGenNone = { - securitySolutionCases: allCasesCapabilities(), - observabilityCases: readCasesCapabilities(), - generalCases: noCasesCapabilities(), + securitySolutionCasesV2: allCasesCapabilities(), + observabilityCasesV2: readCasesCapabilities(), + generalCasesV2: noCasesCapabilities(), }; const unrelatedFeatures = { diff --git a/x-pack/plugins/cases/public/components/app/use_available_owners.ts b/x-pack/plugins/cases/public/components/app/use_available_owners.ts index c829b9c590d01..4220ff8cdecd4 100644 --- a/x-pack/plugins/cases/public/components/app/use_available_owners.ts +++ b/x-pack/plugins/cases/public/components/app/use_available_owners.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { APP_ID, FEATURE_ID } from '../../../common/constants'; +import { APP_ID, FEATURE_ID_V2 } from '../../../common/constants'; import { useKibana } from '../../common/lib/kibana'; import type { CasesPermissions } from '../../containers/types'; import { allCasePermissions } from '../../utils/permissions'; @@ -25,7 +25,7 @@ export const useAvailableCasesOwners = ( return Object.entries(kibanaCapabilities).reduce( (availableOwners: string[], [featureId, kibanaCapability]) => { - if (!featureId.endsWith('Cases')) { + if (!featureId.endsWith('CasesV2')) { return availableOwners; } for (const cap of capabilities) { @@ -42,9 +42,9 @@ export const useAvailableCasesOwners = ( }; const getOwnerFromFeatureID = (featureID: string) => { - if (featureID === FEATURE_ID) { + if (featureID === FEATURE_ID_V2) { return APP_ID; } - return featureID.replace('Cases', ''); + return featureID.replace('CasesV2', ''); }; diff --git a/x-pack/plugins/cases/public/components/case_action_bar/index.tsx b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx index d6c17febb6348..7fd13396086c7 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/index.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { css } from '@emotion/react'; import { EuiFlexGroup, EuiFlexItem, EuiIconTip, EuiButtonEmpty, useEuiTheme } from '@elastic/eui'; import type { CaseStatuses } from '../../../common/types/domain'; @@ -23,6 +23,7 @@ import { useRefreshCaseViewPage } from '../case_view/use_on_refresh_case_view_pa import { useCasesContext } from '../cases_context/use_cases_context'; import { useCasesFeatures } from '../../common/use_cases_features'; import { useGetCaseConnectors } from '../../containers/use_get_case_connectors'; +import { useShouldDisableStatus } from '../actions/status/use_should_disable_status'; export interface CaseActionBarProps { caseData: CaseUI; @@ -67,6 +68,11 @@ const CaseActionBarComponent: React.FC = ({ [caseData.settings, onUpdateField] ); + const shouldDisableStatusFn = useShouldDisableStatus(); + const isStatusMenuDisabled = useMemo(() => { + return shouldDisableStatusFn([caseData]); + }, [caseData, shouldDisableStatusFn]); + return ( = ({ diff --git a/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx index 95d36bb058d79..e4497b14ff75e 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx @@ -10,17 +10,24 @@ import { mount } from 'enzyme'; import { CaseStatuses } from '../../../common/types/domain'; import { StatusContextMenu } from './status_context_menu'; +import { TestProviders } from '../../common/mock'; +import { useShouldDisableStatus } from '../actions/status/use_should_disable_status'; -describe('SyncAlertsSwitch', () => { +jest.mock('../actions/status/use_should_disable_status'); + +describe('StatusContextMenu', () => { const onStatusChanged = jest.fn(); beforeEach(() => { jest.clearAllMocks(); + (useShouldDisableStatus as jest.Mock).mockReturnValue(() => false); }); it('renders', async () => { const wrapper = mount( - + + + ); expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).exists()).toBeTruthy(); @@ -28,11 +35,13 @@ describe('SyncAlertsSwitch', () => { it('renders a simple status badge when disabled', async () => { const wrapper = mount( - + + + ); expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).exists()).toBeFalsy(); @@ -41,7 +50,9 @@ describe('SyncAlertsSwitch', () => { it('renders the current status correctly', async () => { const wrapper = mount( - + + + ); expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toBe( @@ -51,7 +62,9 @@ describe('SyncAlertsSwitch', () => { it('changes the status', async () => { const wrapper = mount( - + + + ); wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); @@ -62,14 +75,61 @@ describe('SyncAlertsSwitch', () => { expect(onStatusChanged).toHaveBeenCalledWith('in-progress'); }); - it('does not call onStatusChanged if selection is same as current status', async () => { + it('does not render the button at all if the status cannot change', async () => { + (useShouldDisableStatus as jest.Mock).mockReturnValue(() => true); const wrapper = mount( - + + + ); wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); - wrapper.find(`[data-test-subj="case-view-status-dropdown-open"] button`).simulate('click'); + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown-open"] button`)).toHaveLength( + 0 + ); expect(onStatusChanged).not.toHaveBeenCalled(); }); + + it('updates menu items when shouldDisableStatus changes', async () => { + const mockShouldDisableStatus = jest.fn().mockReturnValue(false); + (useShouldDisableStatus as jest.Mock).mockReturnValue(mockShouldDisableStatus); + + const wrapper = mount( + + + + ); + + wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); + + expect(mockShouldDisableStatus).toHaveBeenCalledWith([{ status: CaseStatuses.open }]); + }); + + it('handles all statuses being disabled', async () => { + (useShouldDisableStatus as jest.Mock).mockReturnValue(() => true); + + const wrapper = mount( + + + + ); + + wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); + expect(wrapper.find('EuiContextMenuItem').prop('onClick')).toBeUndefined(); + }); + + it('correctly evaluates each status option', async () => { + (useShouldDisableStatus as jest.Mock).mockReturnValue(false); + + const wrapper = mount( + + + + ); + + expect( + wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).exists() + ).toBeFalsy(); + }); }); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx index 422cf1aa44b80..b1c65fc796b46 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx @@ -12,6 +12,7 @@ import type { CaseStatuses } from '../../../common/types/domain'; import { caseStatuses } from '../../../common/types/domain'; import { StatusPopoverButton } from '../status'; import { CHANGE_STATUS } from '../all_cases/translations'; +import { useShouldDisableStatus } from '../actions/status/use_should_disable_status'; interface Props { currentStatus: CaseStatuses; @@ -27,6 +28,7 @@ const StatusContextMenuComponent: React.FC = ({ onStatusChanged, }) => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const shouldDisableStatus = useShouldDisableStatus(); const togglePopover = useCallback( () => setIsPopoverOpen((prevPopoverStatus) => !prevPopoverStatus), [] @@ -57,17 +59,19 @@ const StatusContextMenuComponent: React.FC = ({ const panelItems = useMemo( () => - caseStatuses.map((status: CaseStatuses) => ( - onContextMenuItemClick(status)} - > - - - )), - [currentStatus, onContextMenuItemClick] + caseStatuses + .filter((_: CaseStatuses) => !shouldDisableStatus([{ status: currentStatus }])) + .map((status: CaseStatuses) => ( + onContextMenuItemClick(status)} + > + + + )), + [currentStatus, onContextMenuItemClick, shouldDisableStatus] ); if (disabled) { diff --git a/x-pack/plugins/cases/public/components/case_form_fields/sync_alerts_toggle.test.tsx b/x-pack/plugins/cases/public/components/case_form_fields/sync_alerts_toggle.test.tsx index e783e81800f3e..fbe7eca218391 100644 --- a/x-pack/plugins/cases/public/components/case_form_fields/sync_alerts_toggle.test.tsx +++ b/x-pack/plugins/cases/public/components/case_form_fields/sync_alerts_toggle.test.tsx @@ -6,17 +6,13 @@ */ import React from 'react'; -import { screen, within, waitFor } from '@testing-library/react'; +import { screen, within, waitFor, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { SyncAlertsToggle } from './sync_alerts_toggle'; import { schema } from '../create/schema'; import { FormTestComponent } from '../../common/test_utils'; -import type { AppMockRenderer } from '../../common/mock'; -import { createAppMockRenderer } from '../../common/mock'; -// Failing: https://github.com/elastic/kibana/issues/190270 -describe.skip('SyncAlertsToggle', () => { - let appMockRender: AppMockRenderer; +describe('SyncAlertsToggle', () => { const onSubmit = jest.fn(); const defaultFormProps = { onSubmit, @@ -28,15 +24,10 @@ describe.skip('SyncAlertsToggle', () => { beforeEach(() => { jest.clearAllMocks(); - appMockRender = createAppMockRenderer(); - }); - - afterEach(async () => { - await appMockRender.clearQueryCache(); }); it('it renders', async () => { - appMockRender.render( + render( @@ -48,7 +39,7 @@ describe.skip('SyncAlertsToggle', () => { }); it('it toggles the switch', async () => { - appMockRender.render( + render( @@ -63,7 +54,7 @@ describe.skip('SyncAlertsToggle', () => { }); it('calls onSubmit with correct data', async () => { - appMockRender.render( + render( @@ -73,7 +64,7 @@ describe.skip('SyncAlertsToggle', () => { await userEvent.click(within(synAlerts).getByRole('switch')); - await userEvent.click(screen.getByText('Submit')); + await userEvent.click(await screen.findByText('Submit')); await waitFor(() => { expect(onSubmit).toBeCalledWith( diff --git a/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx b/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx index 588c14a4ef51a..12c28a3930a99 100644 --- a/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx +++ b/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx @@ -6,29 +6,20 @@ */ import React from 'react'; -import { screen } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import type { AppMockRenderer } from '../../common/mock'; -import { createAppMockRenderer } from '../../common/mock'; import { SyncAlertsSwitch } from './sync_alerts_switch'; -// Failing: See https://github.com/elastic/kibana/issues/192997 -describe.skip('SyncAlertsSwitch', () => { - let appMockRender: AppMockRenderer; - - beforeEach(() => { - appMockRender = createAppMockRenderer(); - }); - +describe('SyncAlertsSwitch', () => { it('it renders', async () => { - appMockRender.render(); + render(); expect(await screen.findByTestId('sync-alerts-switch')).toBeInTheDocument(); }); it('it toggles the switch', async () => { - appMockRender.render(); + render(); await userEvent.click(await screen.findByTestId('sync-alerts-switch')); @@ -39,20 +30,20 @@ describe.skip('SyncAlertsSwitch', () => { }); it('it disables the switch', async () => { - appMockRender.render(); + render(); expect(await screen.findByTestId('sync-alerts-switch')).toHaveProperty('disabled', true); }); it('it start as off', async () => { - appMockRender.render(); + render(); expect(await screen.findByText('Off')).toBeInTheDocument(); expect(screen.queryByText('On')).not.toBeInTheDocument(); }); it('it shows the correct labels', async () => { - appMockRender.render(); + render(); expect(await screen.findByText('On')).toBeInTheDocument(); expect(screen.queryByText('Off')).not.toBeInTheDocument(); diff --git a/x-pack/plugins/cases/public/components/cases_context/index.tsx b/x-pack/plugins/cases/public/components/cases_context/index.tsx index 85c267f5d05d7..77aee6551ac03 100644 --- a/x-pack/plugins/cases/public/components/cases_context/index.tsx +++ b/x-pack/plugins/cases/public/components/cases_context/index.tsx @@ -98,6 +98,8 @@ export const CasesProvider: FC< read: permissions.read, settings: permissions.settings, update: permissions.update, + reopenCase: permissions.reopenCase, + createComment: permissions.createComment, }, basePath, /** @@ -127,6 +129,8 @@ export const CasesProvider: FC< permissions.read, permissions.settings, permissions.update, + permissions.reopenCase, + permissions.createComment, ] ); diff --git a/x-pack/plugins/cases/public/components/files/add_file.test.tsx b/x-pack/plugins/cases/public/components/files/add_file.test.tsx index 69aa9e87a34e7..9a27b8780db2d 100644 --- a/x-pack/plugins/cases/public/components/files/add_file.test.tsx +++ b/x-pack/plugins/cases/public/components/files/add_file.test.tsx @@ -107,19 +107,9 @@ describe('AddFile', () => { expect(await screen.findByTestId('cases-files-add')).toBeInTheDocument(); }); - it('AddFile is not rendered if user has no create permission', async () => { + it('AddFile is not rendered if user has no createComment permission', async () => { appMockRender = createAppMockRenderer({ - permissions: buildCasesPermissions({ create: false }), - }); - - appMockRender.render(); - - expect(screen.queryByTestId('cases-files-add')).not.toBeInTheDocument(); - }); - - it('AddFile is not rendered if user has no update permission', async () => { - appMockRender = createAppMockRenderer({ - permissions: buildCasesPermissions({ update: false }), + permissions: buildCasesPermissions({ createComment: false }), }); appMockRender.render(); diff --git a/x-pack/plugins/cases/public/components/files/add_file.tsx b/x-pack/plugins/cases/public/components/files/add_file.tsx index 7b91879834a78..ab83b75920d59 100644 --- a/x-pack/plugins/cases/public/components/files/add_file.tsx +++ b/x-pack/plugins/cases/public/components/files/add_file.tsx @@ -107,7 +107,7 @@ const AddFileComponent: React.FC = ({ caseId }) => { [caseId, createAttachments, owner, refreshAttachmentsTable, showDangerToast, showSuccessToast] ); - return permissions.create && permissions.update ? ( + return permissions.createComment ? ( { +const useCaseViewNavigationMock = useCaseViewNavigation as jest.Mock; + +describe('Configuration button', () => { const props: ConfigureCaseButtonProps = { label: 'My label', msgTooltip: <>, @@ -26,11 +26,7 @@ describe.skip('Configuration button', () => { }; it('renders without the tooltip', async () => { - render( - - - - ); + render(); const configureButton = await screen.findByTestId('configure-case-button'); @@ -39,8 +35,7 @@ describe.skip('Configuration button', () => { expect(configureButton).toHaveAttribute('aria-label', 'My label'); }); - // Flaky: https://github.com/elastic/kibana/issues/193209 - it.skip('renders the tooltip correctly when hovering the button', async () => { + it('renders the tooltip correctly when hovering the button', async () => { jest.useFakeTimers(); const user = userEvent.setup({ @@ -49,14 +44,12 @@ describe.skip('Configuration button', () => { }); render( - - {'My message tooltip'}} - /> - + {'My message tooltip'}} + /> ); await user.hover(await screen.findByTestId('configure-case-button')); @@ -70,7 +63,6 @@ describe.skip('Configuration button', () => { }); describe('CaseDetailsLink', () => { - const useCaseViewNavigationMock = useCaseViewNavigation as jest.Mock; const getCaseViewUrl = jest.fn().mockReturnValue('/cases/test'); const navigateToCaseView = jest.fn(); diff --git a/x-pack/plugins/cases/public/components/links/index.tsx b/x-pack/plugins/cases/public/components/links/index.tsx index 9b610db63ed10..0cdc6b9c27dee 100644 --- a/x-pack/plugins/cases/public/components/links/index.tsx +++ b/x-pack/plugins/cases/public/components/links/index.tsx @@ -8,7 +8,7 @@ import type { EuiButtonProps, EuiLinkProps, PropsForAnchor, PropsForButton } from '@elastic/eui'; import { EuiButton, EuiLink, EuiToolTip, EuiButtonEmpty } from '@elastic/eui'; import React, { useCallback, useMemo } from 'react'; -import { useCaseViewNavigation, useConfigureCasesNavigation } from '../../common/navigation'; +import { useCaseViewNavigation, useConfigureCasesNavigation } from '../../common/navigation/hooks'; import * as i18n from './translations'; export interface CasesNavigation { diff --git a/x-pack/plugins/cases/public/components/recent_cases/index.test.tsx b/x-pack/plugins/cases/public/components/recent_cases/index.test.tsx index 41a2d6a6a8476..e61310b7e9d5d 100644 --- a/x-pack/plugins/cases/public/components/recent_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/index.test.tsx @@ -262,13 +262,13 @@ describe('RecentCases', () => { it('sets all available solutions correctly', () => { appMockRender = createAppMockRenderer({ owner: [] }); /** - * We set securitySolutionCases capability to not have + * We set securitySolutionCasesV2 capability to not have * any access to cases. This tests that we get the owners * that have at least read access. */ appMockRender.coreStart.application.capabilities = { ...appMockRender.coreStart.application.capabilities, - securitySolutionCases: noCasesCapabilities(), + securitySolutionCasesV2: noCasesCapabilities(), }; appMockRender.render(); diff --git a/x-pack/plugins/cases/public/components/user_actions/index.tsx b/x-pack/plugins/cases/public/components/user_actions/index.tsx index a17dee7423fe3..793405276cdb4 100644 --- a/x-pack/plugins/cases/public/components/user_actions/index.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/index.tsx @@ -16,7 +16,6 @@ import { getManualAlertIdsWithNoRuleId } from './helpers'; import type { UserActionTreeProps } from './types'; import { useUserActionsHandler } from './use_user_actions_handler'; import { NEW_COMMENT_ID } from './constants'; -import { useCasesContext } from '../cases_context/use_cases_context'; import { UserToolTip } from '../user_profiles/user_tooltip'; import { Username } from '../user_profiles/username'; import { HoverableAvatar } from '../user_profiles/hoverable_avatar'; @@ -25,6 +24,7 @@ import { useUserActionsPagination } from './use_user_actions_pagination'; import { useLastPageUserActions } from './use_user_actions_last_page'; import { ShowMoreButton } from './show_more_button'; import { useLastPage } from './use_last_page'; +import { useUserPermissions } from './use_user_permissions'; const getIconsCss = (hasNextPage: boolean | undefined, euiTheme: EuiThemeComputed<{}>): string => { const customSize = hasNextPage @@ -108,10 +108,10 @@ export const UserActions = React.memo((props: UserActionTreeProps) => { const [loadingAlertData, manualAlertsData] = useFetchAlertData(alertIdsWithoutRuleInfo); - const { permissions } = useCasesContext(); + const { getCanAddUserComments } = useUserPermissions(); // add-comment markdown is not visible in History filter - const showCommentEditor = permissions.create && userActivityQueryParams.type !== 'action'; + const shouldShowCommentEditor = getCanAddUserComments(userActivityQueryParams); const { commentRefs, @@ -136,7 +136,7 @@ export const UserActions = React.memo((props: UserActionTreeProps) => { [caseId, handleUpdate, handleManageMarkdownEditId, statusActionButton, commentRefs] ); - const bottomActions = showCommentEditor + const bottomActions = shouldShowCommentEditor ? [ { username: ( diff --git a/x-pack/plugins/cases/public/components/user_actions/use_user_permissions.test.tsx b/x-pack/plugins/cases/public/components/user_actions/use_user_permissions.test.tsx new file mode 100644 index 0000000000000..e7c712b0df590 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_actions/use_user_permissions.test.tsx @@ -0,0 +1,259 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { useCasesContext } from '../cases_context/use_cases_context'; +import { useUserPermissions } from './use_user_permissions'; +import type { UserActivityParams } from '../user_actions_activity_bar/types'; + +jest.mock('../cases_context/use_cases_context'); +const mockUseCasesContext = useCasesContext as jest.Mock; + +describe('useUserPermissions', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('canUpdate permission', () => { + it('should return true when user has update permission', () => { + mockUseCasesContext.mockReturnValue({ + permissions: { + update: true, + reopenCase: false, + createComment: false, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }, + }); + + const { result } = renderHook(() => useUserPermissions()); + expect(result.current.canUpdate).toBe(true); + }); + + it('should return false when user lacks update permission', () => { + mockUseCasesContext.mockReturnValue({ + permissions: { + update: false, + reopenCase: true, + createComment: true, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }, + }); + + const { result } = renderHook(() => useUserPermissions()); + expect(result.current.canUpdate).toBe(false); + }); + }); + + describe('canReopenCase permission', () => { + it('should return true when user has reopenCase permission', () => { + mockUseCasesContext.mockReturnValue({ + permissions: { + update: false, + reopenCase: true, + createComment: false, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }, + }); + + const { result } = renderHook(() => useUserPermissions()); + expect(result.current.canReopenCase).toBe(true); + }); + + it('should return false when user lacks reopenCase permission', () => { + mockUseCasesContext.mockReturnValue({ + permissions: { + update: true, + reopenCase: false, + createComment: true, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }, + }); + + const { result } = renderHook(() => useUserPermissions()); + expect(result.current.canReopenCase).toBe(false); + }); + }); + + describe('getCanAddUserComments permission', () => { + it('should return false when activity type is "action" regardless of createComment permission', () => { + mockUseCasesContext.mockReturnValue({ + permissions: { + update: false, + reopenCase: false, + createComment: true, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }, + }); + + const { result } = renderHook(() => useUserPermissions()); + const userActivityParams: UserActivityParams = { + page: 1, + perPage: 10, + sortOrder: 'asc', + type: 'action', + }; + + expect(result.current.getCanAddUserComments(userActivityParams)).toBe(false); + }); + + it('should return true when type is not "action" and user has createComment permission', () => { + mockUseCasesContext.mockReturnValue({ + permissions: { + update: false, + reopenCase: false, + createComment: true, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }, + }); + + const { result } = renderHook(() => useUserPermissions()); + const userActivityParams: UserActivityParams = { + page: 1, + perPage: 10, + sortOrder: 'asc', + type: 'user', + }; + + expect(result.current.getCanAddUserComments(userActivityParams)).toBe(true); + }); + + it('should return false when type is not "action" but user lacks createComment permission', () => { + mockUseCasesContext.mockReturnValue({ + permissions: { + update: true, + reopenCase: true, + createComment: false, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }, + }); + + const { result } = renderHook(() => useUserPermissions()); + const userActivityParams: UserActivityParams = { + page: 1, + perPage: 10, + sortOrder: 'asc', + type: 'user', + }; + + expect(result.current.getCanAddUserComments(userActivityParams)).toBe(false); + }); + }); + + it('should maintain stable references to memoized values when permissions do not change', () => { + const permissions = { + update: true, + reopenCase: true, + createComment: true, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }; + + mockUseCasesContext.mockReturnValue({ permissions }); + + const { result, rerender } = renderHook(() => useUserPermissions()); + + const initialCanUpdate = result.current.canUpdate; + const initialCanReopenCase = result.current.canReopenCase; + const initialGetCanAddUserComments = result.current.getCanAddUserComments; + + rerender(); + + expect(result.current.canUpdate).toBe(initialCanUpdate); + expect(result.current.canReopenCase).toBe(initialCanReopenCase); + expect(result.current.getCanAddUserComments).toBe(initialGetCanAddUserComments); + }); + + it('should update memoized values when permissions change', () => { + const initialPermissions = { + update: true, + reopenCase: true, + createComment: true, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }; + + mockUseCasesContext.mockReturnValue({ permissions: initialPermissions }); + + const { result, rerender } = renderHook(() => useUserPermissions()); + + const initialCanUpdate = result.current.canUpdate; + const initialCanReopenCase = result.current.canReopenCase; + const initialGetCanAddUserComments = result.current.getCanAddUserComments; + + const newPermissions = { + update: false, + reopenCase: false, + createComment: true, + all: false, + read: true, + create: false, + delete: false, + push: false, + connectors: true, + settings: false, + }; + + mockUseCasesContext.mockReturnValue({ permissions: newPermissions }); + rerender(); + + expect(result.current.canUpdate).not.toBe(initialCanUpdate); + expect(result.current.canReopenCase).not.toBe(initialCanReopenCase); + expect(result.current.getCanAddUserComments).toBe(initialGetCanAddUserComments); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_actions/use_user_permissions.tsx b/x-pack/plugins/cases/public/components/user_actions/use_user_permissions.tsx new file mode 100644 index 0000000000000..f0a79a6e285a5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_actions/use_user_permissions.tsx @@ -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 { useCallback } from 'react'; +import { useCasesContext } from '../cases_context/use_cases_context'; +import type { UserActivityParams } from '../user_actions_activity_bar/types'; + +export const useUserPermissions = () => { + const { permissions } = useCasesContext(); + + /** + * Determines if a user has the capability to update the case. Reopening a case is not part of this capability. + */ + + const canUpdate = permissions.update; + + /** + * Determines if a user has the capability to change the case from closed => open or closed => in progress + */ + + const canReopenCase = permissions.reopenCase; + + /** + * Determines if a user has the capability to add comments and attachments + */ + const getCanAddUserComments = useCallback( + (userActivityQueryParams: UserActivityParams) => { + if (userActivityQueryParams.type === 'action') return false; + return permissions.createComment; + }, + [permissions.createComment] + ); + + return { getCanAddUserComments, canReopenCase, canUpdate }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx index 53900a6920f20..92d7abde2f9d2 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx @@ -69,7 +69,7 @@ describe('useGetCases', () => { appMockRender.coreStart.application.capabilities = { ...appMockRender.coreStart.application.capabilities, - observabilityCases: { + observabilityCasesV2: { create_cases: true, read_cases: true, update_cases: true, @@ -78,7 +78,7 @@ describe('useGetCases', () => { delete_cases: true, cases_settings: true, }, - securitySolutionCases: { + securitySolutionCasesV2: { create_cases: true, read_cases: true, update_cases: true, diff --git a/x-pack/plugins/cases/public/mocks.ts b/x-pack/plugins/cases/public/mocks.ts index e267c108a9b39..3de6a96979065 100644 --- a/x-pack/plugins/cases/public/mocks.ts +++ b/x-pack/plugins/cases/public/mocks.ts @@ -50,6 +50,8 @@ const helpersMock: jest.Mocked = { push: false, connectors: false, settings: false, + createComment: false, + reopenCase: false, }), getRuleIdFromEvent: jest.fn(), groupAlertsByRule: jest.fn(), diff --git a/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap b/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap index ebb9501ff8960..b8129f9111b9c 100644 --- a/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap +++ b/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap @@ -2520,6 +2520,90 @@ Object { } `; +exports[`audit_logger log function event structure creates the correct audit event for operation: "reopenCase" with an error and entity 1`] = ` +Object { + "error": Object { + "code": "Error", + "message": "an error", + }, + "event": Object { + "action": "case_reopen", + "category": Array [ + "database", + ], + "outcome": "failure", + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "Failed attempt to update cases [id=1] as owner \\"awesome\\"", +} +`; + +exports[`audit_logger log function event structure creates the correct audit event for operation: "reopenCase" with an error but no entity 1`] = ` +Object { + "error": Object { + "code": "Error", + "message": "an error", + }, + "event": Object { + "action": "case_reopen", + "category": Array [ + "database", + ], + "outcome": "failure", + "type": Array [ + "change", + ], + }, + "message": "Failed attempt to update a case as any owners", +} +`; + +exports[`audit_logger log function event structure creates the correct audit event for operation: "reopenCase" without an error but with an entity 1`] = ` +Object { + "event": Object { + "action": "case_reopen", + "category": Array [ + "database", + ], + "outcome": "unknown", + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "5", + "type": "cases", + }, + }, + "message": "User is updating cases [id=5] as owner \\"super\\"", +} +`; + +exports[`audit_logger log function event structure creates the correct audit event for operation: "reopenCase" without an error or entity 1`] = ` +Object { + "event": Object { + "action": "case_reopen", + "category": Array [ + "database", + ], + "outcome": "unknown", + "type": Array [ + "change", + ], + }, + "message": "User is updating a case as any owners", +} +`; + exports[`audit_logger log function event structure creates the correct audit event for operation: "resolveCase" with an error and entity 1`] = ` Object { "error": Object { diff --git a/x-pack/plugins/cases/server/authorization/__snapshots__/authorization.test.ts.snap b/x-pack/plugins/cases/server/authorization/__snapshots__/authorization.test.ts.snap new file mode 100644 index 0000000000000..23575aaad0ddd --- /dev/null +++ b/x-pack/plugins/cases/server/authorization/__snapshots__/authorization.test.ts.snap @@ -0,0 +1,150 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`authorization ensureAuthorized with operation arrays handles multiple operations successfully when authorized 1`] = ` +Array [ + Array [ + Object { + "event": Object { + "action": "case_create", + "category": Array [ + "database", + ], + "outcome": "unknown", + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User is creating cases [id=1] as owner \\"a\\"", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_get", + "category": Array [ + "database", + ], + "outcome": "success", + "type": Array [ + "access", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User has accessed cases [id=1] as owner \\"a\\"", + }, + ], +] +`; + +exports[`authorization ensureAuthorized with operation arrays logs each operation separately 1`] = ` +Array [ + Array [ + Object { + "event": Object { + "action": "case_create", + "category": Array [ + "database", + ], + "outcome": "unknown", + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User is creating cases [id=1] as owner \\"a\\"", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_get", + "category": Array [ + "database", + ], + "outcome": "success", + "type": Array [ + "access", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User has accessed cases [id=1] as owner \\"a\\"", + }, + ], +] +`; + +exports[`authorization ensureAuthorized with operation arrays throws on first unauthorized operation in array 1`] = ` +Array [ + Array [ + Object { + "error": Object { + "code": "Error", + "message": "Unauthorized to create, access case with owners: \\"a\\"", + }, + "event": Object { + "action": "case_create", + "category": Array [ + "database", + ], + "outcome": "failure", + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "Failed attempt to create cases [id=1] as owner \\"a\\"", + }, + ], + Array [ + Object { + "error": Object { + "code": "Error", + "message": "Unauthorized to create, access case with owners: \\"a\\"", + }, + "event": Object { + "action": "case_get", + "category": Array [ + "database", + ], + "outcome": "failure", + "type": Array [ + "access", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "Failed attempt to access cases [id=1] as owner \\"a\\"", + }, + ], +] +`; diff --git a/x-pack/plugins/cases/server/authorization/audit_logger.ts b/x-pack/plugins/cases/server/authorization/audit_logger.ts index 338af379bbcc7..2de847586228a 100644 --- a/x-pack/plugins/cases/server/authorization/audit_logger.ts +++ b/x-pack/plugins/cases/server/authorization/audit_logger.ts @@ -82,15 +82,18 @@ export class AuthorizationAuditLogger { operation, }: { owners: string[]; - operation: OperationDetails; + operation: OperationDetails | OperationDetails[]; }) { const ownerMsg = owners.length <= 0 ? 'of any owner' : `with owners: "${owners.join(', ')}"`; + const operations = Array.isArray(operation) ? operation : [operation]; + const operationVerbs = [...new Set(operations.map((op) => op.verbs.present))].join(', '); + const operationDocTypes = [...new Set(operations.map((op) => op.docType))].join(', '); /** * This will take the form: * `Unauthorized to create case with owners: "securitySolution, observability"` * `Unauthorized to access cases of any owner` */ - return `Unauthorized to ${operation.verbs.present} ${operation.docType} ${ownerMsg}`; + return `Unauthorized to ${operationVerbs} ${operationDocTypes} ${ownerMsg}`; } /** diff --git a/x-pack/plugins/cases/server/authorization/authorization.test.ts b/x-pack/plugins/cases/server/authorization/authorization.test.ts index 6385bc03813a0..9ba13ed51dcb3 100644 --- a/x-pack/plugins/cases/server/authorization/authorization.test.ts +++ b/x-pack/plugins/cases/server/authorization/authorization.test.ts @@ -1459,4 +1459,80 @@ describe('authorization', () => { }); }); }); + + describe('ensureAuthorized with operation arrays', () => { + let auth: Authorization; + let securityStart: ReturnType; + let featuresStart: jest.Mocked; + let spacesStart: jest.Mocked; + + beforeEach(async () => { + securityStart = securityMock.createStart(); + securityStart.authz.mode.useRbacForRequest.mockReturnValue(true); + securityStart.authz.checkPrivilegesDynamicallyWithRequest.mockReturnValue( + jest.fn(async () => ({ hasAllRequested: true })) + ); + + featuresStart = featuresPluginMock.createStart(); + featuresStart.getKibanaFeatures.mockReturnValue([ + { id: '1', cases: ['a'] }, + ] as unknown as KibanaFeature[]); + + spacesStart = createSpacesDisabledFeaturesMock(); + + auth = await Authorization.create({ + request, + securityAuth: securityStart.authz, + spaces: spacesStart, + features: featuresStart, + auditLogger: new AuthorizationAuditLogger(mockLogger), + logger: loggingSystemMock.createLogger(), + }); + }); + + it('handles multiple operations successfully when authorized', async () => { + await expect( + auth.ensureAuthorized({ + entities: [{ id: '1', owner: 'a' }], + operation: [Operations.createCase, Operations.getCase], + }) + ).resolves.not.toThrow(); + + expect(mockLogger.log.mock.calls).toMatchSnapshot(); + }); + + it('throws on first unauthorized operation in array', async () => { + securityStart.authz.checkPrivilegesDynamicallyWithRequest.mockReturnValue( + jest.fn(async () => ({ hasAllRequested: false })) + ); + + await expect( + auth.ensureAuthorized({ + entities: [{ id: '1', owner: 'a' }], + operation: [Operations.createCase, Operations.getCase], + }) + ).rejects.toThrow('Unauthorized to create, access case with owners: "a"'); + + expect(mockLogger.log.mock.calls).toMatchSnapshot(); + }); + + it('logs each operation separately', async () => { + await auth.ensureAuthorized({ + entities: [{ id: '1', owner: 'a' }], + operation: [Operations.createCase, Operations.getCase], + }); + + expect(mockLogger.log).toHaveBeenCalledTimes(2); + expect(mockLogger.log.mock.calls).toMatchSnapshot(); + }); + + it('handles empty operation array', async () => { + await expect( + auth.ensureAuthorized({ + entities: [{ id: '1', owner: 'a' }], + operation: [], + }) + ).resolves.not.toThrow(); + }); + }); }); diff --git a/x-pack/plugins/cases/server/authorization/authorization.ts b/x-pack/plugins/cases/server/authorization/authorization.ts index ed255a5df18aa..f760e4498d06e 100644 --- a/x-pack/plugins/cases/server/authorization/authorization.ts +++ b/x-pack/plugins/cases/server/authorization/authorization.ts @@ -108,18 +108,17 @@ export class Authorization { operation, }: { entities: OwnerEntity[]; - operation: OperationDetails; + operation: OperationDetails | OperationDetails[]; }) { + const uniqueOwners = Array.from(new Set(entities.map((entity) => entity.owner))); + const operations = Array.isArray(operation) ? operation : [operation]; try { - const uniqueOwners = Array.from(new Set(entities.map((entity) => entity.owner))); - - await this._ensureAuthorized(uniqueOwners, operation); + await this._ensureAuthorized(uniqueOwners, operations); } catch (error) { - this.logSavedObjects({ entities, operation, error }); + this.logSavedObjects({ entities, operation: operations, error }); throw error; } - - this.logSavedObjects({ entities, operation }); + this.logSavedObjects({ entities, operation: operations }); } /** @@ -177,11 +176,15 @@ export class Authorization { error, }: { entities: OwnerEntity[]; - operation: OperationDetails; + operation: OperationDetails | OperationDetails[]; error?: Error; }) { + const operations = Array.isArray(operation) ? operation : [operation]; + for (const entity of entities) { - this.auditLogger.log({ operation, error, entity }); + for (const op of operations) { + this.auditLogger.log({ operation: op, error, entity }); + } } } @@ -197,15 +200,13 @@ export class Authorization { } } - private async _ensureAuthorized(owners: string[], operation: OperationDetails) { + private async _ensureAuthorized(owners: string[], operations: OperationDetails[]) { const { securityAuth } = this; const areAllOwnersAvailable = owners.every((owner) => this.featureCaseOwners.has(owner)); - if (securityAuth && this.shouldCheckAuthorization()) { - const requiredPrivileges: string[] = owners.map((owner) => - securityAuth.actions.cases.get(owner, operation.name) + const requiredPrivileges: string[] = operations.flatMap((operation) => + owners.map((owner) => securityAuth.actions.cases.get(owner, operation.name)) ); - const checkPrivileges = securityAuth.checkPrivilegesDynamicallyWithRequest(this.request); const { hasAllRequested } = await checkPrivileges({ kibana: requiredPrivileges, @@ -219,14 +220,20 @@ export class Authorization { * as Privileged. * This check will ensure we don't accidentally let these through */ - throw Boom.forbidden(AuthorizationAuditLogger.createFailureMessage({ owners, operation })); + throw Boom.forbidden( + AuthorizationAuditLogger.createFailureMessage({ owners, operation: operations }) + ); } if (!hasAllRequested) { - throw Boom.forbidden(AuthorizationAuditLogger.createFailureMessage({ owners, operation })); + throw Boom.forbidden( + AuthorizationAuditLogger.createFailureMessage({ owners, operation: operations }) + ); } } else if (!areAllOwnersAvailable) { - throw Boom.forbidden(AuthorizationAuditLogger.createFailureMessage({ owners, operation })); + throw Boom.forbidden( + AuthorizationAuditLogger.createFailureMessage({ owners, operation: operations }) + ); } // else security is disabled so let the operation proceed @@ -288,7 +295,6 @@ export class Authorization { const { hasAllRequested, username, privileges } = await checkPrivileges({ kibana: [...requiredPrivileges.keys()], }); - return { hasAllRequested, username, diff --git a/x-pack/plugins/cases/server/authorization/index.ts b/x-pack/plugins/cases/server/authorization/index.ts index 12653aa6079e6..40b6c5d7101c5 100644 --- a/x-pack/plugins/cases/server/authorization/index.ts +++ b/x-pack/plugins/cases/server/authorization/index.ts @@ -59,7 +59,7 @@ const EVENT_TYPES: Record> = { }; /** - * These values need to match the respective values in this file: x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/cases.ts + * These values need to match the respective values in this file: x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts * These are shared between find, get, get all, and delete/delete all * There currently isn't a use case for a user to delete one comment but not all or differentiating between get, get all, * and find operations from a privilege stand point. @@ -182,6 +182,14 @@ const CaseOperations = { docType: 'cases', savedObjectType: CASE_SAVED_OBJECT, }, + [WriteOperations.ReopenCase]: { + ecsType: EVENT_TYPES.change, + name: WriteOperations.ReopenCase as const, + action: 'case_reopen', + verbs: updateVerbs, + docType: 'case', + savedObjectType: CASE_SAVED_OBJECT, + }, }; const ConfigurationOperations = { diff --git a/x-pack/plugins/cases/server/authorization/types.ts b/x-pack/plugins/cases/server/authorization/types.ts index f97c6fc597457..1031e2db0ec77 100644 --- a/x-pack/plugins/cases/server/authorization/types.ts +++ b/x-pack/plugins/cases/server/authorization/types.ts @@ -63,6 +63,7 @@ export enum WriteOperations { UpdateComment = 'updateComment', CreateConfiguration = 'createConfiguration', UpdateConfiguration = 'updateConfiguration', + ReopenCase = 'reopenCase', } /** @@ -75,7 +76,7 @@ export interface OperationDetails { ecsType: ArrayElement; /** * The name of the operation to authorize against for the privilege check. - * These values need to match one of the operation strings defined here: x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/cases.ts + * These values need to match one of the operation strings defined here: x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts * * To avoid the authorization strings getting too large, new operations should generally fit within one of the * CasesSupportedOperations. In the situation where a new one is needed we'll have to add it to the security plugin. diff --git a/x-pack/plugins/cases/server/client/cases/bulk_update.test.ts b/x-pack/plugins/cases/server/client/cases/bulk_update.test.ts index 0109e6eda8808..755084d624b9f 100644 --- a/x-pack/plugins/cases/server/client/cases/bulk_update.test.ts +++ b/x-pack/plugins/cases/server/client/cases/bulk_update.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CustomFieldTypes } from '../../../common/types/domain'; +import { CustomFieldTypes, CaseStatuses } from '../../../common/types/domain'; import { MAX_CATEGORY_LENGTH, MAX_DESCRIPTION_LENGTH, @@ -19,6 +19,7 @@ import { } from '../../../common/constants'; import { mockCases } from '../../mocks'; import { createCasesClientMock, createCasesClientMockArgs } from '../mocks'; +import { Operations } from '../../authorization'; import { bulkUpdate } from './bulk_update'; describe('update', () => { @@ -1628,5 +1629,135 @@ describe('update', () => { ); }); }); + + describe('Authorization', () => { + const clientArgs = createCasesClientMockArgs(); + + beforeEach(() => { + jest.clearAllMocks(); + clientArgs.services.caseService.getCases.mockResolvedValue({ saved_objects: mockCases }); + clientArgs.services.caseService.getAllCaseComments.mockResolvedValue({ + saved_objects: [], + total: 0, + per_page: 10, + page: 1, + }); + clientArgs.services.attachmentService.getter.getCaseCommentStats.mockResolvedValue( + new Map() + ); + }); + + it('checks authorization for updateCase operation', async () => { + clientArgs.services.caseService.patchCases.mockResolvedValue({ + saved_objects: [{ ...mockCases[0] }], + }); + + await bulkUpdate( + { + cases: [ + { + id: mockCases[0].id, + version: mockCases[0].version ?? '', + title: 'Updated title', + }, + ], + }, + clientArgs, + casesClientMock + ); + + expect(clientArgs.authorization.ensureAuthorized).toHaveBeenCalledWith({ + entities: [{ id: mockCases[0].id, owner: mockCases[0].attributes.owner }], + operation: [Operations.updateCase], + }); + }); + + it('checks authorization for both reopenCase and updateCase operations when reopening a case', async () => { + // Mock a closed case + const closedCase = { + ...mockCases[0], + attributes: { + ...mockCases[0].attributes, + status: CaseStatuses.closed, + }, + }; + clientArgs.services.caseService.getCases.mockResolvedValue({ saved_objects: [closedCase] }); + + clientArgs.services.caseService.patchCases.mockResolvedValue({ + saved_objects: [{ ...closedCase }], + }); + + await bulkUpdate( + { + cases: [ + { + id: closedCase.id, + version: closedCase.version ?? '', + status: CaseStatuses.open, + }, + ], + }, + clientArgs, + casesClientMock + ); + + expect(clientArgs.authorization.ensureAuthorized).not.toThrow(); + }); + + it('throws when user is not authorized to update case', async () => { + const error = new Error('Unauthorized'); + clientArgs.authorization.ensureAuthorized.mockRejectedValue(error); + + await expect( + bulkUpdate( + { + cases: [ + { + id: mockCases[0].id, + version: mockCases[0].version ?? '', + title: 'Updated title', + }, + ], + }, + clientArgs, + casesClientMock + ) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Failed to update case, ids: [{\\"id\\":\\"mock-id-1\\",\\"version\\":\\"WzAsMV0=\\"}]: Error: Unauthorized"` + ); + }); + + it('throws when user is not authorized to reopen case', async () => { + const closedCase = { + ...mockCases[0], + attributes: { + ...mockCases[0].attributes, + status: CaseStatuses.closed, + }, + }; + clientArgs.services.caseService.getCases.mockResolvedValue({ saved_objects: [closedCase] }); + + const error = new Error('Unauthorized to reopen case'); + clientArgs.authorization.ensureAuthorized.mockRejectedValueOnce(error); // Reject reopenCase + + await expect( + bulkUpdate( + { + cases: [ + { + id: closedCase.id, + version: closedCase.version ?? '', + status: CaseStatuses.open, + }, + ], + }, + clientArgs, + casesClientMock + ) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Failed to update case, ids: [{\\"id\\":\\"mock-id-1\\",\\"version\\":\\"WzAsMV0=\\"}]: Error: Unauthorized to reopen case"` + ); + }); + }); }); }); diff --git a/x-pack/plugins/cases/server/client/cases/bulk_update.ts b/x-pack/plugins/cases/server/client/cases/bulk_update.ts index b9984ac53b05e..9a90168b858de 100644 --- a/x-pack/plugins/cases/server/client/cases/bulk_update.ts +++ b/x-pack/plugins/cases/server/client/cases/bulk_update.ts @@ -272,9 +272,11 @@ function partitionPatchRequest( conflictedCases: CasePatchRequest[]; // This will be a deduped array of case IDs with their corresponding owner casesToAuthorize: OwnerEntity[]; + reopenedCases: CasePatchRequest[]; } { const nonExistingCases: CasePatchRequest[] = []; const conflictedCases: CasePatchRequest[] = []; + const reopenedCases: CasePatchRequest[] = []; const casesToAuthorize: Map = new Map(); for (const reqCase of patchReqCases) { @@ -286,6 +288,13 @@ function partitionPatchRequest( conflictedCases.push(reqCase); // let's try to authorize the conflicted case even though we'll fail after afterwards just in case casesToAuthorize.set(foundCase.id, { id: foundCase.id, owner: foundCase.attributes.owner }); + } else if ( + reqCase.status != null && + foundCase.attributes.status !== reqCase.status && + foundCase.attributes.status === CaseStatuses.closed + ) { + // Track cases that are closed and a user is attempting to reopen + reopenedCases.push(reqCase); } else { casesToAuthorize.set(foundCase.id, { id: foundCase.id, owner: foundCase.attributes.owner }); } @@ -294,6 +303,7 @@ function partitionPatchRequest( return { nonExistingCases, conflictedCases, + reopenedCases, casesToAuthorize: Array.from(casesToAuthorize.values()), }; } @@ -344,14 +354,17 @@ export const bulkUpdate = async ( return acc; }, new Map()); - const { nonExistingCases, conflictedCases, casesToAuthorize } = partitionPatchRequest( - casesMap, - query.cases - ); + const { nonExistingCases, conflictedCases, casesToAuthorize, reopenedCases } = + partitionPatchRequest(casesMap, query.cases); + + const operationsToAuthorize = + reopenedCases.length > 0 + ? [Operations.reopenCase, Operations.updateCase] + : [Operations.updateCase]; await authorization.ensureAuthorized({ entities: casesToAuthorize, - operation: Operations.updateCase, + operation: operationsToAuthorize, }); if (nonExistingCases.length > 0) { diff --git a/x-pack/plugins/cases/server/connectors/cases/index.test.ts b/x-pack/plugins/cases/server/connectors/cases/index.test.ts index 5c7b29ef4e704..7b6d244d165b3 100644 --- a/x-pack/plugins/cases/server/connectors/cases/index.test.ts +++ b/x-pack/plugins/cases/server/connectors/cases/index.test.ts @@ -36,6 +36,7 @@ describe('getCasesConnectorType', () => { 'cases:my-owner/updateComment', 'cases:my-owner/deleteComment', 'cases:my-owner/findConfigurations', + 'cases:my-owner/reopenCase', ]); }); @@ -356,6 +357,7 @@ describe('getCasesConnectorType', () => { 'cases:securitySolution/updateComment', 'cases:securitySolution/deleteComment', 'cases:securitySolution/findConfigurations', + 'cases:securitySolution/reopenCase', ]); }); @@ -376,6 +378,7 @@ describe('getCasesConnectorType', () => { 'cases:observability/updateComment', 'cases:observability/deleteComment', 'cases:observability/findConfigurations', + 'cases:observability/reopenCase', ]); }); @@ -396,6 +399,7 @@ describe('getCasesConnectorType', () => { 'cases:securitySolution/updateComment', 'cases:securitySolution/deleteComment', 'cases:securitySolution/findConfigurations', + 'cases:securitySolution/reopenCase', ]); }); }); diff --git a/x-pack/plugins/cases/server/connectors/cases/utils.test.ts b/x-pack/plugins/cases/server/connectors/cases/utils.test.ts index 976a7eadb5aec..55ffb5c7170bd 100644 --- a/x-pack/plugins/cases/server/connectors/cases/utils.test.ts +++ b/x-pack/plugins/cases/server/connectors/cases/utils.test.ts @@ -507,6 +507,7 @@ describe('utils', () => { 'cases:my-owner/updateComment', 'cases:my-owner/deleteComment', 'cases:my-owner/findConfigurations', + 'cases:my-owner/reopenCase', ]); }); }); diff --git a/x-pack/plugins/cases/server/connectors/cases/utils.ts b/x-pack/plugins/cases/server/connectors/cases/utils.ts index a2513027c9cb3..b9cd2982553e3 100644 --- a/x-pack/plugins/cases/server/connectors/cases/utils.ts +++ b/x-pack/plugins/cases/server/connectors/cases/utils.ts @@ -109,7 +109,7 @@ export const buildCustomFieldsForRequest = ( export const constructRequiredKibanaPrivileges = (owner: string): string[] => { /** * Kibana features privileges are defined in - * x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/cases.ts + * x-pack/packages/security/authorization_core/src/privileges/feature_privilege_builder/cases.ts */ return [ `cases:${owner}/createCase`, @@ -120,5 +120,6 @@ export const constructRequiredKibanaPrivileges = (owner: string): string[] => { `cases:${owner}/updateComment`, `cases:${owner}/deleteComment`, `cases:${owner}/findConfigurations`, + `cases:${owner}/reopenCase`, ]; }; diff --git a/x-pack/plugins/cases/server/features/constants.ts b/x-pack/plugins/cases/server/features/constants.ts new file mode 100644 index 0000000000000..fb0a0f4554dee --- /dev/null +++ b/x-pack/plugins/cases/server/features/constants.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Unique sub privilege ids for cases. + * @description When upgrading (creating new versions), the sub-privileges + * do not need to be versioned as they are appended to the top level privilege id which is the only id + * that will need to be versioned + */ + +export const CASES_DELETE_SUB_PRIVILEGE_ID = 'cases_delete'; +export const CASES_SETTINGS_SUB_PRIVILEGE_ID = 'cases_settings'; +export const CASES_CREATE_COMMENT_SUB_PRIVILEGE_ID = 'create_comment'; +export const CASES_REOPEN_SUB_PRIVILEGE_ID = 'case_reopen'; diff --git a/x-pack/plugins/cases/server/features/index.ts b/x-pack/plugins/cases/server/features/index.ts new file mode 100644 index 0000000000000..afa3dfab9b311 --- /dev/null +++ b/x-pack/plugins/cases/server/features/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { KibanaFeatureConfig } from '@kbn/features-plugin/common'; +import { getV1 } from './v1'; +import { getV2 } from './v2'; + +export const getCasesKibanaFeatures = (): { + v1: KibanaFeatureConfig; + v2: KibanaFeatureConfig; +} => ({ v1: getV1(), v2: getV2() }); diff --git a/x-pack/plugins/cases/server/features.ts b/x-pack/plugins/cases/server/features/v1.ts similarity index 67% rename from x-pack/plugins/cases/server/features.ts rename to x-pack/plugins/cases/server/features/v1.ts index f8f162b2ae3dc..25a43434f3723 100644 --- a/x-pack/plugins/cases/server/features.ts +++ b/x-pack/plugins/cases/server/features/v1.ts @@ -12,8 +12,9 @@ import { hiddenTypes as filesSavedObjectTypes } from '@kbn/files-plugin/server/s import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { KibanaFeatureScope } from '@kbn/features-plugin/common'; -import { APP_ID, FEATURE_ID } from '../common/constants'; -import { createUICapabilities, getApiTags } from '../common'; +import { APP_ID, FEATURE_ID, FEATURE_ID_V2 } from '../../common/constants'; +import { createUICapabilities, getApiTags } from '../../common'; +import { CASES_DELETE_SUB_PRIVILEGE_ID, CASES_SETTINGS_SUB_PRIVILEGE_ID } from './constants'; /** * The order of appearance in the feature privilege page @@ -23,14 +24,24 @@ import { createUICapabilities, getApiTags } from '../common'; const FEATURE_ORDER = 3100; -export const getCasesKibanaFeature = (): KibanaFeatureConfig => { +export const getV1 = (): KibanaFeatureConfig => { const capabilities = createUICapabilities(); const apiTags = getApiTags(APP_ID); return { + deprecated: { + notice: i18n.translate('xpack.cases.features.casesFeature.deprecationMessage', { + defaultMessage: + 'The {currentId} permissions are deprecated, please see {casesFeatureIdV2}.', + values: { + currentId: FEATURE_ID, + casesFeatureIdV2: FEATURE_ID_V2, + }, + }), + }, id: FEATURE_ID, - name: i18n.translate('xpack.cases.features.casesFeatureName', { - defaultMessage: 'Cases', + name: i18n.translate('xpack.cases.features.casesFeatureNameDeprecated', { + defaultMessage: 'Cases (Deprecated)', }), category: DEFAULT_APP_CATEGORIES.management, scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], @@ -42,12 +53,14 @@ export const getCasesKibanaFeature = (): KibanaFeatureConfig => { cases: [APP_ID], privileges: { all: { - api: apiTags.all, + api: [...apiTags.all, ...apiTags.createComment], cases: { create: [APP_ID], read: [APP_ID], update: [APP_ID], push: [APP_ID], + createComment: [APP_ID], + reopenCase: [APP_ID], }, management: { insightsAndAlerting: [APP_ID], @@ -57,6 +70,15 @@ export const getCasesKibanaFeature = (): KibanaFeatureConfig => { read: [...filesSavedObjectTypes], }, ui: capabilities.all, + replacedBy: { + default: [{ feature: FEATURE_ID_V2, privileges: ['all'] }], + minimal: [ + { + feature: FEATURE_ID_V2, + privileges: ['minimal_all', 'create_comment', 'case_reopen'], + }, + ], + }, }, read: { api: apiTags.read, @@ -71,6 +93,10 @@ export const getCasesKibanaFeature = (): KibanaFeatureConfig => { read: [...filesSavedObjectTypes], }, ui: capabilities.read, + replacedBy: { + default: [{ feature: FEATURE_ID_V2, privileges: ['read'] }], + minimal: [{ feature: FEATURE_ID_V2, privileges: ['minimal_read'] }], + }, }, }, subFeatures: [ @@ -84,7 +110,7 @@ export const getCasesKibanaFeature = (): KibanaFeatureConfig => { privileges: [ { api: apiTags.delete, - id: 'cases_delete', + id: CASES_DELETE_SUB_PRIVILEGE_ID, name: i18n.translate('xpack.cases.features.deleteSubFeatureDetails', { defaultMessage: 'Delete cases and comments', }), @@ -97,6 +123,9 @@ export const getCasesKibanaFeature = (): KibanaFeatureConfig => { delete: [APP_ID], }, ui: capabilities.delete, + replacedBy: [ + { feature: FEATURE_ID_V2, privileges: [CASES_DELETE_SUB_PRIVILEGE_ID] }, + ], }, ], }, @@ -111,7 +140,7 @@ export const getCasesKibanaFeature = (): KibanaFeatureConfig => { groupType: 'independent', privileges: [ { - id: 'cases_settings', + id: CASES_SETTINGS_SUB_PRIVILEGE_ID, name: i18n.translate('xpack.cases.features.casesSettingsSubFeatureDetails', { defaultMessage: 'Edit case settings', }), @@ -124,6 +153,9 @@ export const getCasesKibanaFeature = (): KibanaFeatureConfig => { settings: [APP_ID], }, ui: capabilities.settings, + replacedBy: [ + { feature: FEATURE_ID_V2, privileges: [CASES_SETTINGS_SUB_PRIVILEGE_ID] }, + ], }, ], }, diff --git a/x-pack/plugins/cases/server/features/v2.ts b/x-pack/plugins/cases/server/features/v2.ts new file mode 100644 index 0000000000000..fca97303f02ab --- /dev/null +++ b/x-pack/plugins/cases/server/features/v2.ts @@ -0,0 +1,195 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +import type { KibanaFeatureConfig } from '@kbn/features-plugin/common'; +import { hiddenTypes as filesSavedObjectTypes } from '@kbn/files-plugin/server/saved_objects'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; + +import { KibanaFeatureScope } from '@kbn/features-plugin/common'; +import { APP_ID, FEATURE_ID_V2 } from '../../common/constants'; +import { createUICapabilities, getApiTags } from '../../common'; +import { + CASES_DELETE_SUB_PRIVILEGE_ID, + CASES_SETTINGS_SUB_PRIVILEGE_ID, + CASES_CREATE_COMMENT_SUB_PRIVILEGE_ID, + CASES_REOPEN_SUB_PRIVILEGE_ID, +} from './constants'; + +/** + * The order of appearance in the feature privilege page + * under the management section. Cases should be under + * the Actions and Connectors feature + */ + +const FEATURE_ORDER = 3100; + +export const getV2 = (): KibanaFeatureConfig => { + const capabilities = createUICapabilities(); + const apiTags = getApiTags(APP_ID); + + return { + id: FEATURE_ID_V2, + name: i18n.translate('xpack.cases.features.casesFeatureName', { + defaultMessage: 'Cases', + }), + category: DEFAULT_APP_CATEGORIES.management, + scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], + app: [], + order: FEATURE_ORDER, + management: { + insightsAndAlerting: [APP_ID], + }, + cases: [APP_ID], + privileges: { + all: { + api: apiTags.all, + cases: { + create: [APP_ID], + read: [APP_ID], + update: [APP_ID], + push: [APP_ID], + }, + management: { + insightsAndAlerting: [APP_ID], + }, + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + ui: capabilities.all, + }, + read: { + api: apiTags.read, + cases: { + read: [APP_ID], + }, + management: { + insightsAndAlerting: [APP_ID], + }, + savedObject: { + all: [], + read: [...filesSavedObjectTypes], + }, + ui: capabilities.read, + }, + }, + subFeatures: [ + { + name: i18n.translate('xpack.cases.features.deleteSubFeatureName', { + defaultMessage: 'Delete', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + api: apiTags.delete, + id: CASES_DELETE_SUB_PRIVILEGE_ID, + name: i18n.translate('xpack.cases.features.deleteSubFeatureDetails', { + defaultMessage: 'Delete cases and comments', + }), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + delete: [APP_ID], + }, + ui: capabilities.delete, + }, + ], + }, + ], + }, + { + name: i18n.translate('xpack.cases.features.casesSettingsSubFeatureName', { + defaultMessage: 'Case settings', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: CASES_SETTINGS_SUB_PRIVILEGE_ID, + name: i18n.translate('xpack.cases.features.casesSettingsSubFeatureDetails', { + defaultMessage: 'Edit case settings', + }), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + settings: [APP_ID], + }, + ui: capabilities.settings, + }, + ], + }, + ], + }, + { + name: i18n.translate('xpack.cases.features.addCommentsSubFeatureName', { + defaultMessage: 'Create comments & attachments', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + api: apiTags.createComment, + id: CASES_CREATE_COMMENT_SUB_PRIVILEGE_ID, + name: i18n.translate('xpack.cases.features.addCommentsSubFeatureDetails', { + defaultMessage: 'Add comments to cases', + }), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + createComment: [APP_ID], + }, + ui: capabilities.createComment, + }, + ], + }, + ], + }, + { + name: i18n.translate('xpack.cases.features.reopenCaseSubFeatureName', { + defaultMessage: 'Re-open', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: CASES_REOPEN_SUB_PRIVILEGE_ID, + name: i18n.translate('xpack.cases.features.reopenCaseSubFeatureDetails', { + defaultMessage: 'Re-open closed cases', + }), + includeIn: 'all', + savedObject: { + all: [], + read: [], + }, + cases: { + reopenCase: [APP_ID], + }, + ui: capabilities.reopenCase, + }, + ], + }, + ], + }, + ], + }; +}; diff --git a/x-pack/plugins/cases/server/plugin.ts b/x-pack/plugins/cases/server/plugin.ts index b40089ff75050..dfd4c013f0d58 100644 --- a/x-pack/plugins/cases/server/plugin.ts +++ b/x-pack/plugins/cases/server/plugin.ts @@ -30,7 +30,7 @@ import type { CasesServerStartDependencies, } from './types'; import { CasesClientFactory } from './client/factory'; -import { getCasesKibanaFeature } from './features'; +import { getCasesKibanaFeatures } from './features'; import { registerRoutes } from './routes/api/register_routes'; import { getExternalRoutes } from './routes/api/get_external_routes'; import { createCasesTelemetry, scheduleCasesTelemetryTask } from './telemetry'; @@ -92,7 +92,11 @@ export class CasePlugin this.lensEmbeddableFactory = plugins.lens.lensEmbeddableFactory; if (this.caseConfig.stack.enabled) { - plugins.features.registerKibanaFeature(getCasesKibanaFeature()); + // V1 is deprecated, but has to be maintained for the time being + // https://github.com/elastic/kibana/pull/186800#issue-2369812818 + const casesFeatures = getCasesKibanaFeatures(); + plugins.features.registerKibanaFeature(casesFeatures.v1); + plugins.features.registerKibanaFeature(casesFeatures.v2); } registerSavedObjects({ diff --git a/x-pack/plugins/cloud/server/plugin.ts b/x-pack/plugins/cloud/server/plugin.ts index 9821aa318e264..8b20906c30f89 100644 --- a/x-pack/plugins/cloud/server/plugin.ts +++ b/x-pack/plugins/cloud/server/plugin.ts @@ -9,6 +9,7 @@ import type { Logger } from '@kbn/logging'; import type { CoreSetup, Plugin, PluginInitializerContext } from '@kbn/core/server'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import type { SolutionId } from '@kbn/core-chrome-browser'; + import { registerCloudDeploymentMetadataAnalyticsContext } from '../common/register_cloud_deployment_id_analytics_context'; import type { CloudConfigType } from './config'; import { registerCloudUsageCollector } from './collectors'; @@ -18,7 +19,9 @@ import { decodeCloudId, DecodedCloudId } from '../common/decode_cloud_id'; import { parseOnboardingSolution } from '../common/parse_onboarding_default_solution'; import { getFullCloudUrl } from '../common/utils'; import { readInstanceSizeMb } from './env'; -import { defineRoutes } from './routes/elasticsearch_routes'; +import { defineRoutes } from './routes'; +import { CloudRequestHandlerContext } from './routes/types'; +import { setupSavedObjects } from './saved_objects'; interface PluginsSetup { usageCollection?: UsageCollectionSetup; @@ -202,10 +205,15 @@ export class CloudPlugin implements Plugin { if (this.config.id) { decodedId = decodeCloudId(this.config.id, this.logger); } - const router = core.http.createRouter(); + const router = core.http.createRouter(); const elasticsearchUrl = core.elasticsearch.publicBaseUrl || decodedId?.elasticsearchUrl; - defineRoutes({ logger: this.logger, router, elasticsearchUrl }); + defineRoutes({ + logger: this.logger, + router, + elasticsearchUrl, + }); + setupSavedObjects(core.savedObjects, this.logger); return { ...this.getCloudUrls(), cloudId: this.config.id, diff --git a/x-pack/plugins/cloud/server/routes/constants.ts b/x-pack/plugins/cloud/server/routes/constants.ts new file mode 100644 index 0000000000000..a1bfb699ac6b1 --- /dev/null +++ b/x-pack/plugins/cloud/server/routes/constants.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const CLOUD_DATA_SAVED_OBJECT_ID = 'cloud-data-saved-object-id'; diff --git a/x-pack/plugins/cloud/server/routes/elasticsearch_routes.ts b/x-pack/plugins/cloud/server/routes/elasticsearch_route.ts similarity index 96% rename from x-pack/plugins/cloud/server/routes/elasticsearch_routes.ts rename to x-pack/plugins/cloud/server/routes/elasticsearch_route.ts index d3a5c4bebf305..41537a6dc075b 100644 --- a/x-pack/plugins/cloud/server/routes/elasticsearch_routes.ts +++ b/x-pack/plugins/cloud/server/routes/elasticsearch_route.ts @@ -10,7 +10,7 @@ import { Logger } from '@kbn/logging'; import { ElasticsearchConfigType } from '../../common/types'; import { ELASTICSEARCH_CONFIG_ROUTE } from '../../common/constants'; -export function defineRoutes({ +export function setElasticsearchRoute({ elasticsearchUrl, logger, router, diff --git a/x-pack/plugins/cloud/server/routes/get_cloud_data_route.ts b/x-pack/plugins/cloud/server/routes/get_cloud_data_route.ts new file mode 100644 index 0000000000000..c905e4b641c0c --- /dev/null +++ b/x-pack/plugins/cloud/server/routes/get_cloud_data_route.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RouteOptions } from '.'; +import { CLOUD_DATA_SAVED_OBJECT_ID } from './constants'; +import { CLOUD_DATA_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { CloudDataAttributes } from './types'; + +export const setGetCloudSolutionDataRoute = ({ router }: RouteOptions) => { + router.versioned + .get({ + path: `/internal/cloud/solution`, + access: 'internal', + summary: 'Get cloud data for solutions', + }) + .addVersion( + { + version: '1', + validate: { + request: {}, + }, + }, + async (context, request, response) => { + const coreContext = await context.core; + const savedObjectsClient = coreContext.savedObjects.getClient({ + includedHiddenTypes: [CLOUD_DATA_SAVED_OBJECT_TYPE], + }); + try { + const cloudDataSo = await savedObjectsClient.get( + CLOUD_DATA_SAVED_OBJECT_TYPE, + CLOUD_DATA_SAVED_OBJECT_ID + ); + return response.ok({ body: cloudDataSo?.attributes ?? null }); + } catch (error) { + return response.customError(error); + } + } + ); +}; diff --git a/x-pack/plugins/cloud/server/routes/index.ts b/x-pack/plugins/cloud/server/routes/index.ts new file mode 100644 index 0000000000000..5db24b880881c --- /dev/null +++ b/x-pack/plugins/cloud/server/routes/index.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IRouter } from '@kbn/core/server'; +import { Logger } from '@kbn/logging'; +import { setPostCloudSolutionDataRoute } from './set_cloud_data_route'; +import { CloudRequestHandlerContext } from './types'; +import { setElasticsearchRoute } from './elasticsearch_route'; +import { setGetCloudSolutionDataRoute } from './get_cloud_data_route'; + +export interface RouteOptions { + logger: Logger; + router: IRouter; + elasticsearchUrl?: string; +} + +export function defineRoutes(opts: RouteOptions) { + const { logger, elasticsearchUrl, router } = opts; + + setElasticsearchRoute({ logger, elasticsearchUrl, router }); + setGetCloudSolutionDataRoute({ logger, router }); + setPostCloudSolutionDataRoute({ logger, router }); +} diff --git a/x-pack/plugins/cloud/server/routes/set_cloud_data_route.test.ts b/x-pack/plugins/cloud/server/routes/set_cloud_data_route.test.ts new file mode 100644 index 0000000000000..c36e49206a287 --- /dev/null +++ b/x-pack/plugins/cloud/server/routes/set_cloud_data_route.test.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { httpServerMock, httpServiceMock } from '@kbn/core/server/mocks'; +import { + RequestHandlerContext, + RouteValidatorConfig, + SavedObjectsErrorHelpers, + kibanaResponseFactory, +} from '@kbn/core/server'; +import { CLOUD_DATA_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { CLOUD_DATA_SAVED_OBJECT_ID } from './constants'; +import { setPostCloudSolutionDataRoute } from './set_cloud_data_route'; +import { RouteOptions } from '.'; + +const mockSavedObjectsClientGet = jest.fn(); +const mockSavedObjectsClientCreate = jest.fn(); +const mockSavedObjectsClientUpdate = jest.fn(); + +const mockRouteContext = { + core: { + savedObjects: { + getClient: () => ({ + get: mockSavedObjectsClientGet, + create: mockSavedObjectsClientCreate, + update: mockSavedObjectsClientUpdate, + }), + }, + }, +} as unknown as RequestHandlerContext; + +describe('POST /internal/cloud/solution', () => { + const setup = async () => { + const httpService = httpServiceMock.createSetupContract(); + const router = httpService.createRouter(); + + setPostCloudSolutionDataRoute({ + router, + } as unknown as RouteOptions); + + const [routeDefinition, routeHandler] = + router.versioned.post.mock.results[0].value.addVersion.mock.calls[0]; + + return { + routeValidation: routeDefinition.validate as RouteValidatorConfig<{}, {}, {}>, + routeHandler, + }; + }; + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should create cloud data if it does not exist', async () => { + const { routeHandler } = await setup(); + + mockSavedObjectsClientGet.mockRejectedValue( + SavedObjectsErrorHelpers.createGenericNotFoundError() + ); + + const request = httpServerMock.createKibanaRequest({ + body: { + onboardingData: { + solutionType: 'security', + token: 'test-token', + }, + }, + method: 'post', + }); + + await routeHandler(mockRouteContext, request, kibanaResponseFactory); + + expect(mockSavedObjectsClientGet).toHaveBeenCalledWith( + CLOUD_DATA_SAVED_OBJECT_TYPE, + CLOUD_DATA_SAVED_OBJECT_ID + ); + expect(mockSavedObjectsClientCreate).toHaveBeenCalledWith( + CLOUD_DATA_SAVED_OBJECT_TYPE, + { onboardingData: request.body.onboardingData }, + { id: CLOUD_DATA_SAVED_OBJECT_ID } + ); + }); + + it('should update cloud data if it exists', async () => { + const { routeHandler } = await setup(); + + mockSavedObjectsClientGet.mockResolvedValue({ + id: CLOUD_DATA_SAVED_OBJECT_ID, + attributes: { + onboardingData: { solutionType: 'o11y', token: 'test-33' }, + }, + }); + + const request = httpServerMock.createKibanaRequest({ + body: { + onboardingData: { + solutionType: 'security', + token: 'test-token', + }, + }, + method: 'post', + }); + + await routeHandler(mockRouteContext, request, kibanaResponseFactory); + + expect(mockSavedObjectsClientGet).toHaveBeenCalledWith( + CLOUD_DATA_SAVED_OBJECT_TYPE, + CLOUD_DATA_SAVED_OBJECT_ID + ); + expect(mockSavedObjectsClientUpdate).toHaveBeenCalledWith( + CLOUD_DATA_SAVED_OBJECT_TYPE, + CLOUD_DATA_SAVED_OBJECT_ID, + { onboardingData: request.body.onboardingData } + ); + }); +}); diff --git a/x-pack/plugins/cloud/server/routes/set_cloud_data_route.ts b/x-pack/plugins/cloud/server/routes/set_cloud_data_route.ts new file mode 100644 index 0000000000000..511c8dc2081f0 --- /dev/null +++ b/x-pack/plugins/cloud/server/routes/set_cloud_data_route.ts @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; +import { ReservedPrivilegesSet, SavedObjectsErrorHelpers } from '@kbn/core/server'; +import { RouteOptions } from '.'; +import { CLOUD_DATA_SAVED_OBJECT_ID } from './constants'; +import { CLOUD_DATA_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { CloudDataAttributes } from './types'; + +const createBodySchemaV1 = schema.object({ + onboardingData: schema.object({ + solutionType: schema.oneOf([ + schema.literal('security'), + schema.literal('observability'), + schema.literal('search'), + schema.literal('elasticsearch'), + ]), + token: schema.string(), + }), +}); + +export const setPostCloudSolutionDataRoute = ({ router }: RouteOptions) => { + router.versioned + .post({ + path: `/internal/cloud/solution`, + access: 'internal', + summary: 'Save cloud data for solutions', + security: { + authz: { + requiredPrivileges: [ReservedPrivilegesSet.superuser], + }, + }, + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: createBodySchemaV1, + }, + }, + }, + async (context, request, response) => { + const coreContext = await context.core; + const savedObjectsClient = coreContext.savedObjects.getClient({ + includedHiddenTypes: [CLOUD_DATA_SAVED_OBJECT_TYPE], + }); + let cloudDataSo = null; + try { + cloudDataSo = await savedObjectsClient.get( + CLOUD_DATA_SAVED_OBJECT_TYPE, + CLOUD_DATA_SAVED_OBJECT_ID + ); + } catch (error) { + if (SavedObjectsErrorHelpers.isNotFoundError(error)) { + cloudDataSo = null; + } else { + return response.customError(error); + } + } + + try { + if (cloudDataSo === null) { + await savedObjectsClient.create( + CLOUD_DATA_SAVED_OBJECT_TYPE, + { + onboardingData: request.body.onboardingData, + }, + { id: CLOUD_DATA_SAVED_OBJECT_ID } + ); + } else { + await savedObjectsClient.update( + CLOUD_DATA_SAVED_OBJECT_TYPE, + CLOUD_DATA_SAVED_OBJECT_ID, + { + onboardingData: request.body.onboardingData, + } + ); + } + } catch (error) { + return response.badRequest(error); + } + + return response.ok(); + } + ); +}; diff --git a/x-pack/plugins/cloud/server/routes/types.ts b/x-pack/plugins/cloud/server/routes/types.ts new file mode 100644 index 0000000000000..d69877c7b326e --- /dev/null +++ b/x-pack/plugins/cloud/server/routes/types.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CustomRequestHandlerContext } from '@kbn/core/server'; + +/** + * @internal + */ +export type CloudRequestHandlerContext = CustomRequestHandlerContext<{}>; + +export interface CloudDataAttributes { + onboardingData: { + solutionType: 'security' | 'observability' | 'search' | 'elasticsearch'; + token: string; + }; +} diff --git a/x-pack/plugins/cloud/server/saved_objects/index.ts b/x-pack/plugins/cloud/server/saved_objects/index.ts new file mode 100644 index 0000000000000..295e6d81a39fb --- /dev/null +++ b/x-pack/plugins/cloud/server/saved_objects/index.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Logger, SavedObjectsServiceSetup } from '@kbn/core/server'; + +export const CLOUD_DATA_SAVED_OBJECT_TYPE = 'cloud' as const; + +export function setupSavedObjects(savedObjects: SavedObjectsServiceSetup, logger: Logger) { + savedObjects.registerType({ + name: CLOUD_DATA_SAVED_OBJECT_TYPE, + hidden: true, + hiddenFromHttpApis: true, + namespaceType: 'agnostic', + mappings: { + dynamic: false, + properties: {}, + }, + management: { + importableAndExportable: false, + }, + modelVersions: {}, + }); +} diff --git a/x-pack/plugins/cloud/server/saved_objects/model_versions/cloud_data_model_versions.ts b/x-pack/plugins/cloud/server/saved_objects/model_versions/cloud_data_model_versions.ts new file mode 100644 index 0000000000000..051a733d39178 --- /dev/null +++ b/x-pack/plugins/cloud/server/saved_objects/model_versions/cloud_data_model_versions.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsModelVersionMap } from '@kbn/core-saved-objects-server'; +import { schema } from '@kbn/config-schema'; + +export const cloudDataModelVersions: SavedObjectsModelVersionMap = { + '1': { + changes: [], + schemas: { + forwardCompatibility: schema.object({}).extends({}, { unknowns: 'ignore' }), + create: schema.object({}), + }, + }, +}; diff --git a/x-pack/plugins/cloud/server/saved_objects/model_versions/index.ts b/x-pack/plugins/cloud/server/saved_objects/model_versions/index.ts new file mode 100644 index 0000000000000..51e8b5431c547 --- /dev/null +++ b/x-pack/plugins/cloud/server/saved_objects/model_versions/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { cloudDataModelVersions } from './cloud_data_model_versions'; diff --git a/x-pack/plugins/cloud/tsconfig.json b/x-pack/plugins/cloud/tsconfig.json index dd25064897758..37d0b6f4b4de0 100644 --- a/x-pack/plugins/cloud/tsconfig.json +++ b/x-pack/plugins/cloud/tsconfig.json @@ -17,6 +17,7 @@ "@kbn/config-schema", "@kbn/logging-mocks", "@kbn/logging", + "@kbn/core-saved-objects-server", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx index 73d8ed22011dc..9d8deb5b9892d 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx @@ -148,7 +148,7 @@ const getGcpAccountTypeOptions = (isGcpOrgDisabled: boolean): CspRadioGroupProps { id: GCP_SINGLE_ACCOUNT, label: i18n.translate('xpack.csp.fleetIntegration.gcpAccountType.gcpSingleAccountLabel', { - defaultMessage: 'Single Account', + defaultMessage: 'Single Project', }), testId: 'gcpSingleAccountTestId', }, @@ -377,7 +377,7 @@ const GcpAccountTypeSelect = ({ diff --git a/x-pack/plugins/data_usage/common/index.ts b/x-pack/plugins/data_usage/common/index.ts index eb0787f53f344..8b952b13d4cc7 100644 --- a/x-pack/plugins/data_usage/common/index.ts +++ b/x-pack/plugins/data_usage/common/index.ts @@ -12,6 +12,8 @@ export const PLUGIN_NAME = i18n.translate('xpack.dataUsage.name', { defaultMessage: 'Data Usage', }); +export const DEFAULT_SELECTED_OPTIONS = 50 as const; + export const DATA_USAGE_API_ROUTE_PREFIX = '/api/data_usage/'; export const DATA_USAGE_METRICS_API_ROUTE = `/internal${DATA_USAGE_API_ROUTE_PREFIX}metrics`; export const DATA_USAGE_DATA_STREAMS_API_ROUTE = `/internal${DATA_USAGE_API_ROUTE_PREFIX}data_streams`; diff --git a/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx b/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx index 7554716c59492..31ae68244e982 100644 --- a/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx +++ b/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx @@ -16,6 +16,7 @@ import { niceTimeFormatter, DARK_THEME, LIGHT_THEME, + LineSeries, } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { LegendAction } from './legend_action'; @@ -59,6 +60,18 @@ export const ChartPanel: React.FC = ({ [minTimestamp, maxTimestamp] ); + // Calculate the total for each time bucket + const totalSeries = useMemo(() => { + const totalsMap = new Map(); + + series.forEach((stream) => { + stream.data.forEach((point) => { + totalsMap.set(point.x, (totalsMap.get(point.x) || 0) + point.y); + }); + }); + + return Array.from(totalsMap.entries()).map(([x, y]) => ({ x, y })); + }, [series]); const renderLegendAction = useCallback( ({ label }: { label: string }) => { return ( @@ -87,6 +100,19 @@ export const ChartPanel: React.FC = ({ xDomain={{ min: minTimestamp, max: maxTimestamp }} legendAction={renderLegendAction} /> + {series.map((stream, streamIdx) => ( ({ refetch: jest.fn(), }); +const generateDataStreams = (count: number) => { + return Array.from({ length: count }, (_, i) => ({ + name: `.ds-${i}`, + storageSizeBytes: 1024 ** 2 * (22 / 7), + })); +}; + describe('DataUsageMetrics', () => { let user: UserEvent; const testId = 'test'; @@ -174,8 +179,9 @@ describe('DataUsageMetrics', () => { it('should show date filter', () => { const { getByTestId } = render(); - expect(getByTestId(`${testIdFilter}-date-range`)).toBeTruthy(); - expect(getByTestId(`${testIdFilter}-date-range`).textContent).toContain('Last 24 hours'); + const dateFilter = getByTestId(`${testIdFilter}-date-range`); + expect(dateFilter).toBeTruthy(); + expect(dateFilter.textContent).toContain('to'); expect(getByTestId(`${testIdFilter}-super-refresh-button`)).toBeTruthy(); }); @@ -196,28 +202,7 @@ describe('DataUsageMetrics', () => { it('should show selected data streams on the filter', () => { mockUseGetDataUsageDataStreams.mockReturnValue({ error: undefined, - data: [ - { - name: '.ds-1', - storageSizeBytes: 10000, - }, - { - name: '.ds-2', - storageSizeBytes: 20000, - }, - { - name: '.ds-3', - storageSizeBytes: 10300, - }, - { - name: '.ds-4', - storageSizeBytes: 23000, - }, - { - name: '.ds-5', - storageSizeBytes: 23200, - }, - ], + data: generateDataStreams(5), isFetching: false, }); const { getByTestId } = render(); @@ -226,46 +211,35 @@ describe('DataUsageMetrics', () => { ); }); + it('should show at most 50 selected data streams on the filter', async () => { + mockUseGetDataUsageDataStreams.mockReturnValue({ + error: undefined, + data: generateDataStreams(100), + isFetching: false, + }); + const { getByTestId } = render(); + const toggleFilterButton = getByTestId(`${testIdFilter}-dataStreams-popoverButton`); + + expect(toggleFilterButton).toHaveTextContent('Data streams50'); + }); + it('should allow de-selecting all but one data stream option', async () => { mockUseGetDataUsageDataStreams.mockReturnValue({ error: undefined, - data: [ - { - name: '.ds-1', - storageSizeBytes: 10000, - }, - { - name: '.ds-2', - storageSizeBytes: 20000, - }, - { - name: '.ds-3', - storageSizeBytes: 10300, - }, - { - name: '.ds-4', - storageSizeBytes: 23000, - }, - { - name: '.ds-5', - storageSizeBytes: 23200, - }, - ], + data: generateDataStreams(5), isFetching: false, }); const { getByTestId, getAllByTestId } = render(); - expect(getByTestId(`${testIdFilter}-dataStreams-popoverButton`)).toHaveTextContent( - 'Data streams5' - ); - await user.click(getByTestId(`${testIdFilter}-dataStreams-popoverButton`)); + const toggleFilterButton = getByTestId(`${testIdFilter}-dataStreams-popoverButton`); + + expect(toggleFilterButton).toHaveTextContent('Data streams5'); + await user.click(toggleFilterButton); const allFilterOptions = getAllByTestId('dataStreams-filter-option'); for (let i = 0; i < allFilterOptions.length - 1; i++) { await user.click(allFilterOptions[i]); } - expect(getByTestId(`${testIdFilter}-dataStreams-popoverButton`)).toHaveTextContent( - 'Data streams1' - ); + expect(toggleFilterButton).toHaveTextContent('Data streams1'); }); it('should not call usage metrics API if no data streams', async () => { diff --git a/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx b/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx index 59354a1746346..8bedde117785a 100644 --- a/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx +++ b/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx @@ -72,7 +72,9 @@ export const DataUsageMetrics = memo( setUrlMetricTypesFilter(metricsFilters.metricTypes.join(',')); } if (!dataStreamsFromUrl && dataStreams) { - setUrlDataStreamsFilter(dataStreams.map((ds) => ds.name).join(',')); + const hasMoreThan50 = dataStreams.length > 50; + const _dataStreams = hasMoreThan50 ? dataStreams.slice(0, 50) : dataStreams; + setUrlDataStreamsFilter(_dataStreams.map((ds) => ds.name).join(',')); } if (!startDateFromUrl || !endDateFromUrl) { setUrlDateRangeFilter({ startDate: metricsFilters.from, endDate: metricsFilters.to }); diff --git a/x-pack/plugins/data_usage/public/app/components/filters/date_picker.tsx b/x-pack/plugins/data_usage/public/app/components/filters/date_picker.tsx index 044a036eea61f..62c6cc542a523 100644 --- a/x-pack/plugins/data_usage/public/app/components/filters/date_picker.tsx +++ b/x-pack/plugins/data_usage/public/app/components/filters/date_picker.tsx @@ -15,6 +15,7 @@ import type { OnRefreshChangeProps, } from '@elastic/eui/src/components/date_picker/types'; import { UI_SETTINGS } from '@kbn/data-plugin/common'; +import moment from 'moment'; import { useTestIdGenerator } from '../../../hooks/use_test_id_generator'; export interface DateRangePickerValues { @@ -66,7 +67,7 @@ export const UsageMetricsDateRangePicker = memo ); diff --git a/x-pack/plugins/data_usage/public/app/hooks/use_charts_filter.tsx b/x-pack/plugins/data_usage/public/app/hooks/use_charts_filter.tsx index 5cff100d9752e..d2c5dc554ff2d 100644 --- a/x-pack/plugins/data_usage/public/app/hooks/use_charts_filter.tsx +++ b/x-pack/plugins/data_usage/public/app/hooks/use_charts_filter.tsx @@ -11,6 +11,7 @@ import { METRIC_TYPE_API_VALUES_TO_UI_OPTIONS_MAP, METRIC_TYPE_VALUES, } from '../../../common/rest_types'; +import { DEFAULT_SELECTED_OPTIONS } from '../../../common'; import { FILTER_NAMES } from '../translations'; import { useDataUsageMetricsUrlParams } from './use_charts_url_params'; import { formatBytes } from '../../utils/format_bytes'; @@ -77,7 +78,7 @@ export const useChartsFilter = ({ 'data-test-subj': `${filterOptions.filterName}-filter-option`, })) : isDataStreamsFilter && !!filterOptions.options.length - ? filterOptions.options?.map((filterOption) => ({ + ? filterOptions.options?.map((filterOption, i) => ({ key: filterOption, label: filterOption, append: formatBytes(filterOptions.appendOptions?.[filterOption] ?? 0), @@ -85,7 +86,9 @@ export const useChartsFilter = ({ ? selectedDataStreamsFromUrl.includes(filterOption) ? 'on' : undefined - : 'on', + : i < DEFAULT_SELECTED_OPTIONS + ? 'on' + : undefined, 'data-test-subj': `${filterOptions.filterName}-filter-option`, })) : [] diff --git a/x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.test.tsx b/x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.test.tsx index 93a4b434931a3..c73e35fe1397d 100644 --- a/x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.test.tsx +++ b/x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.test.tsx @@ -5,10 +5,12 @@ * 2.0. */ +import moment from 'moment'; import { METRIC_TYPE_VALUES, MetricTypes } from '../../../common/rest_types'; import { getDataUsageMetricsFiltersFromUrlParams } from './use_charts_url_params'; -describe('#getDataUsageMetricsFiltersFromUrlParams', () => { +// FLAKY: https://github.com/elastic/kibana/issues/200888 +describe.skip('#getDataUsageMetricsFiltersFromUrlParams', () => { const getMetricTypesAsArray = (): MetricTypes[] => { return [...METRIC_TYPE_VALUES]; }; @@ -56,12 +58,12 @@ describe('#getDataUsageMetricsFiltersFromUrlParams', () => { it('should use given relative startDate and endDate values URL params', () => { expect( getDataUsageMetricsFiltersFromUrlParams({ - startDate: 'now-24h/h', - endDate: 'now', + startDate: moment().subtract(24, 'hours').toISOString(), + endDate: moment().toISOString(), }) ).toEqual({ - endDate: 'now', - startDate: 'now-24h/h', + endDate: moment().toISOString(), + startDate: moment().subtract(24, 'hours').toISOString(), }); }); diff --git a/x-pack/plugins/data_usage/public/app/hooks/use_date_picker.tsx b/x-pack/plugins/data_usage/public/app/hooks/use_date_picker.tsx index cc4bfd2376da1..1b4b7e38e3554 100644 --- a/x-pack/plugins/data_usage/public/app/hooks/use_date_picker.tsx +++ b/x-pack/plugins/data_usage/public/app/hooks/use_date_picker.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import moment from 'moment'; import { useCallback, useState } from 'react'; import type { DurationRange, @@ -18,8 +19,8 @@ export const DEFAULT_DATE_RANGE_OPTIONS = Object.freeze({ enabled: false, duration: 10000, }, - startDate: 'now-24h/h', - endDate: 'now', + startDate: moment().subtract(24, 'hours').startOf('day').toISOString(), + endDate: moment().toISOString(), recentlyUsedDateRanges: [], }); diff --git a/x-pack/plugins/data_usage/public/hooks/use_get_data_streams.ts b/x-pack/plugins/data_usage/public/hooks/use_get_data_streams.ts index acb41e45f4eb6..d43c3fff139fb 100644 --- a/x-pack/plugins/data_usage/public/hooks/use_get_data_streams.ts +++ b/x-pack/plugins/data_usage/public/hooks/use_get_data_streams.ts @@ -8,7 +8,7 @@ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; -import { DATA_USAGE_DATA_STREAMS_API_ROUTE } from '../../common'; +import { DATA_USAGE_DATA_STREAMS_API_ROUTE, DEFAULT_SELECTED_OPTIONS } from '../../common'; import { useKibanaContextForPlugin } from '../utils/use_kibana'; type GetDataUsageDataStreamsResponse = Array<{ @@ -17,11 +17,6 @@ type GetDataUsageDataStreamsResponse = Array<{ selected: boolean; }>; -const PAGING_PARAMS = Object.freeze({ - default: 50, - all: 10000, -}); - export const useGetDataUsageDataStreams = ({ selectedDataStreams, options = { @@ -51,14 +46,14 @@ export const useGetDataUsageDataStreams = ({ selected: GetDataUsageDataStreamsResponse; rest: GetDataUsageDataStreamsResponse; }>( - (acc, ds) => { + (acc, ds, i) => { const item = { name: ds.name, storageSizeBytes: ds.storageSizeBytes, selected: ds.selected, }; - if (selectedDataStreams?.includes(ds.name)) { + if (selectedDataStreams?.includes(ds.name) && i < DEFAULT_SELECTED_OPTIONS) { acc.selected.push({ ...item, selected: true }); } else { acc.rest.push({ ...item, selected: false }); @@ -69,20 +64,10 @@ export const useGetDataUsageDataStreams = ({ { selected: [], rest: [] } ); - let selectedDataStreamsCount = 0; - if (selectedDataStreams) { - selectedDataStreamsCount = selectedDataStreams.length; - } - return [ ...augmentedDataStreamsBasedOnSelectedItems.selected, ...augmentedDataStreamsBasedOnSelectedItems.rest, - ].slice( - 0, - selectedDataStreamsCount >= PAGING_PARAMS.default - ? selectedDataStreamsCount + 10 - : PAGING_PARAMS.default - ); + ]; }, }); }; diff --git a/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.test.tsx b/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.test.tsx index efc3d2a9f4640..677bd4bdfcef1 100644 --- a/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.test.tsx +++ b/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.test.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import moment from 'moment'; import React, { ReactNode } from 'react'; import { QueryClient, QueryClientProvider, useQuery as _useQuery } from '@tanstack/react-query'; import { renderHook } from '@testing-library/react-hooks'; @@ -41,8 +42,8 @@ jest.mock('../utils/use_kibana', () => { }); const defaultUsageMetricsRequestBody = { - from: 'now-15m', - to: 'now', + from: moment().subtract(15, 'minutes').toISOString(), + to: moment().toISOString(), metricTypes: ['ingest_rate'], dataStreams: ['ds-1'], }; diff --git a/x-pack/plugins/data_usage/server/config.ts b/x-pack/plugins/data_usage/server/config.ts index 7dd664f35288b..c6721592b6aac 100644 --- a/x-pack/plugins/data_usage/server/config.ts +++ b/x-pack/plugins/data_usage/server/config.ts @@ -20,7 +20,6 @@ export const configSchema = schema.object({ schema.object({ certificate: schema.maybe(schema.string()), key: schema.maybe(schema.string()), - ca: schema.maybe(schema.string()), }) ), }) diff --git a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.test.ts b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.test.ts index 2c236e58a5af1..d6337bbcc8dcd 100644 --- a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.test.ts +++ b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.test.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import moment from 'moment'; import type { MockedKeys } from '@kbn/utility-types-jest'; import type { CoreSetup } from '@kbn/core/server'; import { registerUsageMetricsRoute } from './usage_metrics'; @@ -56,8 +56,8 @@ describe('registerUsageMetricsRoute', () => { const mockRequest = httpServerMock.createKibanaRequest({ body: { - from: 'now-15m', - to: 'now', + from: moment().subtract(15, 'minutes').toISOString(), + to: moment().toISOString(), metricTypes: ['ingest_rate'], dataStreams: [], }, @@ -123,8 +123,8 @@ describe('registerUsageMetricsRoute', () => { const mockRequest = httpServerMock.createKibanaRequest({ body: { - from: 'now-15m', - to: 'now', + from: moment().subtract(15, 'minutes').toISOString(), + to: moment().toISOString(), metricTypes: ['ingest_rate', 'storage_retained'], dataStreams: ['.ds-1', '.ds-2'], }, @@ -191,8 +191,8 @@ describe('registerUsageMetricsRoute', () => { const mockRequest = httpServerMock.createKibanaRequest({ body: { - from: 'now-15m', - to: 'now', + from: moment().subtract(15, 'minutes').toISOString(), + to: moment().toISOString(), metricTypes: ['ingest_rate'], dataStreams: ['.ds-1', '.ds-2'], }, diff --git a/x-pack/plugins/data_usage/server/services/autoops_api.ts b/x-pack/plugins/data_usage/server/services/autoops_api.ts index c1b96a973d9d7..582cd7ab33046 100644 --- a/x-pack/plugins/data_usage/server/services/autoops_api.ts +++ b/x-pack/plugins/data_usage/server/services/autoops_api.ts @@ -52,12 +52,23 @@ export class AutoOpsAPIService { throw new AutoOpsError(AUTO_OPS_MISSING_CONFIG_ERROR); } + if (!autoopsConfig.api?.url) { + this.logger.error(`[AutoOps API] Missing API URL in the configuration.`, errorMetadata); + throw new AutoOpsError('Missing API URL in AutoOps configuration.'); + } + + if (!autoopsConfig.api?.tls?.certificate || !autoopsConfig.api?.tls?.key) { + this.logger.error( + `[AutoOps API] Missing required TLS certificate or key in the configuration.`, + errorMetadata + ); + throw new AutoOpsError('Missing required TLS certificate or key in AutoOps configuration.'); + } + this.logger.debug( - `[AutoOps API] Creating autoops agent with TLS cert: ${ - autoopsConfig?.api?.tls?.certificate ? '[REDACTED]' : 'undefined' - } and TLS key: ${autoopsConfig?.api?.tls?.key ? '[REDACTED]' : 'undefined'} - and TLS ca: ${autoopsConfig?.api?.tls?.ca ? '[REDACTED]' : 'undefined'}` + `[AutoOps API] Creating autoops agent with request URL: ${autoopsConfig.api.url} and TLS cert: [REDACTED] and TLS key: [REDACTED]` ); + const controller = new AbortController(); const tlsConfig = this.createTlsConfig(autoopsConfig); const cloudSetup = appContextService.getCloud(); @@ -169,7 +180,6 @@ export class AutoOpsAPIService { enabled: true, certificate: autoopsConfig?.api?.tls?.certificate, key: autoopsConfig?.api?.tls?.key, - certificateAuthorities: autoopsConfig?.api?.tls?.ca, }) ); } @@ -187,7 +197,6 @@ export class AutoOpsAPIService { ...requestConfig.httpsAgent.options, cert: requestConfig.httpsAgent.options.cert ? 'REDACTED' : undefined, key: requestConfig.httpsAgent.options.key ? 'REDACTED' : undefined, - ca: requestConfig.httpsAgent.options.ca ? 'REDACTED' : undefined, }, }, }); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.ts index e5a1c14846e23..aee78c16920d8 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.ts @@ -18,7 +18,7 @@ const BASE_GEMINI_PROMPT = const KB_CATCH = 'If the knowledge base tool gives empty results, do your best to answer the question from the perspective of an expert security analyst.'; export const GEMINI_SYSTEM_PROMPT = `${BASE_GEMINI_PROMPT} ${KB_CATCH}`; -export const BEDROCK_SYSTEM_PROMPT = `Use tools as often as possible, as they have access to the latest data and syntax. Always return value from ESQLKnowledgeBaseTool as is. Never return tags in the response, but make sure to include tags content in the response. Do not reflect on the quality of the returned search results in your response.`; +export const BEDROCK_SYSTEM_PROMPT = `Use tools as often as possible, as they have access to the latest data and syntax. Always return value from NaturalLanguageESQLTool as is. Never return tags in the response, but make sure to include tags content in the response. Do not reflect on the quality of the returned search results in your response.`; export const GEMINI_USER_PROMPT = `Now, always using the tools at your disposal, step by step, come up with a response to this request:\n\n`; export const STRUCTURED_SYSTEM_PROMPT = `Respond to the human as helpfully and accurately as possible. ${KNOWLEDGE_HISTORY} You have access to the following tools: diff --git a/x-pack/plugins/elastic_assistant/server/routes/utils.ts b/x-pack/plugins/elastic_assistant/server/routes/utils.ts index 54f9ef2c04b90..4cc213f0e0db8 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/utils.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/utils.ts @@ -15,7 +15,7 @@ import type { } from '@kbn/core/server'; import { ActionsClientChatOpenAI, - ActionsClientBedrockChatModel, + ActionsClientChatBedrockConverse, ActionsClientChatVertexAI, } from '@kbn/langchain/server'; import { Connector } from '@kbn/actions-plugin/server/application/connector/types'; @@ -184,7 +184,7 @@ export const getLlmType = (actionTypeId: string): string | undefined => { export const getLlmClass = (llmType?: string) => { switch (llmType) { case 'bedrock': - return ActionsClientBedrockChatModel; + return ActionsClientChatBedrockConverse; case 'gemini': return ActionsClientChatVertexAI; case 'openai': diff --git a/x-pack/plugins/elastic_assistant/server/types.ts b/x-pack/plugins/elastic_assistant/server/types.ts index d328001e86bb8..93f35d11eb877 100755 --- a/x-pack/plugins/elastic_assistant/server/types.ts +++ b/x-pack/plugins/elastic_assistant/server/types.ts @@ -38,7 +38,7 @@ import { LicensingPluginStart, } from '@kbn/licensing-plugin/server'; import { - ActionsClientBedrockChatModel, + ActionsClientChatBedrockConverse, ActionsClientChatOpenAI, ActionsClientChatVertexAI, ActionsClientGeminiChatModel, @@ -215,7 +215,7 @@ export interface AssistantTool { } export type AssistantToolLlm = - | ActionsClientBedrockChatModel + | ActionsClientChatBedrockConverse | ActionsClientChatOpenAI | ActionsClientGeminiChatModel | ActionsClientChatVertexAI; diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index 797f94fa29e51..0c13a772862b8 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -27,7 +27,7 @@ import { IngestPipelineParams } from '@kbn/search-connectors'; import { ProductFeatures } from './types'; export const SEARCH_PRODUCT_NAME = i18n.translate('xpack.enterpriseSearch.search.productName', { - defaultMessage: 'Search', + defaultMessage: 'Elasticsearch', }); export const ENTERPRISE_SEARCH_PRODUCT_NAME = i18n.translate('xpack.enterpriseSearch.productName', { defaultMessage: 'Enterprise Search', diff --git a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/ai_search_guide/ai_search_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/ai_search_guide/ai_search_guide.tsx index 7374ecd0ac359..4ce68d1bbd6e4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/ai_search_guide/ai_search_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/ai_search_guide/ai_search_guide.tsx @@ -40,7 +40,7 @@ export const AISearchGuide: React.FC = () => { bottomBorder={false} pageHeader={{ pageTitle: i18n.translate('xpack.enterpriseSearch.aiSearch.guide.pageTitle', { - defaultMessage: 'Improve search revelance with AI', + defaultMessage: 'Improve search relevance with AI', }), }} > diff --git a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx index 42a84efd0ccc4..dfcc1695e4efd 100644 --- a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx @@ -13,6 +13,8 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { i18n } from '@kbn/i18n'; + import { SetAiSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -23,12 +25,14 @@ describe('EnterpriseSearchAISearchPageTemplate', () => { it('renders', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Elasticsearch', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx index b43f1fbcee7d6..f59a750e1a06c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx @@ -43,7 +43,7 @@ describe('EnterpriseSearchAnalyticsPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Elasticsearch', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx index 99eba7d57b108..53fdc507ccfb6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx @@ -13,6 +13,8 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { i18n } from '@kbn/i18n'; + import { SetElasticsearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -23,12 +25,14 @@ describe('EnterpriseSearchElasticsearchPageTemplate', () => { it('renders', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Elasticsearch', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/run_options_buttons.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/run_options_buttons.tsx index c0dd0ff23622d..233b6ddb67374 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/run_options_buttons.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/run_options_buttons.tsx @@ -42,6 +42,11 @@ export const RunOptionsButtons: React.FC = ({ onChange={() => selectDeploymentMethod('docker')} id="xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.runConnectorService.docker" checked={selectedDeploymentMethod === 'docker'} + aria-label={i18n.translate( + 'xpack.enterpriseSearch.connectorConfiguration.dockerTextLabel.ariaLabel', + { defaultMessage: 'Run with Docker' } + )} + name="deployment-method-run-connector" label={ @@ -64,6 +69,11 @@ export const RunOptionsButtons: React.FC = ({ onChange={() => selectDeploymentMethod('source')} id="xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.runConnectorService.source" checked={selectedDeploymentMethod === 'source'} + aria-label={i18n.translate( + 'xpack.enterpriseSearch.connectorConfiguration.sourceTextLabel.ariaLabel', + { defaultMessage: 'Run from source' } + )} + name="deployment-method-run-connector" label={ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx index 3f072abb3c0bf..f6f7355b04e20 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx @@ -13,6 +13,8 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { i18n } from '@kbn/i18n'; + import { SetEnterpriseSearchContentChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -23,12 +25,14 @@ describe('EnterpriseSearchContentPageTemplate', () => { it('renders', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Elasticsearch', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler.tsx index 107be669d8852..ddc98157f80ca 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler.tsx @@ -93,6 +93,7 @@ export const AutomaticCrawlScheduler: React.FC = () => { @@ -137,6 +138,7 @@ export const AutomaticCrawlScheduler: React.FC = () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/authentication_panel/authentication_panel_edit_content.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/authentication_panel/authentication_panel_edit_content.tsx index c8d24525747e0..bbc9c6877f0c0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/authentication_panel/authentication_panel_edit_content.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/authentication_panel/authentication_panel_edit_content.tsx @@ -42,6 +42,7 @@ export const AuthenticationPanelEditContent: React.FC = () => { @@ -75,6 +76,7 @@ export const AuthenticationPanelEditContent: React.FC = () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_error.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_error.tsx index 951fb942a7fa8..1ed3857b2c7ce 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_error.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_error.tsx @@ -31,10 +31,17 @@ export interface IndexErrorProps { } interface SemanticTextProperty extends MappingPropertyBase { - inference_id: string; + inference_id?: string; type: 'semantic_text'; } +/* + This will be repalce once we add default elser inference_id + with the index mapping response. +*/ +const ELSER_PRECONFIGURED_ENDPOINTS = '.elser-2-elasticsearch'; +const isInferencePreconfigured = (inferenceId: string) => inferenceId.startsWith('.'); + const parseMapping = (mappings: MappingTypeMapping) => { const fields = mappings.properties; if (!fields) { @@ -49,6 +56,11 @@ const getSemanticTextFields = ( ): Array<{ path: string; source: SemanticTextProperty }> => { return Object.entries(fields).flatMap(([key, value]) => { const currentPath: string = path ? `${path}.${key}` : key; + if (value.type === 'semantic_text') { + value = value.inference_id + ? value + : { ...value, inference_id: ELSER_PRECONFIGURED_ENDPOINTS }; + } const currentField: Array<{ path: string; source: SemanticTextProperty }> = value.type === 'semantic_text' ? [{ path: currentPath, source: value }] : []; if (hasProperties(value)) { @@ -115,7 +127,7 @@ export const IndexError: React.FC = ({ indexName }) => { field, }; } - if (isLocalModel(model)) { + if (isLocalModel(model) && !isInferencePreconfigured(model.inference_id)) { const modelId = model.service_settings.model_id; const modelStats = trainedModelStats?.trained_model_stats.find( (value) => diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx index ea0e3f4b7749b..92b400fa9b191 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx @@ -13,6 +13,8 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { i18n } from '@kbn/i18n'; + import { SetSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -23,12 +25,14 @@ describe('EnterpriseSearchOverviewPageTemplate', () => { it('renders', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Elasticsearch', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_relevance/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_relevance/components/layout/page_template.test.tsx index 6b9e6b891a59f..246c9835a015a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_relevance/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_relevance/components/layout/page_template.test.tsx @@ -32,7 +32,7 @@ describe('EnterpriseSearchRelevancePageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ items: [], name: 'Search' }); + expect(wrapper.prop('solutionNav')).toEqual({ items: [], name: 'Elasticsearch' }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx index ef1e5ffa70593..0fccdb62d4d2e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx @@ -13,6 +13,8 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { i18n } from '@kbn/i18n'; + import { SetSearchExperiencesChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -23,12 +25,14 @@ describe('EnterpriseSearchSearchExperiencesPageTemplate', () => { it('renders', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Elasticsearch', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.test.ts index c767706fb0d6f..47dcd899d82cf 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.test.ts @@ -162,7 +162,7 @@ describe('useSearchBreadcrumbs', () => { expect(useSearchBreadcrumbs(breadcrumbs)).toEqual([ { - text: 'Search', + text: 'Elasticsearch', href: '/app/enterprise_search/overview', onClick: expect.any(Function), }, @@ -180,7 +180,7 @@ describe('useSearchBreadcrumbs', () => { it('shows just the root if breadcrumbs is empty', () => { expect(useSearchBreadcrumbs()).toEqual([ { - text: 'Search', + text: 'Elasticsearch', }, ]); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts index 511445240095f..5db04cc0a15c2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts @@ -17,17 +17,17 @@ describe('generateTitle', () => { describe('searchTitle', () => { it('automatically appends the Enterprise Search product onto the pages array', () => { const title = searchTitle(['Setup Guide']); - expect(title).toEqual('Setup Guide - Search'); + expect(title).toEqual('Setup Guide - Elasticsearch'); }); it('can be mixed and matched', () => { const title = searchTitle([appSearchTitle(['Some Page'])]); - expect(title).toEqual('Some Page - App Search - Search'); + expect(title).toEqual('Some Page - App Search - Elasticsearch'); }); it('falls back to product name', () => { const title = searchTitle(); - expect(title).toEqual('Search'); + expect(title).toEqual('Elasticsearch'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx index 4c2dc40309349..370972ebe53ea 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx @@ -12,6 +12,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { EuiCallOut } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; @@ -35,7 +36,9 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { it('renders children', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); @@ -71,7 +74,13 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { const wrapper = shallow( Nothing here yet!
} + emptyState={ +
+ {i18n.translate('xpack.enterpriseSearch..div.nothingHereYetLabel', { + defaultMessage: 'Nothing here yet!', + })} +
+ } >
@@ -88,7 +97,13 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { const wrapper = shallow( Nothing here yet!
} + emptyState={ +
+ {i18n.translate('xpack.enterpriseSearch..div.nothingHereYetLabel', { + defaultMessage: 'Nothing here yet!', + })} +
+ } >
@@ -201,14 +216,14 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { ); }); - it('automatically sets the Search logo onto passed solution navs', () => { + it('automatically sets the Elasticsearch logo onto passed solution navs', () => { const wrapper = shallow( - + ); expect(wrapper.find(KibanaPageTemplate).prop('solutionNav')).toEqual({ icon: 'logoEnterpriseSearch', - name: 'Search', + name: 'Elasticsearch', items: [], }); }); @@ -216,14 +231,14 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { it('sets the solutionNavIcon passed', () => { const wrapper = shallow( ); expect(wrapper.find(KibanaPageTemplate).prop('solutionNav')).toEqual({ icon: 'logoElasticsearch', - name: 'Search', + name: 'Elasticsearch', items: [], }); }); @@ -231,7 +246,13 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { describe('Embedded Console', () => { it('renders embedded console if available', () => { - const FakeEmbeddedConsole: React.FC = () =>
foo
; + const FakeEmbeddedConsole: React.FC = () => ( +
+ {i18n.translate('xpack.enterpriseSearch.fakeEmbeddedConsole.div.fooLabel', { + defaultMessage: 'foo', + })} +
+ ); const consolePlugin = { EmbeddableConsole: FakeEmbeddedConsole }; setMockValues({ @@ -241,14 +262,22 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); expect(wrapper.find(consolePlugin.EmbeddableConsole).exists()).toBe(true); }); it('Hides embedded console if available but page template prop set to hide', () => { - const FakeEmbeddedConsole: React.FC = () =>
foo
; + const FakeEmbeddedConsole: React.FC = () => ( +
+ {i18n.translate('xpack.enterpriseSearch.fakeEmbeddedConsole.div.fooLabel', { + defaultMessage: 'foo', + })} +
+ ); const consolePlugin = { EmbeddableConsole: FakeEmbeddedConsole }; setMockValues({ @@ -258,7 +287,9 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); diff --git a/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx index 5f6fe605858bf..561b6d69ed09b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx @@ -13,6 +13,8 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { i18n } from '@kbn/i18n'; + import { SetVectorSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -23,12 +25,14 @@ describe('EnterpriseSearchVectorSearchPageTemplate', () => { it('renders', () => { const wrapper = shallow( -
world
+
+ {i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })} +
); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ items: [], name: 'Search' }); + expect(wrapper.prop('solutionNav')).toEqual({ items: [], name: 'Elasticsearch' }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/navigation_tree.ts b/x-pack/plugins/enterprise_search/public/navigation_tree.ts index 2f41db6bef486..25ad8ec37743f 100644 --- a/x-pack/plugins/enterprise_search/public/navigation_tree.ts +++ b/x-pack/plugins/enterprise_search/public/navigation_tree.ts @@ -31,7 +31,7 @@ export interface DynamicSideNavItems { const title = i18n.translate( 'xpack.enterpriseSearch.searchNav.headerSolutionSwitcher.searchSolutionTitle', { - defaultMessage: 'Search', + defaultMessage: 'Elasticsearch', } ); const icon = 'logoElasticsearch'; diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts index 744369ca18806..cff429f3934a0 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts @@ -48,7 +48,7 @@ export const createIndexPipelineDefinitions = async ( const ingestPipeline = { _meta: { managed: true, - managed_by: 'Search', + managed_by: 'Elasticsearch', }, description: `Ingest pipeline for the '${indexName}' index`, id: `${indexName}`, diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts index 49e94e76cd7a0..3e7a0777dad23 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts @@ -66,13 +66,13 @@ const connectors = [ }, ]; -describe('Enterprise Search search provider', () => { +describe('Search search provider', () => { const crawlerResult = { icon: 'crawlerIcon.svg', id: 'elastic-crawler', score: 75, title: 'Elastic Web Crawler', - type: 'Search', + type: 'Elasticsearch', url: { path: `${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}/crawlers/new_crawler`, prependBasePath: true, @@ -84,7 +84,7 @@ describe('Enterprise Search search provider', () => { id: 'mongodb', score: 75, title: 'MongoDB', - type: 'Search', + type: 'Elasticsearch', url: { path: `${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}/connectors/new_connector?connector_type=connector_client&service_type=mongodb`, prependBasePath: true, @@ -96,7 +96,7 @@ describe('Enterprise Search search provider', () => { id: 'mongodb', score: 75, title: 'MongoDB', - type: 'Search', + type: 'Elasticsearch', url: { path: `${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}/connectors/new_connector?connector_type=native&service_type=mongodb`, prependBasePath: true, @@ -108,7 +108,7 @@ describe('Enterprise Search search provider', () => { id: '', score: 75, title: 'Customized connector', - type: 'Search', + type: 'Elasticsearch', url: { path: `${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}/connectors/new_connector?connector_type=connector_client&service_type=`, prependBasePath: true, diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts index a5ce3aeb367da..6da354495ea0d 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts @@ -62,9 +62,7 @@ export function toSearchResult({ id: serviceType, score, title: name, - type: i18n.translate('xpack.enterpriseSearch.searchProvider.type.name', { - defaultMessage: 'Search', - }), + type: 'Elasticsearch', url: { path: url ?? newUrl, prependBasePath: true, @@ -108,18 +106,15 @@ export function getSearchResultProvider( ] : []), ...(config.hasConnectors ? connectorTypes : []), - ...(config.canDeployEntSearch - ? [ - { - keywords: ['esre', 'search'], - name: i18n.translate('xpack.enterpriseSearch.searchProvider.aiSearch.name', { - defaultMessage: 'Search AI', - }), - serviceType: 'ai_search', - url: AI_SEARCH_PLUGIN.URL, - }, - ] - : []), + + { + keywords: ['esre', 'search'], + name: i18n.translate('xpack.enterpriseSearch.searchProvider.aiSearch.name', { + defaultMessage: 'Search AI', + }), + serviceType: 'ai_search', + url: AI_SEARCH_PLUGIN.URL, + }, ]; const result = services .map((service) => { diff --git a/x-pack/plugins/entity_manager/public/lib/entity_client.test.ts b/x-pack/plugins/entity_manager/public/lib/entity_client.test.ts index 6679140314cb5..33363dea05e76 100644 --- a/x-pack/plugins/entity_manager/public/lib/entity_client.test.ts +++ b/x-pack/plugins/entity_manager/public/lib/entity_client.test.ts @@ -39,7 +39,22 @@ describe('EntityClient', () => { }; const result = entityClient.asKqlFilter(entityLatest); - expect(result).toEqual('service.name: my-service'); + expect(result).toEqual('service.name: "my-service"'); + }); + + it('should return the kql filter when an indentity field value contain special characters', () => { + const entityLatest: EntityInstance = { + entity: { + ...commonEntityFields.entity, + identity_fields: ['host.name', 'foo.bar'], + }, + host: { + name: 'my-host:some-value:some-other-value', + }, + }; + + const result = entityClient.asKqlFilter(entityLatest); + expect(result).toEqual('host.name: "my-host:some-value:some-other-value"'); }); it('should return the kql filter when indentity_fields is composed by multiple fields', () => { @@ -56,7 +71,7 @@ describe('EntityClient', () => { }; const result = entityClient.asKqlFilter(entityLatest); - expect(result).toEqual('(service.name: my-service AND service.environment: staging)'); + expect(result).toEqual('(service.name: "my-service" AND service.environment: "staging")'); }); it('should ignore fields that are not present in the entity', () => { @@ -71,7 +86,7 @@ describe('EntityClient', () => { }; const result = entityClient.asKqlFilter(entityLatest); - expect(result).toEqual('host.name: my-host'); + expect(result).toEqual('host.name: "my-host"'); }); }); diff --git a/x-pack/plugins/entity_manager/public/lib/entity_client.ts b/x-pack/plugins/entity_manager/public/lib/entity_client.ts index 7132dc50330d5..9db1c37888d4b 100644 --- a/x-pack/plugins/entity_manager/public/lib/entity_client.ts +++ b/x-pack/plugins/entity_manager/public/lib/entity_client.ts @@ -95,7 +95,7 @@ export class EntityClient { const identityFieldsValue = this.getIdentityFieldsValue(entityInstance); const nodes: KueryNode[] = Object.entries(identityFieldsValue).map(([identityField, value]) => { - return nodeTypes.function.buildNode('is', identityField, value); + return nodeTypes.function.buildNode('is', identityField, `"${value}"`); }); if (nodes.length === 0) return ''; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/index.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/index.ts index 6c0d4c5995c63..6b1c384f5b541 100644 --- a/x-pack/plugins/entity_manager/server/lib/entities/built_in/index.ts +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/index.ts @@ -10,10 +10,13 @@ import { builtInServicesFromEcsEntityDefinition } from './services_from_ecs_data import { builtInHostsFromEcsEntityDefinition } from './hosts_from_ecs_data'; import { builtInContainersFromEcsEntityDefinition } from './containers_from_ecs_data'; +import * as kubernetes from './kubernetes'; + export { BUILT_IN_ID_PREFIX } from './constants'; export const builtInDefinitions: EntityDefinition[] = [ builtInServicesFromEcsEntityDefinition, builtInHostsFromEcsEntityDefinition, builtInContainersFromEcsEntityDefinition, + ...Object.values(kubernetes), ]; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/ecs_index_patterns.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/ecs_index_patterns.ts new file mode 100644 index 0000000000000..14e2766cac2b2 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/ecs_index_patterns.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const commonEcsIndexPatterns = ['metrics-kubernetes*', 'logs-*']; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/ecs_metadata.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/ecs_metadata.ts new file mode 100644 index 0000000000000..5995b4aa46d5f --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/ecs_metadata.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MetadataField } from '@kbn/entities-schema'; +import { globalMetadata } from './global_metadata'; + +export const commonEcsMetadata: MetadataField[] = [ + ...globalMetadata, + { + source: 'orchestrator.namespace', + destination: 'orchestrator.namespace', + aggregation: { type: 'terms', limit: 10 }, + }, + { + source: 'orchestrator.cluster_ip', + destination: 'orchestrator.cluster_id', + aggregation: { type: 'top_value', sort: { '@timestamp': 'desc' } }, + }, + { + source: 'orchestrator.cluster_name', + destination: 'orchestrator.cluster_name', + aggregation: { type: 'top_value', sort: { '@timestamp': 'desc' } }, + }, +]; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/global_metadata.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/global_metadata.ts new file mode 100644 index 0000000000000..bc7c8fc03a930 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/global_metadata.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MetadataField } from '@kbn/entities-schema'; + +export const globalMetadata: MetadataField[] = [ + { + source: '_index', + destination: 'source_index', + aggregation: { type: 'top_value', sort: { '@timestamp': 'desc' } }, + }, + { + source: 'data_stream.type', + destination: 'source_data_stream.type', + aggregation: { type: 'top_value', sort: { '@timestamp': 'desc' } }, + }, + { + source: 'data_stream.dataset', + destination: 'source_data_stream.dataset', + aggregation: { type: 'top_value', sort: { '@timestamp': 'desc' } }, + }, +]; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/otel_index_patterns.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/otel_index_patterns.ts new file mode 100644 index 0000000000000..9978f61efafab --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/otel_index_patterns.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const commonOtelIndexPatterns = ['metrics-*otel*', 'logs-*']; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/otel_metadata.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/otel_metadata.ts new file mode 100644 index 0000000000000..946f5cc4ead43 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/common/otel_metadata.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MetadataField } from '@kbn/entities-schema'; +import { globalMetadata } from './global_metadata'; + +export const commonOtelMetadata: MetadataField[] = [ + ...globalMetadata, + { + source: 'k8s.namespace.name', + destination: 'k8s.namespace.name', + aggregation: { type: 'terms', limit: 10 }, + }, + { + source: 'k8s.cluster.name', + destination: 'k8s.cluster.name', + aggregation: { type: 'top_value', sort: { '@timestamp': 'desc' } }, + }, +]; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/cluster.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/cluster.ts new file mode 100644 index 0000000000000..1d452b8a8620e --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/cluster.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; +import { globalMetadata } from '../common/global_metadata'; + +export const builtInKubernetesClusterEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_ecs`, + filter: 'orchestrator.cluster.name: *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Clusters from ECS data', + description: + 'This definition extracts Kubernetes cluster entities from the Kubernetes integration data streams', + type: 'k8s.cluster.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['orchestrator.cluster.name'], + displayNameTemplate: '{{orchestrator.cluster.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: [ + ...globalMetadata, + { + source: 'orchestrator.namespace', + destination: 'orchestrator.namespace', + aggregation: { type: 'terms', limit: 10 }, + }, + { + source: 'orchestrator.cluster_ip', + destination: 'orchestrator.cluster_id', + aggregation: { type: 'top_value', sort: { '@timestamp': 'desc' } }, + }, + ], + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/cron_job.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/cron_job.ts new file mode 100644 index 0000000000000..7849dcdc73f5b --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/cron_job.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; +import { commonEcsMetadata } from '../common/ecs_metadata'; + +export const builtInKubernetesCronJobEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_ecs`, + filter: 'kubernetes.cronjob.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes CronJob from ECS data', + description: + 'This definition extracts Kubernetes cron job entities from the Kubernetes integration data streams', + type: 'k8s.cronjob.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.cronjob.uid'], + displayNameTemplate: '{{kubernetes.cronjob.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/daemon_set.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/daemon_set.ts new file mode 100644 index 0000000000000..5b57cdd6ae2f8 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/daemon_set.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; +import { commonEcsMetadata } from '../common/ecs_metadata'; + +export const builtInKubernetesDaemonSetEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_ecs`, + filter: 'kubernetes.daemonset.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes DaemonSet from ECS data', + description: + 'This definition extracts Kubernetes daemon set entities from the Kubernetes integration data streams', + type: 'k8s.daemonset.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.daemonset.name'], + displayNameTemplate: '{{kubernetes.daemonset.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/deployment.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/deployment.ts new file mode 100644 index 0000000000000..d33c14db7e2c9 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/deployment.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsMetadata } from '../common/ecs_metadata'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; + +export const builtInKubernetesDeploymentEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_ecs`, + filter: 'kubernetes.deployment.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Deployment from ECS data', + description: + 'This definition extracts Kubernetes deployment entities from the Kubernetes integration data streams', + type: 'k8s.deployment.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.deployment.uid'], + displayNameTemplate: '{{kubernetes.deployment.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/index.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/index.ts new file mode 100644 index 0000000000000..ecfa67ff893ba --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { builtInKubernetesClusterEcsEntityDefinition } from './cluster'; +export { builtInKubernetesNodeEcsEntityDefinition } from './node'; +export { builtInKubernetesPodEcsEntityDefinition } from './pod'; +export { builtInKubernetesReplicaSetEcsEntityDefinition } from './replica_set'; +export { builtInKubernetesDeploymentEcsEntityDefinition } from './deployment'; +export { builtInKubernetesStatefulSetEcsEntityDefinition } from './stateful_set'; +export { builtInKubernetesDaemonSetEcsEntityDefinition } from './daemon_set'; +export { builtInKubernetesJobEcsEntityDefinition } from './job'; +export { builtInKubernetesCronJobEcsEntityDefinition } from './cron_job'; +export { builtInKubernetesServiceEcsEntityDefinition } from './service'; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/job.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/job.ts new file mode 100644 index 0000000000000..92c6d13251553 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/job.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; +import { commonEcsMetadata } from '../common/ecs_metadata'; + +export const builtInKubernetesJobEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_job_ecs`, + filter: 'kubernetes.job.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Job from ECS data', + description: + 'This definition extracts Kubernetes job entities from the Kubernetes integration data streams', + type: 'k8s.job.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.job.uid'], + displayNameTemplate: '{{kubernetes.job.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/node.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/node.ts new file mode 100644 index 0000000000000..f3fdcdfaf04b4 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/node.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; +import { commonEcsMetadata } from '../common/ecs_metadata'; + +export const builtInKubernetesNodeEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_node_ecs`, + filer: 'kubernetes.node.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Node from ECS data', + description: + 'This definition extracts Kubernetes node entities from the Kubernetes integration data streams', + type: 'k8s.node.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.node.uid'], + displayNameTemplate: '{{kubernetes.node.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/pod.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/pod.ts new file mode 100644 index 0000000000000..7aa53da6e5a7d --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/pod.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsMetadata } from '../common/ecs_metadata'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; + +export const builtInKubernetesPodEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_ecs`, + filter: 'kubernetes.pod.uid: *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Pod from ECS data', + description: + 'This definition extracts Kubernetes pod entities from the Kubernetes integration data streams', + type: 'k8s.pod.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.pod.name'], + displayNameTemplate: '{{kubernetes.pod.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/replica_set.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/replica_set.ts new file mode 100644 index 0000000000000..cc059c14979d0 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/replica_set.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsMetadata } from '../common/ecs_metadata'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; + +export const builtInKubernetesReplicaSetEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_ecs`, + managed: true, + version: '0.1.0', + name: 'Kubernetes ReplicaSet from ECS data', + description: + 'This definition extracts Kubernetes replica set entities from the Kubernetes integration data streams', + type: 'k8s.replicaset.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.replicaset.uid'], + displayNameTemplate: '{{kubernetes.replicaset.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/service.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/service.ts new file mode 100644 index 0000000000000..be1b3b7c6b1c4 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/service.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsMetadata } from '../common/ecs_metadata'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; + +export const builtInKubernetesServiceEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_service_ecs`, + filter: 'kubernetes.service.name: *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Services from ECS data', + description: + 'This definition extracts Kubernetes service entities from the Kubernetes integration data streams', + type: 'k8s.service.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.service.name'], + displayNameTemplate: '{{kubernetes.service.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/stateful_set.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/stateful_set.ts new file mode 100644 index 0000000000000..79f9d4489216f --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/ecs/stateful_set.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsMetadata } from '../common/ecs_metadata'; +import { commonEcsIndexPatterns } from '../common/ecs_index_patterns'; + +export const builtInKubernetesStatefulSetEcsEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_ecs`, + filter: 'kubernetes.statefulset.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes StatefulSet from ECS data', + description: + 'This definition extracts Kubernetes stateful set entities from the Kubernetes integration data streams', + type: 'k8s.statefulset.ecs', + indexPatterns: commonEcsIndexPatterns, + identityFields: ['kubernetes.statefulset.uid'], + displayNameTemplate: '{{kubernetes.statefulset.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonEcsMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/index.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/index.ts new file mode 100644 index 0000000000000..fa559fb86d9db --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './ecs'; +export * from './semconv'; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/cluster.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/cluster.ts new file mode 100644 index 0000000000000..0ec244ec617f3 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/cluster.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; +import { commonOtelMetadata } from '../common/otel_metadata'; + +export const builtInKubernetesClusterSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_semconv`, + filter: 'k8s.cluster.uid: *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Clusters from SemConv data', + description: + 'This definition extracts Kubernetes cluster entities using data collected with OpenTelemetry', + type: 'kubernetes_cluster_semconv', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.cluster.uid'], + displayNameTemplate: '{{k8s.cluster.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/cron_job.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/cron_job.ts new file mode 100644 index 0000000000000..6d677943976d1 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/cron_job.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; +import { commonOtelMetadata } from '../common/otel_metadata'; + +export const builtInKubernetesCronJobSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_semconv`, + filter: 'k8s.cronjob.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes CronJob from SemConv data', + description: + 'This definition extracts Kubernetes cron job entities using data collected with OpenTelemetry', + type: 'k8s.cronjob.otel', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.cronjob.uid'], + displayNameTemplate: '{{k8s.cronjob.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/daemon_set.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/daemon_set.ts new file mode 100644 index 0000000000000..a4b61933ad316 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/daemon_set.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; +import { commonOtelMetadata } from '../common/otel_metadata'; + +export const builtInKubernetesDaemonSetSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_semconv`, + filter: 'k8s.daemonset.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes DaemonSet from SemConv data', + description: + 'This definition extracts Kubernetes daemon set entities using data collected with OpenTelemetry', + type: 'k8s.daemonset.otel', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.daemonset.uid'], + displayNameTemplate: '{{k8s.daemonset.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/deployment.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/deployment.ts new file mode 100644 index 0000000000000..bdb3cb1cef59b --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/deployment.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelMetadata } from '../common/otel_metadata'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; + +export const builtInKubernetesDeploymentSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_semconv`, + filter: 'k8s.deployment.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Deployment from SemConv data', + description: + 'This definition extracts Kubernetes deployment entities using data collected with OpenTelemetry', + type: 'k8s.deployment.otel', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.deployment.uid'], + displayNameTemplate: '{{k8s.deployment.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/index.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/index.ts new file mode 100644 index 0000000000000..fbfcd9c5f9024 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { builtInKubernetesClusterSemConvEntityDefinition } from './cluster'; +export { builtInKubernetesNodeSemConvEntityDefinition } from './node'; +export { builtInKubernetesPodSemConvEntityDefinition } from './pod'; +export { builtInKubernetesReplicaSetSemConvEntityDefinition } from './replica_set'; +export { builtInKubernetesDeploymentSemConvEntityDefinition } from './deployment'; +export { builtInKubernetesStatefulSetSemConvEntityDefinition } from './stateful_set'; +export { builtInKubernetesDaemonSetSemConvEntityDefinition } from './daemon_set'; +export { builtInKubernetesJobSemConvEntityDefinition } from './job'; +export { builtInKubernetesCronJobSemConvEntityDefinition } from './cron_job'; diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/job.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/job.ts new file mode 100644 index 0000000000000..b2e48cf7494fb --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/job.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; +import { commonOtelMetadata } from '../common/otel_metadata'; + +export const builtInKubernetesJobSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_job_semconv`, + filter: 'k8s.job.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Job from SemConv data', + description: + 'This definition extracts Kubernetes job entities using data collected with OpenTelemetry', + type: 'k8s.job.otel', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.job.uid'], + displayNameTemplate: '{{k8s.job.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/node.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/node.ts new file mode 100644 index 0000000000000..456f030421075 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/node.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; +import { commonOtelMetadata } from '../common/otel_metadata'; + +export const builtInKubernetesNodeSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_node_semconv`, + filter: 'k8s.node.uid: *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Node from SemConv data', + description: + 'This definition extracts Kubernetes node entities using data collected with OpenTelemetry', + type: 'k8s.node.otel', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.node.uid'], + displayNameTemplate: '{{k8s.node.uid}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/pod.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/pod.ts new file mode 100644 index 0000000000000..6dc879d761dd8 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/pod.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelMetadata } from '../common/otel_metadata'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; + +export const builtInKubernetesPodSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_semconv`, + filter: 'k8s.pod.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes Pod from SemConv data', + description: + 'This definition extracts Kubernetes pod entities using data collected with OpenTelemetry', + type: 'k8s.pod.otel', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.pod.uid'], + displayNameTemplate: '{{k8s.pod.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/replica_set.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/replica_set.ts new file mode 100644 index 0000000000000..47bad6bf8a641 --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/replica_set.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelMetadata } from '../common/otel_metadata'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; + +export const builtInKubernetesReplicaSetSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_semconv`, + filter: 'k8s.replicaset.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes ReplicaSet from SemConv data', + description: + 'This definition extracts Kubernetes replica set entities using data collected with OpenTelemetry', + type: 'kubernetes_replica_set_semconv', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.replicaset.name'], + displayNameTemplate: '{{k8s.replicaset.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/stateful_set.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/stateful_set.ts new file mode 100644 index 0000000000000..c61d7e5d965cd --- /dev/null +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/kubernetes/semconv/stateful_set.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; +import { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelMetadata } from '../common/otel_metadata'; +import { commonOtelIndexPatterns } from '../common/otel_index_patterns'; + +export const builtInKubernetesStatefulSetSemConvEntityDefinition: EntityDefinition = + entityDefinitionSchema.parse({ + id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_semconv`, + filter: 'k8s.statefulset.uid : *', + managed: true, + version: '0.1.0', + name: 'Kubernetes StatefulSet from SemConv data', + description: + 'This definition extracts Kubernetes stateful set entities using data collected with OpenTelemetry', + type: 'k8s.statefulset.otel', + indexPatterns: commonOtelIndexPatterns, + identityFields: ['k8s.statefulset.uid'], + displayNameTemplate: '{{k8s.statefulset.name}}', + latest: { + timestampField: '@timestamp', + lookbackPeriod: '10m', + settings: { + frequency: '5m', + }, + }, + metadata: commonOtelMetadata, + }); diff --git a/x-pack/plugins/entity_manager/server/lib/entities/uninstall_entity_definition.ts b/x-pack/plugins/entity_manager/server/lib/entities/uninstall_entity_definition.ts index f8e27353082d0..e0d7b0c9eed3d 100644 --- a/x-pack/plugins/entity_manager/server/lib/entities/uninstall_entity_definition.ts +++ b/x-pack/plugins/entity_manager/server/lib/entities/uninstall_entity_definition.ts @@ -47,7 +47,10 @@ export async function uninstallBuiltInEntityDefinitions({ entityClient: EntityClient; deleteData?: boolean; }): Promise { - const { definitions } = await entityClient.getEntityDefinitions({ builtIn: true }); + const { definitions } = await entityClient.getEntityDefinitions({ + builtIn: true, + perPage: 1000, + }); await Promise.all( definitions.map(async ({ id }) => { diff --git a/x-pack/plugins/features/common/feature_kibana_privileges.ts b/x-pack/plugins/features/common/feature_kibana_privileges.ts index 188fade8dd2cb..1939d0b5e4e49 100644 --- a/x-pack/plugins/features/common/feature_kibana_privileges.ts +++ b/x-pack/plugins/features/common/feature_kibana_privileges.ts @@ -188,6 +188,7 @@ export interface FeatureKibanaPrivileges { read?: readonly string[]; /** * List of case owners which users should have update access to when granted this privilege. + * This privilege does NOT provide access to re-opening a case. Please see `reopenCase` for said functionality. * @example * ```ts * { @@ -216,6 +217,26 @@ export interface FeatureKibanaPrivileges { * ``` */ settings?: readonly string[]; + /** + * List of case owners whose users should have createComment access when granted this privilege. + * @example + * ```ts + * { + * createComment: ['securitySolution'] + * } + * ``` + */ + createComment?: readonly string[]; + /** + * List of case owners whose users should have reopenCase access when granted this privilege. + * @example + * ```ts + * { + * reopenCase: ['securitySolution'] + * } + * ``` + */ + reopenCase?: readonly string[]; }; /** diff --git a/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap b/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap index c91244e2f1d9d..b8df9e9c2117b 100644 --- a/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap +++ b/x-pack/plugins/features/server/__snapshots__/oss_features.test.ts.snap @@ -557,9 +557,11 @@ Array [ "cases": Object { "all": Array [], "create": Array [], + "createComment": Array [], "delete": Array [], "push": Array [], "read": Array [], + "reopenCase": Array [], "settings": Array [], "update": Array [], }, @@ -716,9 +718,11 @@ Array [ "cases": Object { "all": Array [], "create": Array [], + "createComment": Array [], "delete": Array [], "push": Array [], "read": Array [], + "reopenCase": Array [], "settings": Array [], "update": Array [], }, @@ -1050,9 +1054,11 @@ Array [ "cases": Object { "all": Array [], "create": Array [], + "createComment": Array [], "delete": Array [], "push": Array [], "read": Array [], + "reopenCase": Array [], "settings": Array [], "update": Array [], }, @@ -1190,9 +1196,11 @@ Array [ "cases": Object { "all": Array [], "create": Array [], + "createComment": Array [], "delete": Array [], "push": Array [], "read": Array [], + "reopenCase": Array [], "settings": Array [], "update": Array [], }, @@ -1349,9 +1357,11 @@ Array [ "cases": Object { "all": Array [], "create": Array [], + "createComment": Array [], "delete": Array [], "push": Array [], "read": Array [], + "reopenCase": Array [], "settings": Array [], "update": Array [], }, @@ -1683,9 +1693,11 @@ Array [ "cases": Object { "all": Array [], "create": Array [], + "createComment": Array [], "delete": Array [], "push": Array [], "read": Array [], + "reopenCase": Array [], "settings": Array [], "update": Array [], }, diff --git a/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.test.ts b/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.test.ts index 58a39c85bf9e9..c7d501bb17cf8 100644 --- a/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.test.ts +++ b/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.test.ts @@ -78,6 +78,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -148,6 +150,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -217,6 +221,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -288,6 +294,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -329,6 +337,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -391,6 +401,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-sub-type'], }, @@ -438,6 +450,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -506,6 +520,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -568,6 +584,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-sub-type'], }, @@ -615,6 +633,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -683,6 +703,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -746,6 +768,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-sub-type'], }, ui: ['ui-sub-type'], }, @@ -796,6 +820,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type', 'cases-delete-sub-type'], push: ['cases-push-type', 'cases-push-sub-type'], settings: ['cases-settings-type', 'cases-settings-sub-type'], + createComment: ['cases-create-comment-type', 'cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-type', 'cases-reopen-sub-type'], }, ui: ['ui-action', 'ui-sub-type'], }, @@ -832,6 +858,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-sub-type'], }, ui: ['ui-action', 'ui-sub-type'], }, @@ -875,6 +903,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -980,6 +1010,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -1015,6 +1047,8 @@ describe('featurePrivilegeIterator', () => { delete: [], push: [], settings: [], + createComment: [], + reopenCase: [], }, ui: ['ui-action'], }, @@ -1056,6 +1090,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -1119,6 +1155,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-sub-type'], }, ui: ['ui-sub-type'], }, @@ -1169,6 +1207,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type', 'cases-delete-sub-type'], push: ['cases-push-type', 'cases-push-sub-type'], settings: ['cases-settings-type', 'cases-settings-sub-type'], + createComment: ['cases-create-comment-type', 'cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-type', 'cases-reopen-sub-type'], }, ui: ['ui-action', 'ui-sub-type'], }, @@ -1362,6 +1402,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-sub-type'], }, ui: ['ui-sub-type'], }, @@ -1412,6 +1454,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-sub-type'], }, ui: ['ui-sub-type'], }, @@ -1448,6 +1492,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-sub-type'], push: ['cases-push-sub-type'], settings: ['cases-settings-sub-type'], + createComment: ['cases-create-comment-sub-type'], + reopenCase: ['cases-reopen-sub-type'], }, ui: ['ui-sub-type'], }, @@ -1489,6 +1535,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -1580,6 +1628,8 @@ describe('featurePrivilegeIterator', () => { delete: ['cases-delete-type'], push: ['cases-push-type'], settings: ['cases-settings-type'], + createComment: ['cases-create-comment-type'], + reopenCase: ['cases-reopen-type'], }, ui: ['ui-action'], }, @@ -1615,6 +1665,8 @@ describe('featurePrivilegeIterator', () => { delete: [], push: [], settings: [], + createComment: [], + reopenCase: [], }, ui: ['ui-action'], }, diff --git a/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.ts b/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.ts index 0d1dc8e3ab788..a9d7336ea0a22 100644 --- a/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.ts +++ b/x-pack/plugins/features/server/feature_privilege_iterator/feature_privilege_iterator.ts @@ -151,6 +151,14 @@ function mergeWithSubFeatures( mergedConfig.cases?.settings ?? [], subFeaturePrivilege.cases?.settings ?? [] ), + createComment: mergeArrays( + mergedConfig.cases?.createComment ?? [], + subFeaturePrivilege.cases?.createComment ?? [] + ), + reopenCase: mergeArrays( + mergedConfig.cases?.reopenCase ?? [], + subFeaturePrivilege.cases?.reopenCase ?? [] + ), }; } return mergedConfig; diff --git a/x-pack/plugins/features/server/feature_schema.ts b/x-pack/plugins/features/server/feature_schema.ts index 581fdc1037e2a..ce444c41e477d 100644 --- a/x-pack/plugins/features/server/feature_schema.ts +++ b/x-pack/plugins/features/server/feature_schema.ts @@ -83,6 +83,8 @@ const casesSchemaObject = schema.maybe( delete: schema.maybe(casesSchema), push: schema.maybe(casesSchema), settings: schema.maybe(casesSchema), + createComment: schema.maybe(casesSchema), + reopenCase: schema.maybe(casesSchema), }) ); diff --git a/x-pack/plugins/fleet/common/settings/agent_policy_settings.tsx b/x-pack/plugins/fleet/common/settings/agent_policy_settings.tsx index a4b41979840b2..55a5885fa4e6b 100644 --- a/x-pack/plugins/fleet/common/settings/agent_policy_settings.tsx +++ b/x-pack/plugins/fleet/common/settings/agent_policy_settings.tsx @@ -40,7 +40,7 @@ export const AGENT_POLICY_ADVANCED_SETTINGS: SettingsConfig[] = [ api_field: { name: 'agent_limits_go_max_procs', }, - schema: z.number().int().min(0).default(0), + schema: z.number().int().min(0), }, { name: 'agent.download.timeout', @@ -59,7 +59,7 @@ export const AGENT_POLICY_ADVANCED_SETTINGS: SettingsConfig[] = [ api_field: { name: 'agent_download_timeout', }, - schema: zodStringWithDurationValidation.default('2h'), + schema: zodStringWithDurationValidation, }, { name: 'agent.download.target_directory', @@ -103,7 +103,7 @@ export const AGENT_POLICY_ADVANCED_SETTINGS: SettingsConfig[] = [ ), learnMoreLink: 'https://www.elastic.co/guide/en/fleet/current/elastic-agent-standalone-logging-config.html#elastic-agent-standalone-logging-settings', - schema: zodStringWithDurationValidation.default('30s'), + schema: zodStringWithDurationValidation, }, { name: 'agent.logging.level', @@ -124,4 +124,76 @@ export const AGENT_POLICY_ADVANCED_SETTINGS: SettingsConfig[] = [ 'https://www.elastic.co/guide/en/fleet/current/agent-policy.html#agent-policy-log-level', schema: z.enum(AGENT_LOG_LEVELS).default(DEFAULT_LOG_LEVEL), }, + { + name: 'agent.logging.to_files', + title: i18n.translate('xpack.fleet.settings.agentPolicyAdvanced.agentLoggingToFilesTitle', { + defaultMessage: 'Agent logging to files', + }), + description: ( + + ), + api_field: { + name: 'agent_logging_to_files', + }, + learnMoreLink: + 'https://www.elastic.co/guide/en/fleet/current/elastic-agent-standalone-logging-config.html#elastic-agent-standalone-logging-settings', + schema: z.boolean().default(true), + }, + { + name: 'agent.logging.files.rotateeverybytes', + title: i18n.translate('xpack.fleet.settings.agentPolicyAdvanced.agentLoggingFileSizeTitle', { + defaultMessage: 'Agent logging file size limit', + }), + description: ( + + ), + api_field: { + name: 'agent_logging_files_rotateeverybytes', + }, + learnMoreLink: + 'https://www.elastic.co/guide/en/fleet/current/elastic-agent-standalone-logging-config.html#elastic-agent-standalone-logging-settings', + schema: z.number().int().min(0), + }, + { + name: 'agent.logging.files.keepfiles', + title: i18n.translate('xpack.fleet.settings.agentPolicyAdvanced.agentLoggingFileLimitTitle', { + defaultMessage: 'Agent logging number of files', + }), + description: ( + + ), + api_field: { + name: 'agent_logging_files_keepfiles', + }, + learnMoreLink: + 'https://www.elastic.co/guide/en/fleet/current/elastic-agent-standalone-logging-config.html#elastic-agent-standalone-logging-settings', + schema: z.number().int().min(0), + }, + { + name: 'agent.logging.files.interval', + title: i18n.translate('xpack.fleet.settings.agentPolicyAdvanced.agentLoggingFileIntervalitle', { + defaultMessage: 'Agent logging number of files', + }), + description: ( + + ), + api_field: { + name: 'agent_logging_files_interval', + }, + learnMoreLink: + 'https://www.elastic.co/guide/en/fleet/current/elastic-agent-standalone-logging-config.html#elastic-agent-standalone-logging-settings', + schema: zodStringWithDurationValidation, + }, ]; diff --git a/x-pack/plugins/fleet/common/types/models/agent_policy.ts b/x-pack/plugins/fleet/common/types/models/agent_policy.ts index ba1a0b182af72..841b98b239b29 100644 --- a/x-pack/plugins/fleet/common/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/models/agent_policy.ts @@ -185,6 +185,18 @@ export interface FullAgentPolicy { uninstall_token_hash: string; signing_key: string; }; + logging?: { + level?: string; + to_files?: boolean; + files?: { + rotateeverybytes?: number; + keepfiles?: number; + interval?: string; + }; + }; + limits?: { + go_max_procs?: number; + }; }; secret_references?: PolicySecretReference[]; signed?: { diff --git a/x-pack/plugins/fleet/dev_docs/fleet_router.md b/x-pack/plugins/fleet/dev_docs/fleet_router.md new file mode 100644 index 0000000000000..03df8c19318ee --- /dev/null +++ b/x-pack/plugins/fleet/dev_docs/fleet_router.md @@ -0,0 +1,33 @@ +# Fleet router + +All the fleet API routes are wrapped with a custom handler see [fleet_router](../server/services/security/fleet_router.ts) that provides error handling and security. + +## Error handling + +All non catched errors in Fleet API will go throuh a default error handler, that will allow to transform known error in response with predefined status code. + +## Security + +Fleet router also provide an easy way to declare authorization rules for Fleet routes. This can be done via the `fleetAuthz` property via a function or an object with required roles. + +Examples: + +```typescript +router.versioned.get({ + path: OUTPUT_API_ROUTES.LIST_PATTERN, + fleetAuthz: (authz) => { + return authz.fleet.readSettings || authz.fleet.readAgentPolicies; + }, + summary: 'Get outputs', +}); +``` + +```typescript +router.versioned.post({ + path: OUTPUT_API_ROUTES.CREATE_PATTERN, + fleetAuthz: { + fleet: { allSettings: true }, + }, + summary: 'Create output', +}); +``` diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.test.tsx index 8bafc124ec36b..768f9f913607d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.test.tsx @@ -102,6 +102,35 @@ describe('ConfiguredSettings', () => { expect(mockUpdateAdvancedSettingsHasErrors).toHaveBeenCalledWith(true); }); + it('should render boolean field using checkbox', () => { + const result = render([ + { + name: 'agent.logging.to_files', + title: 'Agent logging to files', + description: 'Description', + learnMoreLink: '', + api_field: { + name: 'agent_logging_to_files', + }, + schema: z.boolean().default(false), + }, + ]); + + expect(result.getByText('Agent logging to files')).not.toBeNull(); + const input = result.getByTestId('configuredSetting-agent.logging.to_files'); + expect(input).not.toBeChecked(); + + act(() => { + fireEvent.click(input); + }); + + expect(mockUpdateAgentPolicy).toHaveBeenCalledWith( + expect.objectContaining({ + advanced_settings: expect.objectContaining({ agent_logging_to_files: true }), + }) + ); + }); + it('should not render field if hidden', () => { const result = render([ { diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.tsx index 7ebf80141c554..e93dd0b6cdd82 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/index.tsx @@ -7,7 +7,9 @@ import { ZodFirstPartyTypeKind } from '@kbn/zod'; import React from 'react'; -import { EuiFieldNumber, EuiFieldText, EuiSelect } from '@elastic/eui'; +import { EuiCheckbox, EuiFieldNumber, EuiFieldText, EuiSelect } from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; import type { SettingsConfig } from '../../../../../common/settings/types'; @@ -68,7 +70,7 @@ settingComponentRegistry.set(ZodFirstPartyTypeKind.ZodEnum, ({ disabled, ...sett ( { + return ( + ( + + )} + /> + ); + } +); + export function ConfiguredSettings({ configuredSettings, disabled, @@ -101,7 +127,7 @@ export function ConfiguredSettings({ const Component = settingComponentRegistry.get(getInnerType(configuredSetting.schema)); if (!Component) { - throw new Error(`Unknown setting type: ${configuredSetting.schema._type}}`); + throw new Error(`Unknown setting type: ${configuredSetting.schema._type}`); } return ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/settings_field_wrapper.tsx b/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/settings_field_wrapper.tsx index 61adef4729a27..1885d466711fb 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/settings_field_wrapper.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/components/form_settings/settings_field_wrapper.tsx @@ -13,12 +13,15 @@ import { EuiDescribedFormGroup, EuiFormRow, EuiLink } from '@elastic/eui'; import type { SettingsConfig } from '../../../../../common/settings/types'; import { useAgentPolicyFormContext } from '../../sections/agent_policy/components/agent_policy_form'; -export const convertValue = (value: string, type: keyof typeof ZodFirstPartyTypeKind): any => { +export const convertValue = ( + value: string | boolean, + type: keyof typeof ZodFirstPartyTypeKind +): any => { if (type === ZodFirstPartyTypeKind.ZodNumber) { if (value === '') { return 0; } - return parseInt(value, 10); + return parseInt(value as string, 10); } return value; }; @@ -48,7 +51,8 @@ export const SettingsFieldWrapper: React.FC<{ const coercedSchema = settingsConfig.schema as z.ZodString; const handleChange = (e: React.ChangeEvent) => { - const newValue = convertValue(e.target.value, typeName); + const value = typeName === ZodFirstPartyTypeKind.ZodBoolean ? e.target.checked : e.target.value; + const newValue = convertValue(value, typeName); const validationError = validateSchema(coercedSchema, newValue); if (validationError) { @@ -97,9 +101,13 @@ export const SettingsFieldWrapper: React.FC<{ }; export const getInnerType = (schema: z.ZodType) => { - return schema instanceof z.ZodDefault - ? schema._def.innerType._def.typeName === 'ZodEffects' + if (schema._def.innerType) { + return schema._def.innerType._def.typeName === 'ZodEffects' ? schema._def.innerType._def.schema._def.typeName - : schema._def.innerType._def.typeName - : schema._def.typeName; + : schema._def.innerType._def.typeName; + } + if (schema._def.typeName === 'ZodEffects') { + return schema._def.schema._def.typeName; + } + return schema._def.typeName; }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx index 109e9c73bd778..1d6d6750e06e6 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx @@ -129,7 +129,8 @@ describe('stepStepSelectAgentPolicy', () => { }); }); - describe('with multiple agent policies', () => { + // FLAKY: https://github.com/elastic/kibana/issues/197985 + describe.skip('with multiple agent policies', () => { beforeEach(() => { testRenderer = createFleetTestRendererMock(); useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: true }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx index d70ed67247207..deb8402af5bea 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx @@ -24,16 +24,14 @@ import { isAgentUpgradeable, ExperimentalFeaturesService } from '../../../../ser import { AgentHealth } from '../../components'; import type { Pagination } from '../../../../hooks'; -import { useAgentVersion, useGetListOutputsForPolicies } from '../../../../hooks'; +import { useAgentVersion } from '../../../../hooks'; import { useLink, useAuthz } from '../../../../hooks'; import { AgentPolicySummaryLine } from '../../../../components'; import { Tags } from '../../components/tags'; -import type { AgentMetrics, OutputsForAgentPolicy } from '../../../../../../../common/types'; +import type { AgentMetrics } from '../../../../../../../common/types'; import { formatAgentCPU, formatAgentMemory } from '../../services/agent_metrics'; -import { AgentPolicyOutputsSummary } from './agent_policy_outputs_summary'; - import { AgentUpgradeStatus } from './agent_upgrade_status'; import { EmptyPrompt } from './empty_prompt'; @@ -45,8 +43,6 @@ const AGENTS_TABLE_FIELDS = { METRICS: 'metrics', VERSION: 'local_metadata.elastic.agent.version', LAST_CHECKIN: 'last_checkin', - OUTPUT_INTEGRATION: 'output_integrations', - OUTPUT_MONITORING: 'output_monitoring', }; function safeMetadata(val: any) { @@ -128,14 +124,6 @@ export const AgentListTable: React.FC = (props: Props) => { : []; }, [agents, isAgentSelectable, showUpgradeable, totalAgents]); - // get the policyIds of the agents shown on the page - const policyIds = useMemo(() => { - return agentsShown.map((agent) => agent?.policy_id ?? ''); - }, [agentsShown]); - const allOutputs = useGetListOutputsForPolicies({ - ids: policyIds, - }); - const noItemsMessage = isLoading && isCurrentRequestIncremented ? ( = (props: Props) => { render: (lastCheckin: string) => lastCheckin ? : undefined, }, - { - field: AGENTS_TABLE_FIELDS.OUTPUT_INTEGRATION, - sortable: true, - truncateText: true, - name: i18n.translate('xpack.fleet.agentList.integrationsOutputTitle', { - defaultMessage: 'Output for integrations', - }), - width: '180px', - render: (outputs: OutputsForAgentPolicy[], agent: Agent) => { - if (!agent?.policy_id) return null; - - const outputsForPolicy = allOutputs?.data?.items.find( - (item) => item.agentPolicyId === agent?.policy_id - ); - return ; - }, - }, - { - field: AGENTS_TABLE_FIELDS.OUTPUT_MONITORING, - sortable: true, - truncateText: true, - name: i18n.translate('xpack.fleet.agentList.monitoringOutputTitle', { - defaultMessage: 'Output for monitoring', - }), - width: '180px', - render: (outputs: OutputsForAgentPolicy[], agent: Agent) => { - if (!agent?.policy_id) return null; - - const outputsForPolicy = allOutputs?.data?.items.find( - (item) => item.agentPolicyId === agent?.policy_id - ); - return ; - }, - }, { field: AGENTS_TABLE_FIELDS.VERSION, sortable: true, diff --git a/x-pack/plugins/fleet/scripts/verify_test_packages/verify_test_packages.test.ts b/x-pack/plugins/fleet/scripts/verify_test_packages/verify_test_packages.test.ts index b8d1ba7e9bec0..4f15ea3e6558f 100644 --- a/x-pack/plugins/fleet/scripts/verify_test_packages/verify_test_packages.test.ts +++ b/x-pack/plugins/fleet/scripts/verify_test_packages/verify_test_packages.test.ts @@ -23,7 +23,8 @@ mockedAppContextService.getSecuritySetup.mockImplementation(() => ({ let mockedLogger: jest.Mocked; -describe('Test packages', () => { +// FLAKY: https://github.com/elastic/kibana/issues/200787 +describe.skip('Test packages', () => { beforeEach(() => { mockedLogger = loggerMock.create(); mockedAppContextService.getLogger.mockReturnValue(mockedLogger); diff --git a/x-pack/plugins/fleet/server/routes/agent/actions_handlers.ts b/x-pack/plugins/fleet/server/routes/agent/actions_handlers.ts index b11dcb719e2d2..1871bbd74fd17 100644 --- a/x-pack/plugins/fleet/server/routes/agent/actions_handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent/actions_handlers.ts @@ -16,7 +16,6 @@ import type { } from '../../types/rest_spec'; import type { ActionsService } from '../../services/agents'; import type { PostNewAgentActionResponse } from '../../../common/types/rest_spec'; -import { defaultFleetErrorHandler } from '../../errors'; import { getCurrentNamespace } from '../../services/spaces/get_current_namespace'; export const postNewAgentActionHandlerBuilder = function ( @@ -27,30 +26,26 @@ export const postNewAgentActionHandlerBuilder = function ( TypeOf > { return async (context, request, response) => { - try { - const core = await context.core; - const esClient = core.elasticsearch.client.asInternalUser; - const soClient = core.savedObjects.client; + const core = await context.core; + const esClient = core.elasticsearch.client.asInternalUser; + const soClient = core.savedObjects.client; - const agent = await actionsService.getAgent(esClient, soClient, request.params.agentId); + const agent = await actionsService.getAgent(esClient, soClient, request.params.agentId); - const newAgentAction = request.body.action; + const newAgentAction = request.body.action; - const savedAgentAction = await actionsService.createAgentAction(esClient, { - created_at: new Date().toISOString(), - ...newAgentAction, - agents: [agent.id], - namespaces: [getCurrentNamespace(soClient)], - }); + const savedAgentAction = await actionsService.createAgentAction(esClient, { + created_at: new Date().toISOString(), + ...newAgentAction, + agents: [agent.id], + namespaces: [getCurrentNamespace(soClient)], + }); - const body: PostNewAgentActionResponse = { - item: savedAgentAction, - }; + const body: PostNewAgentActionResponse = { + item: savedAgentAction, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; }; @@ -58,24 +53,20 @@ export const postCancelActionHandlerBuilder = function ( actionsService: ActionsService ): RequestHandler, undefined, undefined> { return async (context, request, response) => { - try { - const core = await context.core; - const esClient = core.elasticsearch.client.asInternalUser; - const soClient = core.savedObjects.client; + const core = await context.core; + const esClient = core.elasticsearch.client.asInternalUser; + const soClient = core.savedObjects.client; - const action = await actionsService.cancelAgentAction( - esClient, - soClient, - request.params.actionId - ); + const action = await actionsService.cancelAgentAction( + esClient, + soClient, + request.params.actionId + ); - const body: PostNewAgentActionResponse = { - item: action, - }; + const body: PostNewAgentActionResponse = { + item: action, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; }; diff --git a/x-pack/plugins/fleet/server/routes/agent/handlers.ts b/x-pack/plugins/fleet/server/routes/agent/handlers.ts index f7f56b76503b4..bcefa56b806e8 100644 --- a/x-pack/plugins/fleet/server/routes/agent/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent/handlers.ts @@ -40,7 +40,7 @@ import type { PostRetrieveAgentsByActionsRequestSchema, FleetRequestHandler, } from '../../types'; -import { defaultFleetErrorHandler, FleetNotFoundError } from '../../errors'; +import { FleetNotFoundError } from '../../errors'; import * as AgentService from '../../services/agents'; import { fetchAndAssignAgentMetrics } from '../../services/agents/agent_metrics'; import { getAgentStatusForAgentPolicy } from '../../services/agents'; @@ -81,7 +81,7 @@ export const getAgentHandler: FleetRequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -110,7 +110,7 @@ export const deleteAgentHandler: FleetRequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -148,7 +148,7 @@ export const updateAgentHandler: FleetRequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -164,19 +164,15 @@ export const bulkUpdateAgentTagsHandler: RequestHandler< ? { agentIds: request.body.agents } : { kuery: request.body.agents, showInactive: request.body.includeInactive }; - try { - const results = await AgentService.updateAgentTags( - soClient, - esClient, - { ...agentOptions, batchSize: request.body.batchSize }, - request.body.tagsToAdd ?? [], - request.body.tagsToRemove ?? [] - ); - - return response.ok({ body: { actionId: results.actionId } }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const results = await AgentService.updateAgentTags( + soClient, + esClient, + { ...agentOptions, batchSize: request.body.batchSize }, + request.body.tagsToAdd ?? [], + request.body.tagsToRemove ?? [] + ); + + return response.ok({ body: { actionId: results.actionId } }); }; export const getAgentsHandler: FleetRequestHandler< @@ -187,37 +183,33 @@ export const getAgentsHandler: FleetRequestHandler< const { agentClient } = fleetContext; const esClientCurrentUser = coreContext.elasticsearch.client.asCurrentUser; - try { - const agentRes = await agentClient.asCurrentUser.listAgents({ - page: request.query.page, - perPage: request.query.perPage, - showInactive: request.query.showInactive, - showUpgradeable: request.query.showUpgradeable, - kuery: request.query.kuery, - sortField: request.query.sortField, - sortOrder: request.query.sortOrder, - getStatusSummary: request.query.getStatusSummary, - }); - - const { total, page, perPage, statusSummary } = agentRes; - let { agents } = agentRes; - - // Assign metrics - if (request.query.withMetrics) { - agents = await fetchAndAssignAgentMetrics(esClientCurrentUser, agents); - } - - const body: GetAgentsResponse = { - items: agents, - total, - page, - perPage, - ...(statusSummary ? { statusSummary } : {}), - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + const agentRes = await agentClient.asCurrentUser.listAgents({ + page: request.query.page, + perPage: request.query.perPage, + showInactive: request.query.showInactive, + showUpgradeable: request.query.showUpgradeable, + kuery: request.query.kuery, + sortField: request.query.sortField, + sortOrder: request.query.sortOrder, + getStatusSummary: request.query.getStatusSummary, + }); + + const { total, page, perPage, statusSummary } = agentRes; + let { agents } = agentRes; + + // Assign metrics + if (request.query.withMetrics) { + agents = await fetchAndAssignAgentMetrics(esClientCurrentUser, agents); } + + const body: GetAgentsResponse = { + items: agents, + total, + page, + perPage, + ...(statusSummary ? { statusSummary } : {}), + }; + return response.ok({ body }); }; export const getAgentTagsHandler: RequestHandler< @@ -228,19 +220,15 @@ export const getAgentTagsHandler: RequestHandler< const esClient = coreContext.elasticsearch.client.asInternalUser; const soClient = coreContext.savedObjects.client; - try { - const tags = await AgentService.getAgentTags(soClient, esClient, { - showInactive: request.query.showInactive, - kuery: request.query.kuery, - }); + const tags = await AgentService.getAgentTags(soClient, esClient, { + showInactive: request.query.showInactive, + kuery: request.query.kuery, + }); - const body: GetAgentTagsResponse = { - items: tags, - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const body: GetAgentTagsResponse = { + items: tags, + }; + return response.ok({ body }); }; export const postAgentReassignHandler: RequestHandler< @@ -251,19 +239,15 @@ export const postAgentReassignHandler: RequestHandler< const coreContext = await context.core; const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - await AgentService.reassignAgent( - soClient, - esClient, - request.params.agentId, - request.body.policy_id - ); - - const body: PostAgentReassignResponse = {}; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + await AgentService.reassignAgent( + soClient, + esClient, + request.params.agentId, + request.body.policy_id + ); + + const body: PostAgentReassignResponse = {}; + return response.ok({ body }); }; export const postBulkAgentReassignHandler: RequestHandler< @@ -278,52 +262,44 @@ export const postBulkAgentReassignHandler: RequestHandler< ? { agentIds: request.body.agents } : { kuery: request.body.agents, showInactive: request.body.includeInactive }; - try { - const results = await AgentService.reassignAgents( - soClient, - esClient, - { ...agentOptions, batchSize: request.body.batchSize }, - request.body.policy_id - ); - - return response.ok({ body: { actionId: results.actionId } }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const results = await AgentService.reassignAgents( + soClient, + esClient, + { ...agentOptions, batchSize: request.body.batchSize }, + request.body.policy_id + ); + + return response.ok({ body: { actionId: results.actionId } }); }; export const getAgentStatusForAgentPolicyHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const [coreContext, fleetContext] = await Promise.all([context.core, context.fleet]); - const esClient = coreContext.elasticsearch.client.asInternalUser; - const soClient = fleetContext.internalSoClient; + const [coreContext, fleetContext] = await Promise.all([context.core, context.fleet]); + const esClient = coreContext.elasticsearch.client.asInternalUser; + const soClient = fleetContext.internalSoClient; - const parsePolicyIds = (policyIds: string | string[] | undefined): string[] | undefined => { - if (!policyIds || !policyIds.length) { - return undefined; - } + const parsePolicyIds = (policyIds: string | string[] | undefined): string[] | undefined => { + if (!policyIds || !policyIds.length) { + return undefined; + } - return Array.isArray(policyIds) ? policyIds : [policyIds]; - }; + return Array.isArray(policyIds) ? policyIds : [policyIds]; + }; - const results = await getAgentStatusForAgentPolicy( - esClient, - soClient, - request.query.policyId, - request.query.kuery, - coreContext.savedObjects.client.getCurrentNamespace(), - parsePolicyIds(request.query.policyIds) - ); + const results = await getAgentStatusForAgentPolicy( + esClient, + soClient, + request.query.policyId, + request.query.kuery, + coreContext.savedObjects.client.getCurrentNamespace(), + parsePolicyIds(request.query.policyIds) + ); - const body: GetAgentStatusResponse = { results: omit(results, 'total') }; + const body: GetAgentStatusResponse = { results: omit(results, 'total') }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const getAgentDataHandler: RequestHandler< @@ -332,24 +308,21 @@ export const getAgentDataHandler: RequestHandler< > = async (context, request, response) => { const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asCurrentUser; - try { - const returnDataPreview = request.query.previewData; - const agentIds = isStringArray(request.query.agentsIds) - ? request.query.agentsIds - : [request.query.agentsIds]; - const { items, dataPreview } = await AgentService.getIncomingDataByAgentsId( - esClient, - agentIds, - returnDataPreview - ); + const returnDataPreview = request.query.previewData; + const agentIds = isStringArray(request.query.agentsIds) + ? request.query.agentsIds + : [request.query.agentsIds]; - const body = { items, dataPreview }; + const { items, dataPreview } = await AgentService.getIncomingDataByAgentsId( + esClient, + agentIds, + returnDataPreview + ); - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const body = { items, dataPreview }; + + return response.ok({ body }); }; function isStringArray(arr: unknown | string[]): arr is string[] { @@ -361,24 +334,16 @@ export const getAgentStatusRuntimeFieldHandler: RequestHandler = async ( request, response ) => { - try { - const runtimeFields = await buildAgentStatusRuntimeField(); + const runtimeFields = await buildAgentStatusRuntimeField(); - return response.ok({ body: (runtimeFields.status.script as Script)!.source! }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: (runtimeFields.status.script as Script)!.source! }); }; export const getAvailableVersionsHandler: RequestHandler = async (context, request, response) => { - try { - const availableVersions = await AgentService.getAvailableVersions(); - const body: GetAvailableVersionsResponse = { items: availableVersions }; + const availableVersions = await AgentService.getAvailableVersions(); + const body: GetAvailableVersionsResponse = { items: availableVersions }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const getActionStatusHandler: RequestHandler< @@ -388,17 +353,13 @@ export const getActionStatusHandler: RequestHandler< const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - const actionStatuses = await AgentService.getActionStatuses( - esClient, - request.query, - getCurrentNamespace(coreContext.savedObjects.client) - ); - const body: GetActionStatusResponse = { items: actionStatuses }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const actionStatuses = await AgentService.getActionStatuses( + esClient, + request.query, + getCurrentNamespace(coreContext.savedObjects.client) + ); + const body: GetActionStatusResponse = { items: actionStatuses }; + return response.ok({ body }); }; export const postRetrieveAgentsByActionsHandler: RequestHandler< @@ -409,13 +370,9 @@ export const postRetrieveAgentsByActionsHandler: RequestHandler< const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - const agents = await AgentService.getAgentsByActionsIds(esClient, request.body.actionIds); - const body: PostRetrieveAgentsByActionsResponse = { items: agents }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const agents = await AgentService.getAgentsByActionsIds(esClient, request.body.actionIds); + const body: PostRetrieveAgentsByActionsResponse = { items: agents }; + return response.ok({ body }); }; export const getAgentUploadsHandler: RequestHandler< @@ -423,15 +380,11 @@ export const getAgentUploadsHandler: RequestHandler< > = async (context, request, response) => { const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - const body: GetAgentUploadsResponse = { - items: await AgentService.getAgentUploads(esClient, request.params.agentId), - }; + const body: GetAgentUploadsResponse = { + items: await AgentService.getAgentUploads(esClient, request.params.agentId), + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const getAgentUploadFileHandler: RequestHandler< @@ -439,17 +392,13 @@ export const getAgentUploadFileHandler: RequestHandler< > = async (context, request, response) => { const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - const resp = await AgentService.getAgentUploadFile( - esClient, - request.params.fileId, - request.params.fileName - ); + const resp = await AgentService.getAgentUploadFile( + esClient, + request.params.fileId, + request.params.fileName + ); - return response.ok(resp); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok(resp); }; export const deleteAgentUploadFileHandler: RequestHandler< @@ -457,11 +406,7 @@ export const deleteAgentUploadFileHandler: RequestHandler< > = async (context, request, response) => { const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - const resp = await AgentService.deleteAgentUploadFile(esClient, request.params.fileId); + const resp = await AgentService.deleteAgentUploadFile(esClient, request.params.fileId); - return response.ok({ body: resp }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: resp }); }; diff --git a/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.test.ts b/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.test.ts index b0502c6a23cd5..fccc5790df087 100644 --- a/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.test.ts +++ b/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.test.ts @@ -7,7 +7,6 @@ import type { ElasticsearchClient, KibanaResponseFactory, - RequestHandlerContext, SavedObjectsClientContract, KibanaRequest, } from '@kbn/core/server'; @@ -18,12 +17,14 @@ import { } from '@kbn/core/server/mocks'; import type { RequestDiagnosticsAdditionalMetrics } from '../../../common/types'; - +import { withDefaultErrorHandler } from '../../services/security/fleet_router'; import { getAgentById } from '../../services/agents'; import * as AgentService from '../../services/agents'; +import { type FleetRequestHandlerContext } from '../..'; import { requestDiagnosticsHandler } from './request_diagnostics_handler'; +const requestDiagnosticsWithErrorHandler = withDefaultErrorHandler(requestDiagnosticsHandler); jest.mock('../../services/agents'); const mockGetAgentById = getAgentById as jest.Mock; @@ -32,7 +33,7 @@ describe('request diagnostics handler', () => { let mockResponse: jest.Mocked; let mockSavedObjectsClient: jest.Mocked; let mockElasticsearchClient: jest.Mocked; - let mockContext: RequestHandlerContext; + let mockContext: FleetRequestHandlerContext; let mockRequest: KibanaRequest< { agentId: string }, undefined, @@ -56,7 +57,7 @@ describe('request diagnostics handler', () => { }, }, }, - } as unknown as RequestHandlerContext; + } as unknown as FleetRequestHandlerContext; mockRequest = httpServerMock.createKibanaRequest({ params: { agentId: 'agent1' }, body: { additional_metrics: ['CPU'] }, @@ -69,7 +70,7 @@ describe('request diagnostics handler', () => { local_metadata: { elastic: { agent: { version: '8.7.0' } } }, }); - await requestDiagnosticsHandler(mockContext, mockRequest, mockResponse); + await requestDiagnosticsWithErrorHandler(mockContext, mockRequest, mockResponse); expect(mockResponse.ok).toHaveBeenCalledWith({ body: { actionId: '1' } }); }); @@ -80,7 +81,7 @@ describe('request diagnostics handler', () => { local_metadata: { elastic: { agent: { version: '8.6.0' } } }, }); - await requestDiagnosticsHandler(mockContext, mockRequest, mockResponse); + await requestDiagnosticsWithErrorHandler(mockContext, mockRequest, mockResponse); expect(mockResponse.customError).toHaveBeenCalledWith({ body: { message: 'Agent agent1 does not support request diagnostics action.' }, diff --git a/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.ts b/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.ts index b59d38d947860..63177e6eb57c1 100644 --- a/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.ts +++ b/x-pack/plugins/fleet/server/routes/agent/request_diagnostics_handler.ts @@ -5,20 +5,19 @@ * 2.0. */ -import type { RequestHandler } from '@kbn/core/server'; import type { TypeOf } from '@kbn/config-schema'; import { isAgentRequestDiagnosticsSupported } from '../../../common/services'; import * as AgentService from '../../services/agents'; import type { + FleetRequestHandler, PostBulkRequestDiagnosticsActionRequestSchema, PostRequestDiagnosticsActionRequestSchema, } from '../../types'; -import { defaultFleetErrorHandler } from '../../errors'; import { getAgentById } from '../../services/agents'; -export const requestDiagnosticsHandler: RequestHandler< +export const requestDiagnosticsHandler: FleetRequestHandler< TypeOf, undefined, TypeOf @@ -26,32 +25,28 @@ export const requestDiagnosticsHandler: RequestHandler< const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asInternalUser; const soClient = coreContext.savedObjects.client; - try { - const agent = await getAgentById(esClient, soClient, request.params.agentId); + const agent = await getAgentById(esClient, soClient, request.params.agentId); - if (!isAgentRequestDiagnosticsSupported(agent)) { - return response.customError({ - statusCode: 400, - body: { - message: `Agent ${request.params.agentId} does not support request diagnostics action.`, - }, - }); - } + if (!isAgentRequestDiagnosticsSupported(agent)) { + return response.customError({ + statusCode: 400, + body: { + message: `Agent ${request.params.agentId} does not support request diagnostics action.`, + }, + }); + } - const result = await AgentService.requestDiagnostics( - esClient, - soClient, - request.params.agentId, - request.body?.additional_metrics - ); + const result = await AgentService.requestDiagnostics( + esClient, + soClient, + request.params.agentId, + request.body?.additional_metrics + ); - return response.ok({ body: { actionId: result.actionId } }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: { actionId: result.actionId } }); }; -export const bulkRequestDiagnosticsHandler: RequestHandler< +export const bulkRequestDiagnosticsHandler: FleetRequestHandler< undefined, undefined, TypeOf @@ -62,15 +57,11 @@ export const bulkRequestDiagnosticsHandler: RequestHandler< const agentOptions = Array.isArray(request.body.agents) ? { agentIds: request.body.agents } : { kuery: request.body.agents }; - try { - const result = await AgentService.bulkRequestDiagnostics(esClient, soClient, { - ...agentOptions, - batchSize: request.body.batchSize, - additionalMetrics: request.body.additional_metrics, - }); + const result = await AgentService.bulkRequestDiagnostics(esClient, soClient, { + ...agentOptions, + batchSize: request.body.batchSize, + additionalMetrics: request.body.additional_metrics, + }); - return response.ok({ body: { actionId: result.actionId } }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: { actionId: result.actionId } }); }; diff --git a/x-pack/plugins/fleet/server/routes/agent/unenroll_handler.ts b/x-pack/plugins/fleet/server/routes/agent/unenroll_handler.ts index ec72f23a9876d..6f8b4c3d82fae 100644 --- a/x-pack/plugins/fleet/server/routes/agent/unenroll_handler.ts +++ b/x-pack/plugins/fleet/server/routes/agent/unenroll_handler.ts @@ -14,7 +14,6 @@ import type { PostBulkAgentUnenrollRequestSchema, } from '../../types'; import * as AgentService from '../../services/agents'; -import { defaultFleetErrorHandler } from '../../errors'; export const postAgentUnenrollHandler: RequestHandler< TypeOf, @@ -24,17 +23,13 @@ export const postAgentUnenrollHandler: RequestHandler< const coreContext = await context.core; const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - await AgentService.unenrollAgent(soClient, esClient, request.params.agentId, { - force: request.body?.force, - revoke: request.body?.revoke, - }); + await AgentService.unenrollAgent(soClient, esClient, request.params.agentId, { + force: request.body?.force, + revoke: request.body?.revoke, + }); - const body: PostAgentUnenrollResponse = {}; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const body: PostAgentUnenrollResponse = {}; + return response.ok({ body }); }; export const postBulkAgentsUnenrollHandler: RequestHandler< @@ -49,17 +44,13 @@ export const postBulkAgentsUnenrollHandler: RequestHandler< ? { agentIds: request.body.agents } : { kuery: request.body.agents }; - try { - const results = await AgentService.unenrollAgents(soClient, esClient, { - ...agentOptions, - revoke: request.body?.revoke, - force: request.body?.force, - batchSize: request.body?.batchSize, - showInactive: request.body?.includeInactive, - }); + const results = await AgentService.unenrollAgents(soClient, esClient, { + ...agentOptions, + revoke: request.body?.revoke, + force: request.body?.force, + batchSize: request.body?.batchSize, + showInactive: request.body?.includeInactive, + }); - return response.ok({ body: { actionId: results.actionId } }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: { actionId: results.actionId } }); }; diff --git a/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts b/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts index c2a4361a8253e..aaacd5b4a1c59 100644 --- a/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts +++ b/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts @@ -19,7 +19,7 @@ import type { PostAgentUpgradeResponse } from '../../../common/types'; import type { PostAgentUpgradeRequestSchema, PostBulkAgentUpgradeRequestSchema } from '../../types'; import * as AgentService from '../../services/agents'; import { appContextService } from '../../services'; -import { defaultFleetErrorHandler, AgentRequestInvalidError } from '../../errors'; +import { AgentRequestInvalidError } from '../../errors'; import { getRecentUpgradeInfoForAgent, AGENT_UPGRADE_COOLDOWN_IN_MIN, @@ -55,88 +55,84 @@ export const postAgentUpgradeHandler: RequestHandler< }, }); } - try { - const agent = await getAgentById(esClient, soClient, request.params.agentId); - - const fleetServerAgents = await getAllFleetServerAgents(soClient, esClient); - const agentIsFleetServer = fleetServerAgents.some( - (fleetServerAgent) => fleetServerAgent.id === agent.id - ); - if (!agentIsFleetServer) { - try { - checkFleetServerVersion(version, fleetServerAgents); - } catch (err) { - return response.customError({ - statusCode: 400, - body: { - message: err.message, - }, - }); - } - } - - const { hasBeenUpgradedRecently, timeToWaitMs } = getRecentUpgradeInfoForAgent(agent); - const timeToWaitString = moment - .utc(moment.duration(timeToWaitMs).asMilliseconds()) - .format('mm[m]ss[s]'); - - if (!skipRateLimitCheck && hasBeenUpgradedRecently) { - return response.customError({ - statusCode: 429, - body: { - message: `agent ${request.params.agentId} was upgraded less than ${AGENT_UPGRADE_COOLDOWN_IN_MIN} minutes ago. Please wait ${timeToWaitString} before trying again to ensure the upgrade will not be rolled back.`, - }, - headers: { - // retry-after expects seconds - 'retry-after': Math.ceil(timeToWaitMs / 1000).toString(), - }, - }); - } - - if (agent.unenrollment_started_at || agent.unenrolled_at) { + const agent = await getAgentById(esClient, soClient, request.params.agentId); + + const fleetServerAgents = await getAllFleetServerAgents(soClient, esClient); + const agentIsFleetServer = fleetServerAgents.some( + (fleetServerAgent) => fleetServerAgent.id === agent.id + ); + if (!agentIsFleetServer) { + try { + checkFleetServerVersion(version, fleetServerAgents); + } catch (err) { return response.customError({ statusCode: 400, body: { - message: 'cannot upgrade an unenrolling or unenrolled agent', + message: err.message, }, }); } + } - if (!force && isAgentUpgrading(agent)) { - return response.customError({ - statusCode: 400, - body: { - message: `agent ${request.params.agentId} is already upgrading`, - }, - }); - } + const { hasBeenUpgradedRecently, timeToWaitMs } = getRecentUpgradeInfoForAgent(agent); + const timeToWaitString = moment + .utc(moment.duration(timeToWaitMs).asMilliseconds()) + .format('mm[m]ss[s]'); - if (!force && !skipRateLimitCheck && !isAgentUpgradeableToVersion(agent, version)) { - return response.customError({ - statusCode: 400, - body: { - message: `Agent ${request.params.agentId} is not upgradeable: ${getNotUpgradeableMessage( - agent, - latestAgentVersion, - version - )}`, - }, - }); - } + if (!skipRateLimitCheck && hasBeenUpgradedRecently) { + return response.customError({ + statusCode: 429, + body: { + message: `agent ${request.params.agentId} was upgraded less than ${AGENT_UPGRADE_COOLDOWN_IN_MIN} minutes ago. Please wait ${timeToWaitString} before trying again to ensure the upgrade will not be rolled back.`, + }, + headers: { + // retry-after expects seconds + 'retry-after': Math.ceil(timeToWaitMs / 1000).toString(), + }, + }); + } - await AgentService.sendUpgradeAgentAction({ - soClient, - esClient, - agentId: request.params.agentId, - version, - sourceUri, + if (agent.unenrollment_started_at || agent.unenrolled_at) { + return response.customError({ + statusCode: 400, + body: { + message: 'cannot upgrade an unenrolling or unenrolled agent', + }, }); + } + + if (!force && isAgentUpgrading(agent)) { + return response.customError({ + statusCode: 400, + body: { + message: `agent ${request.params.agentId} is already upgrading`, + }, + }); + } - const body: PostAgentUpgradeResponse = {}; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + if (!force && !skipRateLimitCheck && !isAgentUpgradeableToVersion(agent, version)) { + return response.customError({ + statusCode: 400, + body: { + message: `Agent ${request.params.agentId} is not upgradeable: ${getNotUpgradeableMessage( + agent, + latestAgentVersion, + version + )}`, + }, + }); } + + await AgentService.sendUpgradeAgentAction({ + soClient, + esClient, + agentId: request.params.agentId, + version, + sourceUri, + }); + + const body: PostAgentUpgradeResponse = {}; + return response.ok({ body }); }; export const postBulkAgentsUpgradeHandler: RequestHandler< @@ -171,26 +167,22 @@ export const postBulkAgentsUpgradeHandler: RequestHandler< }); } - try { - const agentOptions = Array.isArray(agents) - ? { agentIds: agents } - : { kuery: agents, showInactive: request.body.includeInactive }; - const upgradeOptions = { - ...agentOptions, - sourceUri, - version, - force, - skipRateLimitCheck, - upgradeDurationSeconds, - startTime, - batchSize, - }; - const results = await AgentService.sendUpgradeAgentsActions(soClient, esClient, upgradeOptions); - - return response.ok({ body: { actionId: results.actionId } }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const agentOptions = Array.isArray(agents) + ? { agentIds: agents } + : { kuery: agents, showInactive: request.body.includeInactive }; + const upgradeOptions = { + ...agentOptions, + sourceUri, + version, + force, + skipRateLimitCheck, + upgradeDurationSeconds, + startTime, + batchSize, + }; + const results = await AgentService.sendUpgradeAgentsActions(soClient, esClient, upgradeOptions); + + return response.ok({ body: { actionId: results.actionId } }); }; export const checkKibanaVersion = (version: string, kibanaVersion: string, force = false) => { diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts index 713c054d8105e..faa18c0cfa476 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts @@ -52,12 +52,7 @@ import type { GetAgentPolicyOutputsResponse, GetListAgentPolicyOutputsResponse, } from '../../../common/types'; -import { - defaultFleetErrorHandler, - AgentPolicyNotFoundError, - FleetUnauthorizedError, - FleetError, -} from '../../errors'; +import { AgentPolicyNotFoundError, FleetUnauthorizedError, FleetError } from '../../errors'; import { createAgentPolicyWithPackages } from '../../services/agent_policy_create'; import { updateAgentPolicySpaces } from '../../services/spaces/agent_policy'; import { packagePolicyToSimplifiedPackagePolicy } from '../../../common/services/simplified_package_policy_helper'; @@ -131,60 +126,56 @@ export const getAgentPoliciesHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const [coreContext, fleetContext] = await Promise.all([context.core, context.fleet]); - const soClient = fleetContext.internalSoClient; - const esClient = coreContext.elasticsearch.client.asInternalUser; - const { - full: withPackagePolicies = false, - noAgentCount, - withAgentCount, - format, - ...restOfQuery - } = request.query; - if (!fleetContext.authz.fleet.readAgentPolicies && withPackagePolicies) { - throw new FleetUnauthorizedError( - 'full query parameter require agent policies read permissions' - ); - } - const agentPoliciesResponse = await agentPolicyService.list(soClient, { - withPackagePolicies, - esClient, - ...restOfQuery, - }); - let { items } = agentPoliciesResponse; - const { total, page, perPage } = agentPoliciesResponse; - - if (fleetContext.authz.fleet.readAgents && (noAgentCount === false || withAgentCount)) { - await populateAssignedAgentsCount(fleetContext.agentClient.asCurrentUser, items); - } + const [coreContext, fleetContext] = await Promise.all([context.core, context.fleet]); + const soClient = fleetContext.internalSoClient; + const esClient = coreContext.elasticsearch.client.asInternalUser; + const { + full: withPackagePolicies = false, + noAgentCount, + withAgentCount, + format, + ...restOfQuery + } = request.query; + if (!fleetContext.authz.fleet.readAgentPolicies && withPackagePolicies) { + throw new FleetUnauthorizedError( + 'full query parameter require agent policies read permissions' + ); + } + const agentPoliciesResponse = await agentPolicyService.list(soClient, { + withPackagePolicies, + esClient, + ...restOfQuery, + }); + let { items } = agentPoliciesResponse; + const { total, page, perPage } = agentPoliciesResponse; - if (!fleetContext.authz.fleet.readAgentPolicies) { - items = items.map(sanitizeItemForReadAgentOnly); - } else if (withPackagePolicies && format === inputsFormat.Simplified) { - items.map((item) => { - if (isEmpty(item.package_policies)) { - return item; - } - return { - ...item, - package_policies: item.package_policies!.map((packagePolicy) => - packagePolicyToSimplifiedPackagePolicy(packagePolicy) - ), - }; - }); - } + if (fleetContext.authz.fleet.readAgents && (noAgentCount === false || withAgentCount)) { + await populateAssignedAgentsCount(fleetContext.agentClient.asCurrentUser, items); + } - const body: GetAgentPoliciesResponse = { - items, - total, - page, - perPage, - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + if (!fleetContext.authz.fleet.readAgentPolicies) { + items = items.map(sanitizeItemForReadAgentOnly); + } else if (withPackagePolicies && format === inputsFormat.Simplified) { + items.map((item) => { + if (isEmpty(item.package_policies)) { + return item; + } + return { + ...item, + package_policies: item.package_policies!.map((packagePolicy) => + packagePolicyToSimplifiedPackagePolicy(packagePolicy) + ), + }; + }); } + + const body: GetAgentPoliciesResponse = { + items, + total, + page, + perPage, + }; + return response.ok({ body }); }; export const bulkGetAgentPoliciesHandler: FleetRequestHandler< @@ -238,7 +229,7 @@ export const bulkGetAgentPoliciesHandler: FleetRequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -246,43 +237,39 @@ export const getOneAgentPolicyHandler: FleetRequestHandler< TypeOf, TypeOf > = async (context, request, response) => { - try { - const [coreContext, fleetContext] = await Promise.all([context.core, context.fleet]); - const soClient = coreContext.savedObjects.client; + const [coreContext, fleetContext] = await Promise.all([context.core, context.fleet]); + const soClient = coreContext.savedObjects.client; - const agentPolicy = await agentPolicyService.get(soClient, request.params.agentPolicyId); - if (agentPolicy) { - if (fleetContext.authz.fleet.readAgents) { - await populateAssignedAgentsCount(fleetContext.agentClient.asCurrentUser, [agentPolicy]); - } - let item: any = agentPolicy; - if (!fleetContext.authz.fleet.readAgentPolicies) { - item = sanitizeItemForReadAgentOnly(agentPolicy); - } else if ( - request.query.format === inputsFormat.Simplified && - !isEmpty(agentPolicy.package_policies) - ) { - item = { - ...agentPolicy, - package_policies: agentPolicy.package_policies!.map((packagePolicy) => - packagePolicyToSimplifiedPackagePolicy(packagePolicy) - ), - }; - } - const body: GetOneAgentPolicyResponse = { - item, + const agentPolicy = await agentPolicyService.get(soClient, request.params.agentPolicyId); + if (agentPolicy) { + if (fleetContext.authz.fleet.readAgents) { + await populateAssignedAgentsCount(fleetContext.agentClient.asCurrentUser, [agentPolicy]); + } + let item: any = agentPolicy; + if (!fleetContext.authz.fleet.readAgentPolicies) { + item = sanitizeItemForReadAgentOnly(agentPolicy); + } else if ( + request.query.format === inputsFormat.Simplified && + !isEmpty(agentPolicy.package_policies) + ) { + item = { + ...agentPolicy, + package_policies: agentPolicy.package_policies!.map((packagePolicy) => + packagePolicyToSimplifiedPackagePolicy(packagePolicy) + ), }; - return response.ok({ - body, - }); - } else { - return response.customError({ - statusCode: 404, - body: { message: 'Agent policy not found' }, - }); } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + const body: GetOneAgentPolicyResponse = { + item, + }; + return response.ok({ + body, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent policy not found' }, + }); } }; @@ -357,7 +344,7 @@ export const createAgentPolicyHandler: FleetRequestHandler< body: { message: error.message }, }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -423,7 +410,7 @@ export const updateAgentPolicyHandler: FleetRequestHandler< body: { message: error.message }, }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -463,7 +450,7 @@ export const copyAgentPolicyHandler: RequestHandler< body, }); } catch (error) { - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -476,19 +463,16 @@ export const deleteAgentPoliciesHandler: RequestHandler< const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; const user = appContextService.getSecurityCore().authc.getCurrentUser(request) || undefined; - try { - const body: DeleteAgentPolicyResponse = await agentPolicyService.delete( - soClient, - esClient, - request.body.agentPolicyId, - { user, force: request.body.force } - ); - return response.ok({ - body, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + + const body: DeleteAgentPolicyResponse = await agentPolicyService.delete( + soClient, + esClient, + request.body.agentPolicyId, + { user, force: request.body.force } + ); + return response.ok({ + body, + }); }; export const getFullAgentPolicy: FleetRequestHandler< @@ -499,55 +483,47 @@ export const getFullAgentPolicy: FleetRequestHandler< const soClient = fleetContext.internalSoClient; if (request.query.kubernetes === true) { - try { - const agentVersion = - await fleetContext.agentClient.asInternalUser.getLatestAgentAvailableVersion(); - const fullAgentConfigMap = await agentPolicyService.getFullAgentConfigMap( - soClient, - request.params.agentPolicyId, - agentVersion, - { standalone: request.query.standalone === true } - ); - if (fullAgentConfigMap) { - const body: GetFullAgentConfigMapResponse = { - item: fullAgentConfigMap, - }; - return response.ok({ - body, - }); - } else { - return response.customError({ - statusCode: 404, - body: { message: 'Agent config map not found' }, - }); - } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + const agentVersion = + await fleetContext.agentClient.asInternalUser.getLatestAgentAvailableVersion(); + const fullAgentConfigMap = await agentPolicyService.getFullAgentConfigMap( + soClient, + request.params.agentPolicyId, + agentVersion, + { standalone: request.query.standalone === true } + ); + if (fullAgentConfigMap) { + const body: GetFullAgentConfigMapResponse = { + item: fullAgentConfigMap, + }; + return response.ok({ + body, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent config map not found' }, + }); } } else { - try { - const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy( - soClient, - request.params.agentPolicyId, - { - standalone: request.query.standalone === true, - } - ); - if (fullAgentPolicy) { - const body: GetFullAgentPolicyResponse = { - item: fullAgentPolicy, - }; - return response.ok({ - body, - }); - } else { - return response.customError({ - statusCode: 404, - body: { message: 'Agent policy not found' }, - }); + const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy( + soClient, + request.params.agentPolicyId, + { + standalone: request.query.standalone === true, } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + ); + if (fullAgentPolicy) { + const body: GetFullAgentPolicyResponse = { + item: fullAgentPolicy, + }; + return response.ok({ + body, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent policy not found' }, + }); } } }; @@ -563,112 +539,39 @@ export const downloadFullAgentPolicy: FleetRequestHandler< } = request; if (request.query.kubernetes === true) { - try { - const agentVersion = - await fleetContext.agentClient.asInternalUser.getLatestAgentAvailableVersion(); - const fullAgentConfigMap = await agentPolicyService.getFullAgentConfigMap( - soClient, - request.params.agentPolicyId, - agentVersion, - { standalone: request.query.standalone === true } - ); - if (fullAgentConfigMap) { - const body = fullAgentConfigMap; - const headers: ResponseHeaders = { - 'content-type': 'text/x-yaml', - 'content-disposition': `attachment; filename="elastic-agent-standalone-kubernetes.yml"`, - }; - return response.ok({ - body, - headers, - }); - } else { - return response.customError({ - statusCode: 404, - body: { message: 'Agent config map not found' }, - }); - } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } - } else { - try { - const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy(soClient, agentPolicyId, { - standalone: request.query.standalone === true, - }); - if (fullAgentPolicy) { - const body = fullAgentPolicyToYaml(fullAgentPolicy, dump); - const headers: ResponseHeaders = { - 'content-type': 'text/x-yaml', - 'content-disposition': `attachment; filename="elastic-agent.yml"`, - }; - return response.ok({ - body, - headers, - }); - } else { - return response.customError({ - statusCode: 404, - body: { message: 'Agent policy not found' }, - }); - } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } - } -}; - -export const getK8sManifest: FleetRequestHandler< - undefined, - TypeOf -> = async (context, request, response) => { - try { - const fleetServer = request.query.fleetServer ?? ''; - const token = request.query.enrolToken ?? ''; - - const agentVersion = await getLatestAvailableAgentVersion(); - - const fullAgentManifest = await agentPolicyService.getFullAgentManifest( - fleetServer, - token, - agentVersion + const agentVersion = + await fleetContext.agentClient.asInternalUser.getLatestAgentAvailableVersion(); + const fullAgentConfigMap = await agentPolicyService.getFullAgentConfigMap( + soClient, + request.params.agentPolicyId, + agentVersion, + { standalone: request.query.standalone === true } ); - if (fullAgentManifest) { - const body: GetFullAgentManifestResponse = { - item: fullAgentManifest, + if (fullAgentConfigMap) { + const body = fullAgentConfigMap; + const headers: ResponseHeaders = { + 'content-type': 'text/x-yaml', + 'content-disposition': `attachment; filename="elastic-agent-standalone-kubernetes.yml"`, }; return response.ok({ body, + headers, }); } else { return response.customError({ statusCode: 404, - body: { message: 'Agent manifest not found' }, + body: { message: 'Agent config map not found' }, }); } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } -}; - -export const downloadK8sManifest: FleetRequestHandler< - undefined, - TypeOf -> = async (context, request, response) => { - try { - const fleetServer = request.query.fleetServer ?? ''; - const token = request.query.enrolToken ?? ''; - const agentVersion = await getLatestAvailableAgentVersion(); - const fullAgentManifest = await agentPolicyService.getFullAgentManifest( - fleetServer, - token, - agentVersion - ); - if (fullAgentManifest) { - const body = fullAgentManifest; + } else { + const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy(soClient, agentPolicyId, { + standalone: request.query.standalone === true, + }); + if (fullAgentPolicy) { + const body = fullAgentPolicyToYaml(fullAgentPolicy, dump); const headers: ResponseHeaders = { 'content-type': 'text/x-yaml', - 'content-disposition': `attachment; filename="elastic-agent-managed-kubernetes.yml"`, + 'content-disposition': `attachment; filename="elastic-agent.yml"`, }; return response.ok({ body, @@ -677,71 +580,120 @@ export const downloadK8sManifest: FleetRequestHandler< } else { return response.customError({ statusCode: 404, - body: { message: 'Agent manifest not found' }, + body: { message: 'Agent policy not found' }, }); } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); } }; -export const GetAgentPolicyOutputsHandler: FleetRequestHandler< - TypeOf, - undefined +export const getK8sManifest: FleetRequestHandler< + undefined, + TypeOf > = async (context, request, response) => { - try { - const coreContext = await context.core; - const soClient = coreContext.savedObjects.client; - const agentPolicy = await agentPolicyService.get(soClient, request.params.agentPolicyId); + const fleetServer = request.query.fleetServer ?? ''; + const token = request.query.enrolToken ?? ''; - if (!agentPolicy) { - return response.customError({ - statusCode: 404, - body: { message: 'Agent policy not found' }, - }); - } - const outputs = await agentPolicyService.getAllOutputsForPolicy(soClient, agentPolicy); + const agentVersion = await getLatestAvailableAgentVersion(); - const body: GetAgentPolicyOutputsResponse = { - item: outputs, + const fullAgentManifest = await agentPolicyService.getFullAgentManifest( + fleetServer, + token, + agentVersion + ); + if (fullAgentManifest) { + const body: GetFullAgentManifestResponse = { + item: fullAgentManifest, }; return response.ok({ body, }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent manifest not found' }, + }); } }; -export const GetListAgentPolicyOutputsHandler: FleetRequestHandler< - undefined, +export const downloadK8sManifest: FleetRequestHandler< undefined, - TypeOf + TypeOf > = async (context, request, response) => { - try { - const coreContext = await context.core; - const soClient = coreContext.savedObjects.client; - const { ids } = request.body; + const fleetServer = request.query.fleetServer ?? ''; + const token = request.query.enrolToken ?? ''; + const agentVersion = await getLatestAvailableAgentVersion(); + const fullAgentManifest = await agentPolicyService.getFullAgentManifest( + fleetServer, + token, + agentVersion + ); + if (fullAgentManifest) { + const body = fullAgentManifest; + const headers: ResponseHeaders = { + 'content-type': 'text/x-yaml', + 'content-disposition': `attachment; filename="elastic-agent-managed-kubernetes.yml"`, + }; + return response.ok({ + body, + headers, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent manifest not found' }, + }); + } +}; - if (!ids) { - return response.ok({ - body: { items: [] }, - }); - } - const agentPolicies = await agentPolicyService.getByIDs(soClient, ids, { - withPackagePolicies: true, +export const GetAgentPolicyOutputsHandler: FleetRequestHandler< + TypeOf, + undefined +> = async (context, request, response) => { + const coreContext = await context.core; + const soClient = coreContext.savedObjects.client; + const agentPolicy = await agentPolicyService.get(soClient, request.params.agentPolicyId); + + if (!agentPolicy) { + return response.customError({ + statusCode: 404, + body: { message: 'Agent policy not found' }, }); + } + const outputs = await agentPolicyService.getAllOutputsForPolicy(soClient, agentPolicy); - const outputsList = await agentPolicyService.listAllOutputsForPolicies(soClient, agentPolicies); + const body: GetAgentPolicyOutputsResponse = { + item: outputs, + }; + return response.ok({ + body, + }); +}; - const body: GetListAgentPolicyOutputsResponse = { - items: outputsList, - }; +export const GetListAgentPolicyOutputsHandler: FleetRequestHandler< + undefined, + undefined, + TypeOf +> = async (context, request, response) => { + const coreContext = await context.core; + const soClient = coreContext.savedObjects.client; + const { ids } = request.body; + if (!ids) { return response.ok({ - body, + body: { items: [] }, }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); } + const agentPolicies = await agentPolicyService.getByIDs(soClient, ids, { + withPackagePolicies: true, + }); + + const outputsList = await agentPolicyService.listAllOutputsForPolicies(soClient, agentPolicies); + + const body: GetListAgentPolicyOutputsResponse = { + items: outputsList, + }; + + return response.ok({ + body, + }); }; diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/index.test.ts b/x-pack/plugins/fleet/server/routes/agent_policy/index.test.ts index 44d15317d6162..a8150b26af5f5 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/index.test.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/index.test.ts @@ -171,6 +171,10 @@ describe('schema validation', () => { agent_limits_go_max_procs: 1, agent_logging_level: 'info', agent_logging_metrics_period: '30s', + agent_logging_to_files: true, + agent_logging_files_rotateeverybytes: 10000, + agent_logging_files_keepfiles: 10, + agent_logging_files_interval: '7h', }, keep_monitoring_alive: true, supports_agentless: true, diff --git a/x-pack/plugins/fleet/server/routes/app/index.ts b/x-pack/plugins/fleet/server/routes/app/index.ts index db7eddd5ddd45..cb2eb0af1d154 100644 --- a/x-pack/plugins/fleet/server/routes/app/index.ts +++ b/x-pack/plugins/fleet/server/routes/app/index.ts @@ -15,7 +15,7 @@ import { APP_API_ROUTES } from '../../constants'; import { API_VERSIONS } from '../../../common/constants'; import { appContextService } from '../../services'; import type { CheckPermissionsResponse, GenerateServiceTokenResponse } from '../../../common/types'; -import { defaultFleetErrorHandler, GenerateServiceTokenError } from '../../errors'; +import { GenerateServiceTokenError } from '../../errors'; import type { FleetRequestHandler } from '../../types'; import { CheckPermissionsRequestSchema, CheckPermissionsResponseSchema } from '../../types'; import { enableSpaceAwarenessMigration } from '../../services/spaces/enable_space_awareness'; @@ -106,16 +106,11 @@ export const postEnableSpaceAwarenessHandler: FleetRequestHandler = async ( request, response ) => { - try { - await enableSpaceAwarenessMigration(); + await enableSpaceAwarenessMigration(); - return response.ok({ - body: {}, - }); - } catch (e) { - const error = new GenerateServiceTokenError(e); - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ + body: {}, + }); }; export const generateServiceTokenHandler: RequestHandler< @@ -145,11 +140,11 @@ export const generateServiceTokenHandler: RequestHandler< }); } else { const error = new GenerateServiceTokenError('Unable to generate service token'); - return defaultFleetErrorHandler({ error, response }); + throw error; } } catch (e) { const error = new GenerateServiceTokenError(e); - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -158,28 +153,24 @@ export const getAgentPoliciesSpacesHandler: FleetRequestHandler< null, TypeOf > = async (context, request, response) => { - try { - const spaces = await (await context.fleet).getAllSpaces(); - const security = appContextService.getSecurity(); - const spaceIds = spaces.map(({ id }) => id); - const res = await security.authz.checkPrivilegesWithRequest(request).atSpaces(spaceIds, { - kibana: [security.authz.actions.api.get(`fleet-agent-policies-all`)], - }); + const spaces = await (await context.fleet).getAllSpaces(); + const security = appContextService.getSecurity(); + const spaceIds = spaces.map(({ id }) => id); + const res = await security.authz.checkPrivilegesWithRequest(request).atSpaces(spaceIds, { + kibana: [security.authz.actions.api.get(`fleet-agent-policies-all`)], + }); - const authorizedSpaces = spaces.filter( - (space) => - res.privileges.kibana.find((privilege) => privilege.resource === space.id)?.authorized ?? - false - ); + const authorizedSpaces = spaces.filter( + (space) => + res.privileges.kibana.find((privilege) => privilege.resource === space.id)?.authorized ?? + false + ); - return response.ok({ - body: { - items: authorizedSpaces, - }, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ + body: { + items: authorizedSpaces, + }, + }); }; export const GenerateServiceTokenRequestSchema = { diff --git a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts index 7cbc9d9274032..7ed4b5bacf336 100644 --- a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts @@ -8,19 +8,18 @@ import type { Dictionary } from 'lodash'; import { keyBy, keys, merge } from 'lodash'; import type { RequestHandler } from '@kbn/core/server'; import pMap from 'p-map'; +import type { IndicesDataStreamsStatsDataStreamsStatsItem } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { ByteSizeValue } from '@kbn/config-schema'; import type { DataStream } from '../../types'; import { KibanaSavedObjectType } from '../../../common/types'; import type { GetDataStreamsResponse } from '../../../common/types'; import { getPackageSavedObjects } from '../../services/epm/packages/get'; -import { defaultFleetErrorHandler } from '../../errors'; import type { MeteringStats } from '../../services/data_streams'; import { dataStreamService } from '../../services/data_streams'; +import { appContextService } from '../../services'; import { getDataStreamsQueryMetadata } from './get_data_streams_query_metadata'; -import type { IndicesDataStreamsStatsDataStreamsStatsItem } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { ByteSizeValue } from '@kbn/config-schema'; -import { appContextService } from '../../services'; const MANAGED_BY = 'fleet'; const LEGACY_MANAGED_BY = 'ingest-manager'; @@ -55,158 +54,154 @@ export const getListHandler: RequestHandler = async (context, request, response) data_streams: [], }; - try { - const useMeteringApi = appContextService.getConfig()?.internal?.useMeteringApi; - - // Get matching data streams, their stats, and package SOs - const [ - dataStreamsInfo, - dataStreamStatsOrUndefined, - dataStreamMeteringStatsorUndefined, - packageSavedObjects, - ] = await Promise.all([ - dataStreamService.getAllFleetDataStreams(esClient), - useMeteringApi - ? undefined - : dataStreamService.getAllFleetDataStreamsStats(elasticsearch.client.asSecondaryAuthUser), - useMeteringApi - ? dataStreamService.getAllFleetMeteringStats(elasticsearch.client.asSecondaryAuthUser) - : undefined, - getPackageSavedObjects(savedObjects.client), - ]); - - // managed_by property 'ingest-manager' added to allow for legacy data streams to be displayed - // See https://github.com/elastic/elastic-agent/issues/654 - - const filteredDataStreamsInfo = dataStreamsInfo.filter( - (ds) => ds?._meta?.managed_by === MANAGED_BY || ds?._meta?.managed_by === LEGACY_MANAGED_BY + const useMeteringApi = appContextService.getConfig()?.internal?.useMeteringApi; + + // Get matching data streams, their stats, and package SOs + const [ + dataStreamsInfo, + dataStreamStatsOrUndefined, + dataStreamMeteringStatsorUndefined, + packageSavedObjects, + ] = await Promise.all([ + dataStreamService.getAllFleetDataStreams(esClient), + useMeteringApi + ? undefined + : dataStreamService.getAllFleetDataStreamsStats(elasticsearch.client.asSecondaryAuthUser), + useMeteringApi + ? dataStreamService.getAllFleetMeteringStats(elasticsearch.client.asSecondaryAuthUser) + : undefined, + getPackageSavedObjects(savedObjects.client), + ]); + + // managed_by property 'ingest-manager' added to allow for legacy data streams to be displayed + // See https://github.com/elastic/elastic-agent/issues/654 + + const filteredDataStreamsInfo = dataStreamsInfo.filter( + (ds) => ds?._meta?.managed_by === MANAGED_BY || ds?._meta?.managed_by === LEGACY_MANAGED_BY + ); + + const dataStreamsInfoByName = keyBy(filteredDataStreamsInfo, 'name'); + + let dataStreamsStatsByName: Dictionary = {}; + if (dataStreamStatsOrUndefined) { + const filteredDataStreamsStats = dataStreamStatsOrUndefined.filter( + (dss) => !!dataStreamsInfoByName[dss.data_stream] ); + dataStreamsStatsByName = keyBy(filteredDataStreamsStats, 'data_stream'); + } + let dataStreamsMeteringStatsByName: Dictionary = {}; + if (dataStreamMeteringStatsorUndefined) { + dataStreamsMeteringStatsByName = keyBy(dataStreamMeteringStatsorUndefined, 'name'); + } - const dataStreamsInfoByName = keyBy(filteredDataStreamsInfo, 'name'); - - let dataStreamsStatsByName: Dictionary = {}; - if (dataStreamStatsOrUndefined) { - const filteredDataStreamsStats = dataStreamStatsOrUndefined.filter( - (dss) => !!dataStreamsInfoByName[dss.data_stream] - ); - dataStreamsStatsByName = keyBy(filteredDataStreamsStats, 'data_stream'); - } - let dataStreamsMeteringStatsByName: Dictionary = {}; - if (dataStreamMeteringStatsorUndefined) { - dataStreamsMeteringStatsByName = keyBy(dataStreamMeteringStatsorUndefined, 'name'); - } - - // Combine data stream info - const dataStreams = merge( - dataStreamsInfoByName, - dataStreamsStatsByName, - dataStreamsMeteringStatsByName - ); - const dataStreamNames = keys(dataStreams); - - // Map package SOs - const packageSavedObjectsByName = keyBy(packageSavedObjects.saved_objects, 'id'); - const packageMetadata: any = {}; - - // Get dashboard information for all packages - const dashboardIdsByPackageName = packageSavedObjects.saved_objects.reduce< - Record - >((allDashboards, pkgSavedObject) => { - const dashboards: string[] = []; - (pkgSavedObject.attributes?.installed_kibana || []).forEach((o) => { - if (o.type === KibanaSavedObjectType.dashboard) { - dashboards.push(o.id); - } - }); - allDashboards[pkgSavedObject.id] = dashboards; - return allDashboards; - }, {}); - const allDashboardSavedObjectsResponse = await savedObjects.client.bulkGet<{ - title?: string; - }>( - Object.values(dashboardIdsByPackageName).flatMap((dashboardIds) => - dashboardIds.map((id) => ({ - id, - type: KibanaSavedObjectType.dashboard, - fields: ['title'], - })) - ) - ); - // Ignore dashboards not found - const allDashboardSavedObjects = allDashboardSavedObjectsResponse.saved_objects.filter((so) => { - if (so.error) { - if (so.error.statusCode === 404) { - return false; - } - throw so.error; + // Combine data stream info + const dataStreams = merge( + dataStreamsInfoByName, + dataStreamsStatsByName, + dataStreamsMeteringStatsByName + ); + const dataStreamNames = keys(dataStreams); + + // Map package SOs + const packageSavedObjectsByName = keyBy(packageSavedObjects.saved_objects, 'id'); + const packageMetadata: any = {}; + + // Get dashboard information for all packages + const dashboardIdsByPackageName = packageSavedObjects.saved_objects.reduce< + Record + >((allDashboards, pkgSavedObject) => { + const dashboards: string[] = []; + (pkgSavedObject.attributes?.installed_kibana || []).forEach((o) => { + if (o.type === KibanaSavedObjectType.dashboard) { + dashboards.push(o.id); } - return true; }); + allDashboards[pkgSavedObject.id] = dashboards; + return allDashboards; + }, {}); + const allDashboardSavedObjectsResponse = await savedObjects.client.bulkGet<{ + title?: string; + }>( + Object.values(dashboardIdsByPackageName).flatMap((dashboardIds) => + dashboardIds.map((id) => ({ + id, + type: KibanaSavedObjectType.dashboard, + fields: ['title'], + })) + ) + ); + // Ignore dashboards not found + const allDashboardSavedObjects = allDashboardSavedObjectsResponse.saved_objects.filter((so) => { + if (so.error) { + if (so.error.statusCode === 404) { + return false; + } + throw so.error; + } + return true; + }); + + const allDashboardSavedObjectsById = keyBy( + allDashboardSavedObjects, + (dashboardSavedObject) => dashboardSavedObject.id + ); + + // Query additional information for each data stream + const queryDataStreamInfo = async (dataStreamName: string) => { + const dataStream = dataStreams[dataStreamName]; + + const dataStreamResponse: DataStream = { + index: dataStreamName, + dataset: '', + namespace: '', + type: '', + package: dataStream._meta?.package?.name || '', + package_version: '', + last_activity_ms: dataStream.maximum_timestamp, // overridden below if maxIngestedTimestamp agg returns a result + size_in_bytes: dataStream.store_size_bytes || dataStream.size_in_bytes, + // `store_size` should be available from ES due to ?human=true flag + // but fallback to bytes just in case + size_in_bytes_formatted: + dataStream.store_size || + new ByteSizeValue(dataStream.store_size_bytes || dataStream.size_in_bytes || 0).toString(), + dashboards: [], + serviceDetails: null, + }; - const allDashboardSavedObjectsById = keyBy( - allDashboardSavedObjects, - (dashboardSavedObject) => dashboardSavedObject.id - ); - - // Query additional information for each data stream - const queryDataStreamInfo = async (dataStreamName: string) => { - const dataStream = dataStreams[dataStreamName]; - - const dataStreamResponse: DataStream = { - index: dataStreamName, - dataset: '', - namespace: '', - type: '', - package: dataStream._meta?.package?.name || '', - package_version: '', - last_activity_ms: dataStream.maximum_timestamp, // overridden below if maxIngestedTimestamp agg returns a result - size_in_bytes: dataStream.store_size_bytes || dataStream.size_in_bytes, - // `store_size` should be available from ES due to ?human=true flag - // but fallback to bytes just in case - size_in_bytes_formatted: - dataStream.store_size || - new ByteSizeValue( - dataStream.store_size_bytes || dataStream.size_in_bytes || 0 - ).toString(), - dashboards: [], - serviceDetails: null, - }; - - const { maxIngested, namespace, dataset, type, serviceNames, environments } = - await getDataStreamsQueryMetadata({ dataStreamName: dataStream.name, esClient }); + const { maxIngested, namespace, dataset, type, serviceNames, environments } = + await getDataStreamsQueryMetadata({ dataStreamName: dataStream.name, esClient }); - // some integrations e.g custom logs don't have event.ingested - if (maxIngested) { - dataStreamResponse.last_activity_ms = maxIngested; - } + // some integrations e.g custom logs don't have event.ingested + if (maxIngested) { + dataStreamResponse.last_activity_ms = maxIngested; + } - if (serviceNames?.length === 1) { - const serviceDetails = { - serviceName: serviceNames[0], - environment: environments?.length === 1 ? environments[0] : 'ENVIRONMENT_ALL', - }; - dataStreamResponse.serviceDetails = serviceDetails; - } + if (serviceNames?.length === 1) { + const serviceDetails = { + serviceName: serviceNames[0], + environment: environments?.length === 1 ? environments[0] : 'ENVIRONMENT_ALL', + }; + dataStreamResponse.serviceDetails = serviceDetails; + } - dataStreamResponse.dataset = dataset; - dataStreamResponse.namespace = namespace; - dataStreamResponse.type = type; - - // Find package saved object - const pkgName = dataStreamResponse.package; - const pkgSavedObject = pkgName ? packageSavedObjectsByName[pkgName] : null; - - if (pkgSavedObject) { - // if - // - the data stream is associated with a package - // - and the package has been installed through EPM - // - and we didn't pick the metadata in an earlier iteration of this map() - if (!packageMetadata[pkgName]) { - // then pick the dashboards from the package saved object - const packageDashboardIds = dashboardIdsByPackageName[pkgName] || []; - const packageDashboards = packageDashboardIds.reduce< - Array<{ id: string; title: string }> - >((dashboards, dashboardId) => { + dataStreamResponse.dataset = dataset; + dataStreamResponse.namespace = namespace; + dataStreamResponse.type = type; + + // Find package saved object + const pkgName = dataStreamResponse.package; + const pkgSavedObject = pkgName ? packageSavedObjectsByName[pkgName] : null; + + if (pkgSavedObject) { + // if + // - the data stream is associated with a package + // - and the package has been installed through EPM + // - and we didn't pick the metadata in an earlier iteration of this map() + if (!packageMetadata[pkgName]) { + // then pick the dashboards from the package saved object + const packageDashboardIds = dashboardIdsByPackageName[pkgName] || []; + const packageDashboards = packageDashboardIds.reduce>( + (dashboards, dashboardId) => { const dashboard = allDashboardSavedObjectsById[dashboardId]; if (dashboard) { dashboards.push({ @@ -215,37 +210,36 @@ export const getListHandler: RequestHandler = async (context, request, response) }); } return dashboards; - }, []); - - packageMetadata[pkgName] = { - version: pkgSavedObject.attributes?.version || '', - dashboards: packageDashboards, - }; - } - - // Set values from package information - dataStreamResponse.package = pkgName; - dataStreamResponse.package_version = packageMetadata[pkgName].version; - dataStreamResponse.dashboards = packageMetadata[pkgName].dashboards; + }, + [] + ); + + packageMetadata[pkgName] = { + version: pkgSavedObject.attributes?.version || '', + dashboards: packageDashboards, + }; } - return dataStreamResponse; - }; + // Set values from package information + dataStreamResponse.package = pkgName; + dataStreamResponse.package_version = packageMetadata[pkgName].version; + dataStreamResponse.dashboards = packageMetadata[pkgName].dashboards; + } - // Return final data streams objects sorted by last activity, descending - // After filtering out data streams that are missing dataset/namespace/type/package fields - body.data_streams = ( - await pMap(dataStreamNames, (dataStreamName) => queryDataStreamInfo(dataStreamName), { - concurrency: 50, - }) - ) - .filter(({ dataset, namespace, type }) => dataset && namespace && type) - .sort((a, b) => b.last_activity_ms - a.last_activity_ms); + return dataStreamResponse; + }; - return response.ok({ - body, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + // Return final data streams objects sorted by last activity, descending + // After filtering out data streams that are missing dataset/namespace/type/package fields + body.data_streams = ( + await pMap(dataStreamNames, (dataStreamName) => queryDataStreamInfo(dataStreamName), { + concurrency: 50, + }) + ) + .filter(({ dataset, namespace, type }) => dataset && namespace && type) + .sort((a, b) => b.last_activity_ms - a.last_activity_ms); + + return response.ok({ + body, + }); }; diff --git a/x-pack/plugins/fleet/server/routes/download_source/handler.ts b/x-pack/plugins/fleet/server/routes/download_source/handler.ts index 8807106de441e..0b2254d85f867 100644 --- a/x-pack/plugins/fleet/server/routes/download_source/handler.ts +++ b/x-pack/plugins/fleet/server/routes/download_source/handler.ts @@ -21,25 +21,20 @@ import type { GetDownloadSourceResponse, } from '../../../common/types'; import { downloadSourceService } from '../../services/download_source'; -import { defaultFleetErrorHandler } from '../../errors'; import { agentPolicyService } from '../../services'; export const getDownloadSourcesHandler: RequestHandler = async (context, request, response) => { const soClient = (await context.core).savedObjects.client; - try { - const downloadSources = await downloadSourceService.list(soClient); + const downloadSources = await downloadSourceService.list(soClient); - const body: GetDownloadSourceResponse = { - items: downloadSources.items, - page: downloadSources.page, - perPage: downloadSources.perPage, - total: downloadSources.total, - }; + const body: GetDownloadSourceResponse = { + items: downloadSources.items, + page: downloadSources.page, + perPage: downloadSources.perPage, + total: downloadSources.total, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const getOneDownloadSourcesHandler: RequestHandler< @@ -61,7 +56,7 @@ export const getOneDownloadSourcesHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -94,7 +89,7 @@ export const putDownloadSourcesHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -106,21 +101,17 @@ export const postDownloadSourcesHandler: RequestHandler< const coreContext = await context.core; const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - const { id, ...data } = request.body; - const downloadSource = await downloadSourceService.create(soClient, data, { id }); - if (downloadSource.is_default) { - await agentPolicyService.bumpAllAgentPolicies(esClient); - } + const { id, ...data } = request.body; + const downloadSource = await downloadSourceService.create(soClient, data, { id }); + if (downloadSource.is_default) { + await agentPolicyService.bumpAllAgentPolicies(esClient); + } - const body: GetOneDownloadSourceResponse = { - item: downloadSource, - }; + const body: GetOneDownloadSourceResponse = { + item: downloadSource, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const deleteDownloadSourcesHandler: RequestHandler< @@ -142,6 +133,6 @@ export const deleteDownloadSourcesHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; diff --git a/x-pack/plugins/fleet/server/routes/enrollment_api_key/handler.ts b/x-pack/plugins/fleet/server/routes/enrollment_api_key/handler.ts index a38f5bdadc617..5f225fc5da709 100644 --- a/x-pack/plugins/fleet/server/routes/enrollment_api_key/handler.ts +++ b/x-pack/plugins/fleet/server/routes/enrollment_api_key/handler.ts @@ -22,7 +22,7 @@ import type { } from '../../../common/types'; import * as APIKeyService from '../../services/api_keys'; import { agentPolicyService } from '../../services/agent_policy'; -import { defaultFleetErrorHandler, AgentPolicyNotFoundError } from '../../errors'; +import { AgentPolicyNotFoundError } from '../../errors'; import { getCurrentNamespace } from '../../services/spaces/get_current_namespace'; import { isSpaceAwarenessEnabled } from '../../services/spaces/helpers'; @@ -34,26 +34,22 @@ export const getEnrollmentApiKeysHandler: RequestHandler< const esClient = (await context.core).elasticsearch.client.asInternalUser; const soClient = (await context.core).savedObjects.client; - try { - const useSpaceAwareness = await isSpaceAwarenessEnabled(); - const { items, total, page, perPage } = await APIKeyService.listEnrollmentApiKeys(esClient, { - page: request.query.page, - perPage: request.query.perPage, - kuery: request.query.kuery, - spaceId: useSpaceAwareness ? getCurrentNamespace(soClient) : undefined, - }); - const body: GetEnrollmentAPIKeysResponse = { - list: items, // deprecated - items, - total, - page, - perPage, - }; - - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const useSpaceAwareness = await isSpaceAwarenessEnabled(); + const { items, total, page, perPage } = await APIKeyService.listEnrollmentApiKeys(esClient, { + page: request.query.page, + perPage: request.query.perPage, + kuery: request.query.kuery, + spaceId: useSpaceAwareness ? getCurrentNamespace(soClient) : undefined, + }); + const body: GetEnrollmentAPIKeysResponse = { + list: items, // deprecated + items, + total, + page, + perPage, + }; + + return response.ok({ body }); }; export const postEnrollmentApiKeyHandler: RequestHandler< undefined, @@ -63,28 +59,24 @@ export const postEnrollmentApiKeyHandler: RequestHandler< const { elasticsearch, savedObjects } = await context.core; const soClient = savedObjects.client; const esClient = elasticsearch.client.asInternalUser; - try { - // validate policy exists in the current space - await agentPolicyService.get(soClient, request.body.policy_id).catch((err) => { - if (SavedObjectsErrorHelpers.isNotFoundError(err)) { - throw new AgentPolicyNotFoundError(`Agent policy "${request.body.policy_id}" not found`); - } + // validate policy exists in the current space + await agentPolicyService.get(soClient, request.body.policy_id).catch((err) => { + if (SavedObjectsErrorHelpers.isNotFoundError(err)) { + throw new AgentPolicyNotFoundError(`Agent policy "${request.body.policy_id}" not found`); + } - throw err; - }); + throw err; + }); - const apiKey = await APIKeyService.generateEnrollmentAPIKey(soClient, esClient, { - name: request.body.name, - expiration: request.body.expiration, - agentPolicyId: request.body.policy_id, - }); + const apiKey = await APIKeyService.generateEnrollmentAPIKey(soClient, esClient, { + name: request.body.name, + expiration: request.body.expiration, + agentPolicyId: request.body.policy_id, + }); - const body: PostEnrollmentAPIKeyResponse = { item: apiKey, action: 'created' }; + const body: PostEnrollmentAPIKeyResponse = { item: apiKey, action: 'created' }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const deleteEnrollmentApiKeyHandler: RequestHandler< @@ -111,7 +103,7 @@ export const deleteEnrollmentApiKeyHandler: RequestHandler< body: { message: `EnrollmentAPIKey ${request.params.keyId} not found` }, }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -141,6 +133,6 @@ export const getOneEnrollmentApiKeyHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; diff --git a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts index 994f52a71c224..701915d384f47 100644 --- a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts +++ b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts @@ -13,7 +13,6 @@ import type { ResponseHeaders, KnownHeaders, HttpResponseOptions } from '@kbn/co import type { GetFileRequestSchema, FleetRequestHandler } from '../../types'; import { getFile, getInstallation } from '../../services/epm/packages'; -import { defaultFleetErrorHandler } from '../../errors'; import { getAsset } from '../../services/epm/archive/storage'; import { getBundledPackageByPkgKey } from '../../services/epm/packages/bundled_packages'; import { pkgToPkgKey } from '../../services/epm/registry'; @@ -25,104 +24,100 @@ const CACHE_CONTROL_10_MINUTES_HEADER: HttpResponseOptions['headers'] = { export const getFileHandler: FleetRequestHandler< TypeOf > = async (context, request, response) => { - try { - const { pkgName, pkgVersion, filePath } = request.params; - const savedObjectsClient = (await context.fleet).internalSoClient; - - const installation = await getInstallation({ savedObjectsClient, pkgName }); - const isPackageInstalled = pkgVersion === installation?.version; - const assetPath = `${pkgName}-${pkgVersion}/${filePath}`; - - if (isPackageInstalled) { - const storedAsset = await getAsset({ savedObjectsClient, path: assetPath }); - - if (!storedAsset) { - return response.custom({ - body: `installed package file not found: ${filePath}`, - statusCode: 404, - }); - } + const { pkgName, pkgVersion, filePath } = request.params; + const savedObjectsClient = (await context.fleet).internalSoClient; - const contentType = storedAsset.media_type; - const buffer = storedAsset.data_utf8 - ? Buffer.from(storedAsset.data_utf8, 'utf8') - : Buffer.from(storedAsset.data_base64, 'base64'); + const installation = await getInstallation({ savedObjectsClient, pkgName }); + const isPackageInstalled = pkgVersion === installation?.version; + const assetPath = `${pkgName}-${pkgVersion}/${filePath}`; - if (!contentType) { - return response.custom({ - body: `unknown content type for file: ${filePath}`, - statusCode: 400, - }); - } + if (isPackageInstalled) { + const storedAsset = await getAsset({ savedObjectsClient, path: assetPath }); + + if (!storedAsset) { + return response.custom({ + body: `installed package file not found: ${filePath}`, + statusCode: 404, + }); + } + const contentType = storedAsset.media_type; + const buffer = storedAsset.data_utf8 + ? Buffer.from(storedAsset.data_utf8, 'utf8') + : Buffer.from(storedAsset.data_base64, 'base64'); + + if (!contentType) { return response.custom({ - body: buffer, - statusCode: 200, - headers: { - ...CACHE_CONTROL_10_MINUTES_HEADER, - 'content-type': contentType, - }, + body: `unknown content type for file: ${filePath}`, + statusCode: 400, }); } - const bundledPackage = await getBundledPackageByPkgKey( - pkgToPkgKey({ name: pkgName, version: pkgVersion }) + return response.custom({ + body: buffer, + statusCode: 200, + headers: { + ...CACHE_CONTROL_10_MINUTES_HEADER, + 'content-type': contentType, + }, + }); + } + + const bundledPackage = await getBundledPackageByPkgKey( + pkgToPkgKey({ name: pkgName, version: pkgVersion }) + ); + if (bundledPackage) { + const bufferEntries = await unpackArchiveEntriesIntoMemory( + await bundledPackage.getBuffer(), + 'application/zip' ); - if (bundledPackage) { - const bufferEntries = await unpackArchiveEntriesIntoMemory( - await bundledPackage.getBuffer(), - 'application/zip' - ); - - const fileBuffer = bufferEntries.find((entry) => entry.path === assetPath)?.buffer; - - if (!fileBuffer) { - return response.custom({ - body: `bundled package file not found: ${filePath}`, - statusCode: 404, - }); - } - // if storedAsset is not available, fileBuffer *must* be - // b/c we error if we don't have at least one, and storedAsset is the least likely - const { buffer, contentType } = { - contentType: mime.contentType(path.extname(assetPath)), - buffer: fileBuffer, - }; - - if (!contentType) { - return response.custom({ - body: `unknown content type for file: ${filePath}`, - statusCode: 400, - }); - } + const fileBuffer = bufferEntries.find((entry) => entry.path === assetPath)?.buffer; + if (!fileBuffer) { return response.custom({ - body: buffer, - statusCode: 200, - headers: { - ...CACHE_CONTROL_10_MINUTES_HEADER, - 'content-type': contentType, - }, + body: `bundled package file not found: ${filePath}`, + statusCode: 404, }); - } else { - const registryResponse = await getFile(pkgName, pkgVersion, filePath); - const headersToProxy: KnownHeaders[] = ['content-type']; - const proxiedHeaders = headersToProxy.reduce((headers, knownHeader) => { - const value = registryResponse.headers.get(knownHeader); - if (value !== null) { - headers[knownHeader] = value; - } - return headers; - }, {} as ResponseHeaders); + } + // if storedAsset is not available, fileBuffer *must* be + // b/c we error if we don't have at least one, and storedAsset is the least likely + const { buffer, contentType } = { + contentType: mime.contentType(path.extname(assetPath)), + buffer: fileBuffer, + }; + + if (!contentType) { return response.custom({ - body: registryResponse.body, - statusCode: registryResponse.status, - headers: { ...CACHE_CONTROL_10_MINUTES_HEADER, ...proxiedHeaders }, + body: `unknown content type for file: ${filePath}`, + statusCode: 400, }); } - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + + return response.custom({ + body: buffer, + statusCode: 200, + headers: { + ...CACHE_CONTROL_10_MINUTES_HEADER, + 'content-type': contentType, + }, + }); + } else { + const registryResponse = await getFile(pkgName, pkgVersion, filePath); + const headersToProxy: KnownHeaders[] = ['content-type']; + const proxiedHeaders = headersToProxy.reduce((headers, knownHeader) => { + const value = registryResponse.headers.get(knownHeader); + if (value !== null) { + headers[knownHeader] = value; + } + return headers; + }, {} as ResponseHeaders); + + return response.custom({ + body: registryResponse.body, + statusCode: registryResponse.status, + headers: { ...CACHE_CONTROL_10_MINUTES_HEADER, ...proxiedHeaders }, + }); } }; diff --git a/x-pack/plugins/fleet/server/routes/epm/handlers.ts b/x-pack/plugins/fleet/server/routes/epm/handlers.ts index 1fcd0e26a6ef0..2b4fa98e38f6b 100644 --- a/x-pack/plugins/fleet/server/routes/epm/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/epm/handlers.ts @@ -67,12 +67,7 @@ import { getTemplateInputs, } from '../../services/epm/packages'; import type { BulkInstallResponse } from '../../services/epm/packages'; -import { - defaultFleetErrorHandler, - fleetErrorToResponseOptions, - FleetError, - FleetTooManyRequestsError, -} from '../../errors'; +import { fleetErrorToResponseOptions, FleetError, FleetTooManyRequestsError } from '../../errors'; import { appContextService, checkAllowedPackages, packagePolicyService } from '../../services'; import { getPackageUsageStats } from '../../services/epm/packages/get'; import { updatePackage } from '../../services/epm/packages/update'; @@ -97,91 +92,75 @@ export const getCategoriesHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const items = await getCategories({ - ...request.query, - }); - const body: GetCategoriesResponse = { - items, - }; - return response.ok({ body, headers: { ...CACHE_CONTROL_10_MINUTES_HEADER } }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const items = await getCategories({ + ...request.query, + }); + const body: GetCategoriesResponse = { + items, + }; + return response.ok({ body, headers: { ...CACHE_CONTROL_10_MINUTES_HEADER } }); }; export const getListHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const savedObjectsClient = (await context.fleet).internalSoClient; - const res = await getPackages({ - savedObjectsClient, - ...request.query, - }); - const flattenedRes = res.map((pkg) => soToInstallationInfo(pkg)) as PackageList; - const body: GetPackagesResponse = { - items: flattenedRes, - }; - return response.ok({ - body, - // Only cache responses where the installation status is excluded, otherwise the request - // needs up-to-date information on whether the package is installed so we can't cache it - headers: request.query.excludeInstallStatus ? { ...CACHE_CONTROL_10_MINUTES_HEADER } : {}, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const savedObjectsClient = (await context.fleet).internalSoClient; + const res = await getPackages({ + savedObjectsClient, + ...request.query, + }); + const flattenedRes = res.map((pkg) => soToInstallationInfo(pkg)) as PackageList; + const body: GetPackagesResponse = { + items: flattenedRes, + }; + return response.ok({ + body, + // Only cache responses where the installation status is excluded, otherwise the request + // needs up-to-date information on whether the package is installed so we can't cache it + headers: request.query.excludeInstallStatus ? { ...CACHE_CONTROL_10_MINUTES_HEADER } : {}, + }); }; export const getInstalledListHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const [fleetContext, coreContext] = await Promise.all([context.fleet, context.core]); - const savedObjectsClient = fleetContext.internalSoClient; - const esClient = coreContext.elasticsearch.client.asCurrentUser; - const res = await getInstalledPackages({ - savedObjectsClient, - esClient, - ...request.query, - }); + const [fleetContext, coreContext] = await Promise.all([context.fleet, context.core]); + const savedObjectsClient = fleetContext.internalSoClient; + const esClient = coreContext.elasticsearch.client.asCurrentUser; + const res = await getInstalledPackages({ + savedObjectsClient, + esClient, + ...request.query, + }); - const body: GetInstalledPackagesResponse = { ...res }; + const body: GetInstalledPackagesResponse = { ...res }; - return response.ok({ - body, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ + body, + }); }; export const getDataStreamsHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const coreContext = await context.core; - // Query datastreams as the current user as the Kibana internal user may not have all the required permissions - const esClient = coreContext.elasticsearch.client.asCurrentUser; - const res = await getDataStreams({ - esClient, - ...request.query, - }); + const coreContext = await context.core; + // Query datastreams as the current user as the Kibana internal user may not have all the required permissions + const esClient = coreContext.elasticsearch.client.asCurrentUser; + const res = await getDataStreams({ + esClient, + ...request.query, + }); - const body: GetEpmDataStreamsResponse = { - ...res, - }; + const body: GetEpmDataStreamsResponse = { + ...res, + }; - return response.ok({ - body, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ + body, + }); }; export const getLimitedListHandler: FleetRequestHandler< @@ -189,69 +168,61 @@ export const getLimitedListHandler: FleetRequestHandler< TypeOf, undefined > = async (context, request, response) => { - try { - const savedObjectsClient = (await context.fleet).internalSoClient; - const res = await getLimitedPackages({ - savedObjectsClient, - prerelease: request.query.prerelease, - }); - const body: GetLimitedPackagesResponse = { - items: res, - }; - return response.ok({ - body, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const savedObjectsClient = (await context.fleet).internalSoClient; + const res = await getLimitedPackages({ + savedObjectsClient, + prerelease: request.query.prerelease, + }); + const body: GetLimitedPackagesResponse = { + items: res, + }; + return response.ok({ + body, + }); }; export const getInfoHandler: FleetRequestHandler< TypeOf, TypeOf > = async (context, request, response) => { - try { - const savedObjectsClient = (await context.fleet).internalSoClient; - const { limitedToPackages } = await context.fleet; - const { pkgName, pkgVersion } = request.params; + const savedObjectsClient = (await context.fleet).internalSoClient; + const { limitedToPackages } = await context.fleet; + const { pkgName, pkgVersion } = request.params; - checkAllowedPackages([pkgName], limitedToPackages); + checkAllowedPackages([pkgName], limitedToPackages); - const { ignoreUnverified = false, full = false, prerelease } = request.query; - if (pkgVersion && !semverValid(pkgVersion)) { - throw new FleetError('Package version is not a valid semver'); - } - const res = await getPackageInfo({ - savedObjectsClient, - pkgName, - pkgVersion: pkgVersion || '', - skipArchive: !full, - ignoreUnverified, - prerelease, + const { ignoreUnverified = false, full = false, prerelease } = request.query; + if (pkgVersion && !semverValid(pkgVersion)) { + throw new FleetError('Package version is not a valid semver'); + } + const res = await getPackageInfo({ + savedObjectsClient, + pkgName, + pkgVersion: pkgVersion || '', + skipArchive: !full, + ignoreUnverified, + prerelease, + }); + const flattenedRes = soToInstallationInfo(res) as PackageInfo; + let metadata: any; + if (request.query.withMetadata) { + const allSpaceSoClient = appContextService.getInternalUserSOClientWithoutSpaceExtension(); + const { total } = await packagePolicyService.list(allSpaceSoClient, { + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${pkgName}`, + page: 1, + perPage: 0, + spaceId: '*', }); - const flattenedRes = soToInstallationInfo(res) as PackageInfo; - let metadata: any; - if (request.query.withMetadata) { - const allSpaceSoClient = appContextService.getInternalUserSOClientWithoutSpaceExtension(); - const { total } = await packagePolicyService.list(allSpaceSoClient, { - kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${pkgName}`, - page: 1, - perPage: 0, - spaceId: '*', - }); - metadata = { - has_policies: total > 0, - }; - } - - const body: GetInfoResponse = { - item: flattenedRes, - metadata, + metadata = { + has_policies: total > 0, }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); } + + const body: GetInfoResponse = { + item: flattenedRes, + metadata, + }; + return response.ok({ body }); }; export const getBulkAssetsHandler: FleetRequestHandler< @@ -260,23 +231,19 @@ export const getBulkAssetsHandler: FleetRequestHandler< TypeOf > = async (context, request, response) => { const coreContext = await context.core; - try { - const { assetIds } = request.body; - const savedObjectsClient = coreContext.savedObjects.client; - const savedObjectsTypeRegistry = coreContext.savedObjects.typeRegistry; - const assets = await getBulkAssets( - savedObjectsClient, - savedObjectsTypeRegistry, - assetIds as AssetSOObject[] - ); + const { assetIds } = request.body; + const savedObjectsClient = coreContext.savedObjects.client; + const savedObjectsTypeRegistry = coreContext.savedObjects.typeRegistry; + const assets = await getBulkAssets( + savedObjectsClient, + savedObjectsTypeRegistry, + assetIds as AssetSOObject[] + ); - const body: GetBulkAssetsResponse = { - items: assets, - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const body: GetBulkAssetsResponse = { + items: assets, + }; + return response.ok({ body }); }; export const updatePackageHandler: FleetRequestHandler< @@ -284,34 +251,26 @@ export const updatePackageHandler: FleetRequestHandler< unknown, TypeOf > = async (context, request, response) => { - try { - const savedObjectsClient = (await context.fleet).internalSoClient; - const { pkgName } = request.params; + const savedObjectsClient = (await context.fleet).internalSoClient; + const { pkgName } = request.params; - const res = await updatePackage({ savedObjectsClient, pkgName, ...request.body }); - const body: UpdatePackageResponse = { - item: res, - }; + const res = await updatePackage({ savedObjectsClient, pkgName, ...request.body }); + const body: UpdatePackageResponse = { + item: res, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const getStatsHandler: FleetRequestHandler< TypeOf > = async (context, request, response) => { - try { - const { pkgName } = request.params; - const savedObjectsClient = (await context.fleet).internalSoClient; - const body: GetStatsResponse = { - response: await getPackageUsageStats({ savedObjectsClient, pkgName }), - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const { pkgName } = request.params; + const savedObjectsClient = (await context.fleet).internalSoClient; + const body: GetStatsResponse = { + response: await getPackageUsageStats({ savedObjectsClient, pkgName }), + }; + return response.ok({ body }); }; export const installPackageFromRegistryHandler: FleetRequestHandler< @@ -354,7 +313,7 @@ export const installPackageFromRegistryHandler: FleetRequestHandler< }; return response.ok({ body }); } else { - return await defaultFleetErrorHandler({ error: res.error, response }); + throw res.error; } }; @@ -395,7 +354,7 @@ export const createCustomIntegrationHandler: FleetRequestHandler< }; return response.ok({ body }); } else { - return await defaultFleetErrorHandler({ error: res.error, response }); + throw res.error; } } catch (error) { if (error instanceof NamingCollisionError) { @@ -413,7 +372,7 @@ export const createCustomIntegrationHandler: FleetRequestHandler< }, }); } - return await defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -508,7 +467,7 @@ export const installPackageByUploadHandler: FleetRequestHandler< }, }); } - return defaultFleetErrorHandler({ error: res.error, response }); + throw res.error; } }; @@ -516,26 +475,22 @@ export const deletePackageHandler: FleetRequestHandler< TypeOf, TypeOf > = async (context, request, response) => { - try { - const { pkgName, pkgVersion } = request.params; - const coreContext = await context.core; - const fleetContext = await context.fleet; - const savedObjectsClient = fleetContext.internalSoClient; - const esClient = coreContext.elasticsearch.client.asInternalUser; - const res = await removeInstallation({ - savedObjectsClient, - pkgName, - pkgVersion, - esClient, - force: request.query?.force, - }); - const body: DeletePackageResponse = { - items: res, - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const { pkgName, pkgVersion } = request.params; + const coreContext = await context.core; + const fleetContext = await context.fleet; + const savedObjectsClient = fleetContext.internalSoClient; + const esClient = coreContext.elasticsearch.client.asInternalUser; + const res = await removeInstallation({ + savedObjectsClient, + pkgName, + pkgVersion, + esClient, + force: request.query?.force, + }); + const body: DeletePackageResponse = { + items: res, + }; + return response.ok({ body }); }; export const getVerificationKeyIdHandler: FleetRequestHandler = async ( @@ -543,15 +498,11 @@ export const getVerificationKeyIdHandler: FleetRequestHandler = async ( request, response ) => { - try { - const packageVerificationKeyId = await getGpgKeyIdOrUndefined(); - const body: GetVerificationKeyIdResponse = { - id: packageVerificationKeyId || null, - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const packageVerificationKeyId = await getGpgKeyIdOrUndefined(); + const body: GetVerificationKeyIdResponse = { + id: packageVerificationKeyId || null, + }; + return response.ok({ body }); }; /** @@ -583,33 +534,29 @@ export const reauthorizeTransformsHandler: FleetRequestHandler< // User might not have permission to get username, or security is not enabled, and that's okay. } - try { - const logger = appContextService.getLogger(); - const authorizationHeader = HTTPAuthorizationHeader.parseFromRequest(request, username); - const secondaryAuth = await generateTransformSecondaryAuthHeaders({ - authorizationHeader, + const logger = appContextService.getLogger(); + const authorizationHeader = HTTPAuthorizationHeader.parseFromRequest(request, username); + const secondaryAuth = await generateTransformSecondaryAuthHeaders({ + authorizationHeader, + logger, + username, + pkgName, + pkgVersion, + }); + + const resp: Array<{ transformId: string; success: boolean; error: null | any }> = + await handleTransformReauthorizeAndStart({ + esClient, + savedObjectsClient, logger, - username, pkgName, pkgVersion, + transforms, + secondaryAuth, + username, }); - const resp: Array<{ transformId: string; success: boolean; error: null | any }> = - await handleTransformReauthorizeAndStart({ - esClient, - savedObjectsClient, - logger, - pkgName, - pkgVersion, - transforms, - secondaryAuth, - username, - }); - - return response.ok({ body: resp }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: resp }); }; export const getInputsHandler: FleetRequestHandler< @@ -619,33 +566,29 @@ export const getInputsHandler: FleetRequestHandler< > = async (context, request, response) => { const soClient = (await context.fleet).internalSoClient; - try { - const { pkgName, pkgVersion } = request.params; - const { format, prerelease, ignoreUnverified } = request.query; - let body; - if (format === 'json') { - body = await getTemplateInputs( - soClient, - pkgName, - pkgVersion, - 'json', - prerelease, - ignoreUnverified - ); - } else if (format === 'yml' || format === 'yaml') { - body = await getTemplateInputs( - soClient, - pkgName, - pkgVersion, - 'yml', - prerelease, - ignoreUnverified - ); - } - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + const { pkgName, pkgVersion } = request.params; + const { format, prerelease, ignoreUnverified } = request.query; + let body; + if (format === 'json') { + body = await getTemplateInputs( + soClient, + pkgName, + pkgVersion, + 'json', + prerelease, + ignoreUnverified + ); + } else if (format === 'yml' || format === 'yaml') { + body = await getTemplateInputs( + soClient, + pkgName, + pkgVersion, + 'yml', + prerelease, + ignoreUnverified + ); } + return response.ok({ body }); }; // Don't expose the whole SO in the API response, only selected fields diff --git a/x-pack/plugins/fleet/server/routes/epm/kibana_assets_handler.ts b/x-pack/plugins/fleet/server/routes/epm/kibana_assets_handler.ts index ad0bec6397ee8..57880d5f08397 100644 --- a/x-pack/plugins/fleet/server/routes/epm/kibana_assets_handler.ts +++ b/x-pack/plugins/fleet/server/routes/epm/kibana_assets_handler.ts @@ -7,7 +7,7 @@ import type { TypeOf } from '@kbn/config-schema'; -import { defaultFleetErrorHandler, FleetNotFoundError } from '../../errors'; +import { FleetNotFoundError } from '../../errors'; import { appContextService } from '../../services'; import { deleteKibanaAssetsAndReferencesForSpace, @@ -29,87 +29,79 @@ export const installPackageKibanaAssetsHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const fleetContext = await context.fleet; - const savedObjectsClient = fleetContext.internalSoClient; - const logger = appContextService.getLogger(); - const spaceId = fleetContext.spaceId; - const { pkgName, pkgVersion } = request.params; + const fleetContext = await context.fleet; + const savedObjectsClient = fleetContext.internalSoClient; + const logger = appContextService.getLogger(); + const spaceId = fleetContext.spaceId; + const { pkgName, pkgVersion } = request.params; - const installedPkgWithAssets = await getInstalledPackageWithAssets({ - savedObjectsClient, - pkgName, - logger, - }); + const installedPkgWithAssets = await getInstalledPackageWithAssets({ + savedObjectsClient, + pkgName, + logger, + }); - const installation = await getInstallationObject({ - pkgName, - savedObjectsClient, - }); + const installation = await getInstallationObject({ + pkgName, + savedObjectsClient, + }); - if ( - !installation || - !installedPkgWithAssets || - installedPkgWithAssets?.installation.version !== pkgVersion - ) { - throw new FleetNotFoundError('Requested version is not installed'); - } + if ( + !installation || + !installedPkgWithAssets || + installedPkgWithAssets?.installation.version !== pkgVersion + ) { + throw new FleetNotFoundError('Requested version is not installed'); + } - const { packageInfo } = installedPkgWithAssets; + const { packageInfo } = installedPkgWithAssets; - await installKibanaAssetsAndReferences({ - savedObjectsClient, - logger, - pkgName, - pkgTitle: packageInfo.title, - installAsAdditionalSpace: true, - spaceId, - assetTags: installedPkgWithAssets.packageInfo?.asset_tags, - installedPkg: installation, - packageInstallContext: { - packageInfo, - paths: installedPkgWithAssets.paths, - assetsMap: installedPkgWithAssets.assetsMap, - archiveIterator: createArchiveIteratorFromMap(installedPkgWithAssets.assetsMap), - }, - }); + await installKibanaAssetsAndReferences({ + savedObjectsClient, + logger, + pkgName, + pkgTitle: packageInfo.title, + installAsAdditionalSpace: true, + spaceId, + assetTags: installedPkgWithAssets.packageInfo?.asset_tags, + installedPkg: installation, + packageInstallContext: { + packageInfo, + paths: installedPkgWithAssets.paths, + assetsMap: installedPkgWithAssets.assetsMap, + archiveIterator: createArchiveIteratorFromMap(installedPkgWithAssets.assetsMap), + }, + }); - return response.ok({ body: { success: true } }); - } catch (error) { - return await defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: { success: true } }); }; export const deletePackageKibanaAssetsHandler: FleetRequestHandler< TypeOf, undefined > = async (context, request, response) => { - try { - const fleetContext = await context.fleet; - const savedObjectsClient = fleetContext.internalSoClient; - const logger = appContextService.getLogger(); - const spaceId = fleetContext.spaceId; - const { pkgName, pkgVersion } = request.params; + const fleetContext = await context.fleet; + const savedObjectsClient = fleetContext.internalSoClient; + const logger = appContextService.getLogger(); + const spaceId = fleetContext.spaceId; + const { pkgName, pkgVersion } = request.params; - const installation = await getInstallationObject({ - pkgName, - savedObjectsClient, - }); + const installation = await getInstallationObject({ + pkgName, + savedObjectsClient, + }); - if (!installation || installation.attributes.version !== pkgVersion) { - throw new FleetNotFoundError('Version is not installed'); - } + if (!installation || installation.attributes.version !== pkgVersion) { + throw new FleetNotFoundError('Version is not installed'); + } - await deleteKibanaAssetsAndReferencesForSpace({ - savedObjectsClient, - logger, - pkgName, - spaceId, - installedPkg: installation, - }); + await deleteKibanaAssetsAndReferencesForSpace({ + savedObjectsClient, + logger, + pkgName, + spaceId, + installedPkg: installation, + }); - return response.ok({ body: { success: true } }); - } catch (error) { - return await defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body: { success: true } }); }; diff --git a/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts b/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts index 52e469971177d..2d63b357347db 100644 --- a/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts +++ b/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts @@ -22,7 +22,6 @@ import { updateFleetProxy, getFleetProxyRelatedSavedObjects, } from '../../services/fleet_proxies'; -import { defaultFleetErrorHandler } from '../../errors'; import type { GetOneFleetProxyRequestSchema, PostFleetProxyRequestSchema, @@ -80,18 +79,14 @@ export const postFleetProxyHandler: RequestHandler< > = async (context, request, response) => { const coreContext = await context.core; const soClient = coreContext.savedObjects.client; - try { - const { id, ...data } = request.body; - const proxy = await createFleetProxy(soClient, { ...data, is_preconfigured: false }, { id }); + const { id, ...data } = request.body; + const proxy = await createFleetProxy(soClient, { ...data, is_preconfigured: false }, { id }); - const body = { - item: proxy, - }; + const body = { + item: proxy, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const putFleetProxyHandler: RequestHandler< @@ -125,26 +120,22 @@ export const putFleetProxyHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; export const getAllFleetProxyHandler: RequestHandler = async (context, request, response) => { const soClient = (await context.core).savedObjects.client; - try { - const res = await listFleetProxies(soClient); - const body = { - items: res.items, - page: res.page, - perPage: res.perPage, - total: res.total, - }; + const res = await listFleetProxies(soClient); + const body = { + items: res.items, + page: res.page, + perPage: res.perPage, + total: res.total, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const deleteFleetProxyHandler: RequestHandler< @@ -177,7 +168,7 @@ export const deleteFleetProxyHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -199,6 +190,6 @@ export const getFleetProxyHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; diff --git a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.test.ts b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.test.ts index bfcb91351af11..4ddcd47ad9ab4 100644 --- a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.test.ts +++ b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.test.ts @@ -8,9 +8,14 @@ import { SERVERLESS_DEFAULT_FLEET_SERVER_HOST_ID } from '../../constants'; import { agentPolicyService, appContextService } from '../../services'; import * as fleetServerService from '../../services/fleet_server_host'; +import { withDefaultErrorHandler } from '../../services/security/fleet_router'; import { postFleetServerHost, putFleetServerHostHandler } from './handler'; +const postFleetServerHostWithErrorHandler = withDefaultErrorHandler(postFleetServerHost); +const putFleetServerHostHandlerWithErrorHandler = + withDefaultErrorHandler(putFleetServerHostHandler); + describe('fleet server hosts handler', () => { const mockContext = { core: Promise.resolve({ @@ -45,7 +50,7 @@ describe('fleet server hosts handler', () => { it('should return error on post in serverless if host url is different from default', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await postFleetServerHost( + const res = await postFleetServerHostWithErrorHandler( mockContext, { body: { id: 'host1', host_urls: ['http://localhost:8080'] } } as any, mockResponse as any @@ -62,7 +67,7 @@ describe('fleet server hosts handler', () => { it('should return ok on post in serverless if host url is same as default', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await postFleetServerHost( + const res = await postFleetServerHostWithErrorHandler( mockContext, { body: { id: 'host1', host_urls: ['http://elasticsearch:9200'] } } as any, mockResponse as any @@ -76,7 +81,7 @@ describe('fleet server hosts handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await postFleetServerHost( + const res = await postFleetServerHostWithErrorHandler( mockContext, { body: { id: 'host1', host_urls: ['http://localhost:8080'] } } as any, mockResponse as any @@ -88,7 +93,7 @@ describe('fleet server hosts handler', () => { it('should return error on put in serverless if host url is different from default', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await putFleetServerHostHandler( + const res = await putFleetServerHostHandlerWithErrorHandler( mockContext, { body: { host_urls: ['http://localhost:8080'] }, params: { outputId: 'host1' } } as any, mockResponse as any @@ -105,7 +110,7 @@ describe('fleet server hosts handler', () => { it('should return ok on put in serverless if host url is same as default', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await putFleetServerHostHandler( + const res = await putFleetServerHostHandlerWithErrorHandler( mockContext, { body: { host_urls: ['http://elasticsearch:9200'] }, params: { outputId: 'host1' } } as any, mockResponse as any @@ -117,7 +122,7 @@ describe('fleet server hosts handler', () => { it('should return ok on put in serverless if host urls are not passed', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await putFleetServerHostHandler( + const res = await putFleetServerHostHandlerWithErrorHandler( mockContext, { body: { name: ['Renamed'] }, params: { outputId: 'host1' } } as any, mockResponse as any @@ -131,7 +136,7 @@ describe('fleet server hosts handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await putFleetServerHostHandler( + const res = await putFleetServerHostHandlerWithErrorHandler( mockContext, { body: { host_urls: ['http://localhost:8080'] }, params: { outputId: 'host1' } } as any, mockResponse as any diff --git a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts index 8ad69d585ffc7..52d370e3062b6 100644 --- a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts +++ b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts @@ -12,7 +12,7 @@ import { isEqual } from 'lodash'; import { SERVERLESS_DEFAULT_FLEET_SERVER_HOST_ID } from '../../constants'; -import { defaultFleetErrorHandler, FleetServerHostUnauthorizedError } from '../../errors'; +import { FleetServerHostUnauthorizedError } from '../../errors'; import { agentPolicyService, appContextService } from '../../services'; import { @@ -58,28 +58,24 @@ export const postFleetServerHost: RequestHandler< const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - // In serverless, allow create fleet server host if host url is same as default. - await checkFleetServerHostsWriteAPIsAllowed(soClient, request.body.host_urls); - - const { id, ...data } = request.body; - const FleetServerHost = await createFleetServerHost( - soClient, - { ...data, is_preconfigured: false }, - { id } - ); - if (FleetServerHost.is_default) { - await agentPolicyService.bumpAllAgentPolicies(esClient); - } - - const body = { - item: FleetServerHost, - }; + // In serverless, allow create fleet server host if host url is same as default. + await checkFleetServerHostsWriteAPIsAllowed(soClient, request.body.host_urls); - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + const { id, ...data } = request.body; + const FleetServerHost = await createFleetServerHost( + soClient, + { ...data, is_preconfigured: false }, + { id } + ); + if (FleetServerHost.is_default) { + await agentPolicyService.bumpAllAgentPolicies(esClient); } + + const body = { + item: FleetServerHost, + }; + + return response.ok({ body }); }; export const getFleetServerHostHandler: RequestHandler< @@ -100,7 +96,7 @@ export const getFleetServerHostHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -125,7 +121,7 @@ export const deleteFleetServerHostHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -163,23 +159,19 @@ export const putFleetServerHostHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; export const getAllFleetServerHostsHandler: RequestHandler = async (context, request, response) => { const soClient = (await context.core).savedObjects.client; - try { - const res = await listFleetServerHosts(soClient); - const body = { - items: res.items, - page: res.page, - perPage: res.perPage, - total: res.total, - }; - - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const res = await listFleetServerHosts(soClient); + const body = { + items: res.items, + page: res.page, + perPage: res.perPage, + total: res.total, + }; + + return response.ok({ body }); }; diff --git a/x-pack/plugins/fleet/server/routes/health_check/handler.ts b/x-pack/plugins/fleet/server/routes/health_check/handler.ts index 16114217bee2b..276edd9c6bb32 100644 --- a/x-pack/plugins/fleet/server/routes/health_check/handler.ts +++ b/x-pack/plugins/fleet/server/routes/health_check/handler.ts @@ -12,8 +12,6 @@ import { getFleetServerHost } from '../../services/fleet_server_host'; import type { FleetRequestHandler, PostHealthCheckRequestSchema } from '../../types'; -import { defaultFleetErrorHandler } from '../../errors'; - export const postHealthCheckHandler: FleetRequestHandler< undefined, undefined, @@ -72,6 +70,6 @@ export const postHealthCheckHandler: FleetRequestHandler< body: { status: `OFFLINE`, host_id: request.body.id }, }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; diff --git a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts index d9987f325338b..11b47a626f8d2 100644 --- a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts @@ -12,9 +12,12 @@ import type { KibanaRequest } from '@kbn/core/server'; import { createAppContextStartContractMock, xpackMocks } from '../../mocks'; import { appContextService } from '../../services'; import type { FleetRequestHandlerContext } from '../../types'; +import { withDefaultErrorHandler } from '../../services/security/fleet_router'; import { rotateKeyPairHandler } from './handlers'; +const rotateKeyPairHandlerWithErrorHandler = withDefaultErrorHandler(rotateKeyPairHandler); + describe('FleetMessageSigningServiceHandler', () => { let context: AwaitedProperties>; let response: ReturnType; @@ -51,7 +54,7 @@ describe('FleetMessageSigningServiceHandler', () => { messageSigningService: undefined, }); - await rotateKeyPairHandler( + await rotateKeyPairHandlerWithErrorHandler( coreMock.createCustomRequestHandlerContext(context), request, response @@ -65,7 +68,7 @@ describe('FleetMessageSigningServiceHandler', () => { }); it('POST /message_signing_service/rotate_key_pair?acknowledge=true succeeds with `acknowledge=true`', async () => { - await rotateKeyPairHandler( + await rotateKeyPairHandlerWithErrorHandler( coreMock.createCustomRequestHandlerContext(context), request, response @@ -89,7 +92,7 @@ describe('FleetMessageSigningServiceHandler', () => { Error(error) ); - await rotateKeyPairHandler( + await rotateKeyPairHandlerWithErrorHandler( coreMock.createCustomRequestHandlerContext(context), request, response diff --git a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts index 7e2acdb5171a8..8bc21e18fbd78 100644 --- a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts @@ -9,7 +9,6 @@ import type { TypeOf } from '@kbn/config-schema'; import type { FleetRequestHandler } from '../../types'; -import { defaultFleetErrorHandler } from '../../errors'; import { appContextService } from '../../services'; import type { RotateKeyPairSchema } from '../../types/rest_spec/message_signing_service'; @@ -41,6 +40,6 @@ export const rotateKeyPairHandler: FleetRequestHandler< }); } catch (error) { logger.error(error); - return defaultFleetErrorHandler({ error: new Error('Failed to rotate key pair!'), response }); + throw new Error('Failed to rotate key pair!'); } }; diff --git a/x-pack/plugins/fleet/server/routes/output/handler.test.ts b/x-pack/plugins/fleet/server/routes/output/handler.test.ts index 26dd6099e474f..665cb9059654e 100644 --- a/x-pack/plugins/fleet/server/routes/output/handler.test.ts +++ b/x-pack/plugins/fleet/server/routes/output/handler.test.ts @@ -7,9 +7,13 @@ import { SERVERLESS_DEFAULT_OUTPUT_ID } from '../../constants'; import { agentPolicyService, appContextService, outputService } from '../../services'; +import { withDefaultErrorHandler } from '../../services/security/fleet_router'; import { postOutputHandler, putOutputHandler } from './handler'; +const putOutputHandlerWithErrorHandler = withDefaultErrorHandler(putOutputHandler); +const postOutputHandlerWithErrorHandler = withDefaultErrorHandler(postOutputHandler); + describe('output handler', () => { const mockContext = { core: Promise.resolve({ @@ -41,7 +45,7 @@ describe('output handler', () => { it('should return error on post output using remote_elasticsearch in serverless', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await postOutputHandler( + const res = await postOutputHandlerWithErrorHandler( mockContext, { body: { id: 'output1', type: 'remote_elasticsearch' } } as any, mockResponse as any @@ -58,7 +62,7 @@ describe('output handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await postOutputHandler( + const res = await postOutputHandlerWithErrorHandler( mockContext, { body: { type: 'remote_elasticsearch' } } as any, mockResponse as any @@ -70,7 +74,7 @@ describe('output handler', () => { it('should return error on put output using remote_elasticsearch in serverless', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await putOutputHandler( + const res = await putOutputHandlerWithErrorHandler( mockContext, { body: { type: 'remote_elasticsearch' }, params: { outputId: 'output1' } } as any, mockResponse as any @@ -87,7 +91,7 @@ describe('output handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await putOutputHandler( + const res = await putOutputHandlerWithErrorHandler( mockContext, { body: { type: 'remote_elasticsearch' }, params: { outputId: 'output1' } } as any, mockResponse as any @@ -99,7 +103,7 @@ describe('output handler', () => { it('should return error on post elasticsearch output in serverless if host url is different from default', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await postOutputHandler( + const res = await postOutputHandlerWithErrorHandler( mockContext, { body: { id: 'output1', type: 'elasticsearch', hosts: ['http://localhost:8080'] } } as any, mockResponse as any @@ -117,7 +121,7 @@ describe('output handler', () => { it('should return ok on post elasticsearch output in serverless if host url is same as default', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await postOutputHandler( + const res = await postOutputHandlerWithErrorHandler( mockContext, { body: { id: 'output1', type: 'elasticsearch', hosts: ['http://elasticsearch:9200'] }, @@ -133,7 +137,7 @@ describe('output handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await postOutputHandler( + const res = await postOutputHandlerWithErrorHandler( mockContext, { body: { id: 'output1', type: 'elasticsearch', hosts: ['http://localhost:8080'] } } as any, mockResponse as any @@ -153,7 +157,7 @@ describe('output handler', () => { } }); - const res = await putOutputHandler( + const res = await putOutputHandlerWithErrorHandler( mockContext, { body: { hosts: ['http://localhost:8080'] }, @@ -174,7 +178,7 @@ describe('output handler', () => { it('should return ok on put elasticsearch output in serverless if host url is same as default', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await putOutputHandler( + const res = await putOutputHandlerWithErrorHandler( mockContext, { body: { hosts: ['http://elasticsearch:9200'] }, @@ -189,7 +193,7 @@ describe('output handler', () => { it('should return ok on put elasticsearch output in serverless if host url is not passed', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); - const res = await putOutputHandler( + const res = await putOutputHandlerWithErrorHandler( mockContext, { body: { name: 'Renamed output' }, @@ -206,7 +210,7 @@ describe('output handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await putOutputHandler( + const res = await putOutputHandlerWithErrorHandler( mockContext, { body: { hosts: ['http://localhost:8080'] }, @@ -223,7 +227,7 @@ describe('output handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await postOutputHandler( + const res = await postOutputHandlerWithErrorHandler( mockContext, { body: { @@ -246,7 +250,7 @@ describe('output handler', () => { .spyOn(appContextService, 'getCloud') .mockReturnValue({ isServerlessEnabled: false } as any); - const res = await postOutputHandler( + const res = await postOutputHandlerWithErrorHandler( mockContext, { body: { type: 'remote_elasticsearch', secrets: { service_token: 'token2' } } } as any, mockResponse as any diff --git a/x-pack/plugins/fleet/server/routes/output/handler.ts b/x-pack/plugins/fleet/server/routes/output/handler.ts index b35158637d151..0b33dd15e73fe 100644 --- a/x-pack/plugins/fleet/server/routes/output/handler.ts +++ b/x-pack/plugins/fleet/server/routes/output/handler.ts @@ -29,7 +29,7 @@ import type { PostLogstashApiKeyResponse, } from '../../../common/types'; import { outputService } from '../../services/output'; -import { defaultFleetErrorHandler, FleetUnauthorizedError } from '../../errors'; +import { FleetUnauthorizedError } from '../../errors'; import { agentPolicyService, appContextService } from '../../services'; import { generateLogstashApiKey, canCreateLogstashApiKey } from '../../services/api_keys'; @@ -55,20 +55,16 @@ function ensureNoDuplicateSecrets(output: Partial) { export const getOutputsHandler: RequestHandler = async (context, request, response) => { const soClient = (await context.core).savedObjects.client; - try { - const outputs = await outputService.list(soClient); + const outputs = await outputService.list(soClient); - const body: GetOutputsResponse = { - items: outputs.items, - page: outputs.page, - perPage: outputs.perPage, - total: outputs.total, - }; + const body: GetOutputsResponse = { + items: outputs.items, + page: outputs.page, + perPage: outputs.perPage, + total: outputs.total, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const getOneOuputHandler: RequestHandler< @@ -90,7 +86,7 @@ export const getOneOuputHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -126,7 +122,7 @@ export const putOutputHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -138,23 +134,19 @@ export const postOutputHandler: RequestHandler< const coreContext = await context.core; const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - const { id, ...newOutput } = request.body; - await validateOutputServerless(newOutput, soClient); - ensureNoDuplicateSecrets(newOutput); - const output = await outputService.create(soClient, esClient, newOutput, { id }); - if (output.is_default || output.is_default_monitoring) { - await agentPolicyService.bumpAllAgentPolicies(esClient); - } + const { id, ...newOutput } = request.body; + await validateOutputServerless(newOutput, soClient); + ensureNoDuplicateSecrets(newOutput); + const output = await outputService.create(soClient, esClient, newOutput, { id }); + if (output.is_default || output.is_default_monitoring) { + await agentPolicyService.bumpAllAgentPolicies(esClient); + } - const body: GetOneOutputResponse = { - item: output, - }; + const body: GetOneOutputResponse = { + item: output, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; async function validateOutputServerless( @@ -206,42 +198,31 @@ export const deleteOutputHandler: RequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; export const postLogstashApiKeyHandler: RequestHandler = async (context, request, response) => { const esClient = (await context.core).elasticsearch.client.asCurrentUser; - try { - const hasCreatePrivileges = await canCreateLogstashApiKey(esClient); - if (!hasCreatePrivileges) { - throw new FleetUnauthorizedError('Missing permissions to create logstash API key'); - } + const hasCreatePrivileges = await canCreateLogstashApiKey(esClient); + if (!hasCreatePrivileges) { + throw new FleetUnauthorizedError('Missing permissions to create logstash API key'); + } - const apiKey = await generateLogstashApiKey(esClient); + const apiKey = await generateLogstashApiKey(esClient); - const body: PostLogstashApiKeyResponse = { - // Logstash expect the key to be formatted like this id:key - api_key: `${apiKey.id}:${apiKey.api_key}`, - }; + const body: PostLogstashApiKeyResponse = { + // Logstash expect the key to be formatted like this id:key + api_key: `${apiKey.id}:${apiKey.api_key}`, + }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ body }); }; export const getLatestOutputHealth: RequestHandler< TypeOf > = async (context, request, response) => { const esClient = (await context.core).elasticsearch.client.asInternalUser; - try { - const outputHealth = await outputService.getLatestOutputHealth( - esClient, - request.params.outputId - ); - return response.ok({ body: outputHealth }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const outputHealth = await outputService.getLatestOutputHealth(esClient, request.params.outputId); + return response.ok({ body: outputHealth }); }; diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts index 05876c2bbdf26..5c19ee75ddade 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts @@ -407,13 +407,10 @@ describe('When calling package policy', () => { .spyOn(appContextService, 'getExperimentalFeatures') .mockReturnValue({ enableReusableIntegrationPolicies: true } as any); const request = getUpdateKibanaRequest({ policy_ids: ['1', '2'] } as any); - await routeHandler(context, request, response); - expect(response.customError).toHaveBeenCalledWith({ - statusCode: 400, - body: { - message: 'Cannot change agent policies of an agentless integration', - }, - }); + + await expect(() => routeHandler(context, request, response)).rejects.toThrow( + /Cannot change agent policies of an agentless integration/ + ); }); it('should rename the agentless agent policy to sync with the package policy name if agentless is enabled', async () => { diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts index 3bc2f79d6afd7..6fe1e897a9772 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts @@ -43,11 +43,7 @@ import type { UpgradePackagePolicyResponse, } from '../../../common/types'; import { installationStatuses, inputsFormat } from '../../../common/constants'; -import { - defaultFleetErrorHandler, - PackagePolicyNotFoundError, - PackagePolicyRequestError, -} from '../../errors'; +import { PackagePolicyNotFoundError, PackagePolicyRequestError } from '../../errors'; import { getInstallation, getInstallations, @@ -80,33 +76,26 @@ export const getPackagePoliciesHandler: FleetRequestHandler< const soClient = fleetContext.internalSoClient; const limitedToPackages = fleetContext.limitedToPackages; - try { - const { items, total, page, perPage } = await packagePolicyService.list( - soClient, - request.query - ); - - checkAllowedPackages(items, limitedToPackages, 'package.name'); + const { items, total, page, perPage } = await packagePolicyService.list(soClient, request.query); - if (request.query.withAgentCount) { - await populatePackagePolicyAssignedAgentsCount(esClient, items); - } + checkAllowedPackages(items, limitedToPackages, 'package.name'); - // agnostic to package-level RBAC - return response.ok({ - body: { - items: - request.query.format === inputsFormat.Simplified - ? items.map((item) => packagePolicyToSimplifiedPackagePolicy(item)) - : items, - total, - page, - perPage, - }, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + if (request.query.withAgentCount) { + await populatePackagePolicyAssignedAgentsCount(esClient, items); } + + // agnostic to package-level RBAC + return response.ok({ + body: { + items: + request.query.format === inputsFormat.Simplified + ? items.map((item) => packagePolicyToSimplifiedPackagePolicy(item)) + : items, + total, + page, + perPage, + }, + }); }; export const bulkGetPackagePoliciesHandler: FleetRequestHandler< @@ -142,7 +131,7 @@ export const bulkGetPackagePoliciesHandler: FleetRequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -177,9 +166,8 @@ export const getOnePackagePolicyHandler: FleetRequestHandler< } catch (error) { if (SavedObjectsErrorHelpers.isNotFoundError(error)) { return notFoundResponse(); - } else { - return defaultFleetErrorHandler({ error, response }); } + throw error; } }; @@ -189,42 +177,39 @@ export const getOrphanedPackagePolicies: RequestHandler = response ) => { const soClient = (await context.core).savedObjects.client; - try { - const installedPackages = await getInstallations(soClient, { - perPage: SO_SEARCH_LIMIT, - filter: ` + + const installedPackages = await getInstallations(soClient, { + perPage: SO_SEARCH_LIMIT, + filter: ` ${PACKAGES_SAVED_OBJECT_TYPE}.attributes.install_status:${installationStatuses.Installed} `, + }); + const orphanedPackagePolicies: PackagePolicy[] = []; + const packagePolicies = await packagePolicyService.list(soClient, { + perPage: SO_SEARCH_LIMIT, + }); + const packagePoliciesByPackage = groupBy(packagePolicies.items, 'package.name'); + const agentPolicies = await agentPolicyService.list(soClient, { + perPage: SO_SEARCH_LIMIT, + }); + const agentPoliciesById = keyBy(agentPolicies.items, 'id'); + const usedPackages = installedPackages.saved_objects.filter( + ({ attributes: { name } }) => !!packagePoliciesByPackage[name] + ); + usedPackages.forEach(({ attributes: { name } }) => { + packagePoliciesByPackage[name].forEach((packagePolicy) => { + if (packagePolicy.policy_ids.every((policyId) => !agentPoliciesById[policyId])) { + orphanedPackagePolicies.push(packagePolicy); + } }); - const orphanedPackagePolicies: PackagePolicy[] = []; - const packagePolicies = await packagePolicyService.list(soClient, { - perPage: SO_SEARCH_LIMIT, - }); - const packagePoliciesByPackage = groupBy(packagePolicies.items, 'package.name'); - const agentPolicies = await agentPolicyService.list(soClient, { - perPage: SO_SEARCH_LIMIT, - }); - const agentPoliciesById = keyBy(agentPolicies.items, 'id'); - const usedPackages = installedPackages.saved_objects.filter( - ({ attributes: { name } }) => !!packagePoliciesByPackage[name] - ); - usedPackages.forEach(({ attributes: { name } }) => { - packagePoliciesByPackage[name].forEach((packagePolicy) => { - if (packagePolicy.policy_ids.every((policyId) => !agentPoliciesById[policyId])) { - orphanedPackagePolicies.push(packagePolicy); - } - }); - }); - - return response.ok({ - body: { - items: orphanedPackagePolicies, - total: orphanedPackagePolicies.length, - }, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + }); + + return response.ok({ + body: { + items: orphanedPackagePolicies, + total: orphanedPackagePolicies.length, + }, + }); }; export const createPackagePolicyHandler: FleetRequestHandler< @@ -323,7 +308,7 @@ export const createPackagePolicyHandler: FleetRequestHandler< body: { message: error.message }, }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -441,7 +426,7 @@ export const updatePackagePolicyHandler: FleetRequestHandler< body: { message: error.message }, }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -455,22 +440,18 @@ export const deletePackagePolicyHandler: RequestHandler< const esClient = coreContext.elasticsearch.client.asInternalUser; const user = appContextService.getSecurityCore().authc.getCurrentUser(request) || undefined; - try { - const body: PostDeletePackagePoliciesResponse = await packagePolicyService.delete( - soClient, - esClient, - request.body.packagePolicyIds, - { user, force: request.body.force, skipUnassignFromAgentPolicies: request.body.force }, - context, - request - ); - - return response.ok({ - body, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const body: PostDeletePackagePoliciesResponse = await packagePolicyService.delete( + soClient, + esClient, + request.body.packagePolicyIds, + { user, force: request.body.force, skipUnassignFromAgentPolicies: request.body.force }, + context, + request + ); + + return response.ok({ + body, + }); }; export const deleteOnePackagePolicyHandler: RequestHandler< @@ -483,33 +464,29 @@ export const deleteOnePackagePolicyHandler: RequestHandler< const esClient = coreContext.elasticsearch.client.asInternalUser; const user = appContextService.getSecurityCore().authc.getCurrentUser(request) || undefined; - try { - const res = await packagePolicyService.delete( - soClient, - esClient, - [request.params.packagePolicyId], - { user, force: request.query.force, skipUnassignFromAgentPolicies: request.query.force }, - context, - request - ); - - if ( - res[0] && - res[0].success === false && - res[0].statusCode !== 404 // ignore 404 to allow that call to be idempotent - ) { - return response.customError({ - statusCode: res[0].statusCode ?? 500, - body: res[0].body, - }); - } - - return response.ok({ - body: { id: request.params.packagePolicyId }, + const res = await packagePolicyService.delete( + soClient, + esClient, + [request.params.packagePolicyId], + { user, force: request.query.force, skipUnassignFromAgentPolicies: request.query.force }, + context, + request + ); + + if ( + res[0] && + res[0].success === false && + res[0].statusCode !== 404 // ignore 404 to allow that call to be idempotent + ) { + return response.customError({ + statusCode: res[0].statusCode ?? 500, + body: res[0].body, }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); } + + return response.ok({ + body: { id: request.params.packagePolicyId }, + }); }; export const upgradePackagePolicyHandler: RequestHandler< @@ -521,28 +498,24 @@ export const upgradePackagePolicyHandler: RequestHandler< const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; const user = appContextService.getSecurityCore().authc.getCurrentUser(request) || undefined; - try { - const body: UpgradePackagePolicyResponse = await packagePolicyService.upgrade( - soClient, - esClient, - request.body.packagePolicyIds, - { user } - ); - - const firstFatalError = body.find((item) => item.statusCode && item.statusCode !== 200); - - if (firstFatalError) { - return response.customError({ - statusCode: firstFatalError.statusCode!, - body: { message: firstFatalError.body!.message }, - }); - } - return response.ok({ - body, + const body: UpgradePackagePolicyResponse = await packagePolicyService.upgrade( + soClient, + esClient, + request.body.packagePolicyIds, + { user } + ); + + const firstFatalError = body.find((item) => item.statusCode && item.statusCode !== 200); + + if (firstFatalError) { + return response.customError({ + statusCode: firstFatalError.statusCode!, + body: { message: firstFatalError.body!.message }, }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); } + return response.ok({ + body, + }); }; export const dryRunUpgradePackagePolicyHandler: RequestHandler< @@ -551,28 +524,25 @@ export const dryRunUpgradePackagePolicyHandler: RequestHandler< TypeOf > = async (context, request, response) => { const soClient = (await context.core).savedObjects.client; - try { - const body: UpgradePackagePolicyDryRunResponse = []; - const { packagePolicyIds } = request.body; - for (const id of packagePolicyIds) { - const result = await packagePolicyService.getUpgradeDryRunDiff(soClient, id); - body.push(result); - } + const body: UpgradePackagePolicyDryRunResponse = []; + const { packagePolicyIds } = request.body; - const firstFatalError = body.find((item) => item.statusCode && item.statusCode !== 200); + for (const id of packagePolicyIds) { + const result = await packagePolicyService.getUpgradeDryRunDiff(soClient, id); + body.push(result); + } - if (firstFatalError) { - return response.customError({ - statusCode: firstFatalError.statusCode!, - body: { message: firstFatalError.body!.message }, - }); - } + const firstFatalError = body.find((item) => item.statusCode && item.statusCode !== 200); - return response.ok({ - body, + if (firstFatalError) { + return response.customError({ + statusCode: firstFatalError.statusCode!, + body: { message: firstFatalError.body!.message }, }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); } + + return response.ok({ + body, + }); }; diff --git a/x-pack/plugins/fleet/server/routes/preconfiguration/handler.ts b/x-pack/plugins/fleet/server/routes/preconfiguration/handler.ts index 7b2956b7ec460..ad4f3ddf17721 100644 --- a/x-pack/plugins/fleet/server/routes/preconfiguration/handler.ts +++ b/x-pack/plugins/fleet/server/routes/preconfiguration/handler.ts @@ -9,7 +9,6 @@ import type { TypeOf } from '@kbn/config-schema'; import type { FleetRequestHandler } from '../../types'; import type { PostResetOnePreconfiguredAgentPoliciesSchema } from '../../types'; -import { defaultFleetErrorHandler } from '../../errors'; import { resetPreconfiguredAgentPolicies } from '../../services/preconfiguration/reset_agent_policies'; export const resetOnePreconfigurationHandler: FleetRequestHandler< @@ -21,12 +20,8 @@ export const resetOnePreconfigurationHandler: FleetRequestHandler< const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - await resetPreconfiguredAgentPolicies(soClient, esClient, request.params.agentPolicyId); - return response.ok({}); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + await resetPreconfiguredAgentPolicies(soClient, esClient, request.params.agentPolicyId); + return response.ok({}); }; export const resetPreconfigurationHandler: FleetRequestHandler< @@ -38,10 +33,6 @@ export const resetPreconfigurationHandler: FleetRequestHandler< const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; - try { - await resetPreconfiguredAgentPolicies(soClient, esClient); - return response.ok({}); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + await resetPreconfiguredAgentPolicies(soClient, esClient); + return response.ok({}); }; diff --git a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts index 69bf95207f82c..6836faa2060aa 100644 --- a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts +++ b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts @@ -17,7 +17,6 @@ import type { EnrollmentSettingsFleetServerPolicy, } from '../../../common/types'; import type { FleetRequestHandler, GetEnrollmentSettingsRequestSchema } from '../../types'; -import { defaultFleetErrorHandler } from '../../errors'; import { agentPolicyService, appContextService, downloadSourceService } from '../../services'; import { getFleetServerHostsForAgentPolicy } from '../../services/fleet_server_host'; import { getFleetProxy } from '../../services/fleet_proxies'; @@ -38,99 +37,95 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< const coreContext = await context.core; const esClient = coreContext.elasticsearch.client.asInternalUser; const soClient = coreContext.savedObjects.client; + // Get all possible fleet server or scoped normal agent policies + const { fleetServerPolicies, scopedAgentPolicy: scopedAgentPolicyResponse } = + await getFleetServerOrAgentPolicies(soClient, agentPolicyId); + const scopedAgentPolicy = scopedAgentPolicyResponse || { + id: undefined, + name: undefined, + fleet_server_host_id: undefined, + download_source_id: undefined, + data_output_id: undefined, + }; + // Check if there is any active fleet server enrolled into the fleet server policies policies + if (fleetServerPolicies) { + settingsResponse.fleet_server.policies = fleetServerPolicies; + settingsResponse.fleet_server.has_active = await hasFleetServersForPolicies( + esClient, + appContextService.getInternalUserSOClientWithoutSpaceExtension(), + fleetServerPolicies, + true + ); + } + + // Get download source + // ignore errors if the download source is not found try { - // Get all possible fleet server or scoped normal agent policies - const { fleetServerPolicies, scopedAgentPolicy: scopedAgentPolicyResponse } = - await getFleetServerOrAgentPolicies(soClient, agentPolicyId); - const scopedAgentPolicy = scopedAgentPolicyResponse || { - id: undefined, - name: undefined, - fleet_server_host_id: undefined, - download_source_id: undefined, - data_output_id: undefined, - }; - // Check if there is any active fleet server enrolled into the fleet server policies policies - if (fleetServerPolicies) { - settingsResponse.fleet_server.policies = fleetServerPolicies; - settingsResponse.fleet_server.has_active = await hasFleetServersForPolicies( - esClient, - appContextService.getInternalUserSOClientWithoutSpaceExtension(), - fleetServerPolicies, - true - ); - } + settingsResponse.download_source = await getDownloadSource( + soClient, + scopedAgentPolicy.download_source_id ?? undefined + ); + } catch (e) { + settingsResponse.download_source = undefined; + } - // Get download source - // ignore errors if the download source is not found - try { - settingsResponse.download_source = await getDownloadSource( + // Get download source proxy + // ignore errors if the download source proxy is not found + try { + if (settingsResponse.download_source?.proxy_id) { + settingsResponse.download_source_proxy = await getFleetProxy( soClient, - scopedAgentPolicy.download_source_id ?? undefined + settingsResponse.download_source.proxy_id ); - } catch (e) { - settingsResponse.download_source = undefined; } + } catch (e) { + settingsResponse.download_source_proxy = undefined; + } - // Get download source proxy - // ignore errors if the download source proxy is not found - try { - if (settingsResponse.download_source?.proxy_id) { - settingsResponse.download_source_proxy = await getFleetProxy( - soClient, - settingsResponse.download_source.proxy_id - ); - } - } catch (e) { - settingsResponse.download_source_proxy = undefined; - } + // Get associated fleet server host, or default one if it doesn't exist + // `getFleetServerHostsForAgentPolicy` errors if there is no default, so catch it + try { + settingsResponse.fleet_server.host = await getFleetServerHostsForAgentPolicy( + soClient, + scopedAgentPolicy + ); + } catch (e) { + settingsResponse.fleet_server.host = undefined; + } - // Get associated fleet server host, or default one if it doesn't exist - // `getFleetServerHostsForAgentPolicy` errors if there is no default, so catch it - try { - settingsResponse.fleet_server.host = await getFleetServerHostsForAgentPolicy( + // If a fleet server host was found, get associated fleet server host proxy if any + // ignore errors if the proxy is not found + try { + if (settingsResponse.fleet_server.host?.proxy_id) { + settingsResponse.fleet_server.host_proxy = await getFleetProxy( soClient, - scopedAgentPolicy + settingsResponse.fleet_server.host.proxy_id ); - } catch (e) { - settingsResponse.fleet_server.host = undefined; - } - - // If a fleet server host was found, get associated fleet server host proxy if any - // ignore errors if the proxy is not found - try { - if (settingsResponse.fleet_server.host?.proxy_id) { - settingsResponse.fleet_server.host_proxy = await getFleetProxy( - soClient, - settingsResponse.fleet_server.host.proxy_id - ); - } - } catch (e) { - settingsResponse.fleet_server.host_proxy = undefined; } + } catch (e) { + settingsResponse.fleet_server.host_proxy = undefined; + } - // Get associated output and proxy (if any) to use for Fleet Server enrollment - try { - if (settingsResponse.fleet_server.policies.length > 0) { - const dataOutput = await getDataOutputForAgentPolicy(soClient, scopedAgentPolicy); - if (dataOutput.type === 'elasticsearch' && dataOutput.hosts?.[0]) { - settingsResponse.fleet_server.es_output = dataOutput; - if (dataOutput.proxy_id) { - settingsResponse.fleet_server.es_output_proxy = await getFleetProxy( - soClient, - dataOutput.proxy_id - ); - } + // Get associated output and proxy (if any) to use for Fleet Server enrollment + try { + if (settingsResponse.fleet_server.policies.length > 0) { + const dataOutput = await getDataOutputForAgentPolicy(soClient, scopedAgentPolicy); + if (dataOutput.type === 'elasticsearch' && dataOutput.hosts?.[0]) { + settingsResponse.fleet_server.es_output = dataOutput; + if (dataOutput.proxy_id) { + settingsResponse.fleet_server.es_output_proxy = await getFleetProxy( + soClient, + dataOutput.proxy_id + ); } } - } catch (e) { - settingsResponse.fleet_server.es_output = undefined; - settingsResponse.fleet_server.es_output_proxy = undefined; } - - return response.ok({ body: settingsResponse }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + } catch (e) { + settingsResponse.fleet_server.es_output = undefined; + settingsResponse.fleet_server.es_output_proxy = undefined; } + + return response.ok({ body: settingsResponse }); }; export const getFleetServerOrAgentPolicies = async ( diff --git a/x-pack/plugins/fleet/server/routes/settings/settings_handler.ts b/x-pack/plugins/fleet/server/routes/settings/settings_handler.ts index 4123c2ea37e68..96bc4e0cd789e 100644 --- a/x-pack/plugins/fleet/server/routes/settings/settings_handler.ts +++ b/x-pack/plugins/fleet/server/routes/settings/settings_handler.ts @@ -12,21 +12,16 @@ import type { PutSettingsRequestSchema, PutSpaceSettingsRequestSchema, } from '../../types'; -import { defaultFleetErrorHandler } from '../../errors'; import { settingsService, agentPolicyService, appContextService } from '../../services'; import { getSpaceSettings, saveSpaceSettings } from '../../services/spaces/space_settings'; export const getSpaceSettingsHandler: FleetRequestHandler = async (context, request, response) => { - try { - const soClient = (await context.fleet).internalSoClient; - const settings = await getSpaceSettings(soClient.getCurrentNamespace()); - const body = { - item: settings, - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const soClient = (await context.fleet).internalSoClient; + const settings = await getSpaceSettings(soClient.getCurrentNamespace()); + const body = { + item: settings, + }; + return response.ok({ body }); }; export const putSpaceSettingsHandler: FleetRequestHandler< @@ -34,22 +29,18 @@ export const putSpaceSettingsHandler: FleetRequestHandler< undefined, TypeOf > = async (context, request, response) => { - try { - const soClient = (await context.fleet).internalSoClient; - await saveSpaceSettings({ - settings: { - allowed_namespace_prefixes: request.body.allowed_namespace_prefixes, - }, - spaceId: soClient.getCurrentNamespace(), - }); - const settings = await getSpaceSettings(soClient.getCurrentNamespace()); - const body = { - item: settings, - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const soClient = (await context.fleet).internalSoClient; + await saveSpaceSettings({ + settings: { + allowed_namespace_prefixes: request.body.allowed_namespace_prefixes, + }, + spaceId: soClient.getCurrentNamespace(), + }); + const settings = await getSpaceSettings(soClient.getCurrentNamespace()); + const body = { + item: settings, + }; + return response.ok({ body }); }; export const getSettingsHandler: FleetRequestHandler = async (context, request, response) => { @@ -68,7 +59,7 @@ export const getSettingsHandler: FleetRequestHandler = async (context, request, }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; @@ -95,6 +86,6 @@ export const putSettingsHandler: FleetRequestHandler< }); } - return defaultFleetErrorHandler({ error, response }); + throw error; } }; diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts index 79544e7a4e932..9d524969d8ed3 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts @@ -23,10 +23,14 @@ import { setupFleet } from '../../services/setup'; import type { FleetRequestHandlerContext } from '../../types'; import { hasFleetServers } from '../../services/fleet_server'; import { createFleetAuthzMock } from '../../../common/mocks'; +import { withDefaultErrorHandler } from '../../services/security/fleet_router'; import { fleetSetupHandler, getFleetStatusHandler } from './handlers'; import { FleetSetupResponseSchema, GetAgentsSetupResponseSchema } from '.'; +const fleetSetupWithErrorHandler = withDefaultErrorHandler(fleetSetupHandler); +const getFleetStatusWithErrorHandler = withDefaultErrorHandler(getFleetStatusHandler); + jest.mock('../../services/setup', () => { return { ...jest.requireActual('../../services/setup'), @@ -87,7 +91,11 @@ describe('FleetSetupHandler', () => { nonFatalErrors: [], }) ); - await fleetSetupHandler(coreMock.createCustomRequestHandlerContext(context), request, response); + await fleetSetupWithErrorHandler( + coreMock.createCustomRequestHandlerContext(context), + request, + response + ); const expectedBody: PostFleetSetupResponse = { isInitialized: true, @@ -101,7 +109,11 @@ describe('FleetSetupHandler', () => { it('POST /setup fails w/500 on custom error', async () => { mockSetupFleet.mockImplementation(() => Promise.reject(new Error('SO method mocked to throw'))); - await fleetSetupHandler(coreMock.createCustomRequestHandlerContext(context), request, response); + await fleetSetupWithErrorHandler( + coreMock.createCustomRequestHandlerContext(context), + request, + response + ); expect(response.customError).toHaveBeenCalledTimes(1); expect(response.customError).toHaveBeenCalledWith({ @@ -117,7 +129,11 @@ describe('FleetSetupHandler', () => { Promise.reject(new RegistryError('Registry method mocked to throw')) ); - await fleetSetupHandler(coreMock.createCustomRequestHandlerContext(context), request, response); + await fleetSetupWithErrorHandler( + coreMock.createCustomRequestHandlerContext(context), + request, + response + ); expect(response.customError).toHaveBeenCalledTimes(1); expect(response.customError).toHaveBeenCalledWith({ statusCode: 502, @@ -175,7 +191,7 @@ describe('FleetStatusHandler', () => { .mocked(appContextService.getSecurity().authc.apiKeys.areAPIKeysEnabled) .mockResolvedValue(true); jest.mocked(hasFleetServers).mockResolvedValue(true); - await getFleetStatusHandler( + await getFleetStatusWithErrorHandler( coreMock.createCustomRequestHandlerContext(context), request, response @@ -197,7 +213,7 @@ describe('FleetStatusHandler', () => { .mocked(appContextService.getSecurity().authc.apiKeys.areAPIKeysEnabled) .mockResolvedValue(false); jest.mocked(hasFleetServers).mockResolvedValue(false); - await getFleetStatusHandler( + await getFleetStatusWithErrorHandler( coreMock.createCustomRequestHandlerContext(context), request, response @@ -228,7 +244,7 @@ describe('FleetStatusHandler', () => { jest .mocked(appContextService.getSecurity().authc.apiKeys.areAPIKeysEnabled) .mockResolvedValue(true); - await getFleetStatusHandler( + await getFleetStatusWithErrorHandler( coreMock.createCustomRequestHandlerContext(context), request, response diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.ts index 05ee55320d445..afe53ba0ed58c 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.ts @@ -9,7 +9,6 @@ import { appContextService } from '../../services'; import type { GetFleetStatusResponse, PostFleetSetupResponse } from '../../../common/types'; import { formatNonFatalErrors, setupFleet } from '../../services/setup'; import { hasFleetServers } from '../../services/fleet_server'; -import { defaultFleetErrorHandler } from '../../errors'; import type { FleetRequestHandler } from '../../types'; import { getGpgKeyIdOrUndefined } from '../../services/epm/packages/package_verification'; import { isSecretStorageEnabled } from '../../services/secrets'; @@ -21,69 +20,59 @@ export const getFleetStatusHandler: FleetRequestHandler = async (context, reques const esClient = coreContext.elasticsearch.client.asInternalUser; const soClient = appContextService.getInternalUserSOClientWithoutSpaceExtension(); - try { - const isApiKeysEnabled = await appContextService - .getSecurity() - .authc.apiKeys.areAPIKeysEnabled(); + const isApiKeysEnabled = await appContextService.getSecurity().authc.apiKeys.areAPIKeysEnabled(); - const [hasFleetServersRes, useSecretsStorage, isSpaceAwarenessEnabledRes] = await Promise.all([ - hasFleetServers(esClient, soClient), - isSecretStorageEnabled(esClient, soClient), - isSpaceAwarenessEnabled(), - ]); + const [hasFleetServersRes, useSecretsStorage, isSpaceAwarenessEnabledRes] = await Promise.all([ + hasFleetServers(esClient, soClient), + isSecretStorageEnabled(esClient, soClient), + isSpaceAwarenessEnabled(), + ]); - const isFleetServerMissing = !hasFleetServersRes; + const isFleetServerMissing = !hasFleetServersRes; - const isFleetServerStandalone = - appContextService.getConfig()?.internal?.fleetServerStandalone ?? false; - const missingRequirements: GetFleetStatusResponse['missing_requirements'] = []; - const missingOptionalFeatures: GetFleetStatusResponse['missing_optional_features'] = []; + const isFleetServerStandalone = + appContextService.getConfig()?.internal?.fleetServerStandalone ?? false; + const missingRequirements: GetFleetStatusResponse['missing_requirements'] = []; + const missingOptionalFeatures: GetFleetStatusResponse['missing_optional_features'] = []; - if (!isApiKeysEnabled) { - missingRequirements.push('api_keys'); - } - - if (!isFleetServerStandalone && isFleetServerMissing) { - missingRequirements.push('fleet_server'); - } + if (!isApiKeysEnabled) { + missingRequirements.push('api_keys'); + } - if (!appContextService.getEncryptedSavedObjectsSetup()?.canEncrypt) { - missingOptionalFeatures.push('encrypted_saved_object_encryption_key_required'); - } + if (!isFleetServerStandalone && isFleetServerMissing) { + missingRequirements.push('fleet_server'); + } - const body: GetFleetStatusResponse = { - isReady: missingRequirements.length === 0, - missing_requirements: missingRequirements, - missing_optional_features: missingOptionalFeatures, - is_secrets_storage_enabled: useSecretsStorage, - is_space_awareness_enabled: isSpaceAwarenessEnabledRes, - }; + if (!appContextService.getEncryptedSavedObjectsSetup()?.canEncrypt) { + missingOptionalFeatures.push('encrypted_saved_object_encryption_key_required'); + } - const packageVerificationKeyId = await getGpgKeyIdOrUndefined(); + const body: GetFleetStatusResponse = { + isReady: missingRequirements.length === 0, + missing_requirements: missingRequirements, + missing_optional_features: missingOptionalFeatures, + is_secrets_storage_enabled: useSecretsStorage, + is_space_awareness_enabled: isSpaceAwarenessEnabledRes, + }; - if (packageVerificationKeyId) { - body.package_verification_key_id = packageVerificationKeyId; - } + const packageVerificationKeyId = await getGpgKeyIdOrUndefined(); - return response.ok({ - body, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + if (packageVerificationKeyId) { + body.package_verification_key_id = packageVerificationKeyId; } + + return response.ok({ + body, + }); }; export const fleetSetupHandler: FleetRequestHandler = async (context, request, response) => { - try { - const soClient = (await context.fleet).internalSoClient; - const esClient = (await context.core).elasticsearch.client.asInternalUser; - const setupStatus = await setupFleet(soClient, esClient); - const body: PostFleetSetupResponse = { - ...setupStatus, - nonFatalErrors: formatNonFatalErrors(setupStatus.nonFatalErrors), - }; - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + const soClient = (await context.fleet).internalSoClient; + const esClient = (await context.core).elasticsearch.client.asInternalUser; + const setupStatus = await setupFleet(soClient, esClient); + const body: PostFleetSetupResponse = { + ...setupStatus, + nonFatalErrors: formatNonFatalErrors(setupStatus.nonFatalErrors), + }; + return response.ok({ body }); }; diff --git a/x-pack/plugins/fleet/server/routes/standalone_agent_api_key/handler.ts b/x-pack/plugins/fleet/server/routes/standalone_agent_api_key/handler.ts index 60e0c40c03f40..787cafcb9ac0d 100644 --- a/x-pack/plugins/fleet/server/routes/standalone_agent_api_key/handler.ts +++ b/x-pack/plugins/fleet/server/routes/standalone_agent_api_key/handler.ts @@ -13,34 +13,30 @@ import { INDEX_PRIVILEGES, canCreateStandaloneAgentApiKey, } from '../../services/api_keys/create_standalone_agent_api_key'; -import { FleetUnauthorizedError, defaultFleetErrorHandler } from '../../errors'; +import { FleetUnauthorizedError } from '../../errors'; export const createStandaloneAgentApiKeyHandler: FleetRequestHandler< undefined, undefined, TypeOf > = async (context, request, response) => { - try { - const coreContext = await context.core; - const esClient = coreContext.elasticsearch.client.asCurrentUser; - const canCreate = await canCreateStandaloneAgentApiKey(esClient); + const coreContext = await context.core; + const esClient = coreContext.elasticsearch.client.asCurrentUser; + const canCreate = await canCreateStandaloneAgentApiKey(esClient); - if (!canCreate) { - throw new FleetUnauthorizedError( - `Missing permissions to create standalone API key, You need ${INDEX_PRIVILEGES.privileges.join( - ', ' - )} for indices ${INDEX_PRIVILEGES.names.join(', ')}` - ); - } + if (!canCreate) { + throw new FleetUnauthorizedError( + `Missing permissions to create standalone API key, You need ${INDEX_PRIVILEGES.privileges.join( + ', ' + )} for indices ${INDEX_PRIVILEGES.names.join(', ')}` + ); + } - const key = await createStandaloneAgentApiKey(esClient, request.body.name); + const key = await createStandaloneAgentApiKey(esClient, request.body.name); - return response.ok({ - body: { - item: key, - }, - }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); - } + return response.ok({ + body: { + item: key, + }, + }); }; diff --git a/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts b/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts index d7432fa7f2f51..b1736df2cc58f 100644 --- a/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts @@ -10,7 +10,10 @@ import type { KibanaRequest, VersionedRouter } from '@kbn/core-http-server'; import { httpServerMock, coreMock, loggingSystemMock } from '@kbn/core/server/mocks'; import type { RequestHandler } from '@kbn/core/server'; -import { makeRouterWithFleetAuthz } from '../../services/security/fleet_router'; +import { + makeRouterWithFleetAuthz, + withDefaultErrorHandler, +} from '../../services/security/fleet_router'; import type { FleetAuthzRouter } from '../../services/security/types'; import type { @@ -41,6 +44,11 @@ import { registerRoutes } from '.'; import { getUninstallTokenHandler, getUninstallTokensMetadataHandler } from './handlers'; +const getUninstallTokenHandlerWithErrorHandler = withDefaultErrorHandler(getUninstallTokenHandler); +const getUninstallTokensMetadataHandlerWithErrorHandler = withDefaultErrorHandler( + getUninstallTokensMetadataHandler +); + jest.mock('../../services/agent_policy'); describe('uninstall token handlers', () => { @@ -113,7 +121,7 @@ describe('uninstall token handlers', () => { it('should return uninstall tokens for all policies', async () => { getTokenMetadataMock.mockResolvedValue(uninstallTokensResponseFixture); - await getUninstallTokensMetadataHandler(context, request, response); + await getUninstallTokensMetadataHandlerWithErrorHandler(context, request, response); expect(response.ok).toHaveBeenCalledWith({ body: uninstallTokensResponseFixture, @@ -127,7 +135,7 @@ describe('uninstall token handlers', () => { it('should return internal error when uninstallTokenService throws error', async () => { getTokenMetadataMock.mockRejectedValue(Error('something happened')); - await getUninstallTokensMetadataHandler(context, request, response); + await getUninstallTokensMetadataHandlerWithErrorHandler(context, request, response); expect(response.customError).toHaveBeenCalledWith({ statusCode: 500, @@ -164,7 +172,7 @@ describe('uninstall token handlers', () => { it('should return requested uninstall token', async () => { getTokenMock.mockResolvedValue(uninstallTokenFixture); - await getUninstallTokenHandler(context, request, response); + await getUninstallTokenHandlerWithErrorHandler(context, request, response); expect(getTokenMock).toHaveBeenCalledWith(uninstallTokenFixture.id); expect(response.ok).toHaveBeenCalledWith({ @@ -181,7 +189,7 @@ describe('uninstall token handlers', () => { it('should return internal error when uninstallTokenService throws error', async () => { getTokenMock.mockRejectedValue(Error('something happened')); - await getUninstallTokenHandler(context, request, response); + await getUninstallTokenHandlerWithErrorHandler(context, request, response); expect(response.customError).toHaveBeenCalledWith({ statusCode: 500, diff --git a/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.ts b/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.ts index 2eb9a83456845..165e271af9a06 100644 --- a/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/uninstall_token/handlers.ts @@ -13,7 +13,6 @@ import type { GetUninstallTokensMetadataRequestSchema, GetUninstallTokenRequestSchema, } from '../../types/rest_spec/uninstall_token'; -import { defaultFleetErrorHandler } from '../../errors'; import type { GetUninstallTokenResponse } from '../../../common/types/rest_spec/uninstall_token'; import { LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE, SO_SEARCH_LIMIT } from '../../constants'; @@ -21,51 +20,47 @@ export const getUninstallTokensMetadataHandler: FleetRequestHandler< unknown, TypeOf > = async (context, request, response) => { - try { - const [fleetContext, coreContext] = await Promise.all([context.fleet, context.core]); - const uninstallTokenService = fleetContext.uninstallTokenService.asCurrentUser; - - const { page = 1, perPage = 20, policyId, search } = request.query; - - if (policyId && search) { - return response.badRequest({ - body: { - message: 'Query parameters `policyId` and `search` cannot be used at the same time.', - }, - }); - } - - const soClient = coreContext.savedObjects.client; - - const { items: managedPolicies } = await agentPolicyService.list(soClient, { - fields: ['id'], - perPage: SO_SEARCH_LIMIT, - kuery: `${LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE}.is_managed:true`, + const [fleetContext, coreContext] = await Promise.all([context.fleet, context.core]); + const uninstallTokenService = fleetContext.uninstallTokenService.asCurrentUser; + + const { page = 1, perPage = 20, policyId, search } = request.query; + + if (policyId && search) { + return response.badRequest({ + body: { + message: 'Query parameters `policyId` and `search` cannot be used at the same time.', + }, }); + } + + const soClient = coreContext.savedObjects.client; + + const { items: managedPolicies } = await agentPolicyService.list(soClient, { + fields: ['id'], + perPage: SO_SEARCH_LIMIT, + kuery: `${LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE}.is_managed:true`, + }); - const managedPolicyIds = managedPolicies.map((policy) => policy.id); - - let policyIdSearchTerm: string | undefined; - let policyNameSearchTerm: string | undefined; - if (search) { - policyIdSearchTerm = search.trim(); - policyNameSearchTerm = search.trim(); - } else if (policyId) { - policyIdSearchTerm = policyId.trim(); - } - - const body = await uninstallTokenService.getTokenMetadata( - policyIdSearchTerm, - policyNameSearchTerm, - page, - perPage, - managedPolicyIds.length > 0 ? managedPolicyIds : undefined - ); - - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + const managedPolicyIds = managedPolicies.map((policy) => policy.id); + + let policyIdSearchTerm: string | undefined; + let policyNameSearchTerm: string | undefined; + if (search) { + policyIdSearchTerm = search.trim(); + policyNameSearchTerm = search.trim(); + } else if (policyId) { + policyIdSearchTerm = policyId.trim(); } + + const body = await uninstallTokenService.getTokenMetadata( + policyIdSearchTerm, + policyNameSearchTerm, + page, + perPage, + managedPolicyIds.length > 0 ? managedPolicyIds : undefined + ); + + return response.ok({ body }); }; export const getUninstallTokenHandler: FleetRequestHandler< @@ -74,22 +69,18 @@ export const getUninstallTokenHandler: FleetRequestHandler< const [fleetContext] = await Promise.all([context.fleet, context.core]); const uninstallTokenService = fleetContext.uninstallTokenService.asCurrentUser; - try { - const { uninstallTokenId } = request.params; + const { uninstallTokenId } = request.params; - const token = await uninstallTokenService.getToken(uninstallTokenId); + const token = await uninstallTokenService.getToken(uninstallTokenId); - if (token === null) { - return response.notFound({ - body: { message: `Uninstall Token not found with id ${uninstallTokenId}` }, - }); - } - const body: GetUninstallTokenResponse = { - item: token, - }; - - return response.ok({ body }); - } catch (error) { - return defaultFleetErrorHandler({ error, response }); + if (token === null) { + return response.notFound({ + body: { message: `Uninstall Token not found with id ${uninstallTokenId}` }, + }); } + const body: GetUninstallTokenResponse = { + item: token, + }; + + return response.ok({ body }); }; diff --git a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts index 688320825326a..96fd29b9534c6 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts @@ -888,6 +888,10 @@ describe('getFullAgentPolicy', () => { advanced_settings: { agent_limits_go_max_procs: 2, agent_logging_level: 'debug', + agent_logging_to_files: true, + agent_logging_files_rotateeverybytes: 10000, + agent_logging_files_keepfiles: 10, + agent_logging_files_interval: '7h', }, }); const agentPolicy = await getFullAgentPolicy(savedObjectsClientMock.create(), 'agent-policy'); @@ -896,7 +900,11 @@ describe('getFullAgentPolicy', () => { id: 'agent-policy', agent: { limits: { go_max_procs: 2 }, - logging: { level: 'debug' }, + logging: { + level: 'debug', + to_files: true, + files: { rotateeverybytes: 10000, keepfiles: 10, interval: '7h' }, + }, }, }); }); diff --git a/x-pack/plugins/fleet/server/services/form_settings/form_settings.test.ts b/x-pack/plugins/fleet/server/services/form_settings/form_settings.test.ts index afcba824f1a33..710d862bf3ad1 100644 --- a/x-pack/plugins/fleet/server/services/form_settings/form_settings.test.ts +++ b/x-pack/plugins/fleet/server/services/form_settings/form_settings.test.ts @@ -55,10 +55,10 @@ describe('form_settings', () => { ).not.toThrow(); }); - it('generate a valid API schema for api_field with default value', () => { + it('generate a valid API schema for api_field with default value but not add the value', () => { const apiSchema = schema.object(_getSettingsAPISchema(TEST_SETTINGS)); const res = apiSchema.validate({ advanced_settings: {} }); - expect(res).toEqual({ advanced_settings: { test_foo_default_value: 'test' } }); + expect(res).toEqual({ advanced_settings: {} }); }); }); diff --git a/x-pack/plugins/fleet/server/services/form_settings/form_settings.ts b/x-pack/plugins/fleet/server/services/form_settings/form_settings.ts index 6f644afca49ac..2c625f6bd0574 100644 --- a/x-pack/plugins/fleet/server/services/form_settings/form_settings.ts +++ b/x-pack/plugins/fleet/server/services/form_settings/form_settings.ts @@ -24,40 +24,19 @@ export function _getSettingsAPISchema(settings: SettingsConfig[]): Props { if (!setting.api_field) { return; } - const defaultValueRes = setting.schema.safeParse(undefined); - const defaultValue = defaultValueRes.success ? defaultValueRes.data : undefined; - if (defaultValue) { - validations[setting.api_field.name] = schema.oneOf( - [ - schema.any({ - validate: (val: any) => { - const res = setting.schema.safeParse(val); - if (!res.success) { - return stringifyZodError(res.error); - } - }, - }), - schema.literal(null), - ], - { - defaultValue, - } - ); - } else { - validations[setting.api_field.name] = schema.maybe( - schema.oneOf([ - schema.literal(null), - schema.any({ - validate: (val: any) => { - const res = setting.schema.safeParse(val); - if (!res.success) { - return stringifyZodError(res.error); - } - }, - }), - ]) - ); - } + validations[setting.api_field.name] = schema.maybe( + schema.oneOf([ + schema.literal(null), + schema.any({ + validate: (val: any) => { + const res = setting.schema.safeParse(val); + if (!res.success) { + return stringifyZodError(res.error); + } + }, + }), + ]) + ); }); const advancedSettingsValidations: Props = { @@ -90,7 +69,7 @@ export function _getSettingsValuesForAgentPolicy( } const val = agentPolicy.advanced_settings?.[setting.api_field.name]; - if (val) { + if (val !== undefined) { settingsValues[setting.name] = val; } }); diff --git a/x-pack/plugins/fleet/server/services/security/fleet_router.ts b/x-pack/plugins/fleet/server/services/security/fleet_router.ts index 11a4b084d4807..775fe7e4765e5 100644 --- a/x-pack/plugins/fleet/server/services/security/fleet_router.ts +++ b/x-pack/plugins/fleet/server/services/security/fleet_router.ts @@ -19,6 +19,7 @@ import type { VersionedRouteConfig } from '@kbn/core-http-server'; import { PUBLIC_API_ACCESS } from '../../../common/constants'; import type { FleetRequestHandlerContext } from '../..'; import { getRequestStore } from '../request_store'; +import { defaultFleetErrorHandler } from '../../errors'; import type { FleetVersionedRouteConfig } from './types'; @@ -47,6 +48,26 @@ function withDefaultPublicAccess( } } +export function withDefaultErrorHandler< + TContext extends FleetRequestHandlerContext, + R extends RouteMethod +>( + wrappedHandler: RequestHandler +): RequestHandler { + return async function defaultErrorHandlerWrapper(context, request, response) { + try { + return await wrappedHandler(context, request, response); + } catch (error: any) { + return defaultFleetErrorHandler({ + error, + response, + context, + request, + }); + } + }; +} + export function makeRouterWithFleetAuthz( router: IRouter, logger: Logger @@ -115,14 +136,15 @@ export function makeRouterWithFleetAuthz + handler: withDefaultErrorHandler((handlerContext, handlerRequest, handlerResponse) => routerAuthzWrapper({ context: handlerContext, request: handlerRequest, response: handlerResponse, handler, hasRequiredAuthz, - }), + }) + ), }); }; diff --git a/x-pack/plugins/fleet/server/types/models/agent_policy.ts b/x-pack/plugins/fleet/server/types/models/agent_policy.ts index e82063e775d70..4f131d00bdf38 100644 --- a/x-pack/plugins/fleet/server/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/server/types/models/agent_policy.ts @@ -377,6 +377,24 @@ export const FullAgentPolicyResponseSchema = schema.object({ signing_key: schema.string(), }) ), + logging: schema.maybe( + schema.object({ + level: schema.maybe(schema.string()), + to_files: schema.maybe(schema.boolean()), + files: schema.maybe( + schema.object({ + rotateeverybytes: schema.maybe(schema.number()), + keepfiles: schema.maybe(schema.number()), + interval: schema.maybe(schema.string()), + }) + ), + }) + ), + limits: schema.maybe( + schema.object({ + go_max_procs: schema.maybe(schema.number()), + }) + ), }) ), secret_references: schema.maybe( diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap b/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap index ff8d0f4d7caa2..83e73494fcb0a 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap +++ b/x-pack/plugins/index_lifecycle_management/__jest__/__snapshots__/extend_index_management.test.tsx.snap @@ -2,6 +2,14 @@ exports[`extend index management ilm banner extension should return extension when any index has lifecycle error 1`] = ` Object { + "action": Object { + "buttonLabel": "Retry lifecycle step", + "indexNames": Array [ + "testy3", + ], + "requestMethod": [Function], + "successMessage": "Called retry lifecycle step for: \\"testy3\\"", + }, "filter": Query { "ast": _AST { "_clauses": Array [ diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/extend_index_management.test.tsx b/x-pack/plugins/index_lifecycle_management/__jest__/extend_index_management.test.tsx index e26000bcacc7d..78a2aeddec1c7 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/extend_index_management.test.tsx +++ b/x-pack/plugins/index_lifecycle_management/__jest__/extend_index_management.test.tsx @@ -302,6 +302,24 @@ describe('extend index management', () => { expect(extension).toBeDefined(); expect(extension).toMatchSnapshot(); }); + + test('should return action definition when any index has lifecycle error', () => { + const extension = ilmBannerExtension([ + indexWithoutLifecyclePolicy, + indexWithLifecyclePolicy, + indexWithLifecycleError, + ]); + const { requestMethod, successMessage, buttonLabel } = + retryLifecycleActionExtension({ + indices: [indexWithLifecycleError], + }) ?? {}; + expect(extension?.action).toEqual({ + requestMethod, + successMessage, + buttonLabel, + indexNames: [indexWithLifecycleError.name], + }); + }); }); describe('ilm summary extension', () => { diff --git a/x-pack/plugins/index_lifecycle_management/public/extend_index_management/index.tsx b/x-pack/plugins/index_lifecycle_management/public/extend_index_management/index.tsx index 519a0606c36aa..2466020deb06d 100644 --- a/x-pack/plugins/index_lifecycle_management/public/extend_index_management/index.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/extend_index_management/index.tsx @@ -128,12 +128,20 @@ export const ilmBannerExtension = (indices: Index[]) => { if (!numIndicesWithLifecycleErrors) { return null; } + const { requestMethod, successMessage, indexNames, buttonLabel } = + retryLifecycleActionExtension({ indices: indicesWithLifecycleErrors }) ?? {}; return { type: 'warning', filter: Query.parse(`${stepPath}:ERROR`), filterLabel: i18n.translate('xpack.indexLifecycleMgmt.indexMgmtBanner.filterLabel', { defaultMessage: 'Show errors', }), + action: { + buttonLabel, + indexNames: indexNames?.[0] ?? [], + requestMethod, + successMessage, + }, title: i18n.translate('xpack.indexLifecycleMgmt.indexMgmtBanner.errorMessage', { defaultMessage: `{ numIndicesWithLifecycleErrors, number} {numIndicesWithLifecycleErrors, plural, one {index has} other {indices have} } diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index 76b8295b6b1f4..5a97dadc870cb 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -836,7 +836,6 @@ describe('', () => { testBed.actions.mappings.isReferenceFieldVisible(); testBed.actions.mappings.selectInferenceIdButtonExists(); testBed.actions.mappings.openSelectInferencePopover(); - testBed.actions.mappings.expectDefaultInferenceModelToExists(); testBed.actions.mappings.expectCustomInferenceModelToExists( `custom-inference_${customInferenceModel}` ); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx index ed5af67840513..2fb9165e8fd10 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx @@ -71,6 +71,8 @@ jest.mock('../../../public/application/components/mappings_editor/mappings_state jest.mock('../../../public/application/services/api', () => ({ useLoadInferenceEndpoints: jest.fn().mockReturnValue({ data: [ + { inference_id: '.preconfigured-elser', task_type: 'sparse_embedding' }, + { inference_id: '.preconfigured-e5', task_type: 'text_embedding' }, { inference_id: 'endpoint-1', task_type: 'text_embedding' }, { inference_id: 'endpoint-2', task_type: 'sparse_embedding' }, { inference_id: 'endpoint-3', task_type: 'completion' }, @@ -83,7 +85,7 @@ jest.mock('../../../public/application/services/api', () => ({ function getTestForm(Component: React.FC) { return (defaultProps: SelectInferenceIdProps) => { const { form } = useForm(); - form.setFieldValue('inference_id', 'elser_model_2'); + form.setFieldValue('inference_id', '.preconfigured-elser'); return ( @@ -125,8 +127,8 @@ describe('SelectInferenceId', () => { it('should display the inference endpoints in the combo', () => { find('inferenceIdButton').simulate('click'); - expect(find('data-inference-endpoint-list').contains('e5')).toBe(true); - expect(find('data-inference-endpoint-list').contains('elser_model_2')).toBe(true); + expect(find('data-inference-endpoint-list').contains('.preconfigured-elser')).toBe(true); + expect(find('data-inference-endpoint-list').contains('.preconfigured-e5')).toBe(true); expect(find('data-inference-endpoint-list').contains('endpoint-1')).toBe(true); expect(find('data-inference-endpoint-list').contains('endpoint-2')).toBe(true); expect(find('data-inference-endpoint-list').contains('endpoint-3')).toBe(false); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx index 094fd40ab1e32..349a724043169 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx @@ -459,6 +459,7 @@ export type TestSubjects = | 'advancedConfiguration.dynamicMappingsToggle.input' | 'advancedConfiguration.metaField' | 'advancedConfiguration.routingRequiredToggle.input' + | 'sourceValueField' | 'sourceField.includesField' | 'sourceField.excludesField' | 'dynamicTemplatesEditor' diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx index 685aa4963edc4..ee3b3e72e7c19 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx @@ -28,7 +28,24 @@ describe('Mappings editor: core', () => { let onChangeHandler: jest.Mock = jest.fn(); let getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler); let testBed: MappingsEditorTestBed; - const appDependencies = { plugins: { ml: { mlApi: {} } } }; + let hasEnterpriseLicense = true; + const mockLicenseCheck = jest.fn((type: any) => hasEnterpriseLicense); + const appDependencies = { + plugins: { + ml: { mlApi: {} }, + licensing: { + license$: { + subscribe: jest.fn((callback: any) => { + callback({ + isActive: true, + hasAtLeast: mockLicenseCheck, + }); + return { unsubscribe: jest.fn() }; + }), + }, + }, + }, + }; beforeAll(() => { jest.useFakeTimers({ legacyFakeTimers: true }); @@ -456,6 +473,11 @@ describe('Mappings editor: core', () => { updatedMappings = { ...updatedMappings, dynamic: false, + // The "enabled": true is removed as this is the default in Es + _source: { + includes: defaultMappings._source.includes, + excludes: defaultMappings._source.excludes, + }, }; delete updatedMappings.date_detection; delete updatedMappings.dynamic_date_formats; @@ -463,6 +485,84 @@ describe('Mappings editor: core', () => { expect(data).toEqual(updatedMappings); }); + + describe('props.indexMode sets the correct default value of _source field', () => { + it("defaults to 'stored' with 'standard' index mode prop", async () => { + await act(async () => { + testBed = setup( + { + value: { ...defaultMappings, _source: undefined }, + onChange: onChangeHandler, + indexMode: 'standard', + }, + ctx + ); + }); + testBed.component.update(); + + const { + actions: { selectTab }, + find, + } = testBed; + + await selectTab('advanced'); + + // Check that the stored option is selected + expect(find('sourceValueField').prop('value')).toBe('stored'); + }); + + ['logsdb', 'time_series'].forEach((indexMode) => { + it(`defaults to 'synthetic' with ${indexMode} index mode prop on enterprise license`, async () => { + hasEnterpriseLicense = true; + await act(async () => { + testBed = setup( + { + value: { ...defaultMappings, _source: undefined }, + onChange: onChangeHandler, + indexMode, + }, + ctx + ); + }); + testBed.component.update(); + + const { + actions: { selectTab }, + find, + } = testBed; + + await selectTab('advanced'); + + // Check that the synthetic option is selected + expect(find('sourceValueField').prop('value')).toBe('synthetic'); + }); + + it(`defaults to 'standard' with ${indexMode} index mode prop on basic license`, async () => { + hasEnterpriseLicense = false; + await act(async () => { + testBed = setup( + { + value: { ...defaultMappings, _source: undefined }, + onChange: onChangeHandler, + indexMode, + }, + ctx + ); + }); + testBed.component.update(); + + const { + actions: { selectTab }, + find, + } = testBed; + + await selectTab('advanced'); + + // Check that the stored option is selected + expect(find('sourceValueField').prop('value')).toBe('stored'); + }); + }); + }); }); describe('multi-fields support', () => { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx index e3e32c55aada0..00ce2d02a1baa 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx @@ -5,17 +5,21 @@ * 2.0. */ -import React, { useEffect, useRef, useCallback } from 'react'; +import React, { useEffect, useRef } from 'react'; import { EuiSpacer } from '@elastic/eui'; -import { FormData } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { useAppContext } from '../../../../app_context'; import { useForm, Form } from '../../shared_imports'; import { GenericObject, MappingsConfiguration } from '../../types'; import { MapperSizePluginId } from '../../constants'; import { useDispatch } from '../../mappings_state_context'; import { DynamicMappingSection } from './dynamic_mapping_section'; -import { SourceFieldSection } from './source_field_section'; +import { + SourceFieldSection, + STORED_SOURCE_OPTION, + SYNTHETIC_SOURCE_OPTION, + DISABLED_SOURCE_OPTION, +} from './source_field_section'; import { MetaFieldSection } from './meta_field_section'; import { RoutingSection } from './routing_section'; import { MapperSizePluginSection } from './mapper_size_plugin_section'; @@ -28,7 +32,14 @@ interface Props { esNodesPlugins: string[]; } -const formSerializer = (formData: GenericObject, sourceFieldMode?: string) => { +interface SerializedSourceField { + enabled?: boolean; + mode?: string; + includes?: string[]; + excludes?: string[]; +} + +export const formSerializer = (formData: GenericObject) => { const { dynamicMapping, sourceField, metaField, _routing, _size, subobjects } = formData; const dynamic = dynamicMapping?.enabled @@ -37,12 +48,30 @@ const formSerializer = (formData: GenericObject, sourceFieldMode?: string) => { ? 'strict' : dynamicMapping?.enabled; + const _source = + sourceField?.option === SYNTHETIC_SOURCE_OPTION + ? { mode: SYNTHETIC_SOURCE_OPTION } + : sourceField?.option === DISABLED_SOURCE_OPTION + ? { enabled: false } + : sourceField?.option === STORED_SOURCE_OPTION + ? { + mode: 'stored', + includes: sourceField?.includes, + excludes: sourceField?.excludes, + } + : sourceField?.includes || sourceField?.excludes + ? { + includes: sourceField?.includes, + excludes: sourceField?.excludes, + } + : undefined; + const serialized = { dynamic, numeric_detection: dynamicMapping?.numeric_detection, date_detection: dynamicMapping?.date_detection, dynamic_date_formats: dynamicMapping?.dynamic_date_formats, - _source: sourceFieldMode ? { mode: sourceFieldMode } : sourceField, + _source: _source as SerializedSourceField, _meta: metaField, _routing, _size, @@ -52,7 +81,7 @@ const formSerializer = (formData: GenericObject, sourceFieldMode?: string) => { return serialized; }; -const formDeserializer = (formData: GenericObject) => { +export const formDeserializer = (formData: GenericObject) => { const { dynamic, /* eslint-disable @typescript-eslint/naming-convention */ @@ -60,11 +89,7 @@ const formDeserializer = (formData: GenericObject) => { date_detection, dynamic_date_formats, /* eslint-enable @typescript-eslint/naming-convention */ - _source: { enabled, includes, excludes } = {} as { - enabled?: boolean; - includes?: string[]; - excludes?: string[]; - }, + _source: { enabled, mode, includes, excludes } = {} as SerializedSourceField, _meta, _routing, // For the Mapper Size plugin @@ -81,7 +106,14 @@ const formDeserializer = (formData: GenericObject) => { dynamic_date_formats, }, sourceField: { - enabled, + option: + mode === 'stored' + ? STORED_SOURCE_OPTION + : mode === 'synthetic' + ? SYNTHETIC_SOURCE_OPTION + : enabled === false + ? DISABLED_SOURCE_OPTION + : undefined, includes, excludes, }, @@ -99,14 +131,9 @@ export const ConfigurationForm = React.memo(({ value, esNodesPlugins }: Props) = const isMounted = useRef(false); - const serializerCallback = useCallback( - (formData: FormData) => formSerializer(formData, value?._source?.mode), - [value?._source?.mode] - ); - const { form } = useForm({ schema: configurationFormSchema, - serializer: serializerCallback, + serializer: formSerializer, deserializer: formDeserializer, defaultValue: value, id: 'configurationForm', @@ -165,7 +192,7 @@ export const ConfigurationForm = React.memo(({ value, esNodesPlugins }: Props) = - {enableMappingsSourceFieldSection && !value?._source?.mode && ( + {enableMappingsSourceFieldSection && ( <> diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx index a9913b9474b36..ff93e717ce090 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx @@ -75,12 +75,9 @@ export const configurationFormSchema: FormSchema = { }, }, sourceField: { - enabled: { - label: i18n.translate('xpack.idxMgmt.mappingsEditor.configuration.sourceFieldLabel', { - defaultMessage: 'Enable _source field', - }), - type: FIELD_TYPES.TOGGLE, - defaultValue: true, + option: { + type: FIELD_TYPES.SUPER_SELECT, + defaultValue: 'stored', }, includes: { label: i18n.translate('xpack.idxMgmt.mappingsEditor.configuration.includeSourceFieldsLabel', { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_serialization.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_serialization.test.ts new file mode 100644 index 0000000000000..5bf4ad3b9ee57 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_serialization.test.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { formSerializer, formDeserializer } from './configuration_form'; +import { + STORED_SOURCE_OPTION, + SYNTHETIC_SOURCE_OPTION, + DISABLED_SOURCE_OPTION, +} from './source_field_section'; + +describe('Template serialization', () => { + describe('serialization of _source parameter', () => { + describe('deserializeTemplate()', () => { + test(`correctly deserializes 'stored' mode`, () => { + expect( + formDeserializer({ + _source: { + mode: 'stored', + includes: ['hello'], + excludes: ['world'], + }, + }) + ).toHaveProperty('sourceField', { + option: STORED_SOURCE_OPTION, + includes: ['hello'], + excludes: ['world'], + }); + }); + + test(`correctly deserializes 'enabled' property set to true`, () => { + expect( + formDeserializer({ + _source: { + enabled: true, + includes: ['hello'], + excludes: ['world'], + }, + }) + ).toHaveProperty('sourceField', { + includes: ['hello'], + excludes: ['world'], + }); + }); + + test(`correctly deserializes 'enabled' property set to false`, () => { + expect( + formDeserializer({ + _source: { + enabled: false, + }, + }) + ).toHaveProperty('sourceField', { + option: DISABLED_SOURCE_OPTION, + }); + }); + + test(`correctly deserializes 'synthetic' mode`, () => { + expect( + formDeserializer({ + _source: { + mode: 'synthetic', + }, + }) + ).toHaveProperty('sourceField', { + option: SYNTHETIC_SOURCE_OPTION, + }); + }); + + test(`correctly deserializes undefined mode and enabled properties with includes or excludes fields`, () => { + expect( + formDeserializer({ + _source: { + includes: ['hello'], + excludes: ['world'], + }, + }) + ).toHaveProperty('sourceField', { + includes: ['hello'], + excludes: ['world'], + }); + }); + }); + + describe('serializeTemplate()', () => { + test(`correctly serializes 'stored' option`, () => { + expect( + formSerializer({ + sourceField: { + option: STORED_SOURCE_OPTION, + includes: ['hello'], + excludes: ['world'], + }, + }) + ).toHaveProperty('_source', { + mode: 'stored', + includes: ['hello'], + excludes: ['world'], + }); + }); + + test(`correctly serializes 'disabled' option`, () => { + expect( + formSerializer({ + sourceField: { + option: DISABLED_SOURCE_OPTION, + }, + }) + ).toHaveProperty('_source', { + enabled: false, + }); + }); + + test(`correctly serializes 'synthetic' option`, () => { + expect( + formSerializer({ + sourceField: { + option: SYNTHETIC_SOURCE_OPTION, + }, + }) + ).toHaveProperty('_source', { + mode: 'synthetic', + }); + }); + + test(`correctly serializes undefined option with includes or excludes fields`, () => { + expect( + formSerializer({ + sourceField: { + includes: ['hello'], + excludes: ['world'], + }, + }) + ).toHaveProperty('_source', { + includes: ['hello'], + excludes: ['world'], + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/constants.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/constants.ts new file mode 100644 index 0000000000000..9e4390846fa81 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/constants.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const STORED_SOURCE_OPTION = 'stored'; +export const DISABLED_SOURCE_OPTION = 'disabled'; +export const SYNTHETIC_SOURCE_OPTION = 'synthetic'; + +export type SourceOptionKey = + | typeof STORED_SOURCE_OPTION + | typeof DISABLED_SOURCE_OPTION + | typeof SYNTHETIC_SOURCE_OPTION; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/i18n_texts.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/i18n_texts.ts new file mode 100644 index 0000000000000..447c45b7b099d --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/i18n_texts.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { + STORED_SOURCE_OPTION, + DISABLED_SOURCE_OPTION, + SYNTHETIC_SOURCE_OPTION, + SourceOptionKey, +} from './constants'; + +export const sourceOptionLabels: Record = { + [STORED_SOURCE_OPTION]: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.configuration.storedSourceFieldsLabel', + { + defaultMessage: 'Stored _source', + } + ), + [DISABLED_SOURCE_OPTION]: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.configuration.disabledSourceFieldsLabel', + { + defaultMessage: 'Disabled _source', + } + ), + [SYNTHETIC_SOURCE_OPTION]: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.configuration.syntheticSourceFieldsLabel', + { + defaultMessage: 'Synthetic _source', + } + ), +}; + +export const sourceOptionDescriptions: Record = { + [STORED_SOURCE_OPTION]: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.configuration.storedSourceFieldsDescription', + { + defaultMessage: 'Stores content in _source field for future retrieval', + } + ), + [DISABLED_SOURCE_OPTION]: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.configuration.disabledSourceFieldsDescription', + { + defaultMessage: 'Strongly discouraged, will impact downstream functionality', + } + ), + [SYNTHETIC_SOURCE_OPTION]: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.configuration.syntheticSourceFieldsDescription', + { + defaultMessage: 'Reconstructs source content to save on disk usage', + } + ), +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/index.ts index df921a036c909..cb5f2afef6d0b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/index.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/index.ts @@ -6,3 +6,4 @@ */ export { SourceFieldSection } from './source_field_section'; +export * from './constants'; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/source_field_section.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/source_field_section.tsx index 236dfe98119ca..2e8f9fb88f87d 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/source_field_section.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/source_field_section/source_field_section.tsx @@ -5,18 +5,61 @@ * 2.0. */ -import React from 'react'; +import React, { Fragment } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiLink, EuiSpacer, EuiComboBox, EuiFormRow, EuiCallOut } from '@elastic/eui'; +import { EuiLink, EuiSpacer, EuiComboBox, EuiFormRow, EuiCallOut, EuiText } from '@elastic/eui'; +import { useMappingsState } from '../../../mappings_state_context'; import { documentationService } from '../../../../../services/documentation'; -import { UseField, FormDataProvider, FormRow, ToggleField } from '../../../shared_imports'; +import { UseField, FormDataProvider, FormRow, SuperSelectField } from '../../../shared_imports'; import { ComboBoxOption } from '../../../types'; +import { sourceOptionLabels, sourceOptionDescriptions } from './i18n_texts'; +import { + STORED_SOURCE_OPTION, + DISABLED_SOURCE_OPTION, + SYNTHETIC_SOURCE_OPTION, + SourceOptionKey, +} from './constants'; export const SourceFieldSection = () => { - const renderWarning = () => ( + const state = useMappingsState(); + + const renderOptionDropdownDisplay = (option: SourceOptionKey) => ( + + {sourceOptionLabels[option]} + +

{sourceOptionDescriptions[option]}

+
+
+ ); + + const sourceValueOptions = [ + { + value: STORED_SOURCE_OPTION, + inputDisplay: sourceOptionLabels[STORED_SOURCE_OPTION], + dropdownDisplay: renderOptionDropdownDisplay(STORED_SOURCE_OPTION), + 'data-test-subj': 'storedSourceFieldOption', + }, + ]; + + if (state.hasEnterpriseLicense) { + sourceValueOptions.push({ + value: SYNTHETIC_SOURCE_OPTION, + inputDisplay: sourceOptionLabels[SYNTHETIC_SOURCE_OPTION], + dropdownDisplay: renderOptionDropdownDisplay(SYNTHETIC_SOURCE_OPTION), + 'data-test-subj': 'syntheticSourceFieldOption', + }); + } + sourceValueOptions.push({ + value: DISABLED_SOURCE_OPTION, + inputDisplay: sourceOptionLabels[DISABLED_SOURCE_OPTION], + dropdownDisplay: renderOptionDropdownDisplay(DISABLED_SOURCE_OPTION), + 'data-test-subj': 'disabledSourceFieldOption', + }); + + const renderDisableWarning = () => ( {

@@ -45,13 +88,13 @@ export const SourceFieldSection = () => {

@@ -70,6 +113,44 @@ export const SourceFieldSection = () => { ); + const renderSyntheticWarning = () => ( + + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2.sourceText', + { + defaultMessage: '_source', + } + )} + + ), + learnMoreLink: ( + + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2.sourceText', + { + defaultMessage: 'Learn more.', + } + )} + + ), + }} + /> + } + iconType="warning" + color="warning" + /> + ); + const renderFormFields = () => (

@@ -155,21 +236,34 @@ export const SourceFieldSection = () => { }} /> - + } > - + {(formData) => { - const { - sourceField: { enabled }, - } = formData; + const { sourceField } = formData; - if (enabled === undefined) { + if (sourceField?.option === undefined) { return null; } - return enabled ? renderFormFields() : renderWarning(); + return sourceField?.option === STORED_SOURCE_OPTION + ? renderFormFields() + : sourceField?.option === DISABLED_SOURCE_OPTION + ? renderDisableWarning() + : renderSyntheticWarning(); }} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx index 15d5ee9ba72c0..a9c54aee80360 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx @@ -52,15 +52,6 @@ type SelectInferenceIdContentProps = SelectInferenceIdProps & { value: string; }; -const defaultEndpoints = [ - { - inference_id: 'elser_model_2', - }, - { - inference_id: 'e5', - }, -]; - export const SelectInferenceId: React.FC = ({ createInferenceEndpoint, 'data-test-subj': dataTestSubj, @@ -134,13 +125,7 @@ const SelectInferenceIdContent: React.FC = ({ endpoint.task_type === 'text_embedding' || endpoint.task_type === 'sparse_embedding' ); - const missingDefaultEndpoints = defaultEndpoints.filter( - (endpoint) => !(filteredEndpoints || []).find((e) => e.inference_id === endpoint.inference_id) - ); - const newOptions: EuiSelectableOption[] = [ - ...(filteredEndpoints || []), - ...missingDefaultEndpoints, - ].map((endpoint) => ({ + const newOptions: EuiSelectableOption[] = [...(filteredEndpoints || [])].map((endpoint) => ({ label: endpoint.inference_id, 'data-test-subj': `custom-inference_${endpoint.inference_id}`, checked: value === endpoint.inference_id ? 'on' : undefined, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts index 6662c2852ad7b..a464a279a8ddf 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts @@ -19,6 +19,8 @@ import { useMLModelNotificationToasts } from '../../../../../../../../hooks/use_ import { getInferenceEndpoints } from '../../../../../../../services/api'; import { getFieldByPathName } from '../../../../../lib/utils'; +import { ELSER_PRECONFIGURED_ENDPOINTS } from '../../../../../constants'; + interface UseSemanticTextProps { form: FormHook; ml?: MlPluginStart; @@ -62,7 +64,7 @@ export function useSemanticText(props: UseSemanticTextProps) { form.setFieldValue('reference_field', referenceField); } if (!form.getFormData().inference_id) { - form.setFieldValue('inference_id', 'elser_model_2'); + form.setFieldValue('inference_id', ELSER_PRECONFIGURED_ENDPOINTS); } } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx index 33c51a3cb644b..a67a7df0acb7b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx @@ -19,7 +19,11 @@ import { i18n } from '@kbn/i18n'; import { NormalizedField, NormalizedFields, State } from '../../../types'; import { getTypeLabelFromField } from '../../../lib'; -import { CHILD_FIELD_INDENT_SIZE, LEFT_PADDING_SIZE_FIELD_ITEM_WRAPPER } from '../../../constants'; +import { + CHILD_FIELD_INDENT_SIZE, + ELSER_PRECONFIGURED_ENDPOINTS, + LEFT_PADDING_SIZE_FIELD_ITEM_WRAPPER, +} from '../../../constants'; import { FieldsList } from './fields_list'; import { CreateField } from './create_field'; @@ -105,6 +109,7 @@ function FieldListItemComponent( const indent = treeDepth * CHILD_FIELD_INDENT_SIZE - substractIndentAmount; const isSemanticText = source.type === 'semantic_text'; + const inferenceId: string = (source.inference_id as string) ?? ELSER_PRECONFIGURED_ENDPOINTS; const indentCreateField = (treeDepth + 1) * CHILD_FIELD_INDENT_SIZE + @@ -293,7 +298,7 @@ function FieldListItemComponent( {isSemanticText && ( - {source.inference_id as string} + {inferenceId} )} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/default_values.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/default_values.ts index b839caf75b242..f8c6da8f7cddb 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/default_values.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/default_values.ts @@ -13,3 +13,9 @@ export const INDEX_DEFAULT = 'index_default'; export const STANDARD = 'standard'; + +/* + This will be repalce once we add default elser inference_id + with the index mapping response. +*/ +export const ELSER_PRECONFIGURED_ENDPOINTS = '.elser-2-elasticsearch'; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts index 58b40293f64f2..872c62bc6f7a7 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts @@ -421,6 +421,7 @@ describe('utils', () => { selectedDataTypes: ['Boolean'], }, inferenceToModelIdMap: {}, + hasEnterpriseLicense: true, mappingViewFields: { byId: {}, rootLevelFields: [], aliases: {}, maxNestedDepth: 0 }, }; test('returns list of matching fields with search term', () => { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx index e1f5306899db3..cc87c3cd614e3 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx @@ -9,6 +9,9 @@ import React, { useMemo, useState, useEffect, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiSpacer, EuiTabs, EuiTab } from '@elastic/eui'; +import { ILicense } from '@kbn/licensing-plugin/common/types'; +import { useAppContext } from '../../app_context'; +import { IndexMode } from '../../../../common/types/data_streams'; import { DocumentFields, RuntimeFieldsList, @@ -32,6 +35,7 @@ import { DocLinksStart } from './shared_imports'; import { DocumentFieldsHeader } from './components/document_fields/document_fields_header'; import { SearchResult } from './components/document_fields/search_fields'; import { parseMappings } from '../../shared/parse_mappings'; +import { LOGSDB_INDEX_MODE, TIME_SERIES_MODE } from '../../../../common/constants'; type TabName = 'fields' | 'runtimeFields' | 'advanced' | 'templates'; @@ -52,10 +56,14 @@ export interface Props { docLinks: DocLinksStart; /** List of plugins installed in the cluster nodes */ esNodesPlugins: string[]; + indexMode?: IndexMode; } export const MappingsEditor = React.memo( - ({ onChange, value, docLinks, indexSettings, esNodesPlugins }: Props) => { + ({ onChange, value, docLinks, indexSettings, esNodesPlugins, indexMode }: Props) => { + const { + plugins: { licensing }, + } = useAppContext(); const { parsedDefaultValue, multipleMappingsDeclared } = useMemo( () => parseMappings(value), [value] @@ -120,6 +128,40 @@ export const MappingsEditor = React.memo( [dispatch] ); + const [isLicenseCheckComplete, setIsLicenseCheckComplete] = useState(false); + useEffect(() => { + const subscription = licensing?.license$.subscribe((license: ILicense) => { + dispatch({ + type: 'hasEnterpriseLicense.update', + value: license.isActive && license.hasAtLeast('enterprise'), + }); + setIsLicenseCheckComplete(true); + }); + + return () => subscription?.unsubscribe(); + }, [dispatch, licensing]); + + useEffect(() => { + if ( + isLicenseCheckComplete && + !state.configuration.defaultValue._source && + (indexMode === LOGSDB_INDEX_MODE || indexMode === TIME_SERIES_MODE) + ) { + if (state.hasEnterpriseLicense) { + dispatch({ + type: 'configuration.save', + value: { ...state.configuration.defaultValue, _source: { mode: 'synthetic' } } as any, + }); + } + } + }, [ + indexMode, + dispatch, + state.configuration, + state.hasEnterpriseLicense, + isLicenseCheckComplete, + ]); + const tabToContentMap = { fields: ( = ({ childr selectedDataTypes: [], }, inferenceToModelIdMap: {}, + hasEnterpriseLicense: false, mappingViewFields: { byId: {}, rootLevelFields: [], aliases: {}, maxNestedDepth: 0 }, }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts index 626ee0e839a8a..ecb9648c34d00 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts @@ -629,5 +629,11 @@ export const reducer = (state: State, action: Action): State => { inferenceToModelIdMap: action.value.inferenceToModelIdMap, }; } + case 'hasEnterpriseLicense.update': { + return { + ...state, + hasEnterpriseLicense: action.value, + }; + } } }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts index f40fe420eb3be..43b3a7dde3b16 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts @@ -108,6 +108,7 @@ export interface State { }; templates: TemplatesFormState; inferenceToModelIdMap?: InferenceToModelIdMap; + hasEnterpriseLicense: boolean; mappingViewFields: NormalizedFields; // state of the incoming index mappings, separate from the editor state above } @@ -140,6 +141,7 @@ export type Action = | { type: 'fieldsJsonEditor.update'; value: { json: { [key: string]: any }; isValid: boolean } } | { type: 'search:update'; value: string } | { type: 'validity:update'; value: boolean } - | { type: 'filter:update'; value: { selectedOptions: EuiSelectableOption[] } }; + | { type: 'filter:update'; value: { selectedOptions: EuiSelectableOption[] } } + | { type: 'hasEnterpriseLicense.update'; value: boolean }; export type Dispatch = (action: Action) => void; diff --git a/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings.tsx b/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings.tsx index 62685a05f7ff9..a239971c1bf82 100644 --- a/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings.tsx +++ b/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings.tsx @@ -16,6 +16,7 @@ import { EuiText, } from '@elastic/eui'; +import { IndexMode } from '../../../../../../common/types/data_streams'; import { Forms } from '../../../../../shared_imports'; import { useAppContext } from '../../../../app_context'; import { @@ -33,10 +34,11 @@ interface Props { esNodesPlugins: string[]; defaultValue?: { [key: string]: any }; indexSettings?: IndexSettings; + indexMode?: IndexMode; } export const StepMappings: React.FunctionComponent = React.memo( - ({ defaultValue = {}, onChange, indexSettings, esDocsBase, esNodesPlugins }) => { + ({ defaultValue = {}, onChange, indexSettings, esDocsBase, esNodesPlugins, indexMode }) => { const [mappings, setMappings] = useState(defaultValue); const { docLinks } = useAppContext(); @@ -115,6 +117,7 @@ export const StepMappings: React.FunctionComponent = React.memo( indexSettings={indexSettings} docLinks={docLinks} esNodesPlugins={esNodesPlugins} + indexMode={indexMode} /> diff --git a/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings_container.tsx b/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings_container.tsx index 50b763ce0d06a..1b8a6bac2a4d8 100644 --- a/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings_container.tsx +++ b/x-pack/plugins/index_management/public/application/components/shared/components/wizard_steps/step_mappings_container.tsx @@ -7,6 +7,8 @@ import React from 'react'; +import { WizardContent } from '../../../template_form/template_form'; +import { TemplateDeserialized } from '../../../../../../common'; import { Forms } from '../../../../../shared_imports'; import { useLoadNodesPlugins } from '../../../../services'; import { CommonWizardSteps } from './types'; @@ -14,15 +16,29 @@ import { StepMappings } from './step_mappings'; interface Props { esDocsBase: string; + getTemplateData?: (wizardContent: WizardContent) => TemplateDeserialized; } -export const StepMappingsContainer: React.FunctionComponent = ({ esDocsBase }) => { +export const StepMappingsContainer: React.FunctionComponent = ({ + esDocsBase, + getTemplateData, +}) => { const { defaultValue, updateContent, getSingleContentData } = Forms.useContent< CommonWizardSteps, 'mappings' >('mappings'); const { data: esNodesPlugins } = useLoadNodesPlugins(); + const { getData } = Forms.useMultiContentContext(); + + let indexMode; + if (getTemplateData) { + const wizardContent = getData(); + // Build the current template object, providing the wizard content data + const template = getTemplateData(wizardContent); + indexMode = template?.indexMode; + } + return ( = ({ esDocsBa indexSettings={getSingleContentData('settings')} esDocsBase={esDocsBase} esNodesPlugins={esNodesPlugins ?? []} + indexMode={indexMode} /> ); }; diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx index 53b53a6ebdeee..1f3d2a22874d3 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx @@ -349,7 +349,10 @@ export const TemplateForm = ({ - + diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx index e2f9cb68ad90d..ec5deabc5f1f3 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx @@ -63,6 +63,8 @@ import { SemanticTextBanner } from './semantic_text_banner'; import { TrainedModelsDeploymentModal } from './trained_models_deployment_modal'; import { parseMappings } from '../../../../shared/parse_mappings'; +const isInferencePreconfigured = (inferenceId: string) => inferenceId.startsWith('.'); + export const DetailsPageMappingsContent: FunctionComponent<{ index: Index; data: string; @@ -235,7 +237,8 @@ export const DetailsPageMappingsContent: FunctionComponent<{ .filter( (inferenceId: string) => inferenceToModelIdMap?.[inferenceId].trainedModelId && // third-party inference models don't have trainedModelId - !inferenceToModelIdMap?.[inferenceId].isDeployed + !inferenceToModelIdMap?.[inferenceId].isDeployed && + !isInferencePreconfigured(inferenceId) ); setHasSavedFields(true); if (inferenceIdsInPendingList.length === 0) { diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.js index 6ea481ae463a6..66406576902c2 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.js +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.js @@ -25,6 +25,7 @@ import { sortChanged, loadIndices, toggleChanged, + performExtensionAction, } from '../../../../store/actions'; import { IndexTable as PresentationComponent } from './index_table'; @@ -63,6 +64,9 @@ const mapDispatchToProps = (dispatch) => { loadIndices: () => { dispatch(loadIndices()); }, + performExtensionAction: (requestMethod, successMessage, indexNames) => { + dispatch(performExtensionAction({ requestMethod, successMessage, indexNames })); + }, }; }; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js index 1d102419c5bdf..ee72f56d2103d 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js @@ -404,24 +404,47 @@ export class IndexTable extends Component { } renderBanners(extensionsService) { - const { allIndices = [], filterChanged } = this.props; + const { allIndices = [], filterChanged, performExtensionAction } = this.props; return extensionsService.banners.map((bannerExtension, i) => { const bannerData = bannerExtension(allIndices); if (!bannerData) { return null; } - const { type, title, message, filter, filterLabel } = bannerData; + const { type, title, message, filter, filterLabel, action } = bannerData; return ( - - {message} - {filter ? ( - filterChanged(filter)}>{filterLabel} - ) : null} - + {message &&

{message}

} + {action || filter ? ( + + {action ? ( + + { + performExtensionAction( + action.requestMethod, + action.successMessage, + action.indexNames + ); + }} + > + {action.buttonLabel} + + + ) : null} + {filter ? ( + + + filterChanged(filter)}>{filterLabel} + + + ) : null} + + ) : null}
diff --git a/x-pack/plugins/index_management/public/application/services/documentation.ts b/x-pack/plugins/index_management/public/application/services/documentation.ts index 58aba69351883..62b7defd78db1 100644 --- a/x-pack/plugins/index_management/public/application/services/documentation.ts +++ b/x-pack/plugins/index_management/public/application/services/documentation.ts @@ -55,6 +55,7 @@ class DocumentationService { private mappingSimilarity: string = ''; private mappingSourceFields: string = ''; private mappingSourceFieldsDisable: string = ''; + private mappingSyntheticSourceFields: string = ''; private mappingStore: string = ''; private mappingSubobjects: string = ''; private mappingTermVector: string = ''; @@ -115,6 +116,7 @@ class DocumentationService { this.mappingSimilarity = links.elasticsearch.mappingSimilarity; this.mappingSourceFields = links.elasticsearch.mappingSourceFields; this.mappingSourceFieldsDisable = links.elasticsearch.mappingSourceFieldsDisable; + this.mappingSyntheticSourceFields = links.elasticsearch.mappingSyntheticSourceFields; this.mappingStore = links.elasticsearch.mappingStore; this.mappingSubobjects = links.elasticsearch.mappingSubobjects; this.mappingTermVector = links.elasticsearch.mappingTermVector; @@ -215,6 +217,10 @@ class DocumentationService { return this.mappingSourceFieldsDisable; } + public getMappingSyntheticSourceFieldLink() { + return this.mappingSyntheticSourceFields; + } + public getNullValueLink() { return this.mappingNullValue; } diff --git a/x-pack/plugins/inference/README.md b/x-pack/plugins/inference/README.md index 935ae31bd6bc6..bba5b4cdcfc27 100644 --- a/x-pack/plugins/inference/README.md +++ b/x-pack/plugins/inference/README.md @@ -77,6 +77,25 @@ class MyPlugin { } ``` +### Binding common parameters + +It is also possible to bind a client to its configuration parameters, to avoid passing connectorId +to every call, for example, using the `bindTo` parameter when creating the client. + +```ts +const inferenceClient = myStartDeps.inference.getClient({ + request, + bindTo: { + connectorId: 'my-connector-id', + functionCalling: 'simulated', + } +}); + +const chatResponse = inferenceClient.chatComplete({ + messages: [{ role: MessageRole.User, content: 'Do something' }], +}); +``` + ## APIs ### `chatComplete` API: diff --git a/x-pack/plugins/inference/common/chat_complete/bind_chat_complete.test.ts b/x-pack/plugins/inference/common/chat_complete/bind_chat_complete.test.ts new file mode 100644 index 0000000000000..039fd0410d254 --- /dev/null +++ b/x-pack/plugins/inference/common/chat_complete/bind_chat_complete.test.ts @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + BoundChatCompleteOptions, + ChatCompleteAPI, + MessageRole, + UnboundChatCompleteOptions, +} from '@kbn/inference-common'; +import { bindChatComplete } from './bind_chat_complete'; + +describe('bindChatComplete', () => { + let chatComplete: ChatCompleteAPI & jest.MockedFn; + + beforeEach(() => { + chatComplete = jest.fn(); + }); + + it('calls chatComplete with both bound and unbound params', async () => { + const bound: BoundChatCompleteOptions = { + connectorId: 'some-id', + functionCalling: 'native', + }; + + const unbound: UnboundChatCompleteOptions = { + messages: [{ role: MessageRole.User, content: 'hello there' }], + }; + + const boundApi = bindChatComplete(chatComplete, bound); + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + ...bound, + ...unbound, + }); + }); + + it('forwards the response from chatComplete', async () => { + const expectedReturnValue = Symbol('something'); + chatComplete.mockResolvedValue(expectedReturnValue as any); + + const boundApi = bindChatComplete(chatComplete, { connectorId: 'my-connector' }); + + const result = await boundApi({ + messages: [{ role: MessageRole.User, content: 'hello there' }], + }); + + expect(result).toEqual(expectedReturnValue); + }); + + it('only passes the expected parameters from the bound param object', async () => { + const bound = { + connectorId: 'some-id', + functionCalling: 'native', + foo: 'bar', + } as BoundChatCompleteOptions; + + const unbound: UnboundChatCompleteOptions = { + messages: [{ role: MessageRole.User, content: 'hello there' }], + }; + + const boundApi = bindChatComplete(chatComplete, bound); + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + connectorId: 'some-id', + functionCalling: 'native', + messages: unbound.messages, + }); + }); + + it('ignores mutations of the bound parameters after binding', async () => { + const bound: BoundChatCompleteOptions = { + connectorId: 'some-id', + functionCalling: 'native', + }; + + const unbound: UnboundChatCompleteOptions = { + messages: [{ role: MessageRole.User, content: 'hello there' }], + }; + + const boundApi = bindChatComplete(chatComplete, bound); + + bound.connectorId = 'some-other-id'; + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + connectorId: 'some-id', + functionCalling: 'native', + messages: unbound.messages, + }); + }); + + it('does not allow overriding bound parameters with the unbound object', async () => { + const bound: BoundChatCompleteOptions = { + connectorId: 'some-id', + functionCalling: 'native', + }; + + const unbound = { + messages: [{ role: MessageRole.User, content: 'hello there' }], + connectorId: 'overridden', + } as UnboundChatCompleteOptions; + + const boundApi = bindChatComplete(chatComplete, bound); + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + connectorId: 'some-id', + functionCalling: 'native', + messages: unbound.messages, + }); + }); +}); diff --git a/x-pack/plugins/inference/common/chat_complete/bind_chat_complete.ts b/x-pack/plugins/inference/common/chat_complete/bind_chat_complete.ts new file mode 100644 index 0000000000000..3030dee641223 --- /dev/null +++ b/x-pack/plugins/inference/common/chat_complete/bind_chat_complete.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 type { + ChatCompleteAPI, + ChatCompleteOptions, + BoundChatCompleteAPI, + BoundChatCompleteOptions, + UnboundChatCompleteOptions, + ToolOptions, +} from '@kbn/inference-common'; + +/** + * Bind chatComplete to the provided parameters, + * returning a bound version of the API. + */ +export function bindChatComplete( + chatComplete: ChatCompleteAPI, + boundParams: BoundChatCompleteOptions +): BoundChatCompleteAPI; +export function bindChatComplete( + chatComplete: ChatCompleteAPI, + boundParams: BoundChatCompleteOptions +) { + const { connectorId, functionCalling } = boundParams; + return (unboundParams: UnboundChatCompleteOptions) => { + const params: ChatCompleteOptions = { + ...unboundParams, + connectorId, + functionCalling, + }; + return chatComplete(params); + }; +} diff --git a/x-pack/plugins/inference/common/chat_complete/index.ts b/x-pack/plugins/inference/common/chat_complete/index.ts new file mode 100644 index 0000000000000..9eaa850fc8195 --- /dev/null +++ b/x-pack/plugins/inference/common/chat_complete/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { bindChatComplete } from './bind_chat_complete'; diff --git a/x-pack/plugins/inference/common/index.ts b/x-pack/plugins/inference/common/index.ts index 19b24d53a389a..79433cbc71a68 100644 --- a/x-pack/plugins/inference/common/index.ts +++ b/x-pack/plugins/inference/common/index.ts @@ -12,6 +12,6 @@ export { export { generateFakeToolCallId } from './utils/generate_fake_tool_call_id'; -export { createOutputApi } from './create_output_api'; +export { createOutputApi } from './output'; export type { ChatCompleteRequestBody, GetConnectorsResponseBody } from './http_apis'; diff --git a/x-pack/plugins/inference/common/output/bind_output.test.ts b/x-pack/plugins/inference/common/output/bind_output.test.ts new file mode 100644 index 0000000000000..65741acbd8a3e --- /dev/null +++ b/x-pack/plugins/inference/common/output/bind_output.test.ts @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { BoundOutputOptions, OutputAPI, UnboundOutputOptions } from '@kbn/inference-common'; +import { bindOutput } from './bind_output'; + +describe('createScopedOutputAPI', () => { + let chatComplete: OutputAPI & jest.MockedFn; + + beforeEach(() => { + chatComplete = jest.fn(); + }); + + it('calls chatComplete with both bound and unbound params', async () => { + const bound: BoundOutputOptions = { + connectorId: 'some-id', + functionCalling: 'native', + }; + + const unbound: UnboundOutputOptions = { + id: 'foo', + input: 'hello there', + }; + + const boundApi = bindOutput(chatComplete, bound); + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + ...bound, + ...unbound, + }); + }); + + it('forwards the response from chatComplete', async () => { + const expectedReturnValue = Symbol('something'); + chatComplete.mockResolvedValue(expectedReturnValue as any); + + const boundApi = bindOutput(chatComplete, { connectorId: 'my-connector' }); + + const result = await boundApi({ + id: 'foo', + input: 'hello there', + }); + + expect(result).toEqual(expectedReturnValue); + }); + + it('only passes the expected parameters from the bound param object', async () => { + const bound = { + connectorId: 'some-id', + functionCalling: 'native', + foo: 'bar', + } as BoundOutputOptions; + + const unbound: UnboundOutputOptions = { + id: 'foo', + input: 'hello there', + }; + + const boundApi = bindOutput(chatComplete, bound); + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + connectorId: 'some-id', + functionCalling: 'native', + id: 'foo', + input: 'hello there', + }); + }); + + it('ignores mutations of the bound parameters after binding', async () => { + const bound: BoundOutputOptions = { + connectorId: 'some-id', + functionCalling: 'native', + }; + + const unbound: UnboundOutputOptions = { + id: 'foo', + input: 'hello there', + }; + + const boundApi = bindOutput(chatComplete, bound); + + bound.connectorId = 'some-other-id'; + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + connectorId: 'some-id', + functionCalling: 'native', + id: 'foo', + input: 'hello there', + }); + }); + + it('does not allow overriding bound parameters with the unbound object', async () => { + const bound: BoundOutputOptions = { + connectorId: 'some-id', + functionCalling: 'native', + }; + + const unbound = { + id: 'foo', + input: 'hello there', + connectorId: 'overridden', + } as UnboundOutputOptions; + + const boundApi = bindOutput(chatComplete, bound); + + await boundApi({ ...unbound }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith({ + connectorId: 'some-id', + functionCalling: 'native', + id: 'foo', + input: 'hello there', + }); + }); +}); diff --git a/x-pack/plugins/inference/common/output/bind_output.ts b/x-pack/plugins/inference/common/output/bind_output.ts new file mode 100644 index 0000000000000..45ac434d5ffd6 --- /dev/null +++ b/x-pack/plugins/inference/common/output/bind_output.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + OutputAPI, + OutputOptions, + BoundOutputAPI, + BoundOutputOptions, + UnboundOutputOptions, + ToolSchema, +} from '@kbn/inference-common'; + +/** + * Bind output to the provided parameters, + * returning a bound version of the API. + */ +export function bindOutput( + chatComplete: OutputAPI, + boundParams: BoundOutputOptions +): BoundOutputAPI; +export function bindOutput(chatComplete: OutputAPI, boundParams: BoundOutputOptions) { + const { connectorId, functionCalling } = boundParams; + return (unboundParams: UnboundOutputOptions) => { + const params: OutputOptions = { + ...unboundParams, + connectorId, + functionCalling, + }; + return chatComplete(params); + }; +} diff --git a/x-pack/plugins/inference/common/create_output_api.test.ts b/x-pack/plugins/inference/common/output/create_output_api.test.ts similarity index 100% rename from x-pack/plugins/inference/common/create_output_api.test.ts rename to x-pack/plugins/inference/common/output/create_output_api.test.ts diff --git a/x-pack/plugins/inference/common/create_output_api.ts b/x-pack/plugins/inference/common/output/create_output_api.ts similarity index 97% rename from x-pack/plugins/inference/common/create_output_api.ts rename to x-pack/plugins/inference/common/output/create_output_api.ts index e5dd2eeda2cbd..d263f733bf4ee 100644 --- a/x-pack/plugins/inference/common/create_output_api.ts +++ b/x-pack/plugins/inference/common/output/create_output_api.ts @@ -16,7 +16,7 @@ import { withoutTokenCountEvents, } from '@kbn/inference-common'; import { isObservable, map } from 'rxjs'; -import { ensureMultiTurn } from './utils/ensure_multi_turn'; +import { ensureMultiTurn } from '../utils/ensure_multi_turn'; export function createOutputApi(chatCompleteApi: ChatCompleteAPI): OutputAPI; export function createOutputApi(chatCompleteApi: ChatCompleteAPI) { diff --git a/x-pack/plugins/inference/common/output/index.ts b/x-pack/plugins/inference/common/output/index.ts new file mode 100644 index 0000000000000..4c6f053d6ed85 --- /dev/null +++ b/x-pack/plugins/inference/common/output/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { createOutputApi } from './create_output_api'; +export { bindOutput } from './bind_output'; diff --git a/x-pack/plugins/inference/public/plugin.tsx b/x-pack/plugins/inference/public/plugin.tsx index f1023bc9c2546..614c2107c0a06 100644 --- a/x-pack/plugins/inference/public/plugin.tsx +++ b/x-pack/plugins/inference/public/plugin.tsx @@ -7,7 +7,7 @@ import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; import type { Logger } from '@kbn/logging'; -import { createOutputApi } from '../common/create_output_api'; +import { createOutputApi } from '../common/output'; import type { GetConnectorsResponseBody } from '../common/http_apis'; import { createChatCompleteApi } from './chat_complete'; import type { diff --git a/x-pack/plugins/inference/scripts/util/kibana_client.ts b/x-pack/plugins/inference/scripts/util/kibana_client.ts index ad6c21cf4b248..ef6f1c4fdcdce 100644 --- a/x-pack/plugins/inference/scripts/util/kibana_client.ts +++ b/x-pack/plugins/inference/scripts/util/kibana_client.ts @@ -28,7 +28,7 @@ import { } from '@kbn/inference-common'; import type { ChatCompleteRequestBody } from '../../common/http_apis'; import type { InferenceConnector } from '../../common/connectors'; -import { createOutputApi } from '../../common/create_output_api'; +import { createOutputApi } from '../../common/output/create_output_api'; import { eventSourceStreamIntoObservable } from '../../server/util/event_source_stream_into_observable'; // eslint-disable-next-line spaced-comment diff --git a/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts b/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts index ff1bbc71a876d..2d0154313b632 100644 --- a/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts +++ b/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts @@ -21,17 +21,19 @@ function createOpenAIChunk({ delta, usage, }: { - delta: OpenAI.ChatCompletionChunk['choices'][number]['delta']; + delta?: OpenAI.ChatCompletionChunk['choices'][number]['delta']; usage?: OpenAI.ChatCompletionChunk['usage']; }): OpenAI.ChatCompletionChunk { return { - choices: [ - { - finish_reason: null, - index: 0, - delta, - }, - ], + choices: delta + ? [ + { + finish_reason: null, + index: 0, + delta, + }, + ] + : [], created: new Date().getTime(), id: v4(), model: 'gpt-4o', @@ -313,7 +315,7 @@ describe('openAIAdapter', () => { ]); }); - it('emits token events', async () => { + it('emits chunk events with tool calls', async () => { const response$ = openAIAdapter.chatComplete({ ...defaultArgs, messages: [ @@ -375,5 +377,55 @@ describe('openAIAdapter', () => { }, ]); }); + + it('emits token count events', async () => { + const response$ = openAIAdapter.chatComplete({ + ...defaultArgs, + messages: [ + { + role: MessageRole.User, + content: 'Hello', + }, + ], + }); + + source$.next( + createOpenAIChunk({ + delta: { + content: 'chunk', + }, + }) + ); + + source$.next( + createOpenAIChunk({ + usage: { + prompt_tokens: 50, + completion_tokens: 100, + total_tokens: 150, + }, + }) + ); + + source$.complete(); + + const allChunks = await lastValueFrom(response$.pipe(toArray())); + + expect(allChunks).toEqual([ + { + type: ChatCompletionEventType.ChatCompletionChunk, + content: 'chunk', + tool_calls: [], + }, + { + type: ChatCompletionEventType.ChatCompletionTokenCount, + tokens: { + prompt: 50, + completion: 100, + total: 150, + }, + }, + ]); + }); }); }); diff --git a/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.ts b/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.ts index 121ba96ab115a..fa412f335800d 100644 --- a/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.ts +++ b/x-pack/plugins/inference/server/chat_complete/adapters/openai/openai_adapter.ts @@ -5,7 +5,7 @@ * 2.0. */ -import OpenAI from 'openai'; +import type OpenAI from 'openai'; import type { ChatCompletionAssistantMessageParam, ChatCompletionMessageParam, @@ -13,22 +13,33 @@ import type { ChatCompletionToolMessageParam, ChatCompletionUserMessageParam, } from 'openai/resources'; -import { filter, from, map, switchMap, tap, throwError, identity } from 'rxjs'; -import { Readable, isReadable } from 'stream'; +import { + filter, + from, + identity, + map, + mergeMap, + Observable, + switchMap, + tap, + throwError, +} from 'rxjs'; +import { isReadable, Readable } from 'stream'; import { ChatCompletionChunkEvent, ChatCompletionEventType, + ChatCompletionTokenCountEvent, + createInferenceInternalError, Message, MessageRole, ToolOptions, - createInferenceInternalError, } from '@kbn/inference-common'; import { createTokenLimitReachedError } from '../../errors'; import { eventSourceStreamIntoObservable } from '../../../util/event_source_stream_into_observable'; import type { InferenceConnectorAdapter } from '../../types'; import { - wrapWithSimulatedFunctionCalling, parseInlineFunctionCalls, + wrapWithSimulatedFunctionCalling, } from '../../simulated_function_calling'; export const openAIAdapter: InferenceConnectorAdapter = { @@ -92,34 +103,57 @@ export const openAIAdapter: InferenceConnectorAdapter = { throw createTokenLimitReachedError(); } }), - filter( - (line): line is OpenAI.ChatCompletionChunk => - 'object' in line && line.object === 'chat.completion.chunk' && line.choices.length > 0 - ), - map((chunk): ChatCompletionChunkEvent => { - const delta = chunk.choices[0].delta; - - return { - type: ChatCompletionEventType.ChatCompletionChunk, - content: delta.content ?? '', - tool_calls: - delta.tool_calls?.map((toolCall) => { - return { - function: { - name: toolCall.function?.name ?? '', - arguments: toolCall.function?.arguments ?? '', - }, - toolCallId: toolCall.id ?? '', - index: toolCall.index, - }; - }) ?? [], - }; + filter((line): line is OpenAI.ChatCompletionChunk => { + return 'object' in line && line.object === 'chat.completion.chunk'; + }), + mergeMap((chunk): Observable => { + const events: Array = []; + if (chunk.usage) { + events.push(tokenCountFromOpenAI(chunk.usage)); + } + if (chunk.choices?.length) { + events.push(chunkFromOpenAI(chunk)); + } + return from(events); }), simulatedFunctionCalling ? parseInlineFunctionCalls({ logger }) : identity ); }, }; +function chunkFromOpenAI(chunk: OpenAI.ChatCompletionChunk): ChatCompletionChunkEvent { + const delta = chunk.choices[0].delta; + + return { + type: ChatCompletionEventType.ChatCompletionChunk, + content: delta.content ?? '', + tool_calls: + delta.tool_calls?.map((toolCall) => { + return { + function: { + name: toolCall.function?.name ?? '', + arguments: toolCall.function?.arguments ?? '', + }, + toolCallId: toolCall.id ?? '', + index: toolCall.index, + }; + }) ?? [], + }; +} + +function tokenCountFromOpenAI( + completionUsage: OpenAI.CompletionUsage +): ChatCompletionTokenCountEvent { + return { + type: ChatCompletionEventType.ChatCompletionTokenCount, + tokens: { + completion: completionUsage.completion_tokens, + prompt: completionUsage.prompt_tokens, + total: completionUsage.total_tokens, + }, + }; +} + function toolsToOpenAI(tools: ToolOptions['tools']): OpenAI.ChatCompletionCreateParams['tools'] { return tools ? Object.entries(tools).map(([toolName, { description, schema }]) => { diff --git a/x-pack/plugins/inference/server/chat_complete/api.ts b/x-pack/plugins/inference/server/chat_complete/api.ts index cf325e72ddf3a..13b1c8d87270c 100644 --- a/x-pack/plugins/inference/server/chat_complete/api.ts +++ b/x-pack/plugins/inference/server/chat_complete/api.ts @@ -16,14 +16,14 @@ import { type ToolOptions, ChatCompleteOptions, } from '@kbn/inference-common'; -import type { InferenceStartDependencies } from '../types'; +import type { PluginStartContract as ActionsPluginStart } from '@kbn/actions-plugin/server'; import { getConnectorById } from '../util/get_connector_by_id'; import { getInferenceAdapter } from './adapters'; import { createInferenceExecutor, chunksIntoMessage, streamToResponse } from './utils'; interface CreateChatCompleteApiOptions { request: KibanaRequest; - actions: InferenceStartDependencies['actions']; + actions: ActionsPluginStart; logger: Logger; } diff --git a/x-pack/plugins/inference/server/index.ts b/x-pack/plugins/inference/server/index.ts index 60ce870020feb..128e90a58308d 100644 --- a/x-pack/plugins/inference/server/index.ts +++ b/x-pack/plugins/inference/server/index.ts @@ -15,7 +15,7 @@ import type { } from './types'; import { InferencePlugin } from './plugin'; -export type { InferenceClient } from './types'; +export type { InferenceClient, BoundInferenceClient } from './inference_client'; export type { InferenceServerSetup, InferenceServerStart }; export { naturalLanguageToEsql } from './tasks/nl_to_esql'; diff --git a/x-pack/plugins/inference/server/inference_client/bind_client.ts b/x-pack/plugins/inference/server/inference_client/bind_client.ts new file mode 100644 index 0000000000000..4600ed1364ed3 --- /dev/null +++ b/x-pack/plugins/inference/server/inference_client/bind_client.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { BoundChatCompleteOptions } from '@kbn/inference-common'; +import { bindChatComplete } from '../../common/chat_complete'; +import { bindOutput } from '../../common/output'; +import type { InferenceClient, BoundInferenceClient } from './types'; + +export const bindClient = ( + unboundClient: InferenceClient, + boundParams: BoundChatCompleteOptions +): BoundInferenceClient => { + return { + ...unboundClient, + chatComplete: bindChatComplete(unboundClient.chatComplete, boundParams), + output: bindOutput(unboundClient.output, boundParams), + }; +}; diff --git a/x-pack/plugins/inference/server/inference_client/create_client.test.ts b/x-pack/plugins/inference/server/inference_client/create_client.test.ts new file mode 100644 index 0000000000000..98f5502cdfa55 --- /dev/null +++ b/x-pack/plugins/inference/server/inference_client/create_client.test.ts @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { createClient } from './create_client'; +import { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; +import { httpServerMock } from '@kbn/core/server/mocks'; +import { actionsMock } from '@kbn/actions-plugin/server/mocks'; + +jest.mock('./inference_client'); +jest.mock('./bind_client'); +import { createInferenceClient } from './inference_client'; +import { bindClient } from './bind_client'; + +const bindClientMock = bindClient as jest.MockedFn; +const createInferenceClientMock = createInferenceClient as jest.MockedFn< + typeof createInferenceClient +>; + +describe('createClient', () => { + let logger: MockedLogger; + let actions: ReturnType; + let request: ReturnType; + + beforeEach(() => { + logger = loggerMock.create(); + actions = actionsMock.createStart(); + request = httpServerMock.createKibanaRequest(); + }); + + afterEach(() => { + bindClientMock.mockReset(); + createInferenceClientMock.mockReset(); + }); + + describe('when `bindTo` is not specified', () => { + it('calls createInferenceClient and return the client', () => { + const expectedResult = Symbol('expected') as any; + createInferenceClientMock.mockReturnValue(expectedResult); + + const result = createClient({ + request, + actions, + logger, + }); + + expect(createInferenceClientMock).toHaveBeenCalledTimes(1); + expect(createInferenceClientMock).toHaveBeenCalledWith({ request, actions, logger }); + + expect(bindClientMock).not.toHaveBeenCalled(); + + expect(result).toBe(expectedResult); + }); + + it('return a client with the expected type', async () => { + createInferenceClientMock.mockReturnValue({ + chatComplete: jest.fn(), + } as any); + + const client = createClient({ + request, + actions, + logger, + }); + + // type check on client.chatComplete + await client.chatComplete({ + messages: [], + connectorId: '.foo', + }); + }); + }); + + describe('when `bindTo` is specified', () => { + it('calls createInferenceClient and bindClient and forward the expected value', () => { + const createInferenceResult = Symbol('createInferenceResult') as any; + createInferenceClientMock.mockReturnValue(createInferenceResult); + + const bindClientResult = Symbol('bindClientResult') as any; + bindClientMock.mockReturnValue(bindClientResult); + + const result = createClient({ + request, + actions, + logger, + bindTo: { + connectorId: '.my-connector', + }, + }); + + expect(createInferenceClientMock).toHaveBeenCalledTimes(1); + expect(createInferenceClientMock).toHaveBeenCalledWith({ + request, + actions, + logger, + }); + + expect(bindClientMock).toHaveBeenCalledTimes(1); + expect(bindClientMock).toHaveBeenCalledWith(createInferenceResult, { + connectorId: '.my-connector', + }); + + expect(result).toBe(bindClientResult); + }); + + it('return a client with the expected type', async () => { + bindClientMock.mockReturnValue({ + chatComplete: jest.fn(), + } as any); + + const client = createClient({ + request, + actions, + logger, + bindTo: { + connectorId: '.foo', + }, + }); + + // type check on client.chatComplete + await client.chatComplete({ + messages: [], + }); + }); + }); +}); diff --git a/x-pack/plugins/inference/server/inference_client/create_client.ts b/x-pack/plugins/inference/server/inference_client/create_client.ts new file mode 100644 index 0000000000000..3507dd7fef8a8 --- /dev/null +++ b/x-pack/plugins/inference/server/inference_client/create_client.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 type { Logger } from '@kbn/logging'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { PluginStartContract as ActionsPluginStart } from '@kbn/actions-plugin/server'; +import type { BoundChatCompleteOptions } from '@kbn/inference-common'; +import type { BoundInferenceClient, InferenceClient } from './types'; +import { createInferenceClient } from './inference_client'; +import { bindClient } from './bind_client'; + +interface UnboundOptions { + request: KibanaRequest; + actions: ActionsPluginStart; + logger: Logger; +} + +interface BoundOptions extends UnboundOptions { + bindTo: BoundChatCompleteOptions; +} + +export function createClient(options: UnboundOptions): InferenceClient; +export function createClient(options: BoundOptions): BoundInferenceClient; +export function createClient( + options: UnboundOptions | BoundOptions +): BoundInferenceClient | InferenceClient { + const { actions, request, logger } = options; + const client = createInferenceClient({ request, actions, logger }); + if ('bindTo' in options) { + return bindClient(client, options.bindTo); + } else { + return client; + } +} diff --git a/x-pack/plugins/inference/server/inference_client/index.ts b/x-pack/plugins/inference/server/inference_client/index.ts index 03da0e3da200f..9d56ebe7ff61a 100644 --- a/x-pack/plugins/inference/server/inference_client/index.ts +++ b/x-pack/plugins/inference/server/inference_client/index.ts @@ -5,28 +5,5 @@ * 2.0. */ -import type { Logger } from '@kbn/logging'; -import type { KibanaRequest } from '@kbn/core-http-server'; -import type { InferenceClient, InferenceStartDependencies } from '../types'; -import { createChatCompleteApi } from '../chat_complete'; -import { createOutputApi } from '../../common/create_output_api'; -import { getConnectorById } from '../util/get_connector_by_id'; - -export function createInferenceClient({ - request, - actions, - logger, -}: { request: KibanaRequest; logger: Logger } & Pick< - InferenceStartDependencies, - 'actions' ->): InferenceClient { - const chatComplete = createChatCompleteApi({ request, actions, logger }); - return { - chatComplete, - output: createOutputApi(chatComplete), - getConnectorById: async (connectorId: string) => { - const actionsClient = await actions.getActionsClientWithRequest(request); - return await getConnectorById({ connectorId, actionsClient }); - }, - }; -} +export { createClient } from './create_client'; +export type { InferenceClient, BoundInferenceClient } from './types'; diff --git a/x-pack/plugins/inference/server/inference_client/inference_client.ts b/x-pack/plugins/inference/server/inference_client/inference_client.ts new file mode 100644 index 0000000000000..f4c64ebdcce54 --- /dev/null +++ b/x-pack/plugins/inference/server/inference_client/inference_client.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Logger } from '@kbn/logging'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { PluginStartContract as ActionsPluginStart } from '@kbn/actions-plugin/server'; +import type { InferenceClient } from './types'; +import { createChatCompleteApi } from '../chat_complete'; +import { createOutputApi } from '../../common/output/create_output_api'; +import { getConnectorById } from '../util/get_connector_by_id'; + +export function createInferenceClient({ + request, + actions, + logger, +}: { + request: KibanaRequest; + logger: Logger; + actions: ActionsPluginStart; +}): InferenceClient { + const chatComplete = createChatCompleteApi({ request, actions, logger }); + return { + chatComplete, + output: createOutputApi(chatComplete), + getConnectorById: async (connectorId: string) => { + const actionsClient = await actions.getActionsClientWithRequest(request); + return await getConnectorById({ connectorId, actionsClient }); + }, + }; +} diff --git a/x-pack/plugins/inference/server/inference_client/types.ts b/x-pack/plugins/inference/server/inference_client/types.ts new file mode 100644 index 0000000000000..193ce83f6d7b6 --- /dev/null +++ b/x-pack/plugins/inference/server/inference_client/types.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + BoundChatCompleteAPI, + ChatCompleteAPI, + BoundOutputAPI, + OutputAPI, +} from '@kbn/inference-common'; +import type { InferenceConnector } from '../../common/connectors'; + +/** + * An inference client, scoped to a request, that can be used to interact with LLMs. + */ +export interface InferenceClient { + /** + * `chatComplete` requests the LLM to generate a response to + * a prompt or conversation, which might be plain text + * or a tool call, or a combination of both. + */ + chatComplete: ChatCompleteAPI; + /** + * `output` asks the LLM to generate a structured (JSON) + * response based on a schema and a prompt or conversation. + */ + output: OutputAPI; + /** + * `getConnectorById` returns an inference connector by id. + * Non-inference connectors will throw an error. + */ + getConnectorById: (id: string) => Promise; +} + +/** + * A version of the {@link InferenceClient} that is pre-bound to a set of parameters. + */ +export interface BoundInferenceClient { + /** + * `chatComplete` requests the LLM to generate a response to + * a prompt or conversation, which might be plain text + * or a tool call, or a combination of both. + */ + chatComplete: BoundChatCompleteAPI; + /** + * `output` asks the LLM to generate a structured (JSON) + * response based on a schema and a prompt or conversation. + */ + output: BoundOutputAPI; + /** + * `getConnectorById` returns an inference connector by id. + * Non-inference connectors will throw an error. + */ + getConnectorById: (id: string) => Promise; +} diff --git a/x-pack/plugins/inference/server/plugin.ts b/x-pack/plugins/inference/server/plugin.ts index 2b1a7be0a165c..0f7090f483339 100644 --- a/x-pack/plugins/inference/server/plugin.ts +++ b/x-pack/plugins/inference/server/plugin.ts @@ -7,10 +7,16 @@ import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/server'; import type { Logger } from '@kbn/logging'; -import { createInferenceClient } from './inference_client'; +import { + type BoundInferenceClient, + createClient as createInferenceClient, + type InferenceClient, +} from './inference_client'; import { registerRoutes } from './routes'; import type { InferenceConfig } from './config'; -import type { +import { + InferenceBoundClientCreateOptions, + InferenceClientCreateOptions, InferenceServerSetup, InferenceServerStart, InferenceSetupDependencies, @@ -48,12 +54,12 @@ export class InferencePlugin start(core: CoreStart, pluginsStart: InferenceStartDependencies): InferenceServerStart { return { - getClient: ({ request }) => { + getClient: (options: T) => { return createInferenceClient({ - request, + ...options, actions: pluginsStart.actions, logger: this.logger.get('client'), - }); + }) as T extends InferenceBoundClientCreateOptions ? BoundInferenceClient : InferenceClient; }, }; } diff --git a/x-pack/plugins/inference/server/routes/chat_complete.ts b/x-pack/plugins/inference/server/routes/chat_complete.ts index e4e078e58c15a..b363c88352994 100644 --- a/x-pack/plugins/inference/server/routes/chat_complete.ts +++ b/x-pack/plugins/inference/server/routes/chat_complete.ts @@ -15,7 +15,7 @@ import type { } from '@kbn/core/server'; import { MessageRole, ToolCall, ToolChoiceType } from '@kbn/inference-common'; import type { ChatCompleteRequestBody } from '../../common/http_apis'; -import { createInferenceClient } from '../inference_client'; +import { createClient as createInferenceClient } from '../inference_client'; import { InferenceServerStart, InferenceStartDependencies } from '../types'; import { observableIntoEventSourceStream } from '../util/observable_into_event_source_stream'; diff --git a/x-pack/plugins/inference/server/tasks/nl_to_esql/types.ts b/x-pack/plugins/inference/server/tasks/nl_to_esql/types.ts index ce45d9a15e4b3..db3ac3b493481 100644 --- a/x-pack/plugins/inference/server/tasks/nl_to_esql/types.ts +++ b/x-pack/plugins/inference/server/tasks/nl_to_esql/types.ts @@ -14,7 +14,7 @@ import type { ToolOptions, OutputCompleteEvent, } from '@kbn/inference-common'; -import type { InferenceClient } from '../../types'; +import type { InferenceClient } from '../../inference_client'; export type NlToEsqlTaskEvent = | OutputCompleteEvent< diff --git a/x-pack/plugins/inference/server/types.ts b/x-pack/plugins/inference/server/types.ts index f538448372e36..8d6d1413f306a 100644 --- a/x-pack/plugins/inference/server/types.ts +++ b/x-pack/plugins/inference/server/types.ts @@ -10,8 +10,8 @@ import type { PluginSetupContract as ActionsPluginSetup, } from '@kbn/actions-plugin/server'; import type { KibanaRequest } from '@kbn/core-http-server'; -import { ChatCompleteAPI, OutputAPI } from '@kbn/inference-common'; -import { InferenceConnector } from '../common/connectors'; +import type { BoundChatCompleteOptions } from '@kbn/inference-common'; +import type { InferenceClient, BoundInferenceClient } from './inference_client'; /* eslint-disable @typescript-eslint/no-empty-interface*/ @@ -23,37 +23,74 @@ export interface InferenceStartDependencies { actions: ActionsPluginStart; } +/** + * Setup contract of the inference plugin. + */ export interface InferenceServerSetup {} -export interface InferenceClient { - /** - * `chatComplete` requests the LLM to generate a response to - * a prompt or conversation, which might be plain text - * or a tool call, or a combination of both. - */ - chatComplete: ChatCompleteAPI; +/** + * Options to create an inference client using the {@link InferenceServerStart.getClient} API. + */ +export interface InferenceUnboundClientCreateOptions { /** - * `output` asks the LLM to generate a structured (JSON) - * response based on a schema and a prompt or conversation. + * The request to scope the client to. */ - output: OutputAPI; + request: KibanaRequest; +} + +/** + * Options to create a bound inference client using the {@link InferenceServerStart.getClient} API. + */ +export interface InferenceBoundClientCreateOptions extends InferenceUnboundClientCreateOptions { /** - * `getConnectorById` returns an inference connector by id. - * Non-inference connectors will throw an error. + * The parameters to bind the client to. */ - getConnectorById: (id: string) => Promise; + bindTo: BoundChatCompleteOptions; } -interface InferenceClientCreateOptions { - request: KibanaRequest; -} +/** + * Options to create an inference client using the {@link InferenceServerStart.getClient} API. + */ +export type InferenceClientCreateOptions = + | InferenceUnboundClientCreateOptions + | InferenceBoundClientCreateOptions; +/** + * Start contract of the inference plugin, exposing APIs to interact with LLMs. + */ export interface InferenceServerStart { /** - * Creates an inference client, scoped to a request. + * Creates an {@link InferenceClient}, scoped to a request. + * + * @example + * ```ts + * const inferenceClient = myStartDeps.inference.getClient({ request }); + * + * const chatResponse = inferenceClient.chatComplete({ + * connectorId: 'my-connector-id', + * messages: [{ role: MessageRole.User, content: 'Do something' }], + * }); + * ``` + * + * It is also possible to bind a client to its configuration parameters, to avoid passing connectorId + * to every call, for example. Defining the `bindTo` parameter will return a {@link BoundInferenceClient} + * + * @example + * ```ts + * const inferenceClient = myStartDeps.inference.getClient({ + * request, + * bindTo: { + * connectorId: 'my-connector-id', + * functionCalling: 'simulated', + * } + * }); * - * @param options {@link InferenceClientCreateOptions} - * @returns {@link InferenceClient} + * const chatResponse = inferenceClient.chatComplete({ + * messages: [{ role: MessageRole.User, content: 'Do something' }], + * }); + * ``` */ - getClient: (options: InferenceClientCreateOptions) => InferenceClient; + getClient: ( + options: T + ) => T extends InferenceBoundClientCreateOptions ? BoundInferenceClient : InferenceClient; } diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx index b6d115cc61275..4d4e244ac25a4 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx @@ -902,6 +902,21 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = { }, }), }, + terminate: { + category: processorCategories.PIPELINE_HANDLING, + docLinkPath: '/terminate-processor.html', + label: i18n.translate('xpack.ingestPipelines.processors.label.terminate', { + defaultMessage: 'Terminate', + }), + typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.terminate', { + defaultMessage: + 'Terminates the current ingest pipeline, causing no further processors to be run.', + }), + getDefaultDescription: () => + i18n.translate('xpack.ingestPipelines.processors.defaultDescription.terminate', { + defaultMessage: 'Terminates the current pipeline', + }), + }, trim: { category: processorCategories.DATA_TRANSFORMATION, FieldsComponent: Trim, diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx index 25ffef0456e42..9154a2c77bf4a 100644 --- a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx @@ -24,7 +24,7 @@ import { ALERT_STATUS, } from '@kbn/rule-data-utils'; import type { FieldFormatsRegistry } from '@kbn/field-formats-plugin/common'; -import { APP_ID as CASE_APP_ID, FEATURE_ID as CASE_GENERAL_ID } from '@kbn/cases-plugin/common'; +import { APP_ID as CASE_APP_ID, FEATURE_ID_V2 as CASE_GENERAL_ID } from '@kbn/cases-plugin/common'; import { MANAGEMENT_APP_ID } from '@kbn/deeplinks-management/constants'; import { getAlertFlyout } from './use_alerts_flyout'; import { diff --git a/x-pack/plugins/ml/public/application/_index.scss b/x-pack/plugins/ml/public/application/_index.scss index 029a422afaa9f..91201434b20b1 100644 --- a/x-pack/plugins/ml/public/application/_index.scss +++ b/x-pack/plugins/ml/public/application/_index.scss @@ -11,7 +11,6 @@ @import 'components/annotations/annotation_description_list/index'; // SASSTODO: This file overwrites EUI directly @import 'components/anomalies_table/index'; // SASSTODO: This file overwrites EUI directly @import 'components/entity_cell/index'; - @import 'components/influencers_list/index'; @import 'components/job_selector/index'; @import 'components/rule_editor/index'; // SASSTODO: This file overwrites EUI directly diff --git a/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx b/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx index d24b5ab8498b0..d06c46cc6f71e 100644 --- a/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx +++ b/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx @@ -59,6 +59,7 @@ export const LogRateAnalysisPage: FC = () => { 'uiSettings', 'unifiedSearch', 'observabilityAIAssistant', + 'embeddable', ]), }} /> diff --git a/x-pack/plugins/ml/public/application/components/influencers_list/_index.scss b/x-pack/plugins/ml/public/application/components/influencers_list/_index.scss deleted file mode 100644 index 90ff743d162f0..0000000000000 --- a/x-pack/plugins/ml/public/application/components/influencers_list/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'influencers_list'; \ No newline at end of file diff --git a/x-pack/plugins/ml/public/application/components/influencers_list/_influencers_list.scss b/x-pack/plugins/ml/public/application/components/influencers_list/_influencers_list.scss deleted file mode 100644 index 1b091e4046c50..0000000000000 --- a/x-pack/plugins/ml/public/application/components/influencers_list/_influencers_list.scss +++ /dev/null @@ -1,109 +0,0 @@ -.ml-influencers-list { - line-height: 1.45; // SASSTODO: Calc proper value - - .field-label { - font-size: $euiFontSizeXS; - text-align: left; - max-height: $euiFontSizeS; - max-width: calc(100% - 102px); // SASSTODO: Calc proper value - - .field-value { - @include euiTextTruncate; - display: inline-block; - vertical-align: bottom; - } - } - - .progress { - display: inline-block; - width: calc(100% - 34px); // SASSTODO: Calc proper value - height: 22px; - min-width: 70px; - margin-bottom: 0; - color: $euiColorDarkShade; - background-color: transparent; - - .progress-bar-holder { - width: calc(100% - 28px); // SASSTODO: Calc proper value - } - - .progress-bar { - height: calc($euiSizeXS / 2); - margin-top: $euiSizeM; - text-align: right; - line-height: 18px; // SASSTODO: Calc proper value - display: inline-block; - transition: none; - } - } - - // SASSTODO: This range of color is too large, needs to be rewritten and variablized - .progress.critical { - .progress-bar { - background-color: $mlColorCritical; - } - - .score-label { - border-color: $mlColorCritical; - } - } - - .progress.major { - .progress-bar { - background-color: $mlColorMajor; - } - - .score-label { - border-color: $mlColorMajor; - } - } - - .progress.minor { - .progress-bar { - background-color: $mlColorMinor; - } - - .score-label { - border-color: $mlColorMinor; - } - } - - .progress.warning { - .progress-bar { - background-color: $mlColorWarning; - } - - .score-label { - border-color: $mlColorWarning; - } - } - - .score-label { - text-align: center; - line-height: 14px; - white-space: nowrap; - font-size: $euiFontSizeXS; - display: inline; - margin-left: $euiSizeXS; - } - - // SASSTODO: Brittle sizing - .total-score-label { - width: $euiSizeXL; - vertical-align: top; - text-align: center; - color: $euiColorDarkShade; - font-size: 11px; - line-height: 14px; - border-radius: $euiBorderRadius; - padding: calc($euiSizeXS / 2); - margin-top: $euiSizeXS; - display: inline-block; - border: $euiBorderThin; - } -} - -// SASSTODO: Can .eui-textBreakAll -.ml-influencers-list-tooltip { - word-break: break-all; -} diff --git a/x-pack/plugins/ml/public/application/components/influencers_list/influencers_list.tsx b/x-pack/plugins/ml/public/application/components/influencers_list/influencers_list.tsx index 39556dfe6a0f4..35f3bb83ebb10 100644 --- a/x-pack/plugins/ml/public/application/components/influencers_list/influencers_list.tsx +++ b/x-pack/plugins/ml/public/application/components/influencers_list/influencers_list.tsx @@ -19,6 +19,7 @@ import { getSeverity, getFormattedSeverityScore } from '@kbn/ml-anomaly-utils'; import { abbreviateWholeNumber } from '../../formatters/abbreviate_whole_number'; import type { EntityCellFilter } from '../entity_cell'; import { EntityCell } from '../entity_cell'; +import { useInfluencersListStyles } from './influencers_list_styles'; export interface InfluencerValueData { influencerFieldValue: string; @@ -65,6 +66,7 @@ function getTooltipContent(maxScoreLabel: string, totalScoreLabel: string) { } const Influencer: FC = ({ influencerFieldName, influencerFilter, valueData }) => { + const styles = useInfluencersListStyles(); const maxScore = Math.floor(valueData.maxAnomalyScore); const maxScoreLabel = getFormattedSeverityScore(valueData.maxAnomalyScore); const severity = getSeverity(maxScore); @@ -73,29 +75,25 @@ const Influencer: FC = ({ influencerFieldName, influencerFilter // Ensure the bar has some width for 0 scores. const barScore = maxScore !== 0 ? maxScore : 1; - const barStyle = { - width: `${barScore}%`, - }; const tooltipContent = getTooltipContent(maxScoreLabel, totalScoreLabel); return (
-
+
-
-
-
+
+
+
-
+
@@ -103,10 +101,9 @@ const Influencer: FC = ({ influencerFieldName, influencerFilter
-
+
@@ -145,12 +142,14 @@ const InfluencersByName: FC = ({ }; export const InfluencersList: FC = ({ influencers, influencerFilter }) => { + const styles = useInfluencersListStyles(); + if (influencers === undefined || Object.keys(influencers).length === 0) { return ( - + - +

= ({ influencers, influen /> )); - return
{influencersByName}
; + return
{influencersByName}
; }; diff --git a/x-pack/plugins/ml/public/application/components/influencers_list/influencers_list_styles.ts b/x-pack/plugins/ml/public/application/components/influencers_list/influencers_list_styles.ts new file mode 100644 index 0000000000000..5a0732ceb8d70 --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/influencers_list/influencers_list_styles.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { css } from '@emotion/react'; +import { useCurrentEuiThemeVars } from '@kbn/ml-kibana-theme'; +import { mlColors } from '../../styles'; +import { useMlKibana } from '../../contexts/kibana'; + +export const useInfluencersListStyles = () => { + const { + services: { theme }, + } = useMlKibana(); + const { euiTheme } = useCurrentEuiThemeVars(theme); + + return { + influencersList: css({ + lineHeight: 1.45, + }), + fieldLabel: css({ + fontSize: euiTheme.euiFontSizeXS, + textAlign: 'left', + maxHeight: euiTheme.euiFontSizeS, + maxWidth: 'calc(100% - 102px)', + }), + progress: css({ + display: 'inline-block', + width: 'calc(100% - 34px)', + height: '22px', + minWidth: '70px', + marginBottom: 0, + color: euiTheme.euiColorDarkShade, + backgroundColor: 'transparent', + }), + progressBarHolder: css({ + width: `calc(100% - 28px)`, + }), + progressBar: (severity: string, barScore: number) => + css({ + height: `calc(${euiTheme.euiSizeXS} / 2)`, + float: 'left', + marginTop: euiTheme.euiSizeM, + textAlign: 'right', + lineHeight: '18px', + display: 'inline-block', + transition: 'none', + width: `${barScore}%`, + backgroundColor: + severity === 'critical' + ? mlColors.critical + : severity === 'major' + ? mlColors.major + : severity === 'minor' + ? mlColors.minor + : mlColors.warning, + }), + scoreLabel: (severity: string) => + css({ + textAlign: 'center', + lineHeight: '14px', + whiteSpace: 'nowrap', + fontSize: euiTheme.euiFontSizeXS, + marginLeft: euiTheme.euiSizeXS, + display: 'inline', + borderColor: + severity === 'critical' + ? mlColors.critical + : severity === 'major' + ? mlColors.major + : severity === 'minor' + ? mlColors.minor + : mlColors.warning, + }), + totalScoreLabel: css({ + width: euiTheme.euiSizeXL, + verticalAlign: 'top', + textAlign: 'center', + color: euiTheme.euiColorDarkShade, + fontSize: '11px', + lineHeight: '14px', + borderRadius: euiTheme.euiBorderRadius, + padding: `calc(${euiTheme.euiSizeXS} / 2)`, + display: 'inline-block', + border: euiTheme.euiBorderThin, + }), + }; +}; diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts index 6a65e6126ff22..1dff57cef6602 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts @@ -72,10 +72,7 @@ export function registerAssistantFunctions({ ruleDataClient, plugins, getApmIndices: async () => { - const coreContext = await resources.context.core; - const apmIndices = await plugins.apmDataAccess.setup.getApmIndices( - coreContext.savedObjects.client - ); + const apmIndices = await plugins.apmDataAccess.setup.getApmIndices(); return apmIndices; }, }; diff --git a/x-pack/plugins/observability_solution/apm/server/deprecations/__snapshots__/apm_user_role.test.ts.snap b/x-pack/plugins/observability_solution/apm/server/deprecations/__snapshots__/apm_user_role.test.ts.snap new file mode 100644 index 0000000000000..4d200ed6f1c63 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/deprecations/__snapshots__/apm_user_role.test.ts.snap @@ -0,0 +1,37 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`apm_user deprecation roles mapped to a removed role logs a deprecation when a role was found that maps to the removed apm_user role 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Go to Management > Security > Role Mappings to find roles mappings with the \\"apm_user\\" role.", + "Remove the \\"apm_user\\" role from all role mappings and add the built-in \\"viewer\\" role", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/main/kibana-privileges.html", + "level": "critical", + "message": "The \\"apm_user\\" role has been deprecated. Remove the \\"apm_user\\" role from affected role mappings in this cluster including: dungeon_master", + "title": "Check for role mappings using the deprecated \\"apm_user\\" role", + }, +] +`; + +exports[`apm_user deprecation users assigned to a removed role logs a deprecation when a user was found with a removed apm_user role 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Go to Management > Security > Users to find users with the \\"apm_user\\" role.", + "Remove the \\"apm_user\\" role from all users and add the built-in \\"viewer\\" role.", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/main/kibana-privileges.html", + "level": "critical", + "message": "The \\"apm_user\\" role has been deprecated. Remove the \\"apm_user\\" role from affected users in this cluster including: foo", + "title": "Check for users assigned the deprecated \\"apm_user\\" role", + }, +] +`; diff --git a/x-pack/plugins/observability_solution/apm/server/deprecations/apm_user_role.test.ts b/x-pack/plugins/observability_solution/apm/server/deprecations/apm_user_role.test.ts new file mode 100644 index 0000000000000..c7b48846520bd --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/deprecations/apm_user_role.test.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 { GetDeprecationsContext, IScopedClusterClient, CoreSetup } from '@kbn/core/server'; +import { elasticsearchServiceMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { getDeprecationsInfo } from './apm_user_role'; +import { SecurityPluginSetup } from '@kbn/security-plugin/server'; + +let context: GetDeprecationsContext; +let esClient: jest.Mocked; +const core = { docLinks: { version: 'main' } } as unknown as CoreSetup; +const logger = loggingSystemMock.createLogger(); +const security = { license: { isEnabled: () => true } } as unknown as SecurityPluginSetup; + +describe('apm_user deprecation', () => { + beforeEach(async () => { + esClient = elasticsearchServiceMock.createScopedClusterClient(); + esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ + xyz: { username: 'normal_user', roles: ['data_analyst'] }, + }); + esClient.asCurrentUser.security.getRoleMapping = jest.fn().mockResolvedValue({}); + + context = { esClient } as unknown as GetDeprecationsContext; + }); + + test('logs no deprecations when setup has no issues', async () => { + expect(await getDeprecationsInfo(context, core, { logger, security })).toMatchInlineSnapshot( + `Array []` + ); + }); + + describe('users assigned to a removed role', () => { + test('logs a deprecation when a user was found with a removed apm_user role', async () => { + esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ + foo: { + username: 'foo', + roles: ['kibana_admin', 'apm_user'], + }, + }); + + expect(await getDeprecationsInfo(context, core, { logger, security })).toMatchSnapshot(); + }); + }); + + describe('roles mapped to a removed role', () => { + test('logs a deprecation when a role was found that maps to the removed apm_user role', async () => { + esClient.asCurrentUser.security.getRoleMapping = jest + .fn() + .mockResolvedValue({ dungeon_master: { roles: ['apm_user'] } }); + + expect(await getDeprecationsInfo(context, core, { logger, security })).toMatchSnapshot(); + }); + }); + + describe('check deprecations when security is disabled', () => { + test('logs no deprecations', async () => { + expect( + await getDeprecationsInfo(context, core, { logger, security: undefined }) + ).toMatchInlineSnapshot(`Array []`); + }); + }); + + it('insufficient permissions', async () => { + const permissionsError = new Error('you shall not pass'); + (permissionsError as unknown as { statusCode: number }).statusCode = 403; + esClient.asCurrentUser.security.getUser = jest.fn().mockRejectedValue(permissionsError); + esClient.asCurrentUser.security.getRoleMapping = jest.fn().mockRejectedValue(permissionsError); + + expect(await getDeprecationsInfo(context, core, { logger, security })).toMatchInlineSnapshot(` + Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Make sure you have a \\"manage_security\\" cluster privilege assigned.", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/main/xpack-security.html#_required_permissions_7", + "level": "fetch_error", + "message": "You do not have enough permissions to fix this deprecation.", + "title": "Check for users assigned the deprecated \\"apm_user\\" role", + }, + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Make sure you have a \\"manage_security\\" cluster privilege assigned.", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/main/xpack-security.html#_required_permissions_7", + "level": "fetch_error", + "message": "You do not have enough permissions to fix this deprecation.", + "title": "Check for role mappings using the deprecated \\"apm_user\\" role", + }, + ] + `); + }); +}); diff --git a/x-pack/plugins/observability_solution/apm/server/deprecations/apm_user_role.ts b/x-pack/plugins/observability_solution/apm/server/deprecations/apm_user_role.ts new file mode 100644 index 0000000000000..d99e6a0a39f94 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/deprecations/apm_user_role.ts @@ -0,0 +1,181 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { + SecurityGetRoleMappingResponse, + SecurityGetUserResponse, +} from '@elastic/elasticsearch/lib/api/types'; +import type { + CoreSetup, + DeprecationsDetails, + DocLinksServiceSetup, + ElasticsearchClient, + GetDeprecationsContext, +} from '@kbn/core/server'; +import { i18n } from '@kbn/i18n'; +import type { DeprecationApmDeps } from '.'; +import { deprecations } from '../lib/deprecations'; + +const APM_USER_ROLE_NAME = 'apm_user'; +const getKibanaPrivilegesDocumentationUrl = (branch: string) => { + return `https://www.elastic.co/guide/en/kibana/${branch}/kibana-privileges.html`; +}; + +export async function getDeprecationsInfo( + { esClient }: GetDeprecationsContext, + core: CoreSetup, + apmDeps: DeprecationApmDeps +) { + const client = esClient.asCurrentUser; + const { docLinks } = core; + const { security } = apmDeps; + + // Nothing to do if security is disabled + if (!security?.license.isEnabled()) { + return []; + } + + const [userDeprecations, roleMappingDeprecations] = await Promise.all([ + getUsersDeprecations(client, apmDeps, docLinks), + getRoleMappingsDeprecations(client, apmDeps, docLinks), + ]); + + return [...userDeprecations, ...roleMappingDeprecations]; +} + +async function getUsersDeprecations( + client: ElasticsearchClient, + apmDeps: DeprecationApmDeps, + docLinks: DocLinksServiceSetup +): Promise { + const title = i18n.translate('xpack.apm.deprecations.apmUser.title', { + defaultMessage: `Check for users assigned the deprecated "{apmUserRoleName}" role`, + values: { apmUserRoleName: APM_USER_ROLE_NAME }, + }); + + let users: SecurityGetUserResponse; + try { + users = await client.security.getUser(); + } catch (err) { + const { logger } = apmDeps; + if (deprecations.getErrorStatusCode(err) === 403) { + logger.warn( + 'Failed to retrieve users when checking for deprecations: the "read_security" or "manage_security" cluster privilege is required.' + ); + } else { + logger.error( + `Failed to retrieve users when checking for deprecations, unexpected error: ${deprecations.getDetailedErrorMessage( + err + )}.` + ); + } + return deprecations.deprecationError(title, err, docLinks); + } + + const apmUsers = Object.values(users).flatMap((user) => + user.roles.find(hasApmUserRole) ? user.username : [] + ); + + if (apmUsers.length === 0) { + return []; + } + + return [ + { + title, + message: i18n.translate('xpack.apm.deprecations.apmUser.description', { + defaultMessage: `The "{apmUserRoleName}" role has been deprecated. Remove the "{apmUserRoleName}" role from affected users in this cluster including: {users}`, + values: { apmUserRoleName: APM_USER_ROLE_NAME, users: apmUsers.join() }, + }), + correctiveActions: { + manualSteps: [ + i18n.translate('xpack.apm.deprecations.apmUser.manualStepOne', { + defaultMessage: `Go to Management > Security > Users to find users with the "{apmUserRoleName}" role.`, + values: { apmUserRoleName: APM_USER_ROLE_NAME }, + }), + i18n.translate('xpack.apm.deprecations.apmUser.manualStepTwo', { + defaultMessage: + 'Remove the "{apmUserRoleName}" role from all users and add the built-in "viewer" role.', + values: { apmUserRoleName: APM_USER_ROLE_NAME }, + }), + ], + }, + level: 'critical', + deprecationType: 'feature', + documentationUrl: getKibanaPrivilegesDocumentationUrl(docLinks.version), + }, + ]; +} + +async function getRoleMappingsDeprecations( + client: ElasticsearchClient, + apmDeps: DeprecationApmDeps, + docLinks: DocLinksServiceSetup +): Promise { + const title = i18n.translate('xpack.apm.deprecations.apmUserRoleMappings.title', { + defaultMessage: `Check for role mappings using the deprecated "{apmUserRoleName}" role`, + values: { apmUserRoleName: APM_USER_ROLE_NAME }, + }); + + let roleMappings: SecurityGetRoleMappingResponse; + try { + roleMappings = await client.security.getRoleMapping(); + } catch (err) { + const { logger } = apmDeps; + if (deprecations.getErrorStatusCode(err) === 403) { + logger.warn( + 'Failed to retrieve role mappings when checking for deprecations: the "manage_security" cluster privilege is required.' + ); + } else { + logger.error( + `Failed to retrieve role mappings when checking for deprecations, unexpected error: ${deprecations.getDetailedErrorMessage( + err + )}.` + ); + } + return deprecations.deprecationError(title, err, docLinks); + } + + const roleMappingsWithApmUserRole = Object.entries(roleMappings).flatMap(([roleName, role]) => + role.roles?.find(hasApmUserRole) ? roleName : [] + ); + + if (roleMappingsWithApmUserRole.length === 0) { + return []; + } + + return [ + { + title, + message: i18n.translate('xpack.apm.deprecations.apmUserRoleMappings.description', { + defaultMessage: `The "{apmUserRoleName}" role has been deprecated. Remove the "{apmUserRoleName}" role from affected role mappings in this cluster including: {roles}`, + values: { + apmUserRoleName: APM_USER_ROLE_NAME, + roles: roleMappingsWithApmUserRole.join(), + }, + }), + correctiveActions: { + manualSteps: [ + i18n.translate('xpack.apm.deprecations.apmUserRoleMappings.manualStepOne', { + defaultMessage: `Go to Management > Security > Role Mappings to find roles mappings with the "{apmUserRoleName}" role.`, + values: { apmUserRoleName: APM_USER_ROLE_NAME }, + }), + i18n.translate('xpack.apm.deprecations.apmUserRoleMappings.manualStepTwo', { + defaultMessage: + 'Remove the "{apmUserRoleName}" role from all role mappings and add the built-in "viewer" role', + values: { apmUserRoleName: APM_USER_ROLE_NAME }, + }), + ], + }, + level: 'critical', + deprecationType: 'feature', + documentationUrl: getKibanaPrivilegesDocumentationUrl(docLinks.version), + }, + ]; +} + +const hasApmUserRole = (role: string) => role === APM_USER_ROLE_NAME; diff --git a/x-pack/plugins/observability_solution/apm/server/deprecations/deprecations.test.ts b/x-pack/plugins/observability_solution/apm/server/deprecations/deprecations.test.ts deleted file mode 100644 index 9252ed46aa6df..0000000000000 --- a/x-pack/plugins/observability_solution/apm/server/deprecations/deprecations.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { kibanaPackageJson } from '@kbn/repo-info'; - -import { GetDeprecationsContext } from '@kbn/core/server'; -import { CloudSetup } from '@kbn/cloud-plugin/server'; -import { getDeprecations } from '.'; -import { AgentPolicy } from '@kbn/fleet-plugin/common'; -import { APMRouteHandlerResources } from '../routes/apm_routes/register_apm_server_routes'; - -const deprecationContext = { - esClient: {}, - savedObjectsClient: {}, -} as GetDeprecationsContext; - -describe('getDeprecations', () => { - describe('when fleet is disabled', () => { - it('returns no deprecations', async () => { - const deprecationsCallback = getDeprecations({ branch: 'main' }); - const deprecations = await deprecationsCallback(deprecationContext); - expect(deprecations).toEqual([]); - }); - }); - - describe('when running on cloud without cloud agent policy', () => { - it('returns no deprecations', async () => { - const deprecationsCallback = getDeprecations({ - branch: 'main', - cloudSetup: { isCloudEnabled: true } as unknown as CloudSetup, - fleet: { - start: () => ({ - agentPolicyService: { get: () => undefined }, - }), - } as unknown as APMRouteHandlerResources['plugins']['fleet'], - }); - const deprecations = await deprecationsCallback(deprecationContext); - expect(deprecations).toEqual([]); - }); - }); - - describe('when running on cloud with cloud agent policy and without apm integration', () => { - it('returns deprecations', async () => { - const deprecationsCallback = getDeprecations({ - branch: 'main', - cloudSetup: { isCloudEnabled: true } as unknown as CloudSetup, - fleet: { - start: () => ({ - agentPolicyService: { - get: () => - ({ - id: 'foo', - package_policies: [{ package: { name: 'system' } }], - } as AgentPolicy), - }, - }), - } as unknown as APMRouteHandlerResources['plugins']['fleet'], - }); - const deprecations = await deprecationsCallback(deprecationContext); - expect(deprecations).not.toEqual([]); - // TODO: remove when docs support "main" - if (kibanaPackageJson.branch === 'main') { - for (const { documentationUrl } of deprecations) { - expect(documentationUrl).toMatch(/\/master\//); - expect(documentationUrl).not.toMatch(/\/main\//); - } - } - }); - }); - - describe('when running on cloud with cloud agent policy and apm integration', () => { - it('returns no deprecations', async () => { - const deprecationsCallback = getDeprecations({ - branch: 'main', - cloudSetup: { isCloudEnabled: true } as unknown as CloudSetup, - fleet: { - start: () => ({ - agentPolicyService: { - get: () => - ({ - id: 'foo', - package_policies: [{ package: { name: 'apm' } }], - } as AgentPolicy), - }, - }), - } as unknown as APMRouteHandlerResources['plugins']['fleet'], - }); - const deprecations = await deprecationsCallback(deprecationContext); - expect(deprecations).toEqual([]); - }); - }); - - describe('when running on prem', () => { - it('returns no deprecations', async () => { - const deprecationsCallback = getDeprecations({ - branch: 'main', - cloudSetup: { isCloudEnabled: false } as unknown as CloudSetup, - fleet: { - start: () => ({ agentPolicyService: { get: () => undefined } }), - } as unknown as APMRouteHandlerResources['plugins']['fleet'], - }); - const deprecations = await deprecationsCallback(deprecationContext); - expect(deprecations).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/observability_solution/apm/server/deprecations/index.ts b/x-pack/plugins/observability_solution/apm/server/deprecations/index.ts index cafbdaf1ef8f0..1d3dd0b3a5b57 100644 --- a/x-pack/plugins/observability_solution/apm/server/deprecations/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/deprecations/index.ts @@ -4,75 +4,25 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { CoreSetup, Logger } from '@kbn/core/server'; +import { SecurityPluginSetup } from '@kbn/security-plugin/server'; +import { getDeprecationsInfo as getApmUserRoleDeprecationsInfo } from './apm_user_role'; -import { GetDeprecationsContext, DeprecationsDetails } from '@kbn/core/server'; -import { i18n } from '@kbn/i18n'; -import { isEmpty } from 'lodash'; -import { CloudSetup } from '@kbn/cloud-plugin/server'; -import { - getCloudAgentPolicy, - getApmPackagePolicy, -} from '../routes/fleet/get_cloud_apm_package_policy'; -import { APMRouteHandlerResources } from '../routes/apm_routes/register_apm_server_routes'; +export interface DeprecationApmDeps { + logger: Logger; + security?: SecurityPluginSetup; +} -export function getDeprecations({ - cloudSetup, - fleet, - branch, +export const registerDeprecations = ({ + core, + apmDeps, }: { - cloudSetup?: CloudSetup; - fleet?: APMRouteHandlerResources['plugins']['fleet']; - branch: string; -}) { - return async ({ savedObjectsClient }: GetDeprecationsContext): Promise => { - const deprecations: DeprecationsDetails[] = []; - if (!fleet) { - return deprecations; - } - // TODO: remove when docs support "main" - const docBranch = branch === 'main' ? 'master' : branch; - - const fleetPluginStart = await fleet.start(); - const cloudAgentPolicy = await getCloudAgentPolicy({ - fleetPluginStart, - savedObjectsClient, - }); - - const isCloudEnabled = !!cloudSetup?.isCloudEnabled; - const hasCloudAgentPolicy = !isEmpty(cloudAgentPolicy); - const hasAPMPackagePolicy = !isEmpty(getApmPackagePolicy(cloudAgentPolicy)); - - if (isCloudEnabled && hasCloudAgentPolicy && !hasAPMPackagePolicy) { - deprecations.push({ - title: i18n.translate('xpack.apm.deprecations.legacyModeTitle', { - defaultMessage: 'APM Server running in legacy mode', - }), - message: i18n.translate('xpack.apm.deprecations.message', { - defaultMessage: - 'Running the APM Server binary directly is considered a legacy option and will be deprecated and removed in the future.', - }), - documentationUrl: `https://www.elastic.co/guide/en/apm/server/${docBranch}/apm-integration.html`, - level: 'warning', - correctiveActions: { - manualSteps: [ - i18n.translate('xpack.apm.deprecations.steps.apm', { - defaultMessage: 'Navigate to Observability/APM', - }), - i18n.translate('xpack.apm.deprecations.steps.settings', { - defaultMessage: 'Click on "Settings"', - }), - i18n.translate('xpack.apm.deprecations.steps.schema', { - defaultMessage: 'Select "Schema" tab', - }), - i18n.translate('xpack.apm.deprecations.steps.switch', { - defaultMessage: - 'Click "Switch to Elastic Agent". You will be guided through the process', - }), - ], - }, - }); - } - - return deprecations; - }; -} + core: CoreSetup; + apmDeps: DeprecationApmDeps; +}) => { + core.deprecations.registerDeprecations({ + getDeprecations: async (ctx) => { + return [...(await getApmUserRoleDeprecationsInfo(ctx, core, apmDeps))]; + }, + }); +}; diff --git a/x-pack/plugins/observability_solution/apm/server/lib/deprecations/index.ts b/x-pack/plugins/observability_solution/apm/server/lib/deprecations/index.ts new file mode 100644 index 0000000000000..f6e75bf5aa301 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/lib/deprecations/index.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { errors } from '@elastic/elasticsearch'; +import Boom from '@hapi/boom'; +import { i18n } from '@kbn/i18n'; +import { DeprecationsDetails, DocLinksServiceSetup } from '@kbn/core/server'; + +function deprecationError( + title: string, + error: Error, + docLinks: DocLinksServiceSetup +): DeprecationsDetails[] { + if (getErrorStatusCode(error) === 403) { + return [ + { + title, + level: 'fetch_error', + deprecationType: 'feature', + message: i18n.translate('xpack.apm.deprecations.apmRole.forbiddenErrorMessage', { + defaultMessage: 'You do not have enough permissions to fix this deprecation.', + }), + documentationUrl: `https://www.elastic.co/guide/en/kibana/${docLinks.version}/xpack-security.html#_required_permissions_7`, + correctiveActions: { + manualSteps: [ + i18n.translate('xpack.apm.deprecations.apmRole.forbiddenErrorCorrectiveAction', { + defaultMessage: 'Make sure you have a "manage_security" cluster privilege assigned.', + }), + ], + }, + }, + ]; + } + + return [ + { + title, + level: 'fetch_error', + deprecationType: 'feature', + message: i18n.translate('xpack.apm.deprecations.apmRole.unknownErrorMessage', { + defaultMessage: 'Failed to perform deprecation check. Check Kibana logs for more details.', + }), + correctiveActions: { + manualSteps: [ + i18n.translate('xpack.apm.deprecations.apmRole.unknownErrorCorrectiveAction', { + defaultMessage: 'Check Kibana logs for more details.', + }), + ], + }, + }, + ]; +} + +function getErrorStatusCode(error: any): number | undefined { + if (error instanceof errors.ResponseError) { + return error.statusCode; + } + + return Boom.isBoom(error) ? error.output.statusCode : error.statusCode || error.status; +} + +function getDetailedErrorMessage(error: any): string { + if (error instanceof errors.ResponseError) { + return JSON.stringify(error.body); + } + + if (Boom.isBoom(error)) { + return JSON.stringify(error.output.payload); + } + + return error.message; +} + +export const deprecations = { + deprecationError, + getDetailedErrorMessage, + getErrorStatusCode, +}; diff --git a/x-pack/plugins/observability_solution/apm/server/lib/deprecations/types.ts b/x-pack/plugins/observability_solution/apm/server/lib/deprecations/types.ts new file mode 100644 index 0000000000000..5f572f89911ef --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/lib/deprecations/types.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ElasticsearchClient } from '@kbn/core/server'; + +export interface DeprecationsDependencies { + elasticsearchClient: ElasticsearchClient; +} diff --git a/x-pack/plugins/observability_solution/apm/server/plugin.ts b/x-pack/plugins/observability_solution/apm/server/plugin.ts index 7e93a5f3c3324..de49ebcebf8b0 100644 --- a/x-pack/plugins/observability_solution/apm/server/plugin.ts +++ b/x-pack/plugins/observability_solution/apm/server/plugin.ts @@ -5,42 +5,42 @@ * 2.0. */ -import { CoreSetup, CoreStart, Logger, Plugin, PluginInitializerContext } from '@kbn/core/server'; -import { isEmpty, mapValues } from 'lodash'; -import { Dataset } from '@kbn/rule-registry-plugin/server'; import { mappingFromFieldMap } from '@kbn/alerting-plugin/common'; +import { CoreSetup, CoreStart, Logger, Plugin, PluginInitializerContext } from '@kbn/core/server'; import { alertsLocatorID } from '@kbn/observability-plugin/common'; +import { Dataset } from '@kbn/rule-registry-plugin/server'; +import { isEmpty, mapValues } from 'lodash'; import { APMConfig, APM_SERVER_FEATURE_ID } from '.'; +import { apmTutorialCustomIntegration } from '../common/tutorial/tutorials'; +import { registerAssistantFunctions } from './assistant_functions'; +import { registerDeprecations } from './deprecations'; import { APM_FEATURE, registerFeaturesUsage } from './feature'; +import { createApmTelemetry } from './lib/apm_telemetry'; import { - registerApmRuleTypes, - apmRuleTypeAlertFieldMap, APM_RULE_TYPE_ALERT_CONTEXT, + apmRuleTypeAlertFieldMap, + registerApmRuleTypes, } from './routes/alerts/register_apm_rule_types'; +import { getGlobalApmServerRouteRepository } from './routes/apm_routes/get_global_apm_server_route_repository'; +import { + APMRouteHandlerResources, + registerRoutes, +} from './routes/apm_routes/register_apm_server_routes'; +import { getAlertDetailsContextHandler } from './routes/assistant_functions/get_observability_alert_details_context'; +import { addApiKeysToEveryPackagePolicyIfMissing } from './routes/fleet/api_keys/add_api_keys_to_policies_if_missing'; import { registerFleetPolicyCallbacks } from './routes/fleet/register_fleet_policy_callbacks'; -import { createApmTelemetry } from './lib/apm_telemetry'; -import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_objects_client'; import { createApmAgentConfigurationIndex } from './routes/settings/agent_configuration/create_agent_config_index'; import { createApmCustomLinkIndex } from './routes/settings/custom_link/create_custom_link_index'; +import { createApmSourceMapIndexTemplate } from './routes/source_maps/create_apm_source_map_index_template'; +import { scheduleSourceMapMigration } from './routes/source_maps/schedule_source_map_migration'; import { - apmTelemetry, + apmCustomDashboards, apmServerSettings, apmServiceGroups, - apmCustomDashboards, + apmTelemetry, } from './saved_objects'; -import { APMPluginSetup, APMPluginSetupDependencies, APMPluginStartDependencies } from './types'; -import { - APMRouteHandlerResources, - registerRoutes, -} from './routes/apm_routes/register_apm_server_routes'; -import { getGlobalApmServerRouteRepository } from './routes/apm_routes/get_global_apm_server_route_repository'; import { tutorialProvider } from './tutorial'; -import { scheduleSourceMapMigration } from './routes/source_maps/schedule_source_map_migration'; -import { createApmSourceMapIndexTemplate } from './routes/source_maps/create_apm_source_map_index_template'; -import { addApiKeysToEveryPackagePolicyIfMissing } from './routes/fleet/api_keys/add_api_keys_to_policies_if_missing'; -import { apmTutorialCustomIntegration } from '../common/tutorial/tutorials'; -import { registerAssistantFunctions } from './assistant_functions'; -import { getAlertDetailsContextHandler } from './routes/assistant_functions/get_observability_alert_details_context'; +import { APMPluginSetup, APMPluginSetupDependencies, APMPluginStartDependencies } from './types'; export class APMPlugin implements Plugin @@ -114,13 +114,6 @@ export class APMPlugin }; }) as APMRouteHandlerResources['plugins']; - const apmIndicesPromise = (async () => { - const coreStart = await getCoreStart(); - const soClient = await getInternalSavedObjectsClient(coreStart); - const { getApmIndices } = plugins.apmDataAccess; - return getApmIndices(soClient); - })(); - // This if else block will go away in favour of removing Home Tutorial Integration // Ideally we will directly register a custom integration and pass the configs // for cloud, onPrem and Serverless so that the actual component can take @@ -128,7 +121,8 @@ export class APMPlugin if (currentConfig.serverlessOnboarding && plugins.customIntegrations) { plugins.customIntegrations?.registerCustomIntegration(apmTutorialCustomIntegration); } else { - apmIndicesPromise + plugins.apmDataAccess + .getApmIndices() .then((apmIndices) => { plugins.home?.tutorials.registerTutorial( tutorialProvider({ @@ -226,6 +220,14 @@ export class APMPlugin getAlertDetailsContextHandler(resourcePlugins, logger) ); + registerDeprecations({ + core, + apmDeps: { + logger: this.logger, + security: plugins.security, + }, + }); + return { config$ }; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/agent_keys/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/agent_keys/route.ts index a296b7f8be284..d8c2cd70768c4 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/agent_keys/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/agent_keys/route.ts @@ -91,10 +91,7 @@ const invalidateAgentKeyRoute = createApmServerRoute({ const createAgentKeyRoute = createApmServerRoute({ endpoint: 'POST /api/apm/agent_keys 2023-10-31', - options: { - tags: ['access:apm', 'access:apm_settings_write', 'oas-tag:APM agent keys'], - access: 'public', - }, + options: { tags: ['access:apm', 'access:apm_settings_write', 'oas-tag:APM agent keys'] }, params: t.type({ body: t.type({ name: t.string, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.ts b/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.ts index 5a2af3e7dc066..4792223610bb6 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.ts @@ -109,10 +109,7 @@ export function registerRoutes({ ); const getApmIndices = async () => { - const coreContext = await context.core; - const apmIndices = await plugins.apmDataAccess.setup.getApmIndices( - coreContext.savedObjects.client - ); + const apmIndices = await plugins.apmDataAccess.setup.getApmIndices(); return apmIndices; }; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts index 84e51675233c9..f28e3f9df8570 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts @@ -38,8 +38,7 @@ export const getAlertDetailsContextHandler = ( return async (requestContext, query) => { const resources = { getApmIndices: async () => { - const coreContext = await requestContext.core; - return resourcePlugins.apmDataAccess.setup.getApmIndices(coreContext.savedObjects.client); + return resourcePlugins.apmDataAccess.setup.getApmIndices(); }, request: requestContext.request, params: { query: { _inspect: false } }, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/fleet/register_fleet_policy_callbacks.ts b/x-pack/plugins/observability_solution/apm/server/routes/fleet/register_fleet_policy_callbacks.ts index 2237548f2d325..9d00c50b4ab48 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/fleet/register_fleet_policy_callbacks.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/fleet/register_fleet_policy_callbacks.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { Logger, CoreStart, SavedObjectsClientContract } from '@kbn/core/server'; +import { Logger, CoreStart } from '@kbn/core/server'; import { FleetStartContract, PostPackagePolicyCreateCallback, @@ -22,7 +22,6 @@ import { SOURCE_MAP_API_KEY_PATH, } from './get_package_policy_decorators'; import { createInternalESClient } from '../../lib/helpers/create_es_client/create_internal_es_client'; -import { getInternalSavedObjectsClient } from '../../lib/helpers/get_internal_saved_objects_client'; import { APMRouteHandlerResources } from '../apm_routes/register_apm_server_routes'; export async function registerFleetPolicyCallbacks({ @@ -149,7 +148,7 @@ function onPackagePolicyCreateOrUpdate({ coreStart, }: { fleetPluginStart: FleetStartContract; - getApmIndices: (soClient: SavedObjectsClientContract) => Promise; + getApmIndices: () => Promise; coreStart: CoreStart; }): PutPackagePolicyUpdateCallback & PostPackagePolicyCreateCallback { return async (packagePolicy) => { @@ -158,8 +157,7 @@ function onPackagePolicyCreateOrUpdate({ } const { asInternalUser } = coreStart.elasticsearch.client; - const savedObjectsClient = await getInternalSavedObjectsClient(coreStart); - const apmIndices = await getApmIndices(savedObjectsClient); + const apmIndices = await getApmIndices(); const internalESClient = await createInternalESClient({ debug: false, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/fleet/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/fleet/route.ts index 1355460cc1836..05b74b3fc9c42 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/fleet/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/fleet/route.ts @@ -65,7 +65,7 @@ const fleetAgentsRoute = createApmServerRoute({ const saveApmServerSchemaRoute = createApmServerRoute({ endpoint: 'POST /api/apm/fleet/apm_server_schema 2023-10-31', - options: { tags: ['access:apm', 'access:apm_write'], access: 'public' }, + options: { tags: ['access:apm', 'access:apm_write'] }, params: t.type({ body: t.type({ schema: t.record(t.string, t.unknown), diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts index eb810fae50323..da2a506e3ae3f 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts @@ -395,7 +395,7 @@ const serviceAnnotationsRoute = createApmServerRoute({ }), query: t.intersection([environmentRt, rangeRt]), }), - options: { tags: ['access:apm', 'oas-tag:APM annotations'], access: 'public' }, + options: { tags: ['access:apm', 'oas-tag:APM annotations'] }, handler: async (resources): Promise => { const apmEventClient = await getApmEventClient(resources); const { params, plugins, context, request, logger, config } = resources; @@ -440,7 +440,6 @@ const serviceAnnotationsCreateRoute = createApmServerRoute({ endpoint: 'POST /api/apm/services/{serviceName}/annotation 2023-10-31', options: { tags: ['access:apm', 'access:apm_write', 'oas-tag:APM annotations'], - access: 'public', }, params: t.type({ path: t.type({ diff --git a/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts index bc8109dfa2808..aaf8fb2c48681 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts @@ -39,7 +39,7 @@ function throwNotFoundIfAgentConfigNotAvailable(featureFlags: ApmFeatureFlags): // get list of configurations const agentConfigurationRoute = createApmServerRoute({ endpoint: 'GET /api/apm/settings/agent-configuration 2023-10-31', - options: { tags: ['access:apm'], access: 'public' }, + options: { tags: ['access:apm'] }, handler: async ( resources ): Promise<{ @@ -68,7 +68,7 @@ const getSingleAgentConfigurationRoute = createApmServerRoute({ params: t.partial({ query: serviceRt, }), - options: { tags: ['access:apm'], access: 'public' }, + options: { tags: ['access:apm'] }, handler: async (resources): Promise => { throwNotFoundIfAgentConfigNotAvailable(resources.featureFlags); @@ -100,7 +100,6 @@ const deleteAgentConfigurationRoute = createApmServerRoute({ endpoint: 'DELETE /api/apm/settings/agent-configuration 2023-10-31', options: { tags: ['access:apm', 'access:apm_settings_write'], - access: 'public', }, params: t.type({ body: t.type({ @@ -157,7 +156,6 @@ const createOrUpdateAgentConfigurationRoute = createApmServerRoute({ endpoint: 'PUT /api/apm/settings/agent-configuration 2023-10-31', options: { tags: ['access:apm', 'access:apm_settings_write'], - access: 'public', }, params: t.intersection([ t.partial({ query: t.partial({ overwrite: toBooleanRt }) }), @@ -226,7 +224,7 @@ const agentConfigurationSearchRoute = createApmServerRoute({ params: t.type({ body: searchParamsRt, }), - options: { tags: ['access:apm'], disableTelemetry: true, access: 'public' }, + options: { tags: ['access:apm'], disableTelemetry: true }, handler: async ( resources ): Promise | null> => { @@ -288,7 +286,7 @@ const listAgentConfigurationEnvironmentsRoute = createApmServerRoute({ params: t.partial({ query: t.partial({ serviceName: t.string }), }), - options: { tags: ['access:apm'], access: 'public' }, + options: { tags: ['access:apm'] }, handler: async ( resources ): Promise<{ @@ -329,7 +327,7 @@ const agentConfigurationAgentNameRoute = createApmServerRoute({ params: t.type({ query: t.type({ serviceName: t.string }), }), - options: { tags: ['access:apm'], access: 'public' }, + options: { tags: ['access:apm'] }, handler: async (resources): Promise<{ agentName: string | undefined }> => { throwNotFoundIfAgentConfigNotAvailable(resources.featureFlags); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/source_maps/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/source_maps/route.ts index f1f7f3def93ab..bc92c06416204 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/source_maps/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/source_maps/route.ts @@ -49,7 +49,7 @@ function throwNotImplementedIfSourceMapNotAvailable(featureFlags: ApmFeatureFlag const listSourceMapRoute = createApmServerRoute({ endpoint: 'GET /api/apm/sourcemaps 2023-10-31', - options: { tags: ['access:apm'], access: 'public' }, + options: { tags: ['access:apm'] }, params: t.partial({ query: t.partial({ page: toNumberRt, @@ -87,7 +87,6 @@ const uploadSourceMapRoute = createApmServerRoute({ options: { tags: ['access:apm', 'access:apm_write'], body: { accepts: ['multipart/form-data'] }, - access: 'public', }, params: t.type({ body: t.type({ @@ -160,7 +159,7 @@ const uploadSourceMapRoute = createApmServerRoute({ const deleteSourceMapRoute = createApmServerRoute({ endpoint: 'DELETE /api/apm/sourcemaps/{id} 2023-10-31', - options: { tags: ['access:apm', 'access:apm_write'], access: 'public' }, + options: { tags: ['access:apm', 'access:apm_write'] }, params: t.type({ path: t.type({ id: t.string, diff --git a/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc b/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc index 51968be90cb7d..9d80dcd71ce93 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc +++ b/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc @@ -18,9 +18,7 @@ "requiredPlugins": [ "data" ], - "optionalPlugins": [ - "security" - ], + "optionalPlugins": [], "requiredBundles": [] } } \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/index.ts b/x-pack/plugins/observability_solution/apm_data_access/server/index.ts index 6b6385ded4ce4..7afaa656591c4 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/server/index.ts +++ b/x-pack/plugins/observability_solution/apm_data_access/server/index.ts @@ -91,7 +91,6 @@ export type { APMEventESSearchRequest, APMLogEventESSearchRequest, DocumentSourcesRequest, - ApmDataAccessPrivilegesCheck, HostNamesRequest, GetDocumentTypeParams, } from './types'; diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/lib/check_privileges.ts b/x-pack/plugins/observability_solution/apm_data_access/server/lib/check_privileges.ts deleted file mode 100644 index 6b8e734a10b4e..0000000000000 --- a/x-pack/plugins/observability_solution/apm_data_access/server/lib/check_privileges.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { KibanaRequest } from '@kbn/core-http-server'; -import { SecurityPluginStart } from '@kbn/security-plugin-types-server'; -import { mapValues } from 'lodash'; -import { APMIndices } from '..'; - -export interface ApmDataAccessPrivilegesCheck { - request: KibanaRequest; - security?: SecurityPluginStart; - getApmIndices: () => Promise; -} - -export async function checkPrivileges({ - request, - getApmIndices, - security, -}: ApmDataAccessPrivilegesCheck) { - const authorization = security?.authz; - if (!authorization) { - return true; - } - - const [apmIndices, checkPrivilegesFn] = await Promise.all([ - getApmIndices(), - authorization.checkPrivilegesDynamicallyWithRequest(request), - ]); - - const { hasAllRequested } = await checkPrivilegesFn({ - elasticsearch: { - cluster: [], - index: mapValues(apmIndices, () => ['read']), - }, - }); - - return hasAllRequested; -} diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/plugin.ts b/x-pack/plugins/observability_solution/apm_data_access/server/plugin.ts index 680079d080c82..6bf684985583a 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/server/plugin.ts +++ b/x-pack/plugins/observability_solution/apm_data_access/server/plugin.ts @@ -5,32 +5,19 @@ * 2.0. */ -import { - PluginInitializerContext, - CoreSetup, - CoreStart, - Plugin, - SavedObjectsClientContract, - Logger, -} from '@kbn/core/server'; +import { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from '@kbn/core/server'; import { APMDataAccessConfig } from '.'; -import { - ApmDataAccessPluginSetup, - ApmDataAccessPluginStart, - ApmDataAccessServerDependencies, -} from './types'; +import { ApmDataAccessPluginSetup, ApmDataAccessPluginStart } from './types'; import { migrateLegacyAPMIndicesToSpaceAware } from './saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware'; import { apmIndicesSavedObjectDefinition, getApmIndicesSavedObject, } from './saved_objects/apm_indices'; import { getServices } from './services/get_services'; -import { ApmDataAccessPrivilegesCheck, checkPrivileges } from './lib/check_privileges'; export class ApmDataAccessPlugin implements Plugin { - public server?: ApmDataAccessServerDependencies; public config: APMDataAccessConfig; public logger: Logger; @@ -39,45 +26,34 @@ export class ApmDataAccessPlugin this.logger = initContext.logger.get(); } - getApmIndices = async (savedObjectsClient: SavedObjectsClientContract) => { - const apmIndicesFromSavedObject = await getApmIndicesSavedObject(savedObjectsClient); - return { ...this.config.indices, ...apmIndicesFromSavedObject }; - }; - public setup(core: CoreSetup): ApmDataAccessPluginSetup { // register saved object core.savedObjects.registerType(apmIndicesSavedObjectDefinition); + const getApmIndices = async () => { + const [coreStart] = await core.getStartServices(); + const soClient = await coreStart.savedObjects.createInternalRepository(); + + const apmIndicesFromSavedObject = await getApmIndicesSavedObject(soClient); + return { ...this.config.indices, ...apmIndicesFromSavedObject }; + }; + // expose return { apmIndicesFromConfigFile: this.config.indices, - getApmIndices: this.getApmIndices, + getApmIndices, getServices, }; } - public start(core: CoreStart, plugins: ApmDataAccessServerDependencies) { + public start(core: CoreStart) { // TODO: remove in 9.0 migrateLegacyAPMIndicesToSpaceAware({ coreStart: core, logger: this.logger }).catch((e) => { this.logger.error('Failed to run migration making APM indices space aware'); this.logger.error(e); }); - const getApmIndicesWithInternalUserFn = async () => { - const soClient = core.savedObjects.createInternalRepository(); - return this.getApmIndices(soClient); - }; - - const startServices = { - hasPrivileges: ({ request }: Pick) => - checkPrivileges({ - request, - getApmIndices: getApmIndicesWithInternalUserFn, - security: plugins.security, - }), - }; - - return { ...startServices }; + return {}; } public stop() {} diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/types.ts b/x-pack/plugins/observability_solution/apm_data_access/server/types.ts index f10c23c1fd994..968590e780ee8 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/server/types.ts +++ b/x-pack/plugins/observability_solution/apm_data_access/server/types.ts @@ -5,28 +5,17 @@ * 2.0. */ -import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; -import type { SecurityPluginStart } from '@kbn/security-plugin-types-server'; import type { APMIndices } from '.'; import { getServices } from './services/get_services'; -import type { ApmDataAccessPrivilegesCheck } from './lib/check_privileges'; export interface ApmDataAccessPluginSetup { apmIndicesFromConfigFile: APMIndices; - getApmIndices: (soClient: SavedObjectsClientContract) => Promise; + getApmIndices: () => Promise; getServices: typeof getServices; } -export interface ApmDataAccessServerDependencies { - security?: SecurityPluginStart; -} - -export interface ApmDataAccessPluginStart { - hasPrivileges: (params: Pick) => Promise; -} -export interface ApmDataAccessServerDependencies { - security?: SecurityPluginStart; -} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ApmDataAccessPluginStart {} export type ApmDataAccessServices = ReturnType; export type { ApmDataAccessServicesParams } from './services/get_services'; @@ -38,4 +27,3 @@ export type { APMEventESSearchRequest, APMLogEventESSearchRequest, } from './lib/helpers'; -export type { ApmDataAccessPrivilegesCheck }; diff --git a/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json b/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json index d4c38fddf967e..f7ac83af0922e 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json +++ b/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json @@ -9,7 +9,6 @@ "@kbn/config-schema", "@kbn/core", "@kbn/i18n", - "@kbn/core-saved-objects-api-server", "@kbn/data-plugin", "@kbn/inspector-plugin", "@kbn/observability-plugin", @@ -18,8 +17,6 @@ "@kbn/apm-types", "@kbn/core-http-server-mocks", "@kbn/apm-utils", - "@kbn/core-http-server", - "@kbn/security-plugin-types-server", "@kbn/utility-types", "@kbn/elastic-agent-utils", "@kbn/observability-utils-common" diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts index 69080c22a13d0..dd98e9879e82a 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { capitalize } from 'lodash'; -import { ExistsFilter, isExistsFilter } from '@kbn/es-query'; +import { ExistsFilter, Filter, isExistsFilter } from '@kbn/es-query'; import { AvgIndexPatternColumn, CardinalityIndexPatternColumn, @@ -41,6 +41,7 @@ import type { DataView } from '@kbn/data-views-plugin/common'; import { PersistableFilter } from '@kbn/lens-plugin/common'; import { DataViewSpec } from '@kbn/data-views-plugin/common'; import { LegendSize } from '@kbn/visualizations-plugin/common/constants'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { urlFiltersToKueryString } from '../utils/stringify_kueries'; import { FILTER_RECORDS, @@ -169,17 +170,20 @@ export class LensAttributes { globalFilter?: { query: string; language: string }; reportType: string; lensFormulaHelper?: FormulaPublicApi; + dslFilters?: QueryDslQueryContainer[]; constructor( layerConfigs: LayerConfig[], reportType: string, - lensFormulaHelper?: FormulaPublicApi + lensFormulaHelper?: FormulaPublicApi, + dslFilters?: QueryDslQueryContainer[] ) { this.layers = {}; this.seriesReferenceLines = {}; this.reportType = reportType; this.lensFormulaHelper = lensFormulaHelper; this.isMultiSeries = layerConfigs.length > 1; + this.dslFilters = dslFilters; layerConfigs.forEach(({ seriesConfig, operationType }) => { if (operationType && reportType !== ReportTypes.SINGLE_METRIC) { @@ -1267,6 +1271,31 @@ export class LensAttributes { return { internalReferences, adHocDataViews }; } + getFilters(): Filter[] { + const { internalReferences } = this.getReferences(); + + const dslFilters = this.dslFilters; + if (!dslFilters) { + return []; + } + return dslFilters.map((filter) => { + return { + meta: { + index: internalReferences?.[0].id, + type: 'query_string', + disabled: false, + negate: false, + alias: null, + key: 'query', + }, + $state: { + store: 'appState', + }, + query: filter, + } as Filter; + }); + } + getJSON( visualizationType: 'lnsXY' | 'lnsLegacyMetric' | 'lnsHeatmap' = 'lnsXY', lastRefresh?: number @@ -1290,7 +1319,7 @@ export class LensAttributes { }, visualization: this.visualization, query: query || { query: '', language: 'kuery' }, - filters: [], + filters: this.getFilters(), }, }; } diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.ts b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.ts index 1aab4261a5d15..fe206c64dd61c 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.ts @@ -10,6 +10,7 @@ import { FormulaPublicApi, MetricState, OperationType } from '@kbn/lens-plugin/p import type { DataView } from '@kbn/data-views-plugin/common'; import { Query } from '@kbn/es-query'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { getColorPalette } from '../synthetics/single_metric_config'; import { FORMULA_COLUMN, RECORDS_FIELD } from '../constants'; import { ColumnFilter, MetricOption } from '../../types'; @@ -28,9 +29,10 @@ export class SingleMetricLensAttributes extends LensAttributes { constructor( layerConfigs: LayerConfig[], reportType: string, - lensFormulaHelper: FormulaPublicApi + lensFormulaHelper: FormulaPublicApi, + dslFilters?: QueryDslQueryContainer[] ) { - super(layerConfigs, reportType, lensFormulaHelper); + super(layerConfigs, reportType, lensFormulaHelper, dslFilters); this.layers = {}; this.reportType = reportType; @@ -145,7 +147,7 @@ export class SingleMetricLensAttributes extends LensAttributes { ? { id: 'percent', params: { - decimals: 1, + decimals: 3, }, } : undefined, diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts index 115bb41f6630d..c935d45f9e124 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts @@ -106,7 +106,7 @@ export function getSyntheticsKPIConfig({ dataView }: ConfigProps): SeriesConfig label: 'Monitor Errors', id: 'monitor_errors', columnType: OPERATION_COLUMN, - field: 'monitor.check_group', + field: 'state.id', columnFilters: [ { language: 'kuery', diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts index 5f74974a81a04..13d509a0919de 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts @@ -16,8 +16,7 @@ import { ConfigProps, SeriesConfig } from '../../types'; import { FieldLabels, FORMULA_COLUMN, RECORDS_FIELD } from '../constants'; import { buildExistsFilter } from '../utils'; -export const FINAL_SUMMARY_KQL = - 'summary: * and (summary.final_attempt: true or not summary.final_attempt: *)'; +export const FINAL_SUMMARY_KQL = 'summary.final_attempt: true'; export function getSyntheticsSingleMetricConfig({ dataView }: ConfigProps): SeriesConfig { return { defaultSeriesType: 'line', diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/test_formula_metric_attribute.ts b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/test_formula_metric_attribute.ts index 914ac7174f5e9..a269a7d4c6059 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/test_formula_metric_attribute.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/test_formula_metric_attribute.ts @@ -50,7 +50,7 @@ export const sampleMetricFormulaAttribute = { format: { id: 'percent', params: { - decimals: 1, + decimals: 3, }, }, formula: "1- (count(kql='summary.down > 0') / count())", diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/embeddable.tsx b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/embeddable.tsx index a0079568803b6..1b3028a0283ed 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/embeddable.tsx +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/embeddable.tsx @@ -19,6 +19,7 @@ import { ViewMode } from '@kbn/embeddable-plugin/common'; import { observabilityFeatureId } from '@kbn/observability-shared-plugin/public'; import styled from 'styled-components'; import { AnalyticsServiceSetup } from '@kbn/core-analytics-browser'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { useEBTTelemetry } from '../hooks/use_ebt_telemetry'; import { AllSeries } from '../../../..'; import { AppDataType, ReportViewType } from '../types'; @@ -57,6 +58,7 @@ export interface ExploratoryEmbeddableProps { lineHeight?: number; dataTestSubj?: string; searchSessionId?: string; + dslFilters?: QueryDslQueryContainer[]; } export interface ExploratoryEmbeddableComponentProps extends ExploratoryEmbeddableProps { diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_embeddable_attributes.ts b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_embeddable_attributes.ts index 4b58ce5366516..f1124d2a32a30 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_embeddable_attributes.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_embeddable_attributes.ts @@ -21,6 +21,7 @@ export const useEmbeddableAttributes = ({ reportType, reportConfigMap = {}, lensFormulaHelper, + dslFilters, }: ExploratoryEmbeddableComponentProps) => { const spaceId = useKibanaSpace(); const theme = useTheme(); @@ -40,7 +41,8 @@ export const useEmbeddableAttributes = ({ const lensAttributes = new SingleMetricLensAttributes( layerConfigs, reportType, - lensFormulaHelper! + lensFormulaHelper!, + dslFilters ); return lensAttributes?.getJSON('lnsLegacyMetric'); } else if (reportType === ReportTypes.HEATMAP) { @@ -51,7 +53,12 @@ export const useEmbeddableAttributes = ({ ); return lensAttributes?.getJSON('lnsHeatmap'); } else { - const lensAttributes = new LensAttributes(layerConfigs, reportType, lensFormulaHelper); + const lensAttributes = new LensAttributes( + layerConfigs, + reportType, + lensFormulaHelper, + dslFilters + ); return lensAttributes?.getJSON(); } } catch (error) { @@ -60,6 +67,7 @@ export const useEmbeddableAttributes = ({ }, [ attributes, dataViewState, + dslFilters, lensFormulaHelper, reportConfigMap, reportType, diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/header/add_to_case_action.test.tsx b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/header/add_to_case_action.test.tsx index 1d42716bf405d..011fb93553ac4 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/header/add_to_case_action.test.tsx +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/header/add_to_case_action.test.tsx @@ -120,6 +120,8 @@ describe('AddToCaseAction', function () { push: false, connectors: false, settings: false, + createComment: false, + reopenCase: false, }, }) ); diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts b/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts index e6b375efdaab7..b769bb68f8d2a 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts @@ -91,7 +91,7 @@ export const validateIndexPatternIsTimeBased = (indexPattern: DataView): FormVal : [ { type: 'missing_timestamp_field' as const, - indexPatternTitle: indexPattern.title, + indexPatternTitle: indexPattern.getIndexPattern(), }, ]; @@ -104,14 +104,14 @@ export const validateIndexPatternHasStringMessageField = ( return [ { type: 'missing_message_field' as const, - indexPatternTitle: indexPattern.title, + indexPatternTitle: indexPattern.getIndexPattern(), }, ]; } else if (messageField.type !== KBN_FIELD_TYPES.STRING) { return [ { type: 'invalid_message_field_type' as const, - indexPatternTitle: indexPattern.title, + indexPatternTitle: indexPattern.getIndexPattern(), }, ]; } else { @@ -124,7 +124,7 @@ export const validateIndexPatternIsntRollup = (indexPattern: DataView): FormVali ? [ { type: 'rollup_index_pattern' as const, - indexPatternTitle: indexPattern.title, + indexPatternTitle: indexPattern.getIndexPattern(), }, ] : []; diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts b/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts index 87aaad06abc96..7fe7b8b3fe18c 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts @@ -21,11 +21,11 @@ jest.mock('react-router-dom', () => ({ const mockDataView = { id: 'mock-id', - title: 'mock-title', timeFieldName: TIMESTAMP_FIELD, isPersisted: () => false, getName: () => 'mock-data-view', toSpec: () => ({}), + getIndexPattern: () => 'mock-title', } as jest.Mocked; jest.mock('../../../../containers/metrics_source', () => ({ diff --git a/x-pack/plugins/observability_solution/infra/server/lib/helpers/get_apm_data_access_client.ts b/x-pack/plugins/observability_solution/infra/server/lib/helpers/get_apm_data_access_client.ts index e99d57eb4d6c8..dcf63e01b7e93 100644 --- a/x-pack/plugins/observability_solution/infra/server/lib/helpers/get_apm_data_access_client.ts +++ b/x-pack/plugins/observability_solution/infra/server/lib/helpers/get_apm_data_access_client.ts @@ -27,23 +27,17 @@ export const getApmDataAccessClient = ({ context: InfraPluginRequestHandlerContext; request: KibanaRequest; }) => { - const hasPrivileges = async () => { - const apmDataAccessStart = await libs.plugins.apmDataAccess.start(); - return apmDataAccessStart.hasPrivileges({ request }); - }; - const getServices = async () => { const apmDataAccess = libs.plugins.apmDataAccess.setup; const coreContext = await context.core; - const { savedObjects, uiSettings, elasticsearch } = coreContext; - const savedObjectsClient = savedObjects.client; + const { uiSettings, elasticsearch } = coreContext; const esClient = elasticsearch.client.asCurrentUser; const uiSettingsClient = uiSettings.client; const [apmIndices, includeFrozen] = await Promise.all([ - apmDataAccess.getApmIndices(savedObjectsClient), + apmDataAccess.getApmIndices(), uiSettingsClient.get(UI_SETTINGS.SEARCH_INCLUDE_FROZEN), ]); @@ -86,5 +80,5 @@ export const getApmDataAccessClient = ({ }; }; - return { hasPrivileges, getServices }; + return { getServices }; }; diff --git a/x-pack/plugins/observability_solution/infra/server/routes/infra/index.ts b/x-pack/plugins/observability_solution/infra/server/routes/infra/index.ts index 1b720eeb31869..3f91a034c8103 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/infra/index.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/infra/index.ts @@ -41,12 +41,11 @@ export const initInfraAssetRoutes = (libs: InfraBackendLibs) => { try { const apmDataAccessClient = getApmDataAccessClient({ request, libs, context }); - const hasApmPrivileges = await apmDataAccessClient.hasPrivileges(); const [infraMetricsClient, alertsClient, apmDataAccessServices] = await Promise.all([ getInfraMetricsClient({ request, libs, context }), getInfraAlertsClient({ libs, request }), - hasApmPrivileges ? apmDataAccessClient.getServices() : undefined, + apmDataAccessClient.getServices(), ]); const hosts = await getHosts({ @@ -97,11 +96,10 @@ export const initInfraAssetRoutes = (libs: InfraBackendLibs) => { try { const apmDataAccessClient = getApmDataAccessClient({ request, libs, context }); - const hasApmPrivileges = await apmDataAccessClient.hasPrivileges(); const [infraMetricsClient, apmDataAccessServices] = await Promise.all([ getInfraMetricsClient({ request, libs, context }), - hasApmPrivileges ? apmDataAccessClient.getServices() : undefined, + apmDataAccessClient.getServices(), ]); const count = await getHostsCount({ diff --git a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/helpers/query.ts b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/helpers/query.ts index 570c1499f3b74..52da69cd7c008 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/helpers/query.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/helpers/query.ts @@ -9,6 +9,7 @@ import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; import { termQuery } from '@kbn/observability-plugin/server'; import { ApmDocumentType, type TimeRangeMetadata } from '@kbn/apm-data-access-plugin/common'; import { estypes } from '@elastic/elasticsearch'; +import { castArray } from 'lodash'; import type { ApmDataAccessServicesWrapper } from '../../../../lib/helpers/get_apm_data_access_client'; import { EVENT_MODULE, @@ -17,12 +18,16 @@ import { } from '../../../../../common/constants'; import type { InfraAssetMetricType } from '../../../../../common/http_api/infra'; -export const getFilterByIntegration = (integration: typeof SYSTEM_INTEGRATION) => { +export const getFilterByIntegration = ( + integration: typeof SYSTEM_INTEGRATION, + extraFilter: estypes.QueryDslQueryContainer[] = [] +) => { return { bool: { should: [ ...termQuery(EVENT_MODULE, integration), ...termQuery(METRICSET_MODULE, integration), + ...extraFilter, ], minimum_should_match: 1, }, @@ -63,7 +68,6 @@ export const getDocumentsFilter = async ({ from: number; to: number; }) => { - const filters: estypes.QueryDslQueryContainer[] = [getFilterByIntegration('system')]; const apmDocumentsFilter = apmDataAccessServices && apmDocumentSources ? await getApmDocumentsFilter({ @@ -74,9 +78,9 @@ export const getDocumentsFilter = async ({ }) : undefined; - if (apmDocumentsFilter) { - filters.push(apmDocumentsFilter); - } + const filters: estypes.QueryDslQueryContainer[] = [ + getFilterByIntegration('system', apmDocumentsFilter && castArray(apmDocumentsFilter)), + ]; return filters; }; diff --git a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts.ts b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts.ts index bb5bd51cfe1f9..63fef5d438b00 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts.ts @@ -49,6 +49,7 @@ export const getHosts = async ({ const [hostMetricsResponse, alertsCountResponse] = await Promise.all([ getAllHosts({ infraMetricsClient, + apmDataAccessServices, apmDocumentSources, from, to, diff --git a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts_count.ts b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts_count.ts index 154fd8796520d..e36811ea5b87a 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts_count.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/host/get_hosts_count.ts @@ -25,8 +25,14 @@ export async function getHostsCount({ }) { assertQueryStructure(query); + const apmDocumentSources = await apmDataAccessServices?.getDocumentSources({ + start: from, + end: to, + }); + const documentsFilter = await getDocumentsFilter({ apmDataAccessServices, + apmDocumentSources, from, to, }); @@ -39,7 +45,7 @@ export async function getHostsCount({ query: { bool: { filter: [query, ...rangeQuery(from, to)], - should: [...documentsFilter], + must: [...documentsFilter], }, }, aggs: { diff --git a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/types.ts b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/types.ts index 87679f24271d6..8f50d9eb89f13 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/types.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/infra/lib/types.ts @@ -13,5 +13,5 @@ import { InfraMetricsClient } from '../../../lib/helpers/get_infra_metrics_clien export interface GetHostParameters extends GetInfraMetricsRequestBodyPayload { infraMetricsClient: InfraMetricsClient; alertsClient: InfraAlertsClient; - apmDataAccessServices?: ApmDataAccessServicesWrapper; + apmDataAccessServices: ApmDataAccessServicesWrapper; } diff --git a/x-pack/plugins/observability_solution/infra/server/routes/services/index.ts b/x-pack/plugins/observability_solution/infra/server/routes/services/index.ts index 9673b31788487..bc6ce91e830ad 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/services/index.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/services/index.ts @@ -36,16 +36,6 @@ export const initServicesRoute = (libs: InfraBackendLibs) => { const { from, to, size = 10, validatedFilters } = request.query; const apmDataAccessClient = getApmDataAccessClient({ request, libs, context }); - const hasApmPrivileges = await apmDataAccessClient.hasPrivileges(); - - if (!hasApmPrivileges) { - return response.customError({ - statusCode: 403, - body: { - message: 'APM data access service is not available', - }, - }); - } const apmDataAccessServices = await apmDataAccessClient.getServices(); diff --git a/x-pack/plugins/observability_solution/inventory/common/utils/entity_type_guards.ts b/x-pack/plugins/observability_solution/inventory/common/utils/entity_type_guards.ts index dccc888abd8dc..f9ace49b20d3a 100644 --- a/x-pack/plugins/observability_solution/inventory/common/utils/entity_type_guards.ts +++ b/x-pack/plugins/observability_solution/inventory/common/utils/entity_type_guards.ts @@ -13,7 +13,7 @@ interface BuiltinEntityMap { container: InventoryEntity & { cloud?: { provider?: string[] } }; service: InventoryEntity & { agent?: { name: AgentName[] }; - service?: { environment?: string }; + service?: { environment?: string | string[] | null }; }; } diff --git a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/generate_data.ts b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/generate_data.ts index 3ddea0d925de2..a75165004a5a2 100644 --- a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/generate_data.ts +++ b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/generate_data.ts @@ -9,10 +9,12 @@ import { apm, entities, log, timerange } from '@kbn/apm-synthtrace-client'; import { generateLongIdWithSeed } from '@kbn/apm-synthtrace-client/src/lib/utils/generate_id'; const SYNTH_NODE_TRACES_LOGS_ENTITY_ID = generateLongIdWithSeed('service'); +const SERVICE_LOGS_ONLY_ENTITY_ID = generateLongIdWithSeed('service-logs-only'); const HOST_SERVER_1_LOGS_ENTITY_ID = generateLongIdWithSeed('host'); const CONTAINER_ID_METRICS_ENTITY_ID = generateLongIdWithSeed('container'); const SYNTH_NODE_TRACE_LOGS = 'synth-node-trace-logs'; +const SERVICE_LOGS_ONLY = 'service-logs-only'; const HOST_NAME = 'server1'; const CONTAINER_ID = 'foo'; @@ -27,6 +29,13 @@ export function generateEntities({ from, to }: { from: number; to: number }) { entityId: SYNTH_NODE_TRACES_LOGS_ENTITY_ID, }); + const serviceLogsOnly = entities.serviceEntity({ + serviceName: SERVICE_LOGS_ONLY, + agentName: ['host'], + dataStreamType: ['logs'], + entityId: SERVICE_LOGS_ONLY_ENTITY_ID, + }); + const hostServer1Logs = entities.hostEntity({ hostName: HOST_NAME, agentName: ['nodejs'], @@ -49,6 +58,7 @@ export function generateEntities({ from, to }: { from: number; to: number }) { .generator((timestamp) => { return [ serviceSynthNodeTracesLogs.timestamp(timestamp), + serviceLogsOnly.timestamp(timestamp), hostServer1Logs.timestamp(timestamp), containerMetrics.timestamp(timestamp), ]; @@ -90,23 +100,43 @@ export function generateLogs({ from, to }: { from: number; to: number }) { .interval('1m') .rate(1) .generator((timestamp) => { - return Array(3) - .fill(0) - .map(() => { - const index = Math.floor(Math.random() * 3); - const logMessage = MESSAGE_LOG_LEVELS[index]; + return [ + ...Array(3) + .fill(0) + .map(() => { + const index = Math.floor(Math.random() * 3); + const logMessage = MESSAGE_LOG_LEVELS[index]; + + return log + .create({ isLogsDb: false }) + .service(SYNTH_NODE_TRACE_LOGS) + .message(logMessage.message) + .logLevel(logMessage.level) + .setGeoLocation([1]) + .setHostIp('223.72.43.22') + .defaults({ + 'agent.name': 'nodejs', + }) + .timestamp(timestamp); + }), + ...Array(3) + .fill(0) + .map(() => { + const index = Math.floor(Math.random() * 3); + const logMessage = MESSAGE_LOG_LEVELS[index]; - return log - .create({ isLogsDb: false }) - .service(SYNTH_NODE_TRACE_LOGS) - .message(logMessage.message) - .logLevel(logMessage.level) - .setGeoLocation([1]) - .setHostIp('223.72.43.22') - .defaults({ - 'agent.name': 'nodejs', - }) - .timestamp(timestamp); - }); + return log + .create({ isLogsDb: false }) + .service(SERVICE_LOGS_ONLY) + .message(logMessage.message) + .logLevel(logMessage.level) + .setGeoLocation([1]) + .setHostIp('223.72.43.22') + .defaults({ + 'agent.name': 'nodejs', + }) + .timestamp(timestamp); + }), + ]; }); } diff --git a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts index c9d341c708965..ce7bdfd102a40 100644 --- a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts +++ b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts @@ -110,6 +110,18 @@ describe('Home page', () => { cy.url().should('include', '/app/apm/services/synth-node-trace-logs/overview'); }); + it('Navigates to apm when clicking on a logs only service', () => { + cy.intercept('GET', '/internal/entities/managed/enablement', { + fixture: 'eem_enabled.json', + }).as('getEEMStatus'); + cy.visitKibana('/app/inventory'); + cy.wait('@getEEMStatus'); + cy.contains('service').click(); + cy.contains('service-logs-only').click(); + cy.url().should('include', '/app/apm/services/service-logs-only/overview'); + cy.contains('Detect and resolve issues faster with deep visibility into your application'); + }); + it('Navigates to hosts when clicking on a host type entity', () => { cy.intercept('GET', '/internal/entities/managed/enablement', { fixture: 'eem_enabled.json', diff --git a/x-pack/plugins/observability_solution/inventory/public/hooks/use_detail_view_redirect.ts b/x-pack/plugins/observability_solution/inventory/public/hooks/use_detail_view_redirect.ts index 4df4fa4ca1f96..36fa622e74667 100644 --- a/x-pack/plugins/observability_solution/inventory/public/hooks/use_detail_view_redirect.ts +++ b/x-pack/plugins/observability_solution/inventory/public/hooks/use_detail_view_redirect.ts @@ -61,7 +61,9 @@ export const useDetailViewRedirect = () => { if (isBuiltinEntityOfType('service', entity)) { return serviceOverviewLocator?.getRedirectUrl({ serviceName: identityFieldsValue[identityFields[0]], - environment: entity.service?.environment, + environment: entity.service?.environment + ? castArray(entity.service?.environment)[0] + : undefined, }); } diff --git a/x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts b/x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts index 1521aa67e3d92..cd2354994db2c 100644 --- a/x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts +++ b/x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts @@ -106,7 +106,7 @@ const resolveDataViewReference = async ( }); return { - indices: dataView.title, + indices: dataView.getIndexPattern(), timestampField: dataView.timeFieldName ?? TIMESTAMP_FIELD, tiebreakerField: TIEBREAKER_FIELD, messageField: ['message'], diff --git a/x-pack/plugins/observability_solution/logs_shared/server/saved_objects/log_view/log_view_saved_object.ts b/x-pack/plugins/observability_solution/logs_shared/server/saved_objects/log_view/log_view_saved_object.ts index 246c398ea5a65..7d067993531e3 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/saved_objects/log_view/log_view_saved_object.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/saved_objects/log_view/log_view_saved_object.ts @@ -40,5 +40,4 @@ export const logViewSavedObjectType: SavedObjectsType = { }, }, }, - migrations: {}, }; diff --git a/x-pack/plugins/observability_solution/observability/common/index.ts b/x-pack/plugins/observability_solution/observability/common/index.ts index 4baaf7957fa81..f43090d799fdf 100644 --- a/x-pack/plugins/observability_solution/observability/common/index.ts +++ b/x-pack/plugins/observability_solution/observability/common/index.ts @@ -61,7 +61,9 @@ export { getProbabilityFromProgressiveLoadingQuality, } from './progressive_loading'; +/** @deprecated deprecated in 8.17. Please use casesFeatureIdV2 instead */ export const casesFeatureId = 'observabilityCases'; +export const casesFeatureIdV2 = 'observabilityCasesV2'; export const sloFeatureId = 'slo'; // The ID of the observability app. Should more appropriately be called // 'observability' but it's used in telemetry by applicationUsage so we don't diff --git a/x-pack/plugins/observability_solution/observability/public/pages/alerts/components/alert_actions.tsx b/x-pack/plugins/observability_solution/observability/public/pages/alerts/components/alert_actions.tsx index 071b75ab89632..cf0c4aa3c8b60 100644 --- a/x-pack/plugins/observability_solution/observability/public/pages/alerts/components/alert_actions.tsx +++ b/x-pack/plugins/observability_solution/observability/public/pages/alerts/components/alert_actions.tsx @@ -159,7 +159,7 @@ export function AlertActions({ ); const actionsMenuItems = [ - ...(userCasesPermissions.create && userCasesPermissions.read + ...(userCasesPermissions.createComment && userCasesPermissions.read ? [ ({ + deprecated: { + // TODO: Add docLinks to link to documentation about the deprecation + notice: i18n.translate( + 'xpack.observability.featureRegistry.linkObservabilityTitle.deprecationMessage', + { + defaultMessage: + 'The {currentId} permissions are deprecated, please see {casesFeatureIdV2}.', + values: { + currentId: casesFeatureId, + casesFeatureIdV2, + }, + } + ), + }, + id: casesFeatureId, + name: i18n.translate('xpack.observability.featureRegistry.linkObservabilityTitleDeprecated', { + defaultMessage: 'Cases (Deprecated)', + }), + order: 1100, + category: DEFAULT_APP_CATEGORIES.observability, + scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], + app: [casesFeatureId, 'kibana'], + catalogue: [observabilityFeatureId], + cases: [observabilityFeatureId], + privileges: { + all: { + api: [...casesApiTags.all, ...casesApiTags.createComment], + app: [casesFeatureId, 'kibana'], + catalogue: [observabilityFeatureId], + cases: { + create: [observabilityFeatureId], + read: [observabilityFeatureId], + update: [observabilityFeatureId], + push: [observabilityFeatureId], + createComment: [observabilityFeatureId], + reopenCase: [observabilityFeatureId], + }, + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + ui: casesCapabilities.all, + replacedBy: { + default: [{ feature: casesFeatureIdV2, privileges: ['all'] }], + minimal: [ + { + feature: casesFeatureIdV2, + privileges: ['minimal_all', 'create_comment', 'case_reopen'], + }, + ], + }, + }, + read: { + api: casesApiTags.read, + app: [casesFeatureId, 'kibana'], + catalogue: [observabilityFeatureId], + cases: { + read: [observabilityFeatureId], + }, + savedObject: { + all: [], + read: [...filesSavedObjectTypes], + }, + ui: casesCapabilities.read, + replacedBy: { + default: [{ feature: casesFeatureIdV2, privileges: ['read'] }], + minimal: [{ feature: casesFeatureIdV2, privileges: ['minimal_read'] }], + }, + }, + }, + subFeatures: [ + { + name: i18n.translate('xpack.observability.featureRegistry.deleteSubFeatureName', { + defaultMessage: 'Delete', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + api: casesApiTags.delete, + id: 'cases_delete', + name: i18n.translate('xpack.observability.featureRegistry.deleteSubFeatureDetails', { + defaultMessage: 'Delete cases and comments', + }), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + delete: [observabilityFeatureId], + }, + ui: casesCapabilities.delete, + replacedBy: [{ feature: casesFeatureIdV2, privileges: ['cases_delete'] }], + }, + ], + }, + ], + }, + { + name: i18n.translate('xpack.observability.featureRegistry.casesSettingsSubFeatureName', { + defaultMessage: 'Case settings', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: 'cases_settings', + name: i18n.translate( + 'xpack.observability.featureRegistry.casesSettingsSubFeatureDetails', + { + defaultMessage: 'Edit case settings', + } + ), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + settings: [observabilityFeatureId], + }, + ui: casesCapabilities.settings, + replacedBy: [{ feature: casesFeatureIdV2, privileges: ['cases_settings'] }], + }, + ], + }, + ], + }, + ], +}); diff --git a/x-pack/plugins/observability_solution/observability/server/features/cases_v2.ts b/x-pack/plugins/observability_solution/observability/server/features/cases_v2.ts new file mode 100644 index 0000000000000..52b501a62bb2e --- /dev/null +++ b/x-pack/plugins/observability_solution/observability/server/features/cases_v2.ts @@ -0,0 +1,181 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; +import { hiddenTypes as filesSavedObjectTypes } from '@kbn/files-plugin/server/saved_objects'; +import { i18n } from '@kbn/i18n'; +import { KibanaFeatureConfig, KibanaFeatureScope } from '@kbn/features-plugin/common'; +import { CasesUiCapabilities, CasesApiTags } from '@kbn/cases-plugin/common'; +import { casesFeatureIdV2, casesFeatureId, observabilityFeatureId } from '../../common'; + +export const getCasesFeatureV2 = ( + casesCapabilities: CasesUiCapabilities, + casesApiTags: CasesApiTags +): KibanaFeatureConfig => ({ + id: casesFeatureIdV2, + name: i18n.translate('xpack.observability.featureRegistry.linkObservabilityTitle', { + defaultMessage: 'Cases', + }), + order: 1100, + category: DEFAULT_APP_CATEGORIES.observability, + scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], + app: [casesFeatureId, 'kibana'], + catalogue: [observabilityFeatureId], + cases: [observabilityFeatureId], + privileges: { + all: { + api: casesApiTags.all, + app: [casesFeatureId, 'kibana'], + catalogue: [observabilityFeatureId], + cases: { + create: [observabilityFeatureId], + read: [observabilityFeatureId], + update: [observabilityFeatureId], + push: [observabilityFeatureId], + }, + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + ui: casesCapabilities.all, + }, + read: { + api: casesApiTags.read, + app: [casesFeatureId, 'kibana'], + catalogue: [observabilityFeatureId], + cases: { + read: [observabilityFeatureId], + }, + savedObject: { + all: [], + read: [...filesSavedObjectTypes], + }, + ui: casesCapabilities.read, + }, + }, + subFeatures: [ + { + name: i18n.translate('xpack.observability.featureRegistry.deleteSubFeatureName', { + defaultMessage: 'Delete', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + api: casesApiTags.delete, + id: 'cases_delete', + name: i18n.translate('xpack.observability.featureRegistry.deleteSubFeatureDetails', { + defaultMessage: 'Delete cases and comments', + }), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + delete: [observabilityFeatureId], + }, + ui: casesCapabilities.delete, + }, + ], + }, + ], + }, + { + name: i18n.translate('xpack.observability.featureRegistry.casesSettingsSubFeatureName', { + defaultMessage: 'Case settings', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: 'cases_settings', + name: i18n.translate( + 'xpack.observability.featureRegistry.casesSettingsSubFeatureDetails', + { + defaultMessage: 'Edit case settings', + } + ), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + settings: [observabilityFeatureId], + }, + ui: casesCapabilities.settings, + }, + ], + }, + ], + }, + { + name: i18n.translate('xpack.observability.featureRegistry.addCommentsSubFeatureName', { + defaultMessage: 'Create comments & attachments', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + api: casesApiTags.createComment, + id: 'create_comment', + name: i18n.translate( + 'xpack.observability.featureRegistry.addCommentsSubFeatureDetails', + { + defaultMessage: 'Add comments to cases', + } + ), + includeIn: 'all', + savedObject: { + all: [...filesSavedObjectTypes], + read: [...filesSavedObjectTypes], + }, + cases: { + createComment: [observabilityFeatureId], + }, + ui: casesCapabilities.createComment, + }, + ], + }, + ], + }, + { + name: i18n.translate('xpack.observability.featureRegistry.reopenCaseSubFeatureName', { + defaultMessage: 'Re-open', + }), + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: 'case_reopen', + name: i18n.translate( + 'xpack.observability.featureRegistry.reopenCaseSubFeatureDetails', + { + defaultMessage: 'Re-open closed cases', + } + ), + includeIn: 'all', + savedObject: { + all: [], + read: [], + }, + cases: { + reopenCase: [observabilityFeatureId], + }, + ui: casesCapabilities.reopenCase, + }, + ], + }, + ], + }, + ], +}); diff --git a/x-pack/plugins/observability_solution/observability/server/plugin.ts b/x-pack/plugins/observability_solution/observability/server/plugin.ts index 7f9a37a5a26c4..b98fe316c712e 100644 --- a/x-pack/plugins/observability_solution/observability/server/plugin.ts +++ b/x-pack/plugins/observability_solution/observability/server/plugin.ts @@ -21,7 +21,6 @@ import { } from '@kbn/core/server'; import { LogsExplorerLocatorParams, LOGS_EXPLORER_LOCATOR_ID } from '@kbn/deeplinks-observability'; import { FeaturesPluginSetup } from '@kbn/features-plugin/server'; -import { hiddenTypes as filesSavedObjectTypes } from '@kbn/files-plugin/server/saved_objects'; import type { GuidedOnboardingPluginSetup } from '@kbn/guided-onboarding-plugin/server'; import { i18n } from '@kbn/i18n'; import { @@ -41,7 +40,7 @@ import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import { KibanaFeatureScope } from '@kbn/features-plugin/common'; import { ObservabilityConfig } from '.'; -import { casesFeatureId, observabilityFeatureId } from '../common'; +import { observabilityFeatureId } from '../common'; import { kubernetesGuideConfig, kubernetesGuideId, @@ -58,6 +57,8 @@ import { registerRoutes } from './routes/register_routes'; import { threshold } from './saved_objects/threshold'; import { AlertDetailsContextualInsightsService } from './services'; import { uiSettings } from './ui_settings'; +import { getCasesFeature } from './features/cases_v1'; +import { getCasesFeatureV2 } from './features/cases_v2'; export type ObservabilityPluginSetup = ReturnType; @@ -110,112 +111,8 @@ export class ObservabilityPlugin implements Plugin { const alertDetailsContextualInsightsService = new AlertDetailsContextualInsightsService(); - plugins.features.registerKibanaFeature({ - id: casesFeatureId, - name: i18n.translate('xpack.observability.featureRegistry.linkObservabilityTitle', { - defaultMessage: 'Cases', - }), - order: 1100, - category: DEFAULT_APP_CATEGORIES.observability, - scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], - app: [casesFeatureId, 'kibana'], - catalogue: [observabilityFeatureId], - cases: [observabilityFeatureId], - privileges: { - all: { - api: casesApiTags.all, - app: [casesFeatureId, 'kibana'], - catalogue: [observabilityFeatureId], - cases: { - create: [observabilityFeatureId], - read: [observabilityFeatureId], - update: [observabilityFeatureId], - push: [observabilityFeatureId], - }, - savedObject: { - all: [...filesSavedObjectTypes], - read: [...filesSavedObjectTypes], - }, - ui: casesCapabilities.all, - }, - read: { - api: casesApiTags.read, - app: [casesFeatureId, 'kibana'], - catalogue: [observabilityFeatureId], - cases: { - read: [observabilityFeatureId], - }, - savedObject: { - all: [], - read: [...filesSavedObjectTypes], - }, - ui: casesCapabilities.read, - }, - }, - subFeatures: [ - { - name: i18n.translate('xpack.observability.featureRegistry.deleteSubFeatureName', { - defaultMessage: 'Delete', - }), - privilegeGroups: [ - { - groupType: 'independent', - privileges: [ - { - api: casesApiTags.delete, - id: 'cases_delete', - name: i18n.translate( - 'xpack.observability.featureRegistry.deleteSubFeatureDetails', - { - defaultMessage: 'Delete cases and comments', - } - ), - includeIn: 'all', - savedObject: { - all: [...filesSavedObjectTypes], - read: [...filesSavedObjectTypes], - }, - cases: { - delete: [observabilityFeatureId], - }, - ui: casesCapabilities.delete, - }, - ], - }, - ], - }, - { - name: i18n.translate('xpack.observability.featureRegistry.casesSettingsSubFeatureName', { - defaultMessage: 'Case settings', - }), - privilegeGroups: [ - { - groupType: 'independent', - privileges: [ - { - id: 'cases_settings', - name: i18n.translate( - 'xpack.observability.featureRegistry.casesSettingsSubFeatureDetails', - { - defaultMessage: 'Edit case settings', - } - ), - includeIn: 'all', - savedObject: { - all: [...filesSavedObjectTypes], - read: [...filesSavedObjectTypes], - }, - cases: { - settings: [observabilityFeatureId], - }, - ui: casesCapabilities.settings, - }, - ], - }, - ], - }, - ], - }); + plugins.features.registerKibanaFeature(getCasesFeature(casesCapabilities, casesApiTags)); + plugins.features.registerKibanaFeature(getCasesFeatureV2(casesCapabilities, casesApiTags)); let annotationsApiPromise: Promise | undefined; diff --git a/x-pack/plugins/observability_solution/observability_shared/common/index.ts b/x-pack/plugins/observability_solution/observability_shared/common/index.ts index b4b7731d166b7..f483bcc5dc269 100644 --- a/x-pack/plugins/observability_solution/observability_shared/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/common/index.ts @@ -8,7 +8,7 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; export const observabilityFeatureId = 'observability'; export const observabilityAppId = 'observability-overview'; -export const casesFeatureId = 'observabilityCases'; +export const casesFeatureId = 'observabilityCasesV2'; export const sloFeatureId = 'slo'; // SLO alerts table in slo detail page diff --git a/x-pack/plugins/observability_solution/observability_shared/public/utils/cases_permissions.ts b/x-pack/plugins/observability_solution/observability_shared/public/utils/cases_permissions.ts index 0ceea46ad0d38..0b3699e49b40c 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/utils/cases_permissions.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/utils/cases_permissions.ts @@ -14,6 +14,8 @@ export const noCasesPermissions = () => ({ push: false, connectors: false, settings: false, + createComment: false, + reopenCase: false, }); export const allCasesPermissions = () => ({ @@ -25,4 +27,6 @@ export const allCasesPermissions = () => ({ push: true, connectors: true, settings: true, + createComment: true, + reopenCase: true, }); diff --git a/x-pack/plugins/observability_solution/profiling/server/routes/apm.ts b/x-pack/plugins/observability_solution/profiling/server/routes/apm.ts index 7ad001831c0e4..4d5a7cca0ff7f 100644 --- a/x-pack/plugins/observability_solution/profiling/server/routes/apm.ts +++ b/x-pack/plugins/observability_solution/profiling/server/routes/apm.ts @@ -52,9 +52,7 @@ export function registerTopNFunctionsAPMTransactionsRoute({ }); } const core = await context.core; - const { transaction: transactionIndices } = await apmDataAccess.getApmIndices( - core.savedObjects.client - ); + const { transaction: transactionIndices } = await apmDataAccess.getApmIndices(); const esClient = await getClient(context); diff --git a/x-pack/plugins/observability_solution/slo/emotion.d.ts b/x-pack/plugins/observability_solution/slo/emotion.d.ts new file mode 100644 index 0000000000000..213178080e536 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/emotion.d.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 '@emotion/react'; +import type { UseEuiTheme } from '@elastic/eui'; + +declare module '@emotion/react' { + // eslint-disable-next-line @typescript-eslint/no-empty-interface + export interface Theme extends UseEuiTheme {} +} diff --git a/x-pack/plugins/observability_solution/slo/public/application.tsx b/x-pack/plugins/observability_solution/slo/public/application.tsx index 79160de114cd5..abd85fc712c0e 100644 --- a/x-pack/plugins/observability_solution/slo/public/application.tsx +++ b/x-pack/plugins/observability_solution/slo/public/application.tsx @@ -5,10 +5,9 @@ * 2.0. */ -import { AppMountParameters, APP_WRAPPER_CLASS, CoreStart } from '@kbn/core/public'; +import { APP_WRAPPER_CLASS, AppMountParameters, CoreStart } from '@kbn/core/public'; import { PerformanceContextProvider } from '@kbn/ebt-tools'; import { i18n } from '@kbn/i18n'; -import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { ObservabilityRuleTypeRegistry } from '@kbn/observability-plugin/public'; @@ -25,7 +24,7 @@ import { ExperimentalFeatures } from '../common/config'; import { PluginContext } from './context/plugin_context'; import { usePluginContext } from './hooks/use_plugin_context'; import { getRoutes } from './routes/routes'; -import { SLORepositoryClient, SLOPublicPluginsStart } from './types'; +import { SLOPublicPluginsStart, SLORepositoryClient } from './types'; interface Props { core: CoreStart; @@ -55,7 +54,6 @@ export const renderApp = ({ sloClient, }: Props) => { const { element, history, theme$ } = appMountParameters; - const isDarkMode = core.theme.getTheme().darkMode; // ensure all divs are .kbnAppWrappers element.classList.add(APP_WRAPPER_CLASS); @@ -116,15 +114,13 @@ export const renderApp = ({ }} > - - - - - - - - - + + + + + + + diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_alerts_wrapper.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_alerts_wrapper.tsx index d6c58315cc1ad..b46506ea73d9e 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_alerts_wrapper.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_alerts_wrapper.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui'; import type { TimeRange } from '@kbn/es-query'; import { Subject } from 'rxjs'; -import styled from 'styled-components'; +import { css } from '@emotion/react'; import { observabilityPaths } from '@kbn/observability-plugin/common'; import { FetchContext } from '@kbn/presentation-publishing'; import { SloIncludedCount } from './components/slo_included_count'; @@ -72,14 +72,10 @@ export function SloAlertsWrapper({ } }, [isSummaryLoaded, isTableLoaded, onRenderComplete]); const handleGoToAlertsClick = () => { - let kuery = ''; - slos.map((slo, index) => { - const shouldAddOr = index < slos.length - 1; - kuery += `(slo.id:"${slo.id}" and slo.instanceId:"${slo.instanceId}")`; - if (shouldAddOr) { - kuery += ' or '; - } - }); + const kuery = slos + .map((slo) => `(slo.id:"${slo.id}" and slo.instanceId:"${slo.instanceId}")`) + .join(' or '); + navigateToUrl( `${basePath.prepend(observabilityPaths.alerts)}?_a=(kuery:'${kuery}',rangeFrom:${ timeRange.from @@ -87,12 +83,17 @@ export function SloAlertsWrapper({ ); }; return ( - +
@@ -150,11 +151,6 @@ export function SloAlertsWrapper({ /> - +
); } - -const Wrapper = styled.div` - width: 100%; - overflow: scroll; -`; diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_configuration.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_configuration.tsx index 979162aee40b2..07d55b02fb270 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_configuration.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/alerts/slo_configuration.tsx @@ -5,24 +5,24 @@ * 2.0. */ -import React, { useState } from 'react'; import { - EuiFlyout, - EuiFlyoutHeader, - EuiFlyoutBody, - EuiFlyoutFooter, - EuiTitle, EuiButton, EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, EuiSpacer, EuiSwitch, + EuiTitle, } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; import { ALL_VALUE } from '@kbn/slo-schema'; - +import React, { useState } from 'react'; import { SloSelector } from './slo_selector'; import type { EmbeddableSloProps, SloItem } from './types'; @@ -47,7 +47,7 @@ export function SloConfiguration({ initialInput, onCreate, onCancel }: SloConfig return ( diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/burn_rate/burn_rate.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/burn_rate/burn_rate.tsx index bb92363359112..43491ff036a33 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/burn_rate/burn_rate.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/burn_rate/burn_rate.tsx @@ -5,8 +5,15 @@ * 2.0. */ -import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiLink, EuiLoadingChart } from '@elastic/eui'; -import { css } from '@emotion/css'; +import { + EuiBadge, + EuiFlexGroup, + EuiFlexItem, + EuiLink, + EuiLoadingChart, + UseEuiTheme, +} from '@elastic/eui'; +import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { SLOWithSummaryResponse } from '@kbn/slo-schema'; @@ -41,12 +48,7 @@ export function BurnRate({ sloId, sloInstanceId, duration, reloadSubject }: Embe if (isLoading || !slo) { return ( - + @@ -56,12 +58,7 @@ export function BurnRate({ sloId, sloInstanceId, duration, reloadSubject }: Embe if (isSloNotFound) { return ( - + {i18n.translate('xpack.slo.sloEmbeddable.overview.sloNotFoundText', { defaultMessage: @@ -84,7 +81,7 @@ export function BurnRate({ sloId, sloInstanceId, duration, reloadSubject }: Embe { setSelectedSlo(slo); @@ -146,7 +143,7 @@ const container = css` height: 100%; `; -const link = css` - font-size: 16px; - font-weight: 700; +const link = ({ euiTheme }: UseEuiTheme) => css` + font-size: ${euiTheme.size.base}; + font-weight: ${euiTheme.font.weight.bold}; `; diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx index e74ba591e7166..57de174194976 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx @@ -5,7 +5,8 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, UseEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; import type { CoreStart } from '@kbn/core-lifecycle-browser'; import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; import { i18n } from '@kbn/i18n'; @@ -21,7 +22,6 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { createBrowserHistory } from 'history'; import React, { useEffect } from 'react'; import { BehaviorSubject, Subject } from 'rxjs'; -import styled from 'styled-components'; import { PluginContext } from '../../../context/plugin_context'; import type { SLOPublicPluginsStart, SLORepositoryClient } from '../../../types'; import { SLO_OVERVIEW_EMBEDDABLE_ID } from './constants'; @@ -165,11 +165,21 @@ export const getOverviewEmbeddableFactory = ({ const kqlQuery = groupFilters?.kqlQuery ?? ''; const groups = groupFilters?.groups ?? []; return ( - +
css` + width: 100%; + padding: ${euiTheme.size.xs} ${euiTheme.size.base}; + overflow: scroll; + + .euiAccordion__buttonContent { + min-width: ${euiTheme.base * 6}px; + } + `} + > css` + margin-top: ${euiTheme.base * 1.25}px; `} > - +
); } else { return ( @@ -230,13 +240,3 @@ export const getOverviewEmbeddableFactory = ({ }; return factory; }; - -const Wrapper = styled.div` - width: 100%; - padding: 5px 15px; - overflow: scroll; - - .euiAccordion__buttonContent { - min-width: 100px; - } -`; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx index e7e61adfc1cc5..629d6e9ec4598 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx @@ -6,16 +6,16 @@ */ import { EuiFormRow } from '@elastic/eui'; -import { Controller, useFormContext } from 'react-hook-form'; -import { fromKueryExpression, Query, TimeRange, toElasticsearchQuery } from '@kbn/es-query'; +import { css } from '@emotion/react'; +import { Query, TimeRange, fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; +import { observabilityAppId } from '@kbn/observability-shared-plugin/common'; import { kqlQuerySchema, kqlWithFiltersSchema } from '@kbn/slo-schema'; import React, { memo } from 'react'; -import styled from 'styled-components'; -import { observabilityAppId } from '@kbn/observability-shared-plugin/common'; -import { SearchBarProps } from './query_builder'; +import { Controller, useFormContext } from 'react-hook-form'; import { useKibana } from '../../../../hooks/use_kibana'; import { CreateSLOForm } from '../../types'; import { OptionalText } from './optional_text'; +import { SearchBarProps } from './query_builder'; export const QuerySearchBar = memo( ({ @@ -90,7 +90,13 @@ export const QuerySearchBar = memo( error={fieldState.error?.message} fullWidth > - +
{}} filters={kqlQuerySchema.is(field.value) ? [] : field.value?.filters ?? []} /> - +
); }} @@ -161,9 +167,3 @@ export const QuerySearchBar = memo( ); } ); - -const Container = styled.div` - .uniSearchBar { - padding: 0; - } -`; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_actions.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_actions.tsx index 53a8da22db2a7..9df624edc1e60 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_actions.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_actions.tsx @@ -4,39 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; -import { SLOWithSummaryResponse } from '@kbn/slo-schema'; -import styled from 'styled-components'; import { useEuiShadow } from '@elastic/eui'; +import { css } from '@emotion/react'; +import { SLOWithSummaryResponse } from '@kbn/slo-schema'; import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; +import React from 'react'; import { BurnRateRuleParams } from '../../../../typings'; import { SloItemActions } from '../slo_item_actions'; -type PopoverPosition = 'relative' | 'default'; - -interface ActionContainerProps { - boxShadow: string; - position: PopoverPosition; -} - -const Container = styled.div` - ${({ position }) => - position === 'relative' - ? // custom styles used to overlay the popover button on `MetricItem` - ` - display: inline-block; - position: relative; - bottom: 42px; - left: 12px; - z-index: 1; -` - : // otherwise, no custom position needed - ''} - - border-radius: ${({ theme }) => theme.eui.euiBorderRadius}; - ${({ boxShadow, position }) => (position === 'relative' ? boxShadow : '')} -`; - interface Props { slo: SLOWithSummaryResponse; isActionsPopoverOpen: boolean; @@ -50,10 +25,19 @@ interface Props { } export function SloCardItemActions(props: Props) { - const euiShadow = useEuiShadow('l'); - + const shadow = useEuiShadow('l'); return ( - +
css` + display: inline-block; + position: relative; + bottom: ${euiTheme.size.xxl}; + left: ${euiTheme.size.m}; + z-index: 1; + border-radius: ${euiTheme.border.radius.medium}; + ${shadow} + `} + > - +
); } diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx index 5166baaf7d311..7f1888e182f38 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx @@ -9,7 +9,7 @@ import { EuiFlexGroup } from '@elastic/eui'; import { SLOWithSummaryResponse } from '@kbn/slo-schema'; import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; import React, { useCallback } from 'react'; -import styled from 'styled-components'; +import { css } from '@emotion/react'; import { SloIndicatorTypeBadge } from '../badges/slo_indicator_type_badge'; import { SloActiveAlertsBadge } from '../../../../components/slo/slo_status_badge/slo_active_alerts_badge'; import { BurnRateRuleParams } from '../../../../typings'; @@ -29,11 +29,6 @@ interface Props { handleCreateRule?: () => void; } -const Container = styled.div` - display: inline-block; - margin-top: 5px; -`; - export function SloCardItemBadges({ slo, activeAlerts, rules, handleCreateRule }: Props) { const { onStateChange } = useUrlSearchState(); @@ -52,10 +47,15 @@ export function SloCardItemBadges({ slo, activeAlerts, rules, handleCreateRule } const numberOfTagsToDisplay = !isRemote || (rules ?? []).length > 0 ? 2 : 1; return ( - css` + display: inline-block; + margin-top: ${euiTheme.size.xs}; + `} onClick={(evt) => { evt.stopPropagation(); }} + aria-hidden="true" > {!slo.summary ? ( @@ -78,6 +78,6 @@ export function SloCardItemBadges({ slo, activeAlerts, rules, handleCreateRule } )} - +

); } diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx index ad350a3d17fbe..3924b55c0f096 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx @@ -5,14 +5,14 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; -import { skip } from 'rxjs'; -import React, { useEffect, useState } from 'react'; +import { css } from '@emotion/react'; import { ControlGroupRenderer, ControlGroupRendererApi } from '@kbn/controls-plugin/public'; import { DataView } from '@kbn/data-views-plugin/common'; -import styled from 'styled-components'; import { Filter } from '@kbn/es-query'; +import { i18n } from '@kbn/i18n'; import { isEmpty } from 'lodash'; +import React, { useEffect, useState } from 'react'; +import { skip } from 'rxjs'; import { SearchState } from '../../hooks/use_url_search_state'; interface Props { @@ -53,7 +53,17 @@ export function QuickFilters({ } return ( - +
{ @@ -94,7 +104,7 @@ export function QuickFilters({ timeRange={{ from: 'now-24h', to: 'now' }} compressed={false} /> - +
); } @@ -114,16 +124,6 @@ export const getSelectedOptions = (filter?: Filter) => { return []; }; -const Container = styled.div` - .controlsWrapper { - align-items: flex-start; - min-height: initial; - } - .controlGroup { - min-height: initial; - } -`; - const TAGS_LABEL = i18n.translate('xpack.slo.list.tags', { defaultMessage: 'Tags', }); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx index 1a99f8ff354d9..37c48b2bf8881 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx @@ -14,15 +14,15 @@ import { EuiPopover, useEuiShadow, } from '@elastic/eui'; +import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { SLOWithSummaryResponse } from '@kbn/slo-schema'; import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; import React from 'react'; -import styled from 'styled-components'; -import { usePermissions } from '../../../hooks/use_permissions'; import { useCloneSlo } from '../../../hooks/use_clone_slo'; -import { BurnRateRuleParams } from '../../../typings'; import { useKibana } from '../../../hooks/use_kibana'; +import { usePermissions } from '../../../hooks/use_permissions'; +import { BurnRateRuleParams } from '../../../typings'; import { useSloActions } from '../../slo_details/hooks/use_slo_actions'; interface Props { @@ -37,24 +37,22 @@ interface Props { btnProps?: Partial; rules?: Array>; } -const CustomShadowPanel = styled(EuiPanel)<{ shadow: string }>` - ${(props) => props.shadow} -`; -function IconPanel({ children, hasPanel }: { children: JSX.Element; hasPanel: boolean }) { +function IconPanel({ children }: { children: JSX.Element }) { const shadow = useEuiShadow('s'); - if (!hasPanel) return children; return ( - {children} - + ); } @@ -161,7 +159,7 @@ export function SloItemActions({ return ( {btn} : btn} + button={btnProps ? {btn} : btn} panelPaddingSize="m" closePopover={handleClickActions} isOpen={isActionsPopoverOpen} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.tsx index 16c635a2da20c..d6d501494bc4f 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.tsx @@ -5,11 +5,11 @@ * 2.0. */ +import { css } from '@emotion/react'; import { Query } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; import { observabilityAppId } from '@kbn/observability-plugin/public'; import React, { useEffect } from 'react'; -import styled from 'styled-components'; import { useKibana } from '../../../hooks/use_kibana'; import { useSloCrudLoading } from '../hooks/use_crud_loading'; import { useSloSummaryDataView } from '../hooks/use_summary_dataview'; @@ -42,7 +42,13 @@ export function SloListSearchBar() { }, [onStateChange, query]); return ( - +
- +
); } -const Container = styled.div` - .uniSearchBar { - padding: 0; - } -`; - const PLACEHOLDER = i18n.translate('xpack.slo.list.search', { defaultMessage: 'Search your SLOs ...', }); diff --git a/x-pack/plugins/observability_solution/slo/public/utils/test_helper.tsx b/x-pack/plugins/observability_solution/slo/public/utils/test_helper.tsx index fd735d94c4a98..44cd0abceded4 100644 --- a/x-pack/plugins/observability_solution/slo/public/utils/test_helper.tsx +++ b/x-pack/plugins/observability_solution/slo/public/utils/test_helper.tsx @@ -9,16 +9,15 @@ import { AppMountParameters } from '@kbn/core/public'; import { coreMock } from '@kbn/core/public/mocks'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; -import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { createObservabilityRuleTypeRegistryMock } from '@kbn/observability-plugin/public'; +import { DefaultClientOptions, createRepositoryClient } from '@kbn/server-route-repository-client'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { render as testLibRender } from '@testing-library/react'; import React from 'react'; -import { DefaultClientOptions, createRepositoryClient } from '@kbn/server-route-repository-client'; -import { PluginContext } from '../context/plugin_context'; import type { SLORouteRepository } from '../../server/routes/get_slo_server_route_repository'; +import { PluginContext } from '../context/plugin_context'; const appMountParameters = { setHeaderActionMenu: () => {} } as unknown as AppMountParameters; const observabilityRuleTypeRegistry = createObservabilityRuleTypeRegistryMock(); @@ -67,9 +66,7 @@ export const render = (component: React.ReactNode) => { sloClient, }} > - - {component} - + {component} diff --git a/x-pack/plugins/observability_solution/slo/server/plugin.ts b/x-pack/plugins/observability_solution/slo/server/plugin.ts index d7d002d26aa03..7699cbe5f1404 100644 --- a/x-pack/plugins/observability_solution/slo/server/plugin.ts +++ b/x-pack/plugins/observability_solution/slo/server/plugin.ts @@ -141,6 +141,7 @@ export class SLOPlugin }, logger: this.logger, repository: getSloServerRouteRepository({ isServerless: this.isServerless }), + isServerless: this.isServerless, }); core diff --git a/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts b/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts index fd0b18c210041..6e3c02a5b921b 100644 --- a/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts +++ b/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts @@ -7,16 +7,32 @@ import { CoreSetup, Logger } from '@kbn/core/server'; import { ServerRoute, registerRoutes } from '@kbn/server-route-repository'; import { ServerRouteCreateOptions } from '@kbn/server-route-repository-utils'; -import { SLORoutesDependencies } from './types'; +import { SLORequestHandlerContext, SLORoutesDependencies } from './types'; interface RegisterRoutes { core: CoreSetup; repository: Record>; logger: Logger; dependencies: SLORoutesDependencies; + isServerless: boolean; } -export function registerServerRoutes({ repository, core, logger, dependencies }: RegisterRoutes) { +export function registerServerRoutes({ + repository, + core, + logger, + dependencies, + isServerless, +}: RegisterRoutes) { + core.http.registerRouteHandlerContext( + 'slo', + async (_context, _request) => { + return { + isServerless, + }; + } + ); + registerRoutes({ repository, dependencies, diff --git a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts index 9e63a4b02fe7b..7f3b395c7adba 100644 --- a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts +++ b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts @@ -107,6 +107,7 @@ const createSLORoute = createSloServerRoute({ handler: async ({ context, response, params, logger, request, plugins, corePlugins }) => { await assertPlatinumLicense(plugins); + const sloContext = await context.slo; const dataViews = await plugins.dataViews.start(); const core = await context.core; const scopedClusterClient = core.elasticsearch.client; @@ -124,7 +125,8 @@ const createSLORoute = createSloServerRoute({ scopedClusterClient, logger, spaceId, - dataViewsService + dataViewsService, + sloContext.isServerless ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -156,6 +158,7 @@ const inspectSLORoute = createSloServerRoute({ handler: async ({ context, params, logger, request, plugins, corePlugins }) => { await assertPlatinumLicense(plugins); + const sloContext = await context.slo; const dataViews = await plugins.dataViews.start(); const spaceId = await getSpaceId(plugins, request); const basePath = corePlugins.http.basePath; @@ -170,7 +173,8 @@ const inspectSLORoute = createSloServerRoute({ scopedClusterClient, logger, spaceId, - dataViewsService + dataViewsService, + sloContext.isServerless ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -206,6 +210,7 @@ const updateSLORoute = createSloServerRoute({ const spaceId = await getSpaceId(plugins, request); const dataViews = await plugins.dataViews.start(); + const sloContext = await context.slo; const basePath = corePlugins.http.basePath; const core = await context.core; const scopedClusterClient = core.elasticsearch.client; @@ -218,7 +223,8 @@ const updateSLORoute = createSloServerRoute({ scopedClusterClient, logger, spaceId, - dataViewsService + dataViewsService, + sloContext.isServerless ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -254,6 +260,7 @@ const deleteSLORoute = createSloServerRoute({ const spaceId = await getSpaceId(plugins, request); const dataViews = await plugins.dataViews.start(); + const sloContext = await context.slo; const core = await context.core; const scopedClusterClient = core.elasticsearch.client; const esClient = core.elasticsearch.client.asCurrentUser; @@ -270,7 +277,8 @@ const deleteSLORoute = createSloServerRoute({ scopedClusterClient, logger, spaceId, - dataViewsService + dataViewsService, + sloContext.isServerless ); const summaryTransformManager = new DefaultSummaryTransformManager( @@ -331,7 +339,7 @@ const enableSLORoute = createSloServerRoute({ const spaceId = await getSpaceId(plugins, request); const dataViews = await plugins.dataViews.start(); - + const sloContext = await context.slo; const core = await context.core; const scopedClusterClient = core.elasticsearch.client; const soClient = core.savedObjects.client; @@ -343,7 +351,8 @@ const enableSLORoute = createSloServerRoute({ scopedClusterClient, logger, spaceId, - dataViewsService + dataViewsService, + sloContext.isServerless ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -372,6 +381,7 @@ const disableSLORoute = createSloServerRoute({ const spaceId = await getSpaceId(plugins, request); const dataViews = await plugins.dataViews.start(); + const sloContext = await context.slo; const core = await context.core; const scopedClusterClient = core.elasticsearch.client; const soClient = core.savedObjects.client; @@ -383,7 +393,8 @@ const disableSLORoute = createSloServerRoute({ scopedClusterClient, logger, spaceId, - dataViewsService + dataViewsService, + sloContext.isServerless ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -408,6 +419,7 @@ const resetSLORoute = createSloServerRoute({ handler: async ({ context, request, params, logger, plugins, corePlugins }) => { await assertPlatinumLicense(plugins); + const sloContext = await context.slo; const dataViews = await plugins.dataViews.start(); const spaceId = await getSpaceId(plugins, request); const core = await context.core; @@ -423,7 +435,8 @@ const resetSLORoute = createSloServerRoute({ scopedClusterClient, logger, spaceId, - dataViewsService + dataViewsService, + sloContext.isServerless ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), diff --git a/x-pack/plugins/observability_solution/slo/server/routes/types.ts b/x-pack/plugins/observability_solution/slo/server/routes/types.ts index cb5057cee4056..37937cf8c5688 100644 --- a/x-pack/plugins/observability_solution/slo/server/routes/types.ts +++ b/x-pack/plugins/observability_solution/slo/server/routes/types.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CoreSetup } from '@kbn/core/server'; +import { CoreSetup, CustomRequestHandlerContext } from '@kbn/core/server'; import type { DefaultRouteHandlerResources } from '@kbn/server-route-repository'; import { SLOPluginSetupDependencies, SLOPluginStartDependencies } from '../types'; @@ -21,4 +21,15 @@ export interface SLORoutesDependencies { corePlugins: CoreSetup; } -export type SLORouteHandlerResources = SLORoutesDependencies & DefaultRouteHandlerResources; +export type SLORouteHandlerResources = SLORoutesDependencies & + DefaultRouteHandlerResources & { + context: SLORequestHandlerContext; + }; + +export interface SLORouteContext { + isServerless: boolean; +} + +export type SLORequestHandlerContext = CustomRequestHandlerContext<{ + slo: Promise; +}>; diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts index 565a0d56d1ff4..fa40ab9cc1e8d 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts @@ -19,7 +19,7 @@ describe('Synthetics Availability Transform Generator', () => { it('returns the expected transform params', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform).toMatchSnapshot(); expect(transform.source.query?.bool?.filter).toContainEqual({ @@ -34,7 +34,7 @@ describe('Synthetics Availability Transform Generator', () => { id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -58,7 +58,7 @@ describe('Synthetics Availability Transform Generator', () => { indicator: createSyntheticsAvailabilityIndicator(), groupBy: ['host.name'], }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.pivot?.group_by).not.toEqual( expect.objectContaining({ @@ -94,7 +94,7 @@ describe('Synthetics Availability Transform Generator', () => { indicator: createSyntheticsAvailabilityIndicator(), groupBy, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -121,7 +121,7 @@ describe('Synthetics Availability Transform Generator', () => { indicator: createSyntheticsAvailabilityIndicator(), groupBy, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -146,7 +146,7 @@ describe('Synthetics Availability Transform Generator', () => { indicator: createSyntheticsAvailabilityIndicator(), groupBy, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -161,7 +161,7 @@ describe('Synthetics Availability Transform Generator', () => { it('filters by summary.final_attempt', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.source.query?.bool?.filter).toContainEqual({ term: { @@ -186,7 +186,7 @@ describe('Synthetics Availability Transform Generator', () => { }, } as SLODefinition['indicator'], }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.source.query?.bool?.filter).toContainEqual({ terms: { @@ -216,7 +216,7 @@ describe('Synthetics Availability Transform Generator', () => { }, } as SLODefinition['indicator'], }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.source.query?.bool?.filter).toContainEqual({ terms: { @@ -246,7 +246,7 @@ describe('Synthetics Availability Transform Generator', () => { }, } as SLODefinition['indicator'], }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.source.query?.bool?.filter).toContainEqual({ terms: { @@ -262,7 +262,7 @@ describe('Synthetics Availability Transform Generator', () => { it('filters by space', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); expect(transform.source.query?.bool?.filter).toContainEqual({ term: { @@ -281,7 +281,7 @@ describe('Synthetics Availability Transform Generator', () => { }, }); - const transform = await generator.getTransformParams(slo, 'default', dataViewsService); + const transform = await generator.getTransformParams(slo, 'default', dataViewsService, false); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts index e15c1d09a2044..285820f908182 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts @@ -31,7 +31,8 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator public async getTransformParams( slo: SLODefinition, spaceId: string, - dataViewService: DataViewsService + dataViewService: DataViewsService, + isServerless: boolean ): Promise { if (!syntheticsAvailabilityIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); @@ -44,7 +45,7 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator this.buildDestination(slo), this.buildGroupBy(slo, slo.indicator), this.buildAggregations(slo), - this.buildSettings(slo, 'event.ingested'), + this.buildSettings(slo, isServerless ? '@timestamp' : 'event.ingested'), slo ); } @@ -56,7 +57,7 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator private buildGroupBy(slo: SLODefinition, indicator: SyntheticsAvailabilityIndicator) { // These are the group by fields that will be used in `groupings` key // in the summary and rollup documents. For Synthetics, we want to use the - // user-readible `monitor.name` and `observer.geo.name` fields by default, + // user-readable `monitor.name` and `observer.geo.name` fields by default, // unless otherwise specified by the user. const flattenedGroupBy = [slo.groupBy].flat().filter((value) => !!value); const groupings = diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts index 8ae6eeb52c9be..25b0dc161661c 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts @@ -18,7 +18,8 @@ export abstract class TransformGenerator { public abstract getTransformParams( slo: SLODefinition, spaceId: string, - dataViewService: DataViewsService + dataViewService: DataViewsService, + isServerless: boolean ): Promise; public buildCommonRuntimeMappings(slo: SLODefinition, dataView?: DataView): MappingRuntimeFields { diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts index b7b5d7ba4fcd9..e837db4e88dc2 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts @@ -51,7 +51,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); await expect( @@ -69,7 +70,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); await expect( @@ -90,7 +92,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator() }); @@ -114,7 +117,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); await transformManager.preview('slo-transform-id'); @@ -136,7 +140,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); await transformManager.start('slo-transform-id'); @@ -158,7 +163,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); await transformManager.stop('slo-transform-id'); @@ -180,7 +186,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); await transformManager.uninstall('slo-transform-id'); @@ -203,7 +210,8 @@ describe('TransformManager', () => { scopedClusterClientMock, loggerMock, spaceId, - dataViewsService + dataViewsService, + false ); await transformManager.uninstall('slo-transform-id'); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts index 7e5ddce8bcad6..aed9931822bdc 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts @@ -31,7 +31,8 @@ export class DefaultTransformManager implements TransformManager { private scopedClusterClient: IScopedClusterClient, private logger: Logger, private spaceId: string, - private dataViewService: DataViewsService + private dataViewService: DataViewsService, + private isServerless: boolean ) {} async install(slo: SLODefinition): Promise { @@ -44,7 +45,8 @@ export class DefaultTransformManager implements TransformManager { const transformParams = await generator.getTransformParams( slo, this.spaceId, - this.dataViewService + this.dataViewService, + this.isServerless ); try { await retryTransientEsErrors( @@ -72,7 +74,12 @@ export class DefaultTransformManager implements TransformManager { throw new Error(`Unsupported indicator type [${slo.indicator.type}]`); } - return await generator.getTransformParams(slo, this.spaceId, this.dataViewService); + return await generator.getTransformParams( + slo, + this.spaceId, + this.dataViewService, + this.isServerless + ); } async preview(transformId: string): Promise { diff --git a/x-pack/plugins/observability_solution/slo/tsconfig.json b/x-pack/plugins/observability_solution/slo/tsconfig.json index 23efcc39698b1..be74e370a1fc1 100644 --- a/x-pack/plugins/observability_solution/slo/tsconfig.json +++ b/x-pack/plugins/observability_solution/slo/tsconfig.json @@ -7,7 +7,9 @@ "common/**/*", "public/**/*", "server/**/*", - "../../../typings/**/*" + "../../../typings/**/*", + // Emotion theme typing + "./emotion.d.ts" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts b/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts index f1098c89b7caa..0f4f2ca9441ad 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts @@ -112,3 +112,18 @@ export const getTimeSpanFilter = () => ({ }, }, }); + +export const getQueryFilters = (query: string) => ({ + query_string: { + query: `${query}`, + fields: [ + 'monitor.name.text', + 'tags', + 'observer.geo.name', + 'observer.name', + 'urls', + 'hosts', + 'monitor.project.id', + ], + }, +}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_filters.test.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_filters.test.ts new file mode 100644 index 0000000000000..830e2bce119ce --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_filters.test.ts @@ -0,0 +1,124 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import * as spaceHook from '../../../../../hooks/use_kibana_space'; +import * as paramHook from '../../../hooks/use_url_params'; +import * as redux from 'react-redux'; +import { useMonitorFilters } from './use_monitor_filters'; +import { WrappedHelper } from '../../../utils/testing'; + +describe('useMonitorFilters', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + const spaceSpy = jest.spyOn(spaceHook, 'useKibanaSpace'); + const paramSpy = jest.spyOn(paramHook, 'useGetUrlParams'); + const selSPy = jest.spyOn(redux, 'useSelector'); + + it('should return an empty array when no parameters are provided', () => { + const { result } = renderHook(() => useMonitorFilters({}), { wrapper: WrappedHelper }); + + expect(result.current).toEqual([]); + }); + + it('should return filters for allIds and schedules', () => { + spaceSpy.mockReturnValue({} as any); + paramSpy.mockReturnValue({ schedules: 'daily' } as any); + selSPy.mockReturnValue({ status: { allIds: ['id1', 'id2'] } }); + + const { result } = renderHook(() => useMonitorFilters({}), { wrapper: WrappedHelper }); + + expect(result.current).toEqual([{ field: 'monitor.id', values: ['id1', 'id2'] }]); + }); + + it('should return filters for allIds and empty schedules', () => { + spaceSpy.mockReturnValue({} as any); + paramSpy.mockReturnValue({ schedules: [] } as any); + selSPy.mockReturnValue({ status: { allIds: ['id1', 'id2'] } }); + + const { result } = renderHook(() => useMonitorFilters({}), { wrapper: WrappedHelper }); + + expect(result.current).toEqual([]); + }); + + it('should return filters for project IDs', () => { + spaceSpy.mockReturnValue({ space: null } as any); + paramSpy.mockReturnValue({ projects: ['project1', 'project2'] } as any); + selSPy.mockReturnValue({ status: { allIds: [] } }); + + const { result } = renderHook(() => useMonitorFilters({}), { wrapper: WrappedHelper }); + + expect(result.current).toEqual([ + { field: 'monitor.project.id', values: ['project1', 'project2'] }, + ]); + }); + + it('should return filters for tags and locations', () => { + spaceSpy.mockReturnValue({ space: null } as any); + paramSpy.mockReturnValue({ + tags: ['tag1', 'tag2'], + locations: ['location1', 'location2'], + } as any); + selSPy.mockReturnValue({ status: { allIds: [] } }); + + const { result } = renderHook(() => useMonitorFilters({}), { wrapper: WrappedHelper }); + + expect(result.current).toEqual([ + { field: 'tags', values: ['tag1', 'tag2'] }, + { field: 'observer.geo.name', values: ['location1', 'location2'] }, + ]); + }); + + it('should include space filters for alerts', () => { + spaceSpy.mockReturnValue({ space: { id: 'space1' } } as any); + paramSpy.mockReturnValue({} as any); + selSPy.mockReturnValue({ status: { allIds: [] } }); + + const { result } = renderHook(() => useMonitorFilters({ forAlerts: true }), { + wrapper: WrappedHelper, + }); + + expect(result.current).toEqual([{ field: 'kibana.space_ids', values: ['space1'] }]); + }); + + it('should include space filters for non-alerts', () => { + spaceSpy.mockReturnValue({ space: { id: 'space2' } } as any); + paramSpy.mockReturnValue({} as any); + selSPy.mockReturnValue({ status: { allIds: [] } }); + + const { result } = renderHook(() => useMonitorFilters({}), { wrapper: WrappedHelper }); + + expect(result.current).toEqual([{ field: 'meta.space_id', values: ['space2'] }]); + }); + + it('should handle a combination of parameters', () => { + spaceSpy.mockReturnValue({ space: { id: 'space3' } } as any); + paramSpy.mockReturnValue({ + schedules: 'daily', + projects: ['projectA'], + tags: ['tagB'], + locations: ['locationC'], + monitorTypes: 'http', + } as any); + selSPy.mockReturnValue({ status: { allIds: ['id3', 'id4'] } }); + + const { result } = renderHook(() => useMonitorFilters({ forAlerts: false }), { + wrapper: WrappedHelper, + }); + + expect(result.current).toEqual([ + { field: 'monitor.id', values: ['id3', 'id4'] }, + { field: 'monitor.project.id', values: ['projectA'] }, + { field: 'monitor.type', values: ['http'] }, + { field: 'tags', values: ['tagB'] }, + { field: 'observer.geo.name', values: ['locationC'] }, + { field: 'meta.space_id', values: ['space3'] }, + ]); + }); +}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_filters.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_filters.ts new file mode 100644 index 0000000000000..ed20d021349c0 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_filters.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { UrlFilter } from '@kbn/exploratory-view-plugin/public'; +import { useSelector } from 'react-redux'; +import { isEmpty } from 'lodash'; +import { useGetUrlParams } from '../../../hooks/use_url_params'; +import { useKibanaSpace } from '../../../../../hooks/use_kibana_space'; +import { selectOverviewStatus } from '../../../state/overview_status'; + +export const useMonitorFilters = ({ forAlerts }: { forAlerts?: boolean }): UrlFilter[] => { + const { space } = useKibanaSpace(); + const { locations, monitorTypes, tags, projects, schedules } = useGetUrlParams(); + const { status: overviewStatus } = useSelector(selectOverviewStatus); + const allIds = overviewStatus?.allIds ?? []; + + return [ + // since schedule isn't available in heartbeat data, in that case we rely on monitor.id + ...(allIds?.length && !isEmpty(schedules) ? [{ field: 'monitor.id', values: allIds }] : []), + ...(projects?.length ? [{ field: 'monitor.project.id', values: getValues(projects) }] : []), + ...(monitorTypes?.length ? [{ field: 'monitor.type', values: getValues(monitorTypes) }] : []), + ...(tags?.length ? [{ field: 'tags', values: getValues(tags) }] : []), + ...(locations?.length ? [{ field: 'observer.geo.name', values: getValues(locations) }] : []), + ...(space + ? [{ field: forAlerts ? 'kibana.space_ids' : 'meta.space_id', values: [space.id] }] + : []), + ]; +}; + +const getValues = (values: string | string[]): string[] => { + return Array.isArray(values) ? values : [values]; +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_query_filters.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_query_filters.ts new file mode 100644 index 0000000000000..5ddf208da6115 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_monitor_query_filters.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo } from 'react'; +import { useGetUrlParams } from '../../../hooks'; +import { getQueryFilters } from '../../../../../../common/constants/client_defaults'; + +export const useMonitorQueryFilters = () => { + const { query } = useGetUrlParams(); + + return useMemo(() => { + return query ? [getQueryFilters(query)] : undefined; + }, [query]); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_errors/monitor_async_error.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_errors/monitor_async_error.tsx index ae5a035b76b54..a40bb6e370783 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_errors/monitor_async_error.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_errors/monitor_async_error.tsx @@ -36,7 +36,7 @@ export const MonitorAsyncError = () => { defaultMessage="There was a problem running your monitors for one or more locations:" />

-
    +
      {Object.values(syncErrors ?? {}).map((e) => { return (
    • diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_stats.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_stats.tsx index 67ce536fc3c8e..db0e54b078752 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_stats.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_stats.tsx @@ -73,9 +73,9 @@ export const MonitorStats = ({ - + - + diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs.tsx index 90a7d705b5c39..18eaa74b4cdcd 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs.tsx @@ -11,31 +11,36 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { useTheme } from '@kbn/observability-shared-plugin/public'; import { ReportTypes } from '@kbn/exploratory-view-plugin/public'; +import { useMonitorFilters } from '../../hooks/use_monitor_filters'; import { useRefreshedRange } from '../../../../hooks'; import { ClientPluginsStart } from '../../../../../../plugin'; import * as labels from '../labels'; +import { useMonitorQueryFilters } from '../../hooks/use_monitor_query_filters'; -export const MonitorTestRunsCount = ({ monitorIds }: { monitorIds: string[] }) => { +export const MonitorTestRunsCount = () => { const { exploratoryView: { ExploratoryViewEmbeddable }, } = useKibana().services; const theme = useTheme(); const { from, to } = useRefreshedRange(30, 'days'); + const filters = useMonitorFilters({}); + const queryFilter = useMonitorQueryFilters(); return ( 0 ? monitorIds : ['false-monitor-id'], // Show no data when monitorIds is empty + 'monitor.type': ['http', 'tcp', 'browser', 'icmp'], }, dataType: 'synthetics', selectedMetricField: 'monitor_total_runs', - filters: [], name: labels.TEST_RUNS_LABEL, color: theme.eui.euiColorVis1, }, diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs_sparkline.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs_sparkline.tsx index c2930a1d22ffb..8713dfb77769e 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs_sparkline.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_stats/monitor_test_runs_sparkline.tsx @@ -10,11 +10,13 @@ import React, { useMemo } from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { useTheme } from '@kbn/observability-shared-plugin/public'; +import { useMonitorQueryFilters } from '../../hooks/use_monitor_query_filters'; +import { useMonitorFilters } from '../../hooks/use_monitor_filters'; import { useRefreshedRange } from '../../../../hooks'; import { ClientPluginsStart } from '../../../../../../plugin'; import * as labels from '../labels'; -export const MonitorTestRunsSparkline = ({ monitorIds }: { monitorIds: string[] }) => { +export const MonitorTestRunsSparkline = () => { const { exploratoryView: { ExploratoryViewEmbeddable }, } = useKibana().services; @@ -22,6 +24,8 @@ export const MonitorTestRunsSparkline = ({ monitorIds }: { monitorIds: string[] const theme = useTheme(); const { from, to } = useRefreshedRange(30, 'days'); + const filters = useMonitorFilters({}); + const queryFilter = useMonitorQueryFilters(); const attributes = useMemo(() => { return [ @@ -29,18 +33,18 @@ export const MonitorTestRunsSparkline = ({ monitorIds }: { monitorIds: string[] seriesType: 'area' as const, time: { from, to }, reportDefinitions: { - 'monitor.id': monitorIds.length > 0 ? monitorIds : ['false-monitor-id'], // Show no data when monitorIds is empty + 'monitor.type': ['http', 'tcp', 'browser', 'icmp'], }, dataType: 'synthetics' as const, selectedMetricField: 'total_test_runs', - filters: [], + filters, name: labels.TEST_RUNS_LABEL, color: theme.eui.euiColorVis1, operationType: 'count', }, ]; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [from, JSON.stringify({ ids: [...monitorIds].sort() }), theme.eui.euiColorVis1, to]); + }, [from, theme.eui.euiColorVis1, to]); return ( ); }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_alerts.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_alerts.tsx index e9c86eef3767a..8174b7fb63f73 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_alerts.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_alerts.tsx @@ -6,19 +6,18 @@ */ import React, { useMemo } from 'react'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiSkeletonText, - EuiPanel, - EuiSpacer, - EuiTitle, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useTheme } from '@kbn/observability-shared-plugin/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { useSelector } from 'react-redux'; import { RECORDS_FIELD } from '@kbn/exploratory-view-plugin/public'; +import { useMonitorQueryFilters } from '../../hooks/use_monitor_query_filters'; +import { + SYNTHETICS_STATUS_RULE, + SYNTHETICS_TLS_RULE, +} from '../../../../../../../common/constants/synthetics_alerts'; +import { useMonitorFilters } from '../../hooks/use_monitor_filters'; import { selectOverviewStatus } from '../../../../state/overview_status'; import { AlertsLink } from '../../../common/links/view_alerts'; import { useRefreshedRange, useGetUrlParams } from '../../../../hooks'; @@ -64,14 +63,10 @@ export const OverviewAlerts = () => { } = useKibana().services; const theme = useTheme(); - - const { status } = useSelector(selectOverviewStatus); + const filters = useMonitorFilters({ forAlerts: true }); const { locations } = useGetUrlParams(); - - const loading = !status?.allIds || status?.allIds.length === 0; - - const monitorIds = useMonitorQueryIds(); + const queryFilters = useMonitorQueryFilters(); return ( @@ -79,68 +74,70 @@ export const OverviewAlerts = () => {

      {headingText}

      - {loading ? ( - - ) : ( - - - + + + + + - - - - - - - - - )} + dataType: 'alerts', + selectedMetricField: RECORDS_FIELD, + name: ALERTS_LABEL, + filters: [ + { field: 'kibana.alert.status', values: ['active', 'recovered'] }, + ...filters, + ], + color: theme.eui.euiColorVis1_behindText, + }, + ]} + /> + + + + +
      ); }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors.tsx index 34d113da9901b..acabd436d83fc 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors.tsx @@ -5,62 +5,30 @@ * 2.0. */ -import { - EuiFlexGroup, - EuiFlexItem, - EuiSkeletonText, - EuiPanel, - EuiSpacer, - EuiTitle, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui'; import React from 'react'; -import { useSelector } from 'react-redux'; import { i18n } from '@kbn/i18n'; -import { useMonitorQueryIds } from '../overview_alerts'; -import { selectOverviewStatus } from '../../../../../state/overview_status'; import { OverviewErrorsSparklines } from './overview_errors_sparklines'; -import { useRefreshedRange, useGetUrlParams } from '../../../../../hooks'; +import { useRefreshedRange } from '../../../../../hooks'; import { OverviewErrorsCount } from './overview_errors_count'; export function OverviewErrors() { - const { status } = useSelector(selectOverviewStatus); - - const loading = !status?.allIds || status?.allIds.length === 0; - const { from, to } = useRefreshedRange(6, 'hours'); - const { locations } = useGetUrlParams(); - - const monitorIds = useMonitorQueryIds(); - return (

      {headingText}

      - {loading ? ( - - ) : ( - - - - - - - - - )} + + + + + + + +
      ); } diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_count.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_count.tsx index aaebf3e4bb041..e7365ccc7520c 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_count.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_count.tsx @@ -8,27 +8,23 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import React, { useMemo } from 'react'; import { ReportTypes } from '@kbn/exploratory-view-plugin/public'; +import { useMonitorFilters } from '../../../hooks/use_monitor_filters'; import { ERRORS_LABEL } from '../../../../monitor_details/monitor_summary/monitor_errors_count'; import { ClientPluginsStart } from '../../../../../../../plugin'; +import { useMonitorQueryFilters } from '../../../hooks/use_monitor_query_filters'; interface MonitorErrorsCountProps { from: string; to: string; - locationLabel?: string; - monitorIds: string[]; - locations?: string[]; } -export const OverviewErrorsCount = ({ - monitorIds, - from, - to, - locations, -}: MonitorErrorsCountProps) => { +export const OverviewErrorsCount = ({ from, to }: MonitorErrorsCountProps) => { const { exploratoryView: { ExploratoryViewEmbeddable }, } = useKibana().services; + const filters = useMonitorFilters({}); + const time = useMemo(() => ({ from, to }), [from, to]); return ( @@ -36,17 +32,18 @@ export const OverviewErrorsCount = ({ id="overviewErrorsCount" align="left" customHeight="70px" + dslFilters={useMonitorQueryFilters()} reportType={ReportTypes.SINGLE_METRIC} attributes={[ { time, reportDefinitions: { - 'monitor.id': monitorIds.length > 0 ? monitorIds : ['false-monitor-id'], - ...(locations?.length ? { 'observer.geo.name': locations } : {}), + 'monitor.type': ['http', 'tcp', 'browser', 'icmp'], }, dataType: 'synthetics', selectedMetricField: 'monitor_errors', name: ERRORS_LABEL, + filters, }, ]} /> diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_sparklines.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_sparklines.tsx index b97e0eef8bbb5..41d6a5bc34d7d 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_sparklines.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_errors/overview_errors_sparklines.tsx @@ -8,20 +8,21 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import React, { useMemo } from 'react'; import { useEuiTheme } from '@elastic/eui'; -import { ClientPluginsStart } from '../../../../../../../plugin'; import { ERRORS_LABEL } from '../../../../monitor_details/monitor_summary/monitor_errors_count'; +import { ClientPluginsStart } from '../../../../../../../plugin'; +import { useMonitorFilters } from '../../../hooks/use_monitor_filters'; +import { useMonitorQueryFilters } from '../../../hooks/use_monitor_query_filters'; interface Props { from: string; to: string; - monitorIds: string[]; - locations?: string[]; } -export const OverviewErrorsSparklines = ({ from, to, monitorIds, locations }: Props) => { +export const OverviewErrorsSparklines = ({ from, to }: Props) => { const { exploratoryView: { ExploratoryViewEmbeddable }, } = useKibana().services; + const filters = useMonitorFilters({}); const { euiTheme } = useEuiTheme(); const time = useMemo(() => ({ from, to }), [from, to]); @@ -33,19 +34,20 @@ export const OverviewErrorsSparklines = ({ from, to, monitorIds, locations }: Pr axisTitlesVisibility={{ x: false, yRight: false, yLeft: false }} legendIsVisible={false} hideTicks={true} + dslFilters={useMonitorQueryFilters()} attributes={[ { time, seriesType: 'area', reportDefinitions: { - 'monitor.id': monitorIds.length > 0 ? monitorIds : ['false-monitor-id'], - ...(locations?.length ? { 'observer.geo.name': locations } : {}), + 'monitor.type': ['http', 'tcp', 'browser', 'icmp'], }, dataType: 'synthetics', selectedMetricField: 'monitor_errors', name: ERRORS_LABEL, color: euiTheme.colors.danger, operationType: 'unique_count', + filters, }, ]} /> diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx index f0612498f8664..507b971c6a40f 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx @@ -114,7 +114,6 @@ export const OverviewGrid = memo(() => { return acc; }, [monitorsSortedByStatus]); - const listRef: React.LegacyRef> | undefined = React.createRef(); useEffect(() => { dispatch(refreshOverviewTrends.get()); }, [dispatch, lastRefresh]); @@ -165,50 +164,52 @@ export const OverviewGrid = memo(() => { minimumBatchSize={MIN_BATCH_SIZE} threshold={LIST_THRESHOLD} > - {({ onItemsRendered }) => ( - - {({ - index: listIndex, - style, - data: listData, - }: React.PropsWithChildren>) => { - setCurrentIndex(listIndex); - return ( - - {listData[listIndex].map((_, idx) => ( - - - - ))} - {listData[listIndex].length % ROW_COUNT !== 0 && - // Adds empty items to fill out row - Array.from({ - length: ROW_COUNT - listData[listIndex].length, - }).map((_, idx) => )} - - ); - }} - - )} + {({ onItemsRendered, ref }) => { + return ( + + {({ + index: listIndex, + style, + data: listData, + }: React.PropsWithChildren>) => { + setCurrentIndex(listIndex); + return ( + + {listData[listIndex].map((_, idx) => ( + + + + ))} + {listData[listIndex].length % ROW_COUNT !== 0 && + // Adds empty items to fill out row + Array.from({ + length: ROW_COUNT - listData[listIndex].length, + }).map((_, idx) => )} + + ); + }} + + ); + }} )} @@ -239,7 +240,6 @@ export const OverviewGrid = memo(() => { data-test-subj="syntheticsOverviewGridButton" onClick={() => { window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); - listRef.current?.scrollToItem(0); }} iconType="sortUp" iconSide="right" diff --git a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_kibana_space.tsx b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_kibana_space.tsx index 6dbc979397b30..0b5291e890ecc 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_kibana_space.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_kibana_space.tsx @@ -8,7 +8,7 @@ import type { Space } from '@kbn/spaces-plugin/common'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { useFetcher } from '@kbn/observability-shared-plugin/public'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; -import { ClientPluginsStart } from '../plugin'; +import type { ClientPluginsStart } from '../plugin'; export const useKibanaSpace = () => { const { services } = useKibana(); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts index 2a906f3cf6a4d..24d16d323e480 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts @@ -111,7 +111,7 @@ export const getMonitors = async ( sortField: parseMappingKey(sortField), sortOrder, searchFields: SEARCH_FIELDS, - search: query ? `${query}*` : undefined, + search: query, filter: filtersStr, searchAfter, fields, diff --git a/x-pack/plugins/osquery/server/routes/asset/get_assets_status_route.ts b/x-pack/plugins/osquery/server/routes/asset/get_assets_status_route.ts index f217b60bf2459..ab7a52c6fca68 100644 --- a/x-pack/plugins/osquery/server/routes/asset/get_assets_status_route.ts +++ b/x-pack/plugins/osquery/server/routes/asset/get_assets_status_route.ts @@ -23,7 +23,11 @@ export const getAssetsStatusRoute = (router: IRouter, osqueryContext: OsqueryApp .get({ access: 'internal', path: '/internal/osquery/assets', - options: { tags: [`access:${PLUGIN_ID}-writePacks`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-writePacks`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts b/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts index 690ea4206b84a..7c8ccc5bb0ba4 100644 --- a/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts +++ b/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts @@ -28,7 +28,11 @@ export const updateAssetsRoute = (router: IRouter, osqueryContext: OsqueryAppCon .post({ access: 'internal', path: '/internal/osquery/assets/update', - options: { tags: [`access:${PLUGIN_ID}-writePacks`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-writePacks`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_details.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_details.ts index c1d445fd40183..2bf8eea1811c1 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_details.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_details.ts @@ -17,7 +17,11 @@ export const getAgentDetailsRoute = (router: IRouter, osqueryContext: OsqueryApp .get({ access: 'internal', path: '/internal/osquery/fleet_wrapper/agents/{id}', - options: { tags: [`access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts index 64b10f0a8248e..e347299b42d3b 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts @@ -21,7 +21,11 @@ export const getAgentPoliciesRoute = (router: IRouter, osqueryContext: OsqueryAp .get({ access: 'internal', path: '/internal/osquery/fleet_wrapper/agent_policies', - options: { tags: [`access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policy.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policy.ts index bad5b01289d52..9535b36ed3e2b 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policy.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policy.ts @@ -18,7 +18,11 @@ export const getAgentPolicyRoute = (router: IRouter, osqueryContext: OsqueryAppC .get({ access: 'internal', path: '/internal/osquery/fleet_wrapper/agent_policies/{id}', - options: { tags: [`access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts index 64cd9d9f8ddd0..bfc77e9d6d6ae 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts @@ -28,7 +28,11 @@ export const getAgentStatusForAgentPolicyRoute = ( .get({ access: 'internal', path: '/internal/osquery/fleet_wrapper/agent_status', - options: { tags: [`access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts index 195e550077aa8..a04967a3e3c7c 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts @@ -26,7 +26,11 @@ export const getAgentsRoute = (router: IRouter, osqueryContext: OsqueryAppContex .get({ access: 'internal', path: '/internal/osquery/fleet_wrapper/agents', - options: { tags: [`access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_package_policies.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_package_policies.ts index 86719125b97eb..748c9102d6366 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_package_policies.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_package_policies.ts @@ -17,7 +17,11 @@ export const getPackagePoliciesRoute = (router: IRouter, osqueryContext: Osquery .get({ access: 'internal', path: '/internal/osquery/fleet_wrapper/package_policies', - options: { tags: [`access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/live_query/find_live_query_route.ts b/x-pack/plugins/osquery/server/routes/live_query/find_live_query_route.ts index 008964f2468b5..b89a69e5aeb24 100644 --- a/x-pack/plugins/osquery/server/routes/live_query/find_live_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/live_query/find_live_query_route.ts @@ -29,7 +29,12 @@ export const findLiveQueryRoute = (router: IRouter) = .get({ access: 'public', path: '/api/osquery/live_queries', - options: { tags: ['api', `access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, + options: { tags: ['api'] }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/live_query/get_live_query_details_route.ts b/x-pack/plugins/osquery/server/routes/live_query/get_live_query_details_route.ts index 2b32a3269b693..7406887ecb594 100644 --- a/x-pack/plugins/osquery/server/routes/live_query/get_live_query_details_route.ts +++ b/x-pack/plugins/osquery/server/routes/live_query/get_live_query_details_route.ts @@ -34,7 +34,11 @@ export const getLiveQueryDetailsRoute = (router: IRouter { .get({ access: 'public', path: '/api/osquery/packs', - options: { tags: [`access:${PLUGIN_ID}-readPacks`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-readPacks`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts b/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts index 724deedf19845..4ec3e6806a55c 100644 --- a/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts +++ b/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts @@ -25,7 +25,11 @@ export const readPackRoute = (router: IRouter) => { .get({ access: 'public', path: '/api/osquery/packs/{id}', - options: { tags: [`access:${PLUGIN_ID}-readPacks`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-readPacks`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts b/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts index 532aa2c772732..0872a16c5bb05 100644 --- a/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts +++ b/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts @@ -44,7 +44,11 @@ export const updatePackRoute = (router: IRouter, osqueryContext: OsqueryAppConte .put({ access: 'public', path: '/api/osquery/packs/{id}', - options: { tags: [`access:${PLUGIN_ID}-writePacks`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-writePacks`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/privileges_check/privileges_check_route.ts b/x-pack/plugins/osquery/server/routes/privileges_check/privileges_check_route.ts index b31da0c0e24da..2470b2f0c418e 100644 --- a/x-pack/plugins/osquery/server/routes/privileges_check/privileges_check_route.ts +++ b/x-pack/plugins/osquery/server/routes/privileges_check/privileges_check_route.ts @@ -15,8 +15,10 @@ export const privilegesCheckRoute = (router: IRouter, osqueryContext: OsqueryApp .get({ access: 'internal', path: '/internal/osquery/privileges_check', - options: { - tags: [`access:${PLUGIN_ID}-readLiveQueries`], + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-readLiveQueries`], + }, }, }) .addVersion( diff --git a/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts index 1be4cb24a2ea3..35d3b34b1ca8c 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts @@ -23,7 +23,11 @@ export const createSavedQueryRoute = (router: IRouter, osqueryContext: OsqueryAp .post({ access: 'public', path: '/api/osquery/saved_queries', - options: { tags: [`access:${PLUGIN_ID}-writeSavedQueries`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-writeSavedQueries`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/saved_query/delete_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/delete_saved_query_route.ts index f33040e167c62..1d76bcf2d4711 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/delete_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/delete_saved_query_route.ts @@ -20,7 +20,11 @@ export const deleteSavedQueryRoute = (router: IRouter, osqueryContext: OsqueryAp .delete({ access: 'public', path: '/api/osquery/saved_queries/{id}', - options: { tags: [`access:${PLUGIN_ID}-writeSavedQueries`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-writeSavedQueries`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/saved_query/find_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/find_saved_query_route.ts index 88ccc120d0fd6..02d4b0229fd18 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/find_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/find_saved_query_route.ts @@ -25,7 +25,11 @@ export const findSavedQueryRoute = (router: IRouter, osqueryContext: OsqueryAppC .get({ access: 'public', path: '/api/osquery/saved_queries', - options: { tags: [`access:${PLUGIN_ID}-readSavedQueries`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-readSavedQueries`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts index 706304300c40a..e3100baa4b3f1 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts @@ -23,7 +23,11 @@ export const readSavedQueryRoute = (router: IRouter, osqueryContext: OsqueryAppC .get({ access: 'public', path: '/api/osquery/saved_queries/{id}', - options: { tags: [`access:${PLUGIN_ID}-readSavedQueries`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-readSavedQueries`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts index 4225f0f223cd3..12dd5b2bf73d6 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts @@ -30,7 +30,11 @@ export const updateSavedQueryRoute = (router: IRouter, osqueryContext: OsqueryAp .put({ access: 'public', path: '/api/osquery/saved_queries/{id}', - options: { tags: [`access:${PLUGIN_ID}-writeSavedQueries`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-writeSavedQueries`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/osquery/server/routes/status/create_status_route.ts b/x-pack/plugins/osquery/server/routes/status/create_status_route.ts index 8b6f75100a371..b6e6f988f454d 100644 --- a/x-pack/plugins/osquery/server/routes/status/create_status_route.ts +++ b/x-pack/plugins/osquery/server/routes/status/create_status_route.ts @@ -27,7 +27,11 @@ export const createStatusRoute = (router: IRouter, osqueryContext: OsqueryAppCon .get({ access: 'internal', path: '/internal/osquery/status', - options: { tags: [`access:${PLUGIN_ID}-read`] }, + security: { + authz: { + requiredPrivileges: [`${PLUGIN_ID}-read`], + }, + }, }) .addVersion( { diff --git a/x-pack/plugins/rule_registry/server/routes/bulk_update_alerts.ts b/x-pack/plugins/rule_registry/server/routes/bulk_update_alerts.ts index 84fdcafd7b211..a7133bee8208c 100644 --- a/x-pack/plugins/rule_registry/server/routes/bulk_update_alerts.ts +++ b/x-pack/plugins/rule_registry/server/routes/bulk_update_alerts.ts @@ -45,9 +45,13 @@ export const bulkUpdateAlertsRoute = (router: IRouter) ]) ), }, + security: { + authz: { + requiredPrivileges: ['rac'], + }, + }, options: { access: 'internal', - tags: ['access:rac'], }, }, async (context, req, response) => { diff --git a/x-pack/plugins/rule_registry/server/routes/find.ts b/x-pack/plugins/rule_registry/server/routes/find.ts index 370607836b832..4ce4567dd35bd 100644 --- a/x-pack/plugins/rule_registry/server/routes/find.ts +++ b/x-pack/plugins/rule_registry/server/routes/find.ts @@ -37,9 +37,13 @@ export const findAlertsByQueryRoute = (router: IRouter ) ), }, + security: { + authz: { + requiredPrivileges: ['rac'], + }, + }, options: { access: 'internal', - tags: ['access:rac'], }, }, async (context, request, response) => { diff --git a/x-pack/plugins/rule_registry/server/routes/get_aad_fields_by_rule_type.ts b/x-pack/plugins/rule_registry/server/routes/get_aad_fields_by_rule_type.ts index 39e0b96d466cb..8ca68828d03ef 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_aad_fields_by_rule_type.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_aad_fields_by_rule_type.ts @@ -26,9 +26,13 @@ export const getAADFieldsByRuleType = (router: IRouter ) ), }, + security: { + authz: { + requiredPrivileges: ['rac'], + }, + }, options: { access: 'internal', - tags: ['access:rac'], }, }, async (context, request, response) => { diff --git a/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts b/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts index d904796c68753..0ecab0aaa0945 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts @@ -34,9 +34,13 @@ export const getAlertByIdRoute = (router: IRouter) => ]) ), }, + security: { + authz: { + requiredPrivileges: ['rac'], + }, + }, options: { access: 'internal', - tags: ['access:rac'], }, }, async (context, request, response) => { diff --git a/x-pack/plugins/rule_registry/server/routes/get_alert_index.ts b/x-pack/plugins/rule_registry/server/routes/get_alert_index.ts index f828deff3301d..aa3ec89fde7c8 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_alert_index.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_alert_index.ts @@ -27,9 +27,13 @@ export const getAlertsIndexRoute = (router: IRouter) = ) ), }, + security: { + authz: { + requiredPrivileges: ['rac'], + }, + }, options: { access: 'internal', - tags: ['access:rac'], }, }, async (context, request, response) => { diff --git a/x-pack/plugins/rule_registry/server/routes/get_alert_summary.ts b/x-pack/plugins/rule_registry/server/routes/get_alert_summary.ts index fc4ce222c81e6..e33b0137a932e 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_alert_summary.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_alert_summary.ts @@ -39,9 +39,13 @@ export const getAlertSummaryRoute = (router: IRouter) ]) ), }, + security: { + authz: { + requiredPrivileges: ['rac'], + }, + }, options: { access: 'internal', - tags: ['access:rac'], }, }, async (context, request, response) => { diff --git a/x-pack/plugins/rule_registry/server/routes/get_alerts_group_aggregations.ts b/x-pack/plugins/rule_registry/server/routes/get_alerts_group_aggregations.ts index 0d447d6a14210..34c56b7691a1f 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_alerts_group_aggregations.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_alerts_group_aggregations.ts @@ -35,9 +35,13 @@ export const getAlertsGroupAggregations = (router: IRouter { diff --git a/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts b/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts index a21d816c7b570..20a3781be6973 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts @@ -26,9 +26,13 @@ export const getBrowserFieldsByFeatureId = (router: IRouter { diff --git a/x-pack/plugins/rule_registry/server/routes/get_feature_ids_by_registration_contexts.ts b/x-pack/plugins/rule_registry/server/routes/get_feature_ids_by_registration_contexts.ts index 42a99cb410fc5..43bd491daafbe 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_feature_ids_by_registration_contexts.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_feature_ids_by_registration_contexts.ts @@ -26,9 +26,13 @@ export const getFeatureIdsByRegistrationContexts = (router: IRouter { diff --git a/x-pack/plugins/rule_registry/server/routes/update_alert_by_id.ts b/x-pack/plugins/rule_registry/server/routes/update_alert_by_id.ts index cc8174b70add0..caf28ecef1298 100644 --- a/x-pack/plugins/rule_registry/server/routes/update_alert_by_id.ts +++ b/x-pack/plugins/rule_registry/server/routes/update_alert_by_id.ts @@ -35,9 +35,13 @@ export const updateAlertByIdRoute = (router: IRouter) ]) ), }, + security: { + authz: { + requiredPrivileges: ['rac'], + }, + }, options: { access: 'internal', - tags: ['access:rac'], }, }, async (context, req, response) => { diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts index 37c65ebb9a314..7ce1e578f1db0 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts @@ -34,8 +34,3 @@ export const DEFAULT_INFERENCE_ENDPOINTS_TABLE_STATE: AllInferenceEndpointsTable }; export const PIPELINE_URL = 'ingest/ingest_pipelines'; - -export const PRECONFIGURED_ENDPOINTS = { - ELSER: '.elser-2-elasticsearch', - E5: '.multilingual-e5-small-elasticsearch', -}; diff --git a/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts index b853109352dd9..9bb3505fffbe4 100644 --- a/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts +++ b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts @@ -5,16 +5,15 @@ * 2.0. */ -import { PRECONFIGURED_ENDPOINTS } from '../components/all_inference_endpoints/constants'; import { isEndpointPreconfigured } from './preconfigured_endpoint_helper'; describe('Preconfigured Endpoint helper', () => { it('return true for preconfigured elser', () => { - expect(isEndpointPreconfigured(PRECONFIGURED_ENDPOINTS.ELSER)).toEqual(true); + expect(isEndpointPreconfigured('.preconfigured_elser')).toEqual(true); }); it('return true for preconfigured e5', () => { - expect(isEndpointPreconfigured(PRECONFIGURED_ENDPOINTS.E5)).toEqual(true); + expect(isEndpointPreconfigured('.preconfigured_e5')).toEqual(true); }); it('return false for other endpoints', () => { diff --git a/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts index 418e7e95319ef..213a03c0d85aa 100644 --- a/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts +++ b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts @@ -5,7 +5,4 @@ * 2.0. */ -import { PRECONFIGURED_ENDPOINTS } from '../components/all_inference_endpoints/constants'; - -export const isEndpointPreconfigured = (endpoint: string) => - Object.values(PRECONFIGURED_ENDPOINTS).includes(endpoint); +export const isEndpointPreconfigured = (endpoint: string) => endpoint.startsWith('.'); diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/simple_privilege_section/simple_privilege_section.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/simple_privilege_section/simple_privilege_section.tsx index ad6415a1f4fec..b9f4fd8e474a4 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/simple_privilege_section/simple_privilege_section.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/simple_privilege_section/simple_privilege_section.tsx @@ -226,6 +226,7 @@ export class SimplePrivilegeSection extends Component { privilegeIndex={this.props.role.kibana.findIndex((k) => isGlobalPrivilegeDefinition(k) )} + showAdditionalPermissionsMessage={true} canCustomizeSubFeaturePrivileges={this.props.canCustomizeSubFeaturePrivileges} allSpacesSelected disabled={!this.props.editable} diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.test.tsx index fb472191b561d..751db03939dda 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.test.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.test.tsx @@ -19,7 +19,6 @@ import type { Space } from '@kbn/spaces-plugin/public'; import { findTestSubject, mountWithIntl } from '@kbn/test-jest-helpers'; import { PrivilegeSpaceForm } from './privilege_space_form'; -import { SpaceSelector } from './space_selector'; import type { Role } from '../../../../../../../common'; const createRole = (kibana: Role['kibana'] = []): Role => { @@ -57,7 +56,7 @@ const renderComponent = (props: React.ComponentProps) }; describe('PrivilegeSpaceForm', () => { - it('renders an empty form when the role contains no Kibana privileges', () => { + it('renders no form when no role is selected', () => { const role = createRole(); const kibanaPrivileges = createKibanaPrivileges(kibanaFeatures); @@ -71,40 +70,9 @@ describe('PrivilegeSpaceForm', () => { onCancel: jest.fn(), }); - expect( - wrapper.find(EuiButtonGroup).filter('[name="basePrivilegeButtonGroup"]').props().idSelected - ).toEqual(`basePrivilege_custom`); - expect(wrapper.find(FeatureTable).props().disabled).toEqual(true); - expect(getDisplayedFeaturePrivileges(wrapper)).toMatchInlineSnapshot(` - Object { - "excluded_from_base": Object { - "primaryFeaturePrivilege": "none", - "subFeaturePrivileges": Array [], - }, - "no_sub_features": Object { - "primaryFeaturePrivilege": "none", - "subFeaturePrivileges": Array [], - }, - "with_excluded_sub_features": Object { - "primaryFeaturePrivilege": "none", - "subFeaturePrivileges": Array [], - }, - "with_require_all_spaces_for_feature_and_sub_features": Object { - "primaryFeaturePrivilege": "none", - "subFeaturePrivileges": Array [], - }, - "with_require_all_spaces_sub_features": Object { - "primaryFeaturePrivilege": "none", - "subFeaturePrivileges": Array [], - }, - "with_sub_features": Object { - "primaryFeaturePrivilege": "none", - "subFeaturePrivileges": Array [], - }, - } - `); - - expect(findTestSubject(wrapper, 'spaceFormGlobalPermissionsSupersedeWarning')).toHaveLength(0); + expect(wrapper.find(EuiButtonGroup).filter('[name="basePrivilegeButtonGroup"]')).toHaveLength( + 0 + ); }); it('renders when a base privilege is selected', () => { @@ -232,43 +200,6 @@ describe('PrivilegeSpaceForm', () => { expect(findTestSubject(wrapper, 'spaceFormGlobalPermissionsSupersedeWarning')).toHaveLength(0); }); - it('renders a warning when configuring a global privilege after space privileges are already defined', () => { - const role = createRole([ - { - base: [], - feature: { - with_sub_features: ['read'], - }, - spaces: ['foo'], - }, - { - base: [], - feature: { - with_sub_features: ['all'], - }, - spaces: ['*'], - }, - ]); - - const kibanaPrivileges = createKibanaPrivileges(kibanaFeatures); - - const wrapper = renderComponent({ - role, - spaces: displaySpaces, - kibanaPrivileges, - privilegeIndex: -1, - canCustomizeSubFeaturePrivileges: true, - onChange: jest.fn(), - onCancel: jest.fn(), - }); - - wrapper.find(SpaceSelector).props().onChange(['*']); - - wrapper.update(); - - expect(findTestSubject(wrapper, 'globalPrivilegeWarning')).toHaveLength(1); - }); - it('renders a warning when space privileges are less permissive than configured global privileges', () => { const role = createRole([ { diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx index 8275a7b1203ab..5946197d35d69 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx @@ -5,7 +5,6 @@ * 2.0. */ -import type { EuiButtonColor } from '@elastic/eui'; import { EuiButton, EuiButtonEmpty, @@ -21,7 +20,6 @@ import { EuiForm, EuiFormRow, EuiSpacer, - EuiText, EuiTitle, } from '@elastic/eui'; import { remove } from 'lodash'; @@ -105,20 +103,19 @@ export class PrivilegeSpaceForm extends Component {

      - + {this.state.mode === 'create' ? ( + + ) : ( + + )}

      - -

      - -

      -
      {this.getForm()} @@ -180,14 +177,13 @@ export class PrivilegeSpaceForm extends Component { label={i18n.translate( 'xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormLabel', { - defaultMessage: 'Spaces', + defaultMessage: 'Select spaces', } )} helpText={i18n.translate( 'xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormHelpText', { - defaultMessage: - 'Select one or more Kibana spaces to which you wish to assign privileges.', + defaultMessage: 'Users assigned to this role will gain access to selected spaces.', } )} > @@ -198,99 +194,85 @@ export class PrivilegeSpaceForm extends Component { /> - {this.getPrivilegeCallout()} - - - - - - - - -

      {this.getFeatureListLabel(this.state.selectedBasePrivilege.length > 0)}

      -
      - - - - -

      {this.getFeatureListDescription(this.state.selectedBasePrivilege.length > 0)}

      -
      - - - - 0 || !hasSelectedSpaces} - allSpacesSelected={this.state.selectedSpaceIds.includes(ALL_SPACES_ID)} - /> - - {this.requiresGlobalPrivilegeWarning() && ( - - - - } + {Boolean(this.state.selectedSpaceIds.length) && ( + <> + + + + + + + + + 0 || !hasSelectedSpaces} + allSpacesSelected={this.state.selectedSpaceIds.includes(ALL_SPACES_ID)} /> - + )} ); @@ -298,58 +280,34 @@ export class PrivilegeSpaceForm extends Component { private getSaveButton = () => { const { mode } = this.state; - const isGlobal = this.isDefiningGlobalPrivilege(); let buttonText; switch (mode) { case 'create': - if (isGlobal) { - buttonText = ( - - ); - } else { - buttonText = ( - - ); - } + buttonText = ( + + ); break; case 'update': - if (isGlobal) { - buttonText = ( - - ); - } else { - buttonText = ( - - ); - } + buttonText = ( + + ); break; default: throw new Error(`Unsupported mode: ${mode}`); } - let buttonColor: EuiButtonColor = 'primary'; - if (this.requiresGlobalPrivilegeWarning()) { - buttonColor = 'warning'; - } - return ( {buttonText} @@ -357,65 +315,6 @@ export class PrivilegeSpaceForm extends Component { ); }; - private getFeatureListLabel = (disabled: boolean) => { - if (disabled) { - return i18n.translate( - 'xpack.security.management.editRole.spacePrivilegeForm.summaryOfFeaturePrivileges', - { - defaultMessage: 'Summary of feature privileges', - } - ); - } else { - return i18n.translate( - 'xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivileges', - { - defaultMessage: 'Customize by feature', - } - ); - } - }; - - private getFeatureListDescription = (disabled: boolean) => { - if (disabled) { - return i18n.translate( - 'xpack.security.management.editRole.spacePrivilegeForm.featurePrivilegeSummaryDescription', - { - defaultMessage: - 'Some features might be hidden by the space or affected by a global space privilege.', - } - ); - } else { - return i18n.translate( - 'xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivilegeDescription', - { - defaultMessage: - 'Increase privilege levels on a per feature basis. Some features might be hidden by the space or affected by a global space privilege.', - } - ); - } - }; - - private getPrivilegeCallout = () => { - if (this.isDefiningGlobalPrivilege()) { - return ( - - - - ); - } - - return null; - }; - private closeFlyout = () => { this.props.onCancel(); }; @@ -594,13 +493,4 @@ export class PrivilegeSpaceForm extends Component { }; private isDefiningGlobalPrivilege = () => this.state.selectedSpaceIds.includes('*'); - - private requiresGlobalPrivilegeWarning = () => { - const hasOtherSpacePrivilegesDefined = this.props.role.kibana.length > 0; - return ( - this.state.mode === 'create' && - this.isDefiningGlobalPrivilege() && - hasOtherSpacePrivilegesDefined - ); - }; } diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx index 99e9edb48d556..d7edbdfa59e8b 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx @@ -57,6 +57,9 @@ export class SpaceSelector extends Component { aria-label={i18n.translate('xpack.security.management.editRole.spaceSelectorLabel', { defaultMessage: 'Spaces', })} + placeholder={i18n.translate('xpack.security.management.editRole.spaceSelectorPlaceholder', { + defaultMessage: 'Add spaces...', + })} fullWidth options={this.getOptions()} renderOption={renderOption} diff --git a/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts b/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts index 6e3f6751d11dc..49cb34ccdc09e 100644 --- a/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts +++ b/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts @@ -94,7 +94,7 @@ const roles = [ applications: [ { application: 'kibana-.kibana', - privileges: ['feature_securitySolutionCases.a;;'], + privileges: ['feature_securitySolutionCasesV2.a;;'], resources: ['*'], }, ], @@ -184,7 +184,7 @@ const roles = [ applications: [ { application: 'kibana-.kibana', - privileges: ['feature_securitySolutionCases.a;;'], + privileges: ['feature_securitySolutionCasesV2.a;;'], resources: ['space:default'], }, ], diff --git a/x-pack/plugins/security/server/config.test.ts b/x-pack/plugins/security/server/config.test.ts index 2e2199ff850a1..38e37e290fa2b 100644 --- a/x-pack/plugins/security/server/config.test.ts +++ b/x-pack/plugins/security/server/config.test.ts @@ -62,10 +62,8 @@ describe('config schema', () => { }, "cookieName": "sid", "encryptionKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "experimental": Object { - "fipsMode": Object { - "enabled": false, - }, + "fipsMode": Object { + "enabled": false, }, "loginAssistanceMessage": "", "public": Object {}, @@ -121,10 +119,8 @@ describe('config schema', () => { }, "cookieName": "sid", "encryptionKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "experimental": Object { - "fipsMode": Object { - "enabled": false, - }, + "fipsMode": Object { + "enabled": false, }, "loginAssistanceMessage": "", "public": Object {}, @@ -179,10 +175,8 @@ describe('config schema', () => { "selector": Object {}, }, "cookieName": "sid", - "experimental": Object { - "fipsMode": Object { - "enabled": false, - }, + "fipsMode": Object { + "enabled": false, }, "loginAssistanceMessage": "", "public": Object {}, @@ -240,10 +234,8 @@ describe('config schema', () => { "selector": Object {}, }, "cookieName": "sid", - "experimental": Object { - "fipsMode": Object { - "enabled": false, - }, + "fipsMode": Object { + "enabled": false, }, "loginAssistanceMessage": "", "public": Object {}, diff --git a/x-pack/plugins/security/server/config.ts b/x-pack/plugins/security/server/config.ts index 8be1500bdccf1..f6af6188e6c76 100644 --- a/x-pack/plugins/security/server/config.ts +++ b/x-pack/plugins/security/server/config.ts @@ -315,10 +315,8 @@ export const ConfigSchema = schema.object({ roleMappingManagementEnabled: schema.boolean({ defaultValue: true }), }), }), - experimental: schema.object({ - fipsMode: schema.object({ - enabled: schema.boolean({ defaultValue: false }), - }), + fipsMode: schema.object({ + enabled: schema.boolean({ defaultValue: false }), }), }); diff --git a/x-pack/plugins/security/server/config_deprecations.test.ts b/x-pack/plugins/security/server/config_deprecations.test.ts index 1245ef3978212..3be46e5ddeb79 100644 --- a/x-pack/plugins/security/server/config_deprecations.test.ts +++ b/x-pack/plugins/security/server/config_deprecations.test.ts @@ -46,6 +46,28 @@ describe('Config Deprecations', () => { expect(messages).toHaveLength(0); }); + it('renames `xpack.security.experimental.fipsMode.enabled` to `xpack.security.fipsMode.enabled`', () => { + const config = { + xpack: { + security: { + experimental: { + fipsMode: { + enabled: true, + }, + }, + }, + }, + }; + const { messages, migrated } = applyConfigDeprecations(cloneDeep(config)); + expect(migrated.xpack.security.experimental?.fipsMode?.enabled).not.toBeDefined(); + expect(migrated.xpack.security.fipsMode.enabled).toEqual(true); + expect(messages).toMatchInlineSnapshot(` + Array [ + "Setting \\"xpack.security.experimental.fipsMode.enabled\\" has been replaced by \\"xpack.security.fipsMode.enabled\\"", + ] + `); + }); + it('renames sessionTimeout to session.idleTimeout', () => { const config = { xpack: { diff --git a/x-pack/plugins/security/server/config_deprecations.ts b/x-pack/plugins/security/server/config_deprecations.ts index 2e6a14b2028a2..2ee7d05c78b8e 100644 --- a/x-pack/plugins/security/server/config_deprecations.ts +++ b/x-pack/plugins/security/server/config_deprecations.ts @@ -21,6 +21,9 @@ export const securityConfigDeprecationProvider: ConfigDeprecationProvider = ({ rename('audit.appender.policy.kind', 'audit.appender.policy.type', { level: 'warning' }), rename('audit.appender.strategy.kind', 'audit.appender.strategy.type', { level: 'warning' }), rename('audit.appender.path', 'audit.appender.fileName', { level: 'warning' }), + rename('experimental.fipsMode.enabled', 'fipsMode.enabled', { + level: 'critical', + }), renameFromRoot( 'security.showInsecureClusterWarning', diff --git a/x-pack/plugins/security/server/fips/fips_service.test.ts b/x-pack/plugins/security/server/fips/fips_service.test.ts index a3f74e058268a..6bdc0fea35acb 100644 --- a/x-pack/plugins/security/server/fips/fips_service.test.ts +++ b/x-pack/plugins/security/server/fips/fips_service.test.ts @@ -43,7 +43,7 @@ function buildMockFipsServiceSetupParams( let mockConfig = {}; if (isFipsConfigured) { - mockConfig = { experimental: { fipsMode: { enabled: true } } }; + mockConfig = { fipsMode: { enabled: true } }; } return { @@ -84,7 +84,7 @@ describe('FipsService', () => { describe('#validateLicenseForFips', () => { describe('start-up check', () => { - it('should not throw Error/log.error if license features allowFips and `experimental.fipsMode.enabled` is `false`', () => { + it('should not throw Error/log.error if license features allowFips and `fipsMode.enabled` is `false`', () => { fipsServiceSetup = fipsService.setup( buildMockFipsServiceSetupParams('platinum', false, of({ allowFips: true })) ); @@ -93,7 +93,7 @@ describe('FipsService', () => { expect(logger.error).not.toHaveBeenCalled(); }); - it('should not throw Error/log.error if license features allowFips and `experimental.fipsMode.enabled` is `true`', () => { + it('should not throw Error/log.error if license features allowFips and `fipsMode.enabled` is `true`', () => { fipsServiceSetup = fipsService.setup( buildMockFipsServiceSetupParams('platinum', true, of({ allowFips: true })) ); @@ -102,7 +102,7 @@ describe('FipsService', () => { expect(logger.error).not.toHaveBeenCalled(); }); - it('should not throw Error/log.error if license features do not allowFips and `experimental.fipsMode.enabled` is `false`', () => { + it('should not throw Error/log.error if license features do not allowFips and `fipsMode.enabled` is `false`', () => { fipsServiceSetup = fipsService.setup( buildMockFipsServiceSetupParams('basic', false, of({ allowFips: false })) ); @@ -111,7 +111,7 @@ describe('FipsService', () => { expect(logger.error).not.toHaveBeenCalled(); }); - it('should throw Error/log.error if license features do not allowFips and `experimental.fipsMode.enabled` is `true`', () => { + it('should throw Error/log.error if license features do not allowFips and `fipsMode.enabled` is `true`', () => { fipsServiceSetup = fipsService.setup( buildMockFipsServiceSetupParams('basic', true, of({ allowFips: false })) ); @@ -124,7 +124,7 @@ describe('FipsService', () => { }); describe('monitoring check', () => { - describe('with experimental.fipsMode.enabled', () => { + describe('with fipsMode.enabled', () => { let mockFeaturesSubject: BehaviorSubject>; let mockIsAvailableSubject: BehaviorSubject; let mockFeatures$: Observable>; @@ -149,23 +149,23 @@ describe('FipsService', () => { mockIsAvailableSubject.next(true); }); - it('should not log.error if license changes to unavailable and `experimental.fipsMode.enabled` is `true`', () => { + it('should not log.error if license changes to unavailable and `fipsMode.enabled` is `true`', () => { mockIsAvailableSubject.next(false); expect(logger.error).not.toHaveBeenCalled(); }); - it('should not log.error if license features continue to allowFips and `experimental.fipsMode.enabled` is `true`', () => { + it('should not log.error if license features continue to allowFips and `fipsMode.enabled` is `true`', () => { mockFeaturesSubject.next({ allowFips: true }); expect(logger.error).not.toHaveBeenCalled(); }); - it('should log.error if license features change to not allowFips and `experimental.fipsMode.enabled` is `true`', () => { + it('should log.error if license features change to not allowFips and `fipsMode.enabled` is `true`', () => { mockFeaturesSubject.next({ allowFips: false }); expect(logger.error).toHaveBeenCalledTimes(1); }); }); - describe('with not experimental.fipsMode.enabled', () => { + describe('with not fipsMode.enabled', () => { let mockFeaturesSubject: BehaviorSubject>; let mockIsAvailableSubject: BehaviorSubject; let mockFeatures$: Observable>; @@ -191,17 +191,17 @@ describe('FipsService', () => { mockIsAvailableSubject.next(true); }); - it('should not log.error if license changes to unavailable and `experimental.fipsMode.enabled` is `false`', () => { + it('should not log.error if license changes to unavailable and `fipsMode.enabled` is `false`', () => { mockIsAvailableSubject.next(false); expect(logger.error).not.toHaveBeenCalled(); }); - it('should not log.error if license features continue to allowFips and `experimental.fipsMode.enabled` is `false`', () => { + it('should not log.error if license features continue to allowFips and `fipsMode.enabled` is `false`', () => { mockFeaturesSubject.next({ allowFips: true }); expect(logger.error).not.toHaveBeenCalled(); }); - it('should not log.error if license change to not allowFips and `experimental.fipsMode.enabled` is `false`', () => { + it('should not log.error if license change to not allowFips and `fipsMode.enabled` is `false`', () => { mockFeaturesSubject.next({ allowFips: false }); expect(logger.error).not.toHaveBeenCalled(); }); diff --git a/x-pack/plugins/security/server/fips/fips_service.ts b/x-pack/plugins/security/server/fips/fips_service.ts index aa351ab48828d..9f9c01254bca2 100644 --- a/x-pack/plugins/security/server/fips/fips_service.ts +++ b/x-pack/plugins/security/server/fips/fips_service.ts @@ -40,7 +40,7 @@ export class FipsService { const errorMessage = `Your current license level is ${license.getLicenseType()} and does not support running in FIPS mode.`; if (license.isLicenseAvailable() && !this.isInitialLicenseLoaded) { - if (config?.experimental.fipsMode.enabled && !license.getFeatures().allowFips) { + if (config?.fipsMode.enabled && !license.getFeatures().allowFips) { this.logger.error(errorMessage); throw new Error(errorMessage); } @@ -51,7 +51,7 @@ export class FipsService { if ( this.isInitialLicenseLoaded && license.isLicenseAvailable() && - config?.experimental.fipsMode.enabled && + config?.fipsMode.enabled && !features.allowFips ) { this.logger.error( diff --git a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts index 513e2163f932f..f0d8445c41eed 100644 --- a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts +++ b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts @@ -371,6 +371,8 @@ import type { StartRuleMigrationResponse, StopRuleMigrationRequestParamsInput, StopRuleMigrationResponse, + UpdateRuleMigrationRequestBodyInput, + UpdateRuleMigrationResponse, UpsertRuleMigrationResourcesRequestParamsInput, UpsertRuleMigrationResourcesRequestBodyInput, UpsertRuleMigrationResourcesResponse, @@ -2099,6 +2101,22 @@ detection engine rules. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Updates rules migrations attributes + */ + async updateRuleMigration(props: UpdateRuleMigrationProps) { + this.log.info(`${new Date().toISOString()} Calling API UpdateRuleMigration`); + return this.kbnClient + .request({ + path: '/internal/siem_migrations/rules', + headers: { + [ELASTIC_HTTP_VERSION_HEADER]: '1', + }, + method: 'PUT', + body: props.body, + }) + .catch(catchAxiosErrorFormatAndThrow); + } async uploadAssetCriticalityRecords(props: UploadAssetCriticalityRecordsProps) { this.log.info(`${new Date().toISOString()} Calling API UploadAssetCriticalityRecords`); return this.kbnClient @@ -2401,6 +2419,9 @@ export interface TriggerRiskScoreCalculationProps { export interface UpdateRuleProps { body: UpdateRuleRequestBodyInput; } +export interface UpdateRuleMigrationProps { + body: UpdateRuleMigrationRequestBodyInput; +} export interface UploadAssetCriticalityRecordsProps { attachment: FormData; } diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 137afe7ba9112..b366a0e555357 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -21,7 +21,7 @@ export const APP_ID = 'securitySolution' as const; export const APP_UI_ID = 'securitySolutionUI' as const; export const ASSISTANT_FEATURE_ID = 'securitySolutionAssistant' as const; export const ATTACK_DISCOVERY_FEATURE_ID = 'securitySolutionAttackDiscovery' as const; -export const CASES_FEATURE_ID = 'securitySolutionCases' as const; +export const CASES_FEATURE_ID = 'securitySolutionCasesV2' as const; export const SERVER_APP_ID = 'siem' as const; export const APP_NAME = 'Security' as const; export const APP_ICON = 'securityAnalyticsApp' as const; diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.gen.ts b/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.gen.ts index 7ea6314726dab..ac15080f2e0a4 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.gen.ts +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.gen.ts @@ -19,6 +19,9 @@ import { ArrayFromString } from '@kbn/zod-helpers'; import { OriginalRule, + ElasticRulePartial, + RuleMigrationTranslationResult, + RuleMigrationComments, RuleMigrationAllTaskStats, RuleMigration, RuleMigrationTaskStats, @@ -26,7 +29,7 @@ import { RuleMigrationResourceType, RuleMigrationResource, } from '../../rule_migration.gen'; -import { ConnectorId, LangSmithOptions } from '../common.gen'; +import { NonEmptyString, ConnectorId, LangSmithOptions } from '../../common.gen'; export type CreateRuleMigrationRequestBody = z.infer; export const CreateRuleMigrationRequestBody = z.array(OriginalRule); @@ -37,7 +40,7 @@ export const CreateRuleMigrationResponse = z.object({ /** * The migration id created. */ - migration_id: z.string(), + migration_id: NonEmptyString, }); export type GetAllStatsRuleMigrationResponse = z.infer; @@ -45,7 +48,7 @@ export const GetAllStatsRuleMigrationResponse = RuleMigrationAllTaskStats; export type GetRuleMigrationRequestParams = z.infer; export const GetRuleMigrationRequestParams = z.object({ - migration_id: z.string(), + migration_id: NonEmptyString, }); export type GetRuleMigrationRequestParamsInput = z.input; @@ -66,7 +69,7 @@ export type GetRuleMigrationResourcesRequestParams = z.infer< typeof GetRuleMigrationResourcesRequestParams >; export const GetRuleMigrationResourcesRequestParams = z.object({ - migration_id: z.string(), + migration_id: NonEmptyString, }); export type GetRuleMigrationResourcesRequestParamsInput = z.input< typeof GetRuleMigrationResourcesRequestParams @@ -77,7 +80,7 @@ export const GetRuleMigrationResourcesResponse = z.array(RuleMigrationResource); export type GetRuleMigrationStatsRequestParams = z.infer; export const GetRuleMigrationStatsRequestParams = z.object({ - migration_id: z.string(), + migration_id: NonEmptyString, }); export type GetRuleMigrationStatsRequestParamsInput = z.input< typeof GetRuleMigrationStatsRequestParams @@ -88,7 +91,7 @@ export const GetRuleMigrationStatsResponse = RuleMigrationTaskStats; export type StartRuleMigrationRequestParams = z.infer; export const StartRuleMigrationRequestParams = z.object({ - migration_id: z.string(), + migration_id: NonEmptyString, }); export type StartRuleMigrationRequestParamsInput = z.input; @@ -109,7 +112,7 @@ export const StartRuleMigrationResponse = z.object({ export type StopRuleMigrationRequestParams = z.infer; export const StopRuleMigrationRequestParams = z.object({ - migration_id: z.string(), + migration_id: NonEmptyString, }); export type StopRuleMigrationRequestParamsInput = z.input; @@ -121,11 +124,42 @@ export const StopRuleMigrationResponse = z.object({ stopped: z.boolean(), }); +export type UpdateRuleMigrationRequestBody = z.infer; +export const UpdateRuleMigrationRequestBody = z.array( + z.object({ + /** + * The rule migration id + */ + id: NonEmptyString, + /** + * The migrated elastic rule attributes to update. + */ + elastic_rule: ElasticRulePartial.optional(), + /** + * The rule translation result. + */ + translation_result: RuleMigrationTranslationResult.optional(), + /** + * The comments for the migration including a summary from the LLM in markdown. + */ + comments: RuleMigrationComments.optional(), + }) +); +export type UpdateRuleMigrationRequestBodyInput = z.input; + +export type UpdateRuleMigrationResponse = z.infer; +export const UpdateRuleMigrationResponse = z.object({ + /** + * Indicates rules migrations have been updated. + */ + updated: z.boolean(), +}); + export type UpsertRuleMigrationResourcesRequestParams = z.infer< typeof UpsertRuleMigrationResourcesRequestParams >; export const UpsertRuleMigrationResourcesRequestParams = z.object({ - migration_id: z.string(), + migration_id: NonEmptyString, }); export type UpsertRuleMigrationResourcesRequestParamsInput = z.input< typeof UpsertRuleMigrationResourcesRequestParams @@ -134,7 +168,16 @@ export type UpsertRuleMigrationResourcesRequestParamsInput = z.input< export type UpsertRuleMigrationResourcesRequestBody = z.infer< typeof UpsertRuleMigrationResourcesRequestBody >; -export const UpsertRuleMigrationResourcesRequestBody = z.array(RuleMigrationResourceData); +export const UpsertRuleMigrationResourcesRequestBody = z.array( + RuleMigrationResourceData.merge( + z.object({ + /** + * The rule resource migration id + */ + id: NonEmptyString, + }) + ) +); export type UpsertRuleMigrationResourcesRequestBodyInput = z.input< typeof UpsertRuleMigrationResourcesRequestBody >; diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.schema.yaml b/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.schema.yaml index bac82e5b0248e..7785304671129 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.schema.yaml +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/api/rules/rule_migration.schema.yaml @@ -3,7 +3,6 @@ info: title: SIEM Rules Migration API version: '1' paths: - # Rule migrations APIs /internal/siem_migrations/rules: @@ -33,8 +32,52 @@ paths: - migration_id properties: migration_id: - type: string description: The migration id created. + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' + + put: + summary: Updates rules migrations + operationId: UpdateRuleMigration + x-codegen-enabled: true + description: Updates rules migrations attributes + tags: + - SIEM Rule Migrations + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + type: object + required: + - id + properties: + id: + description: The rule migration id + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' + elastic_rule: + description: The migrated elastic rule attributes to update. + $ref: '../../rule_migration.schema.yaml#/components/schemas/ElasticRulePartial' + translation_result: + description: The rule translation result. + $ref: '../../rule_migration.schema.yaml#/components/schemas/RuleMigrationTranslationResult' + comments: + description: The comments for the migration including a summary from the LLM in markdown. + $ref: '../../rule_migration.schema.yaml#/components/schemas/RuleMigrationComments' + responses: + 200: + description: Indicates rules migrations have been updated correctly. + content: + application/json: + schema: + type: object + required: + - updated + properties: + updated: + type: boolean + description: Indicates rules migrations have been updated. /internal/siem_migrations/rules/stats: get: @@ -67,8 +110,8 @@ paths: in: path required: true schema: - type: string description: The migration id to start + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' responses: 200: description: Indicates rule migration have been retrieved correctly. @@ -94,8 +137,8 @@ paths: in: path required: true schema: - type: string description: The migration id to start + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' requestBody: required: true content: @@ -106,9 +149,9 @@ paths: - connector_id properties: connector_id: - $ref: '../common.schema.yaml#/components/schemas/ConnectorId' + $ref: '../../common.schema.yaml#/components/schemas/ConnectorId' langsmith_options: - $ref: '../common.schema.yaml#/components/schemas/LangSmithOptions' + $ref: '../../common.schema.yaml#/components/schemas/LangSmithOptions' responses: 200: description: Indicates the migration start request has been processed successfully. @@ -138,8 +181,8 @@ paths: in: path required: true schema: - type: string description: The migration id to start + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' responses: 200: description: Indicates the migration stats has been retrieved correctly. @@ -163,8 +206,8 @@ paths: in: path required: true schema: - type: string description: The migration id to stop + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' responses: 200: description: Indicates migration task stop has been processed successfully. @@ -197,8 +240,8 @@ paths: in: path required: true schema: - type: string description: The migration id to attach the resources + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' requestBody: required: true content: @@ -206,7 +249,15 @@ paths: schema: type: array items: - $ref: '../../rule_migration.schema.yaml#/components/schemas/RuleMigrationResourceData' + allOf: + - $ref: '../../rule_migration.schema.yaml#/components/schemas/RuleMigrationResourceData' + - type: object + required: + - id + properties: + id: + description: The rule resource migration id + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' responses: 200: description: Indicates migration resources have been created or updated correctly. @@ -234,8 +285,8 @@ paths: in: path required: true schema: - type: string description: The migration id to attach the resources + $ref: '../../common.schema.yaml#/components/schemas/NonEmptyString' - name: type in: query required: false diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/api/common.gen.ts b/x-pack/plugins/security_solution/common/siem_migrations/model/common.gen.ts similarity index 77% rename from x-pack/plugins/security_solution/common/siem_migrations/model/api/common.gen.ts rename to x-pack/plugins/security_solution/common/siem_migrations/model/common.gen.ts index 7880354928538..9b1d0756c3a3b 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/api/common.gen.ts +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/common.gen.ts @@ -10,12 +10,21 @@ * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. * * info: - * title: SIEM Rule Migrations API common components + * title: SIEM Rule Migration common components * version: not applicable */ import { z } from '@kbn/zod'; +/** + * A string that is not empty and does not contain only whitespace + */ +export type NonEmptyString = z.infer; +export const NonEmptyString = z + .string() + .min(1) + .regex(/^(?! *$).+$/); + /** * The GenAI connector id to use. */ diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/api/common.schema.yaml b/x-pack/plugins/security_solution/common/siem_migrations/model/common.schema.yaml similarity index 71% rename from x-pack/plugins/security_solution/common/siem_migrations/model/api/common.schema.yaml rename to x-pack/plugins/security_solution/common/siem_migrations/model/common.schema.yaml index 5782fa7772013..a50225df778ad 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/api/common.schema.yaml +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/common.schema.yaml @@ -1,11 +1,16 @@ openapi: 3.0.3 info: - title: SIEM Rule Migrations API common components + title: SIEM Rule Migration common components version: 'not applicable' paths: {} components: x-codegen-enabled: true schemas: + NonEmptyString: + type: string + pattern: ^(?! *$).+$ + minLength: 1 + description: A string that is not empty and does not contain only whitespace ConnectorId: type: string description: The GenAI connector id to use. diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts index ac178610cee62..0554ef18a13f7 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts @@ -10,12 +10,14 @@ * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. * * info: - * title: SIEM Rule Migration common components + * title: SIEM Rule Migration components * version: not applicable */ import { z } from '@kbn/zod'; +import { NonEmptyString } from './common.gen'; + /** * The original rule vendor identifier. */ @@ -30,7 +32,10 @@ export const OriginalRule = z.object({ /** * The original rule id. */ - id: z.string(), + id: NonEmptyString, + /** + * The original rule vendor identifier. + */ vendor: OriginalRuleVendor, /** * The original rule name. @@ -82,18 +87,46 @@ export const ElasticRule = z.object({ /** * The Elastic prebuilt rule id matched. */ - prebuilt_rule_id: z.string().optional(), + prebuilt_rule_id: NonEmptyString.optional(), /** * The Elastic rule id installed as a result. */ - id: z.string().optional(), + id: NonEmptyString.optional(), }); +/** + * The partial version of the migrated elastic rule. + */ +export type ElasticRulePartial = z.infer; +export const ElasticRulePartial = ElasticRule.partial(); + +/** + * The rule translation result. + */ +export type RuleMigrationTranslationResult = z.infer; +export const RuleMigrationTranslationResult = z.enum(['full', 'partial', 'untranslatable']); +export type RuleMigrationTranslationResultEnum = typeof RuleMigrationTranslationResult.enum; +export const RuleMigrationTranslationResultEnum = RuleMigrationTranslationResult.enum; + +/** + * The status of the rule migration process. + */ +export type RuleMigrationStatus = z.infer; +export const RuleMigrationStatus = z.enum(['pending', 'processing', 'completed', 'failed']); +export type RuleMigrationStatusEnum = typeof RuleMigrationStatus.enum; +export const RuleMigrationStatusEnum = RuleMigrationStatus.enum; + +/** + * The comments for the migration including a summary from the LLM in markdown. + */ +export type RuleMigrationComments = z.infer; +export const RuleMigrationComments = z.array(z.string()); + /** * The rule migration document object. */ -export type RuleMigration = z.infer; -export const RuleMigration = z.object({ +export type RuleMigrationData = z.infer; +export const RuleMigrationData = z.object({ /** * The moment of creation */ @@ -101,25 +134,31 @@ export const RuleMigration = z.object({ /** * The migration id. */ - migration_id: z.string(), + migration_id: NonEmptyString, /** * The username of the user who created the migration. */ - created_by: z.string(), + created_by: NonEmptyString, + /** + * The original rule to migrate. + */ original_rule: OriginalRule, + /** + * The migrated elastic rule. + */ elastic_rule: ElasticRule.optional(), /** * The rule translation result. */ - translation_result: z.enum(['full', 'partial', 'untranslatable']).optional(), + translation_result: RuleMigrationTranslationResult.optional(), /** * The status of the rule migration process. */ - status: z.enum(['pending', 'processing', 'completed', 'failed']).default('pending'), + status: RuleMigrationStatus.default('pending'), /** * The comments for the migration including a summary from the LLM in markdown. */ - comments: z.array(z.string()).optional(), + comments: RuleMigrationComments.optional(), /** * The moment of the last update */ @@ -130,6 +169,19 @@ export const RuleMigration = z.object({ updated_by: z.string().optional(), }); +/** + * The rule migration document object. + */ +export type RuleMigration = z.infer; +export const RuleMigration = z + .object({ + /** + * The rule migration id + */ + id: NonEmptyString, + }) + .merge(RuleMigrationData); + /** * The rule migration task stats object. */ @@ -177,7 +229,7 @@ export const RuleMigrationAllTaskStats = z.array( /** * The migration id */ - migration_id: z.string(), + migration_id: NonEmptyString, }) ) ); @@ -216,10 +268,14 @@ export const RuleMigrationResourceData = z.object({ export type RuleMigrationResource = z.infer; export const RuleMigrationResource = RuleMigrationResourceData.merge( z.object({ + /** + * The rule resource migration id + */ + id: NonEmptyString, /** * The migration id */ - migration_id: z.string(), + migration_id: NonEmptyString, /** * The moment of the last update */ diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml index c16849cec278f..95ff05df39a15 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml @@ -1,12 +1,11 @@ openapi: 3.0.3 info: - title: SIEM Rule Migration common components + title: SIEM Rule Migration components version: 'not applicable' paths: {} components: x-codegen-enabled: true schemas: - OriginalRuleVendor: type: string description: The original rule vendor identifier. @@ -25,9 +24,10 @@ components: - query_language properties: id: - type: string description: The original rule id. + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' vendor: + description: The original rule vendor identifier. $ref: '#/components/schemas/OriginalRuleVendor' title: type: string @@ -71,13 +71,30 @@ components: enum: - esql prebuilt_rule_id: - type: string description: The Elastic prebuilt rule id matched. + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' id: - type: string description: The Elastic rule id installed as a result. + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' + + ElasticRulePartial: + description: The partial version of the migrated elastic rule. + $ref: '#/components/schemas/ElasticRule' + x-modify: partial RuleMigration: + description: The rule migration document object. + allOf: + - type: object + required: + - id + properties: + id: + description: The rule migration id + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' + - $ref: '#/components/schemas/RuleMigrationData' + + RuleMigrationData: type: object description: The rule migration document object. required: @@ -91,36 +108,27 @@ components: type: string description: The moment of creation migration_id: - type: string description: The migration id. + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' created_by: - type: string description: The username of the user who created the migration. + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' original_rule: + description: The original rule to migrate. $ref: '#/components/schemas/OriginalRule' elastic_rule: + description: The migrated elastic rule. $ref: '#/components/schemas/ElasticRule' translation_result: - type: string description: The rule translation result. - enum: # should match SiemMigrationRuleTranslationResult enum at ../constants.ts - - full - - partial - - untranslatable + $ref: '#/components/schemas/RuleMigrationTranslationResult' status: - type: string description: The status of the rule migration process. - enum: # should match SiemMigrationsStatus enum at ../constants.ts - - pending - - processing - - completed - - failed + $ref: '#/components/schemas/RuleMigrationStatus' default: pending comments: - type: array description: The comments for the migration including a summary from the LLM in markdown. - items: - type: string + $ref: '#/components/schemas/RuleMigrationComments' updated_at: type: string description: The moment of the last update @@ -182,11 +190,34 @@ components: - migration_id properties: migration_id: - type: string description: The migration id + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' + + RuleMigrationTranslationResult: + type: string + description: The rule translation result. + enum: # should match SiemMigrationRuleTranslationResult enum at ../constants.ts + - full + - partial + - untranslatable + + RuleMigrationStatus: + type: string + description: The status of the rule migration process. + enum: # should match SiemMigrationsStatus enum at ../constants.ts + - pending + - processing + - completed + - failed + + RuleMigrationComments: + type: array + description: The comments for the migration including a summary from the LLM in markdown. + items: + type: string + + ## Rule migration resources -## Rule migration resources - RuleMigrationResourceType: type: string description: The type of the rule migration resource. @@ -220,11 +251,15 @@ components: - $ref: '#/components/schemas/RuleMigrationResourceData' - type: object required: + - id - migration_id properties: + id: + description: The rule resource migration id + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' migration_id: - type: string description: The migration id + $ref: './common.schema.yaml#/components/schemas/NonEmptyString' updated_at: type: string description: The moment of the last update diff --git a/x-pack/plugins/security_solution/common/test/ess_roles.json b/x-pack/plugins/security_solution/common/test/ess_roles.json index 94bd3d57a6d7b..361d5d4321756 100644 --- a/x-pack/plugins/security_solution/common/test/ess_roles.json +++ b/x-pack/plugins/security_solution/common/test/ess_roles.json @@ -30,7 +30,7 @@ "siem": ["read", "read_alerts"], "securitySolutionAssistant": ["none"], "securitySolutionAttackDiscovery": ["none"], - "securitySolutionCases": ["read"], + "securitySolutionCasesV2": ["read"], "actions": ["read"], "builtInAlerts": ["read"] }, @@ -79,7 +79,7 @@ "siem": ["all", "read_alerts", "crud_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["all"], + "securitySolutionCasesV2": ["all"], "actions": ["read"], "builtInAlerts": ["all"] }, @@ -128,7 +128,7 @@ "siem": ["all", "read_alerts", "crud_alerts"], "securitySolutionAssistant": ["all"], "securitySolutionAttackDiscovery": ["all"], - "securitySolutionCases": ["all"], + "securitySolutionCasesV2": ["all"], "builtInAlerts": ["all"] }, "spaces": ["*"], diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/assets_links.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/assets_links.ts index f4ae848beb25d..c77e0fe7a03e7 100644 --- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/assets_links.ts +++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/assets_links.ts @@ -34,7 +34,7 @@ const assetsCloudDefendAppLink: LinkItem = { landingIcon: IconEcctlLazy, isBeta: true, hideTimeline: true, - links: [], // cloudDefendPolicies link is added in createAssetsLinkFromManage + links: [], }; export const createAssetsLinkFromManage = (manageLink: LinkItem): LinkItem => { @@ -54,13 +54,7 @@ export const createAssetsLinkFromManage = (manageLink: LinkItem): LinkItem => { assetsSubLinks.push({ ...endpointsLink, links: endpointsSubLinks }); } - const cloudPoliciesLink = manageLink.links?.find( - ({ id }) => id === SecurityPageName.cloudDefendPolicies - ); - if (cloudPoliciesLink) { - // Add cloud defend policies link as cloud defend sub link - assetsSubLinks.push({ ...assetsCloudDefendAppLink, links: [cloudPoliciesLink] }); - } + assetsSubLinks.push(assetsCloudDefendAppLink); return { ...assetsAppLink, diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/take_action/index.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/take_action/index.tsx index 9701114915507..af2150b4010d9 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/take_action/index.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/take_action/index.tsx @@ -33,8 +33,8 @@ const TakeActionComponent: React.FC = ({ attackDiscovery, replacements }) const { cases } = useKibana().services; const userCasesPermissions = cases.helpers.canUseCases([APP_ID]); const canUserCreateAndReadCases = useCallback( - () => userCasesPermissions.create && userCasesPermissions.read, - [userCasesPermissions.create, userCasesPermissions.read] + () => userCasesPermissions.createComment && userCasesPermissions.read, + [userCasesPermissions.createComment, userCasesPermissions.read] ); const { disabled: addToCaseDisabled, onAddToNewCase } = useAddToNewCase({ canUserCreateAndReadCases, diff --git a/x-pack/plugins/security_solution/public/cases_test_utils.ts b/x-pack/plugins/security_solution/public/cases_test_utils.ts index dc70dcab33eaa..f3c356507bcfe 100644 --- a/x-pack/plugins/security_solution/public/cases_test_utils.ts +++ b/x-pack/plugins/security_solution/public/cases_test_utils.ts @@ -15,6 +15,8 @@ export const noCasesCapabilities = (): CasesCapabilities => ({ push_cases: false, cases_connectors: false, cases_settings: false, + case_reopen: false, + create_comment: false, }); export const readCasesCapabilities = (): CasesCapabilities => ({ @@ -25,6 +27,8 @@ export const readCasesCapabilities = (): CasesCapabilities => ({ push_cases: false, cases_connectors: true, cases_settings: false, + case_reopen: false, + create_comment: false, }); export const allCasesCapabilities = (): CasesCapabilities => ({ @@ -35,6 +39,8 @@ export const allCasesCapabilities = (): CasesCapabilities => ({ push_cases: true, cases_connectors: true, cases_settings: true, + case_reopen: true, + create_comment: true, }); export const noCasesPermissions = (): CasesPermissions => ({ @@ -46,6 +52,8 @@ export const noCasesPermissions = (): CasesPermissions => ({ push: false, connectors: false, settings: false, + reopenCase: false, + createComment: false, }); export const readCasesPermissions = (): CasesPermissions => ({ @@ -57,6 +65,8 @@ export const readCasesPermissions = (): CasesPermissions => ({ push: false, connectors: true, settings: false, + reopenCase: false, + createComment: false, }); export const writeCasesPermissions = (): CasesPermissions => ({ @@ -68,6 +78,8 @@ export const writeCasesPermissions = (): CasesPermissions => ({ push: true, connectors: true, settings: true, + reopenCase: true, + createComment: true, }); export const allCasesPermissions = (): CasesPermissions => ({ @@ -79,4 +91,6 @@ export const allCasesPermissions = (): CasesPermissions => ({ push: true, connectors: true, settings: true, + reopenCase: true, + createComment: true, }); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx index aa11ced2603a9..c07bbd651316a 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx @@ -59,7 +59,7 @@ export const useAddToExistingCase = ({ disabled: lensAttributes == null || timeRange == null || - !userCasesPermissions.create || + !userCasesPermissions.createComment || !userCasesPermissions.read, }; }; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx index c2ac628000fa7..7803e27b2453f 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx @@ -60,7 +60,7 @@ export const useAddToNewCase = ({ disabled: lensAttributes == null || timeRange == null || - !userCasesPermissions.create || + !userCasesPermissions.createComment || !userCasesPermissions.read, }; }; diff --git a/x-pack/plugins/security_solution/public/common/links/links.test.tsx b/x-pack/plugins/security_solution/public/common/links/links.test.tsx index c0f8c8cc48da4..c5f05afde9c62 100644 --- a/x-pack/plugins/security_solution/public/common/links/links.test.tsx +++ b/x-pack/plugins/security_solution/public/common/links/links.test.tsx @@ -432,9 +432,9 @@ describe('Security links', () => { describe('hasCapabilities', () => { const siemShow = 'siem.show'; - const createCases = 'securitySolutionCases.create_cases'; - const readCases = 'securitySolutionCases.read_cases'; - const pushCases = 'securitySolutionCases.push_cases'; + const createCases = 'securitySolutionCasesV2.create_cases'; + const readCases = 'securitySolutionCasesV2.read_cases'; + const pushCases = 'securitySolutionCasesV2.push_cases'; it('returns false when capabilities is an empty array', () => { expect(hasCapabilities(createCapabilities(), [])).toBeFalsy(); @@ -461,7 +461,7 @@ describe('Security links', () => { hasCapabilities( createCapabilities({ siem: { show: true }, - securitySolutionCases: { create_cases: false }, + securitySolutionCasesV2: { create_cases: false }, }), [siemShow, createCases] ) @@ -473,7 +473,7 @@ describe('Security links', () => { hasCapabilities( createCapabilities({ siem: { show: false }, - securitySolutionCases: { create_cases: true }, + securitySolutionCasesV2: { create_cases: true }, }), [siemShow, createCases] ) @@ -485,7 +485,7 @@ describe('Security links', () => { hasCapabilities( createCapabilities({ siem: { show: true }, - securitySolutionCases: { create_cases: false }, + securitySolutionCasesV2: { create_cases: false }, }), [readCases, createCases] ) @@ -497,7 +497,7 @@ describe('Security links', () => { hasCapabilities( createCapabilities({ siem: { show: true }, - securitySolutionCases: { read_cases: true, create_cases: true }, + securitySolutionCasesV2: { read_cases: true, create_cases: true }, }), [[readCases, createCases]] ) @@ -509,7 +509,7 @@ describe('Security links', () => { hasCapabilities( createCapabilities({ siem: { show: false }, - securitySolutionCases: { read_cases: false, create_cases: true }, + securitySolutionCasesV2: { read_cases: false, create_cases: true }, }), [siemShow, [readCases, createCases]] ) @@ -521,7 +521,7 @@ describe('Security links', () => { hasCapabilities( createCapabilities({ siem: { show: true }, - securitySolutionCases: { read_cases: false, create_cases: true }, + securitySolutionCasesV2: { read_cases: false, create_cases: true }, }), [siemShow, [readCases, createCases]] ) @@ -533,7 +533,7 @@ describe('Security links', () => { hasCapabilities( createCapabilities({ siem: { show: true }, - securitySolutionCases: { read_cases: false, create_cases: true, push_cases: false }, + securitySolutionCasesV2: { read_cases: false, create_cases: true, push_cases: false }, }), [ [siemShow, pushCases], diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx index bdef9cd84c8f6..fa14fc317a78a 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx @@ -88,6 +88,8 @@ jest.mock('../../../../common/lib/kibana', () => { update: true, delete: true, push: true, + createComment: true, + reopenCase: true, }), getRuleIdFromEvent: jest.fn(), }, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx index 60a19f005c53e..8ddcd34f092f0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx @@ -142,7 +142,7 @@ export const useAddToCaseActions = ({ const addToCaseActionItems: AlertTableContextMenuItem[] = useMemo(() => { if ( (isActiveTimelines || isInDetections) && - userCasesPermissions.create && + userCasesPermissions.createComment && userCasesPermissions.read && isAlert ) { @@ -169,14 +169,14 @@ export const useAddToCaseActions = ({ } return []; }, [ + isActiveTimelines, + isInDetections, + userCasesPermissions.createComment, + userCasesPermissions.read, + isAlert, ariaLabel, handleAddToExistingCaseClick, handleAddToNewCaseClick, - userCasesPermissions.create, - userCasesPermissions.read, - isInDetections, - isActiveTimelines, - isAlert, ]); return { diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx index 535c0114426dd..2c5152e3813f7 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx @@ -15,7 +15,9 @@ import { import { ActionsLogUsersFilter } from './actions_log_users_filter'; import { MANAGEMENT_PATH } from '../../../../../common/constants'; -describe('Users filter', () => { +// FLAKY: https://github.com/elastic/kibana/issues/193554 +// FLAKY: https://github.com/elastic/kibana/issues/193092 +describe.skip('Users filter', () => { let render: ( props?: React.ComponentProps ) => ReturnType; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac.cy.ts index 64779bb2ba27e..b108cb8985b80 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac.cy.ts @@ -9,7 +9,8 @@ import { closeAllToasts } from '../../tasks/toasts'; import { login, ROLE } from '../../tasks/login'; import { loadPage } from '../../tasks/common'; -describe('When defining a kibana role for Endpoint security access', { tags: '@ess' }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/200967 +describe.skip('When defining a kibana role for Endpoint security access', { tags: '@ess' }, () => { const getAllSubFeatureRows = (): Cypress.Chainable> => { return cy .get('#featurePrivilegeControls_siem') diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts index 424b3fc954c57..d2a86e7899aee 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts @@ -23,7 +23,8 @@ import { setSecuritySolutionEndpointGroupPrivilege, } from '../../screens/stack_management/role_page'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/200962 +describe.skip( 'When defining a kibana role for Endpoint security access with space awareness enabled', { // TODO:PR Remove `'@skipInServerlessMKI` once PR merges to `main` diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts index 64fd3279d18cb..b5c524255509f 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts @@ -15,7 +15,7 @@ export const API_AUTH = Object.freeze({ export const COMMON_API_HEADERS = Object.freeze({ 'kbn-xsrf': 'cypress', 'x-elastic-internal-origin': 'security-solution', - 'Elastic-Api-Version': '2023-10-31', + 'elastic-api-version': '2023-10-31', }); export const waitForPageToBeLoaded = () => { diff --git a/x-pack/plugins/security_solution/public/overview/pages/data_quality.tsx b/x-pack/plugins/security_solution/public/overview/pages/data_quality.tsx index e785e58435432..fce22635f3f64 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/data_quality.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/data_quality.tsx @@ -95,8 +95,8 @@ const DataQualityComponent: React.FC = () => { const userCasesPermissions = cases.helpers.canUseCases([APP_ID]); const canUserCreateAndReadCases = useCallback( - () => userCasesPermissions.create && userCasesPermissions.read, - [userCasesPermissions.create, userCasesPermissions.read] + () => userCasesPermissions.createComment && userCasesPermissions.read, + [userCasesPermissions.createComment, userCasesPermissions.read] ); const createCaseFlyout = cases.hooks.useCasesAddToNewCaseFlyout({ diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index b20e645d71c2c..b74d0cffdc88d 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -346,7 +346,7 @@ export class Plugin implements IPlugin ({ status: AppStatus.inaccessible, visibleIn: [], diff --git a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx index 25eef44d1469c..793cd12f99451 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx @@ -89,7 +89,7 @@ describe('TimelineModalHeader', () => { cases: { helpers: { canUseCases: jest.fn().mockReturnValue({ - create: true, + createComment: true, read: true, }), }, diff --git a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx index 7eccb11a35312..e42e856b9ca74 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx @@ -169,7 +169,7 @@ export const TimelineModalHeader = React.memo( isDisabled={isInspectDisabled} /> - {userCasesPermissions.create && userCasesPermissions.read ? ( + {userCasesPermissions.createComment && userCasesPermissions.read ? ( <> diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts index a1f3585ffcdc7..85cadf5aa65d4 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts @@ -55,7 +55,7 @@ export const getEndpointOperationsAnalyst: () => Omit = () => { fleet: ['all'], fleetv2: ['all'], osquery: ['all'], - securitySolutionCases: ['all'], + securitySolutionCasesV2: ['all'], builtinAlerts: ['all'], siem: [ 'all', diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/without_response_actions_role.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/without_response_actions_role.ts index 4ed5f91df77dd..d57ca059de994 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/without_response_actions_role.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/without_response_actions_role.ts @@ -37,7 +37,7 @@ export const getNoResponseActionsRole: () => Omit = () => ({ advancedSettings: ['all'], dev_tools: ['all'], fleet: ['all'], - generalCases: ['all'], + generalCasesV2: ['all'], indexPatterns: ['all'], osquery: ['all'], savedObjectsManagement: ['all'], diff --git a/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts b/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts index dda4a6af5d221..28e823874b529 100644 --- a/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts +++ b/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts @@ -21,8 +21,10 @@ export const getDashboardsByTagsRoute = (router: SecuritySolutionPluginRouter, l .post({ path: INTERNAL_DASHBOARDS_URL, access: 'internal', - options: { - tags: ['access:securitySolution'], + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, }, }) .addVersion( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts index 72e87fde6ca2f..8f0b3586066fa 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/multi_line_string_diff_algorithm.test.ts @@ -174,9 +174,11 @@ describe('multiLineStringDiffAlgorithm', () => { const result = multiLineStringDiffAlgorithm(mockVersions); const endTime = performance.now(); - // If the regex merge in this function takes over 500ms, this test fails + // If the regex merge in this function takes over 1 sec, this test fails // Performance measurements: https://github.com/elastic/kibana/pull/199388 - expect(endTime - startTime).toBeLessThan(500); + // NOTE: despite the fact that this test runs in ~50ms locally, on CI it + // runs slower and can be flaky even with a 500ms threshold. + expect(endTime - startTime).toBeLessThan(1000); expect(result).toEqual( expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index 314d2c273b04a..22c031d5d5eb5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -22,8 +22,10 @@ export const readPrivilegesRoute = ( .get({ path: DETECTION_ENGINE_PRIVILEGES_URL, access: 'public', - options: { - tags: ['access:securitySolution'], + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, }, }) .addVersion( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts index 271e6e7d27749..8013b2af9742b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts @@ -26,8 +26,10 @@ export const telemetryDetectionRulesPreviewRoute = ( .get({ path: SECURITY_TELEMETRY_URL, access: 'internal', - options: { - tags: ['access:securitySolution'], + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, }, }) .addVersion( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts index 1b1aeada05660..2b8f65af12ca5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts @@ -23,8 +23,10 @@ export const suggestUserProfilesRoute = ( .get({ path: DETECTION_ENGINE_ALERT_SUGGEST_USERS_URL, access: 'internal', - options: { - tags: ['access:securitySolution'], + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, }, }) .addVersion( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts index f05914201ad09..4e72e275bf802 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts @@ -142,6 +142,10 @@ export const createThreatSignals = async ({ await services.scopedClusterClient.asCurrentUser.openPointInTime({ index: threatIndex, keep_alive: THREAT_PIT_KEEP_ALIVE, + // @ts-expect-error client support this option, but it is not documented and typed yet, but we need this fix in 8.16.2. + // once support added we should remove this expected type error + // https://github.com/elastic/elasticsearch-specification/issues/3144 + allow_partial_search_results: true, }) ).id; const reassignThreatPitId = (newPitId: OpenPointInTimeResponse['id'] | undefined) => { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts index b4d7e2f492eb8..760fec7f58f3b 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts @@ -97,7 +97,7 @@ export class AssetCriticalityDataClient { query, size = DEFAULT_CRITICALITY_RESPONSE_SIZE, from, - sort, + sort = ['@timestamp'], // without a default sort order the results are not deterministic which makes testing hard }: { query: ESFilter; size?: number; @@ -301,7 +301,7 @@ export class AssetCriticalityDataClient { index: this.getIndex(), flushBytes, retries, - refreshOnCompletion: true, // refresh the index after all records are processed + refreshOnCompletion: this.getIndex(), onDocument: ({ record }) => [ { update: { _id: createId(record) } }, { diff --git a/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts b/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts index 01a04a284b16a..5b2a3a70be1a2 100644 --- a/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts +++ b/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts @@ -23,8 +23,10 @@ export const createSharedExceptionListRoute = (router: SecuritySolutionPluginRou .post({ path: SHARED_EXCEPTION_LIST_URL, access: 'public', - options: { - tags: ['access:securitySolution'], + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, }, }) .addVersion( diff --git a/x-pack/plugins/security_solution/server/lib/product_features_service/mocks.ts b/x-pack/plugins/security_solution/server/lib/product_features_service/mocks.ts index c2275ebbcee5f..29df069020561 100644 --- a/x-pack/plugins/security_solution/server/lib/product_features_service/mocks.ts +++ b/x-pack/plugins/security_solution/server/lib/product_features_service/mocks.ts @@ -26,6 +26,11 @@ jest.mock('@kbn/security-solution-features/product_features', () => ({ baseKibanaSubFeatureIds: [], subFeaturesMap: new Map(), })), + getCasesV2Feature: jest.fn(() => ({ + baseKibanaFeature: {}, + baseKibanaSubFeatureIds: [], + subFeaturesMap: new Map(), + })), getAssistantFeature: jest.fn(() => ({ baseKibanaFeature: {}, baseKibanaSubFeatureIds: [], diff --git a/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts b/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts index 8d274a30ca3c9..768228f319b24 100644 --- a/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts +++ b/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts @@ -44,6 +44,7 @@ jest.mock('@kbn/security-solution-features/product_features', () => ({ getAttackDiscoveryFeature: () => mockGetFeature(), getAssistantFeature: () => mockGetFeature(), getCasesFeature: () => mockGetFeature(), + getCasesV2Feature: () => mockGetFeature(), getSecurityFeature: () => mockGetFeature(), })); @@ -56,8 +57,8 @@ describe('ProductFeaturesService', () => { const experimentalFeatures = {} as ExperimentalFeatures; new ProductFeaturesService(loggerMock.create(), experimentalFeatures); - expect(mockGetFeature).toHaveBeenCalledTimes(4); - expect(MockedProductFeatures).toHaveBeenCalledTimes(4); + expect(mockGetFeature).toHaveBeenCalledTimes(5); + expect(MockedProductFeatures).toHaveBeenCalledTimes(5); }); it('should init all ProductFeatures when initialized', () => { diff --git a/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.ts b/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.ts index 86928ff905545..2901734527a93 100644 --- a/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.ts +++ b/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.ts @@ -20,6 +20,7 @@ import { getAttackDiscoveryFeature, getCasesFeature, getSecurityFeature, + getCasesV2Feature, } from '@kbn/security-solution-features/product_features'; import type { RecursiveReadonly } from '@kbn/utility-types'; import type { ExperimentalFeatures } from '../../../common'; @@ -35,6 +36,7 @@ export const API_ACTION_PREFIX = `${APP_ID}-`; export class ProductFeaturesService { private securityProductFeatures: ProductFeatures; private casesProductFeatures: ProductFeatures; + private casesProductV2Features: ProductFeatures; private securityAssistantProductFeatures: ProductFeatures; private attackDiscoveryProductFeatures: ProductFeatures; private productFeatures?: Set; @@ -59,6 +61,7 @@ export class ProductFeaturesService { apiTags: casesApiTags, savedObjects: { files: filesSavedObjectTypes }, }); + this.casesProductFeatures = new ProductFeatures( this.logger, casesFeature.subFeaturesMap, @@ -66,6 +69,19 @@ export class ProductFeaturesService { casesFeature.baseKibanaSubFeatureIds ); + const casesV2Feature = getCasesV2Feature({ + uiCapabilities: casesUiCapabilities, + apiTags: casesApiTags, + savedObjects: { files: filesSavedObjectTypes }, + }); + + this.casesProductV2Features = new ProductFeatures( + this.logger, + casesV2Feature.subFeaturesMap, + casesV2Feature.baseKibanaFeature, + casesV2Feature.baseKibanaSubFeatureIds + ); + const assistantFeature = getAssistantFeature(this.experimentalFeatures); this.securityAssistantProductFeatures = new ProductFeatures( this.logger, @@ -86,6 +102,7 @@ export class ProductFeaturesService { public init(featuresSetup: FeaturesPluginSetup) { this.securityProductFeatures.init(featuresSetup); this.casesProductFeatures.init(featuresSetup); + this.casesProductV2Features.init(featuresSetup); this.securityAssistantProductFeatures.init(featuresSetup); this.attackDiscoveryProductFeatures.init(featuresSetup); } @@ -96,6 +113,7 @@ export class ProductFeaturesService { const casesProductFeaturesConfig = configurator.cases(); this.casesProductFeatures.setConfig(casesProductFeaturesConfig); + this.casesProductV2Features.setConfig(casesProductFeaturesConfig); const securityAssistantProductFeaturesConfig = configurator.securityAssistant(); this.securityAssistantProductFeatures.setConfig(securityAssistantProductFeaturesConfig); @@ -124,6 +142,7 @@ export class ProductFeaturesService { return ( this.securityProductFeatures.isActionRegistered(action) || this.casesProductFeatures.isActionRegistered(action) || + this.casesProductV2Features.isActionRegistered(action) || this.securityAssistantProductFeatures.isActionRegistered(action) || this.attackDiscoveryProductFeatures.isActionRegistered(action) ); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts index 025c52da766ad..a937560842f74 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts @@ -14,7 +14,7 @@ import { } from '../../../../../common/siem_migrations/model/api/rules/rule_migration.gen'; import { SIEM_RULE_MIGRATIONS_PATH } from '../../../../../common/siem_migrations/constants'; import type { SecuritySolutionPluginRouter } from '../../../../types'; -import type { CreateRuleMigrationInput } from '../data/rule_migrations_data_client'; +import type { CreateRuleMigrationInput } from '../data/rule_migrations_data_rules_client'; import { withLicense } from './util/with_license'; export const registerSiemRuleMigrationsCreateRoute = ( diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/index.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/index.ts index dfc4c2156fe2d..c6ea6b8bf897b 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/index.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/index.ts @@ -8,6 +8,7 @@ import type { Logger } from '@kbn/core/server'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { registerSiemRuleMigrationsCreateRoute } from './create'; +import { registerSiemRuleMigrationsUpdateRoute } from './update'; import { registerSiemRuleMigrationsGetRoute } from './get'; import { registerSiemRuleMigrationsStartRoute } from './start'; import { registerSiemRuleMigrationsStatsRoute } from './stats'; @@ -22,6 +23,7 @@ export const registerSiemRuleMigrationsRoutes = ( logger: Logger ) => { registerSiemRuleMigrationsCreateRoute(router, logger); + registerSiemRuleMigrationsUpdateRoute(router, logger); registerSiemRuleMigrationsStatsAllRoute(router, logger); registerSiemRuleMigrationsGetRoute(router, logger); registerSiemRuleMigrationsStartRoute(router, logger); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/update.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/update.ts new file mode 100644 index 0000000000000..a41ba32d2dd34 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/update.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { IKibanaResponse, Logger } from '@kbn/core/server'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; +import { + UpdateRuleMigrationRequestBody, + type UpdateRuleMigrationResponse, +} from '../../../../../common/siem_migrations/model/api/rules/rule_migration.gen'; +import { SIEM_RULE_MIGRATIONS_PATH } from '../../../../../common/siem_migrations/constants'; +import type { SecuritySolutionPluginRouter } from '../../../../types'; +import { withLicense } from './util/with_license'; + +export const registerSiemRuleMigrationsUpdateRoute = ( + router: SecuritySolutionPluginRouter, + logger: Logger +) => { + router.versioned + .put({ + path: SIEM_RULE_MIGRATIONS_PATH, + access: 'internal', + security: { authz: { requiredPrivileges: ['securitySolution'] } }, + }) + .addVersion( + { + version: '1', + validate: { + request: { body: buildRouteValidationWithZod(UpdateRuleMigrationRequestBody) }, + }, + }, + withLicense( + async (context, req, res): Promise> => { + const rulesToUpdate = req.body; + try { + const ctx = await context.resolve(['securitySolution']); + const ruleMigrationsClient = ctx.securitySolution.getSiemRuleMigrationsClient(); + + await ruleMigrationsClient.data.rules.update(rulesToUpdate); + + return res.ok({ body: { updated: true } }); + } catch (err) { + logger.error(err); + return res.badRequest({ body: err.message }); + } + } + ) + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts index 8b5a81e2bc99d..4f0b65e063b77 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts @@ -33,7 +33,7 @@ export class RuleMigrationsDataBaseClient { return hits.map(({ _id, _source }) => { assert(_id, 'document should have _id'); assert(_source, 'document should have _source'); - return { ..._source, ...override, _id }; + return { ..._source, ...override, id: _id }; }); } diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts index fe682ceeec783..40f4aa6bf786e 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts @@ -6,18 +6,10 @@ */ import type { ElasticsearchClient, Logger } from '@kbn/core/server'; -import type { - RuleMigration, - RuleMigrationTaskStats, -} from '../../../../../common/siem_migrations/model/rule_migration.gen'; import { RuleMigrationsDataRulesClient } from './rule_migrations_data_rules_client'; import { RuleMigrationsDataResourcesClient } from './rule_migrations_data_resources_client'; import type { AdapterId } from './rule_migrations_data_service'; -export type CreateRuleMigrationInput = Omit; -export type RuleMigrationDataStats = Omit; -export type RuleMigrationAllDataStats = Array; - export type IndexNameProvider = () => Promise; export type IndexNameProviders = Record; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_rules_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_rules_client.ts index feedff65343d5..a01d36e9a1195 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_rules_client.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_rules_client.ts @@ -15,12 +15,20 @@ import type { import type { StoredRuleMigration } from '../types'; import { SiemMigrationStatus } from '../../../../../common/siem_migrations/constants'; import type { + ElasticRule, RuleMigration, RuleMigrationTaskStats, } from '../../../../../common/siem_migrations/model/rule_migration.gen'; import { RuleMigrationsDataBaseClient } from './rule_migrations_data_base_client'; -export type CreateRuleMigrationInput = Omit; +export type CreateRuleMigrationInput = Omit< + RuleMigration, + '@timestamp' | 'id' | 'status' | 'created_by' +>; +export type UpdateRuleMigrationInput = { elastic_rule?: Partial } & Pick< + RuleMigration, + 'id' | 'translation_result' | 'comments' +>; export type RuleMigrationDataStats = Omit; export type RuleMigrationAllDataStats = Array; @@ -35,6 +43,7 @@ export class RuleMigrationsDataRulesClient extends RuleMigrationsDataBaseClient const index = await this.getIndexName(); let ruleMigrationsSlice: CreateRuleMigrationInput[]; + const createdAt = new Date().toISOString(); while ((ruleMigrationsSlice = ruleMigrations.splice(0, BULK_MAX_SIZE)).length) { await this.esClient .bulk({ @@ -43,9 +52,11 @@ export class RuleMigrationsDataRulesClient extends RuleMigrationsDataBaseClient { create: { _index: index } }, { ...ruleMigration, - '@timestamp': new Date().toISOString(), + '@timestamp': createdAt, status: SiemMigrationStatus.PENDING, created_by: this.username, + updated_by: this.username, + updated_at: createdAt, }, ]), }) @@ -56,6 +67,37 @@ export class RuleMigrationsDataRulesClient extends RuleMigrationsDataBaseClient } } + /** Updates an array of rule migrations to be processed */ + async update(ruleMigrations: UpdateRuleMigrationInput[]): Promise { + const index = await this.getIndexName(); + + let ruleMigrationsSlice: UpdateRuleMigrationInput[]; + const updatedAt = new Date().toISOString(); + while ((ruleMigrationsSlice = ruleMigrations.splice(0, BULK_MAX_SIZE)).length) { + await this.esClient + .bulk({ + refresh: 'wait_for', + operations: ruleMigrationsSlice.flatMap((ruleMigration) => { + const { id, ...rest } = ruleMigration; + return [ + { update: { _index: index, _id: id } }, + { + doc: { + ...rest, + updated_by: this.username, + updated_at: updatedAt, + }, + }, + ]; + }), + }) + .catch((error) => { + this.logger.error(`Error updating rule migrations: ${error.message}`); + throw error; + }); + } + } + /** Retrieves an array of rule documents of a specific migrations */ async get(migrationId: string): Promise { const index = await this.getIndexName(); @@ -94,8 +136,8 @@ export class RuleMigrationsDataRulesClient extends RuleMigrationsDataBaseClient await this.esClient .bulk({ refresh: 'wait_for', - operations: storedRuleMigrations.flatMap(({ _id, status }) => [ - { update: { _id, _index: index } }, + operations: storedRuleMigrations.flatMap(({ id, status }) => [ + { update: { _id: id, _index: index } }, { doc: { status, updated_by: this.username, updated_at: new Date().toISOString() }, }, @@ -112,7 +154,7 @@ export class RuleMigrationsDataRulesClient extends RuleMigrationsDataBaseClient } /** Updates one rule migration with the provided data and sets the status to `completed` */ - async saveCompleted({ _id, ...ruleMigration }: StoredRuleMigration): Promise { + async saveCompleted({ id, ...ruleMigration }: StoredRuleMigration): Promise { const index = await this.getIndexName(); const doc = { ...ruleMigration, @@ -120,14 +162,14 @@ export class RuleMigrationsDataRulesClient extends RuleMigrationsDataBaseClient updated_by: this.username, updated_at: new Date().toISOString(), }; - await this.esClient.update({ index, id: _id, doc, refresh: 'wait_for' }).catch((error) => { + await this.esClient.update({ index, id, doc, refresh: 'wait_for' }).catch((error) => { this.logger.error(`Error updating rule migration status to completed: ${error.message}`); throw error; }); } /** Updates one rule migration with the provided data and sets the status to `failed` */ - async saveError({ _id, ...ruleMigration }: StoredRuleMigration): Promise { + async saveError({ id, ...ruleMigration }: StoredRuleMigration): Promise { const index = await this.getIndexName(); const doc = { ...ruleMigration, @@ -135,7 +177,7 @@ export class RuleMigrationsDataRulesClient extends RuleMigrationsDataBaseClient updated_by: this.username, updated_at: new Date().toISOString(), }; - await this.esClient.update({ index, id: _id, doc, refresh: 'wait_for' }).catch((error) => { + await this.esClient.update({ index, id, doc, refresh: 'wait_for' }).catch((error) => { this.logger.error(`Error updating rule migration status to failed: ${error.message}`); throw error; }); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts index 8dbccb61d5355..3811ff74b5ca1 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts @@ -11,7 +11,7 @@ import type { RuleMigrationResource, } from '../../../../../common/siem_migrations/model/rule_migration.gen'; -export const ruleMigrationsFieldMap: FieldMap> = { +export const ruleMigrationsFieldMap: FieldMap>> = { '@timestamp': { type: 'date', required: false }, migration_id: { type: 'keyword', required: true }, created_by: { type: 'keyword', required: true }, @@ -38,7 +38,9 @@ export const ruleMigrationsFieldMap: FieldMap> updated_by: { type: 'keyword', required: false }, }; -export const ruleMigrationResourcesFieldMap: FieldMap> = { +export const ruleMigrationResourcesFieldMap: FieldMap< + SchemaFieldMapKeys> +> = { migration_id: { type: 'keyword', required: true }, type: { type: 'keyword', required: true }, name: { type: 'keyword', required: true }, diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts index 98319a77a7662..989c33a44cb36 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts @@ -13,10 +13,8 @@ import type { RuleMigrationAllTaskStats, RuleMigrationTaskStats, } from '../../../../../common/siem_migrations/model/rule_migration.gen'; -import type { - RuleMigrationDataStats, - RuleMigrationsDataClient, -} from '../data/rule_migrations_data_client'; +import type { RuleMigrationsDataClient } from '../data/rule_migrations_data_client'; +import type { RuleMigrationDataStats } from '../data/rule_migrations_data_rules_client'; import type { RuleMigrationTaskStartParams, RuleMigrationTaskStartResult, diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/actions_client_chat.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/actions_client_chat.ts index 204978c901df6..1659862543078 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/actions_client_chat.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/actions_client_chat.ts @@ -33,10 +33,7 @@ export type ActionsClientChatModelClass = export type ChatModelParams = Partial & Partial & Partial & - Partial & { - /** Enables the streaming mode of the response, disabled by default */ - streaming?: boolean; - }; + Partial; const llmTypeDictionary: Record = { [`.gen-ai`]: `openai`, @@ -67,7 +64,7 @@ export class ActionsClientChat { llmType, model: connector.config?.defaultModel, ...params, - streaming: params?.streaming ?? false, // disabling streaming by default, for some reason is enabled when omitted + streaming: false, // disabling streaming by default }); return model; } diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts index 34d0088256282..e506b43cc323b 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts @@ -10,7 +10,7 @@ import type { RuleMigrationResource, } from '../../../../common/siem_migrations/model/rule_migration.gen'; -export type Stored = T & { _id: string }; +export type Stored = T & { id: string }; export type StoredRuleMigration = Stored; export type StoredRuleMigrationResource = Stored; diff --git a/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts b/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts index 1604b4374b984..8b76d6b380893 100644 --- a/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts +++ b/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts @@ -21,8 +21,10 @@ export const createTagRoute = (router: SecuritySolutionPluginRouter, logger: Log .put({ path: INTERNAL_TAGS_URL, access: 'internal', - options: { - tags: ['access:securitySolution'], + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, }, }) .addVersion( diff --git a/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts b/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts index 75ae24d0eacd5..dc5a9da70c71f 100644 --- a/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts +++ b/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts @@ -21,8 +21,10 @@ export const getTagsByNameRoute = (router: SecuritySolutionPluginRouter, logger: .get({ path: INTERNAL_TAGS_URL, access: 'internal', - options: { - tags: ['access:securitySolution'], + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, }, }) .addVersion( diff --git a/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx b/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx index 701490be4c4c4..350e9151d8ea9 100644 --- a/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx +++ b/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx @@ -8,7 +8,6 @@ import type { EuiSuperSelectOption, EuiThemeComputed } from '@elastic/eui'; import { EuiBetaBadge, - EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiFormRow, @@ -43,7 +42,7 @@ const getOptions = ({ size }: EuiThemeComputed): Array {i18n.translate( 'xpack.spaces.management.manageSpacePage.solutionViewSelect.searchOptionLabel', - { defaultMessage: 'Search' } + { defaultMessage: 'Elasticsearch' } )} ), @@ -181,21 +180,6 @@ export const SolutionView: FunctionComponent = ({ isInvalid={validator.validateSolutionView(space, isEditing).isInvalid} /> - - {showClassicDefaultViewCallout && ( - <> - - - - )} diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx index 2e3d40527dbd7..18e11110d7564 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiConfirmModal, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import type { FC } from 'react'; -import React, { useCallback, useEffect } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import type { KibanaFeature } from '@kbn/features-plugin/common'; import { i18n } from '@kbn/i18n'; @@ -40,6 +40,8 @@ export const EditSpaceAssignedRolesTab: FC = ({ space, features, isReadOn invokeClient, } = services; + const [removeRoleConfirm, setRemoveRoleConfirm] = useState(null); + // Roles are already loaded in app state, refresh them when user navigates to this tab useEffect(() => { const getRoles = async () => { @@ -175,7 +177,7 @@ export const EditSpaceAssignedRolesTab: FC = ({ space, features, isReadOn ); return ( - + <> @@ -194,8 +196,8 @@ export const EditSpaceAssignedRolesTab: FC = ({ space, features, isReadOn onClickBulkRemove={async (selectedRoles) => { await removeRole(selectedRoles); }} - onClickRowRemoveAction={async (rowRecord) => { - await removeRole([rowRecord]); + onClickRemoveRoleConfirm={async (rowRecord) => { + setRemoveRoleConfirm(rowRecord); }} onClickAssignNewRole={async () => { showRolesPrivilegeEditor(); @@ -203,6 +205,36 @@ export const EditSpaceAssignedRolesTab: FC = ({ space, features, isReadOn /> - + {removeRoleConfirm && ( + setRemoveRoleConfirm(null)} + onConfirm={() => { + removeRole([removeRoleConfirm]); + setRemoveRoleConfirm(null); + }} + > +

      + +

      +
      + )} + ); }; diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx index 74f2b2fde4667..84859631cdb77 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx @@ -20,7 +20,6 @@ import { EuiFormRow, EuiLink, EuiLoadingSpinner, - EuiSpacer, EuiText, EuiTitle, useGeneratedHtmlId, @@ -31,7 +30,6 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import type { KibanaFeature, KibanaFeatureConfig } from '@kbn/features-plugin/common'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; import type { RawKibanaPrivileges, Role, @@ -157,7 +155,7 @@ export const PrivilegesRolesForm: FC = (props) => { const [roleSpacePrivilege, setRoleSpacePrivilege] = useState( !selectedRoles.length || !selectedRolesCombinedPrivileges.length - ? FEATURE_PRIVILEGES_ALL + ? FEATURE_PRIVILEGES_CUSTOM : selectedRolesCombinedPrivileges[0] ); @@ -378,17 +376,19 @@ export const PrivilegesRolesForm: FC = (props) => { { defaultMessage: 'Select roles' } )} labelAppend={ - - {i18n.translate( - 'xpack.spaces.management.spaceDetails.roles.selectRolesFormRowLabelAnchor', - { defaultMessage: 'Manage roles' } - )} - + + + {i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.selectRolesFormRowLabelAnchor', + { defaultMessage: 'Manage roles' } + )} + + } helpText={i18n.translate( 'xpack.spaces.management.spaceDetails.roles.selectRolesHelp', @@ -409,7 +409,7 @@ export const PrivilegesRolesForm: FC = (props) => { )} placeholder={i18n.translate( 'xpack.spaces.management.spaceDetails.roles.selectRolesPlaceholder', - { defaultMessage: 'Add a role...' } + { defaultMessage: 'Add roles...' } )} isLoading={fetchingDataDeps} options={createRolesComboBoxOptions(spaceUnallocatedRoles)} @@ -452,9 +452,9 @@ export const PrivilegesRolesForm: FC = (props) => { iconType="iInCircle" data-test-subj="privilege-info-callout" title={i18n.translate( - 'xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.title', + 'xpack.spaces.management.spaceDetails.roles.assign.privilegeCombinationMsg.title', { - defaultMessage: 'Privileges will apply only to this space.', + defaultMessage: `The user's resulting access depends on a combination of their role's global space privileges and specific privileges applied to this space.`, } )} /> @@ -464,7 +464,14 @@ export const PrivilegesRolesForm: FC = (props) => { label={i18n.translate( 'xpack.spaces.management.spaceDetails.roles.assign.privilegesLabelText', { - defaultMessage: 'Define role privileges', + defaultMessage: 'Define privileges', + } + )} + helpText={i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.assign.privilegesHelpText', + { + defaultMessage: + 'Assign the privilege level you wish to grant to all present and future features across this space.', } )} > @@ -518,7 +525,6 @@ export const PrivilegesRolesForm: FC = (props) => { ) : ( = (props) => { canCustomizeSubFeaturePrivileges={ license?.getFeatures().allowSubFeaturePrivileges ?? false } + showAdditionalPermissionsMessage={false} /> )} @@ -643,10 +650,10 @@ export const PrivilegesRolesForm: FC = (props) => { > {isEditOperation.current ? i18n.translate('xpack.spaces.management.spaceDetails.roles.updateRoleButton', { - defaultMessage: 'Update', + defaultMessage: 'Update role privileges', }) : i18n.translate('xpack.spaces.management.spaceDetails.roles.assignRoleButton', { - defaultMessage: 'Assign', + defaultMessage: 'Assign roles', })}
      ); @@ -659,7 +666,7 @@ export const PrivilegesRolesForm: FC = (props) => {

      {isEditOperation.current ? i18n.translate('xpack.spaces.management.spaceDetails.roles.assignRoleButton', { - defaultMessage: 'Edit role privileges', + defaultMessage: 'Edit role privileges for space', }) : i18n.translate( 'xpack.spaces.management.spaceDetails.roles.assign.privileges.custom', @@ -669,15 +676,6 @@ export const PrivilegesRolesForm: FC = (props) => { )}

      - - -

      - -

      -
      {getForm()} diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx index f909dba415c41..0ddb633cd1f5c 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx @@ -18,7 +18,7 @@ const defaultProps: Pick< | 'onClickAssignNewRole' | 'onClickBulkRemove' | 'onClickRowEditAction' - | 'onClickRowRemoveAction' + | 'onClickRemoveRoleConfirm' | 'currentSpace' > = { currentSpace: { @@ -29,7 +29,7 @@ const defaultProps: Pick< onClickBulkRemove: jest.fn(), onClickRowEditAction: jest.fn(), onClickAssignNewRole: jest.fn(), - onClickRowRemoveAction: jest.fn(), + onClickRemoveRoleConfirm: jest.fn(), }; const renderTestComponent = ( diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx index ffe7ecba85ec0..f59bd00561671 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx @@ -41,7 +41,7 @@ interface ISpaceAssignedRolesTableProps { assignedRoles: Map; onClickAssignNewRole: () => Promise; onClickRowEditAction: (role: Role) => void; - onClickRowRemoveAction: (role: Role) => void; + onClickRemoveRoleConfirm: (role: Role) => void; supportsBulkAction?: boolean; onClickBulkRemove?: (selectedRoles: Role[]) => void; } @@ -67,10 +67,10 @@ const getTableColumns = ({ isReadOnly, currentSpace, onClickRowEditAction, - onClickRowRemoveAction, + onClickRemoveRoleConfirm, }: Pick< ISpaceAssignedRolesTableProps, - 'isReadOnly' | 'onClickRowEditAction' | 'onClickRowRemoveAction' | 'currentSpace' + 'isReadOnly' | 'onClickRowEditAction' | 'onClickRemoveRoleConfirm' | 'currentSpace' >) => { const columns: Array> = [ { @@ -205,7 +205,7 @@ const getTableColumns = ({ { defaultMessage: 'Click this action to remove the user from this space.' } ), available: (rowRecord) => isEditableRole(rowRecord), - onClick: onClickRowRemoveAction, + onClick: onClickRemoveRoleConfirm, }, ], }); @@ -237,14 +237,19 @@ export const SpaceAssignedRolesTable = ({ onClickAssignNewRole, onClickBulkRemove, onClickRowEditAction, - onClickRowRemoveAction, + onClickRemoveRoleConfirm, isReadOnly = false, supportsBulkAction = false, }: ISpaceAssignedRolesTableProps) => { const tableColumns = useMemo( () => - getTableColumns({ isReadOnly, onClickRowEditAction, onClickRowRemoveAction, currentSpace }), - [currentSpace, isReadOnly, onClickRowEditAction, onClickRowRemoveAction] + getTableColumns({ + isReadOnly, + onClickRowEditAction, + onClickRemoveRoleConfirm, + currentSpace, + }), + [currentSpace, isReadOnly, onClickRowEditAction, onClickRemoveRoleConfirm] ); const [rolesInView, setRolesInView] = useState([]); const [selectedRoles, setSelectedRoles] = useState([]); @@ -262,14 +267,17 @@ export const SpaceAssignedRolesTable = ({ const onSearchQueryChange = useCallback>>( ({ query }) => { - const _assignedRolesTransformed = Array.from(assignedRoles.values()); + const assignedRolesTransformed = Array.from(assignedRoles.values()); + const sortedAssignedRolesTransformed = assignedRolesTransformed.sort(sortRolesForListing); if (query?.text) { setRolesInView( - _assignedRolesTransformed.filter((role) => role.name.includes(query.text.toLowerCase())) + sortedAssignedRolesTransformed.filter((role) => + role.name.includes(query.text.toLowerCase()) + ) ); } else { - setRolesInView(_assignedRolesTransformed); + setRolesInView(sortedAssignedRolesTransformed); } }, [assignedRoles] diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx index 169f12c3487c4..7a9cf421d02c9 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx @@ -154,12 +154,21 @@ describe('SpacesGridPage', () => { wrapper.update(); expect(wrapper.find('EuiInMemoryTable').prop('items')).toBe(spacesWithSolution); - expect(wrapper.find('EuiInMemoryTable').prop('columns')).toContainEqual({ - field: 'solution', - name: 'Solution view', - sortable: true, - render: expect.any(Function), - }); + expect(wrapper.find('EuiInMemoryTable').prop('columns')).toEqual( + expect.arrayContaining([ + expect.objectContaining({ name: '', field: 'initials' }), + expect.objectContaining({ name: 'Space', field: 'name' }), + expect.objectContaining({ name: 'Description', field: 'description' }), + expect.objectContaining({ name: 'Solution view', field: 'solution' }), + expect.objectContaining({ + actions: expect.arrayContaining([ + expect.objectContaining({ name: 'Edit', icon: 'pencil' }), + expect.objectContaining({ name: 'Switch', icon: 'merge' }), + expect.objectContaining({ name: 'Delete', icon: 'trash' }), + ]), + }), + ]) + ); }); it('renders a "current" badge for the current space', async () => { @@ -413,44 +422,6 @@ describe('SpacesGridPage', () => { }); }); - it(`renders the 'Features visible' column when not serverless`, async () => { - const httpStart = httpServiceMock.createStartContract(); - httpStart.get.mockResolvedValue([]); - - const error = new Error('something awful happened'); - - const notifications = notificationServiceMock.createStartContract(); - - const wrapper = shallowWithIntl( - Promise.reject(error)} - notifications={notifications} - getUrlForApp={getUrlForApp} - history={history} - capabilities={{ - navLinks: {}, - management: {}, - catalogue: {}, - spaces: { manage: true }, - }} - allowSolutionVisibility - {...spacesGridCommonProps} - /> - ); - - // allow spacesManager to load spaces and lazy-load SpaceAvatar - await act(async () => {}); - wrapper.update(); - - expect(wrapper.find('EuiInMemoryTable').prop('columns')).toContainEqual( - expect.objectContaining({ - field: 'disabledFeatures', - name: 'Features visible', - }) - ); - }); - it(`does not render the 'Features visible' column when serverless`, async () => { const httpStart = httpServiceMock.createStartContract(); httpStart.get.mockResolvedValue([]); diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index 586992c1b6b48..10bbde47a106f 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -18,8 +18,6 @@ import { EuiPageHeader, EuiPageSection, EuiSpacer, - EuiText, - useIsWithinBreakpoints, } from '@elastic/eui'; import React, { Component, lazy, Suspense } from 'react'; @@ -36,17 +34,12 @@ import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; import { addSpaceIdToPath, type Space } from '../../../common'; import { isReservedSpace } from '../../../common'; -import { - DEFAULT_SPACE_ID, - ENTER_SPACE_PATH, - SOLUTION_VIEW_CLASSIC, -} from '../../../common/constants'; +import { DEFAULT_SPACE_ID, ENTER_SPACE_PATH } from '../../../common/constants'; import { getSpacesFeatureDescription } from '../../constants'; import { getSpaceAvatarComponent } from '../../space_avatar'; import { SpaceSolutionBadge } from '../../space_solution_badge'; import type { SpacesManager } from '../../spaces_manager'; import { ConfirmDeleteModal, UnauthorizedPrompt } from '../components'; -import { getEnabledFeatures } from '../lib/feature_utils'; // No need to wrap LazySpaceAvatar in an error boundary, because it is one of the first chunks loaded when opening Kibana. const LazySpaceAvatar = lazy(() => @@ -255,8 +248,7 @@ export class SpacesGridPage extends Component { }; public getColumnConfig() { - const { activeSpace, features } = this.state; - const { solution: activeSolution } = activeSpace ?? {}; + const { activeSpace } = this.state; const config: Array> = [ { @@ -284,15 +276,8 @@ export class SpacesGridPage extends Component { render: (value: string, rowRecord: Space) => { const SpaceName = () => { const isCurrent = this.state.activeSpace?.id === rowRecord.id; - const isWide = useIsWithinBreakpoints(['xl']); - const gridColumns = isCurrent && isWide ? 2 : 1; return ( - + { return ; }, 'data-test-subj': 'spacesListTableRowNameCell', - width: '15%', + width: '20%', }, { field: 'description', @@ -332,55 +317,10 @@ export class SpacesGridPage extends Component { }), sortable: true, truncateText: true, - width: '45%', + width: '40%', }, ]; - const shouldShowFeaturesColumn = - !this.props.isServerless && (!activeSolution || activeSolution === SOLUTION_VIEW_CLASSIC); - if (shouldShowFeaturesColumn) { - config.push({ - field: 'disabledFeatures', - name: i18n.translate('xpack.spaces.management.spacesGridPage.featuresColumnName', { - defaultMessage: 'Features visible', - }), - sortable: (space: Space) => { - return getEnabledFeatures(features, space).length; - }, - render: (_disabledFeatures: string[], rowRecord: Space) => { - const enabledFeatureCount = getEnabledFeatures(features, rowRecord).length; - if (enabledFeatureCount === features.length) { - return ( - - ); - } - if (enabledFeatureCount === 0) { - return ( - - - - ); - } - return ( - - ); - }, - }); - } - config.push({ field: 'id', name: i18n.translate('xpack.spaces.management.spacesGridPage.identifierColumnName', { @@ -405,6 +345,7 @@ export class SpacesGridPage extends Component { render: (solution: Space['solution'], record: Space) => ( ), + width: '10%', }); } diff --git a/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx b/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx index caa9cc17b053c..eda87809c66b3 100644 --- a/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx +++ b/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx @@ -28,7 +28,7 @@ const LearnMoreLink = () => ( const solutionMap: Record = { es: i18n.translate('xpack.spaces.navControl.tour.esSolution', { - defaultMessage: 'Search', + defaultMessage: 'Elasticsearch', }), security: i18n.translate('xpack.spaces.navControl.tour.securitySolution', { defaultMessage: 'Security', diff --git a/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap b/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap index 4419707ab45f4..2b088f54f3535 100644 --- a/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap +++ b/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap @@ -4,7 +4,6 @@ exports[`it renders with custom logo 1`] = ` <_KibanaPageTemplate className="spcSpaceSelector" data-test-subj="kibanaSpaceSelector" - panelled={true} >
      { } return ( - + {/* Portal the fixed background graphic so it doesn't affect page positioning or overlap on top of global banners */}
      ), }, diff --git a/x-pack/plugins/stack_connectors/common/bedrock/constants.ts b/x-pack/plugins/stack_connectors/common/bedrock/constants.ts index f3b133dd783f6..d2ffa0b116bda 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/constants.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/constants.ts @@ -21,6 +21,8 @@ export enum SUB_ACTION { INVOKE_STREAM = 'invokeStream', DASHBOARD = 'getDashboard', TEST = 'test', + CONVERSE = 'converse', + CONVERSE_STREAM = 'converseStream', } export const DEFAULT_TIMEOUT_MS = 120000; diff --git a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts index 15ac45c0cf597..c444159c010b2 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts @@ -26,6 +26,11 @@ export const RunActionParamsSchema = schema.object({ signal: schema.maybe(schema.any()), timeout: schema.maybe(schema.number()), raw: schema.maybe(schema.boolean()), + apiType: schema.maybe( + schema.oneOf([schema.literal('converse'), schema.literal('invoke')], { + defaultValue: 'invoke', + }) + ), }); export const BedrockMessageSchema = schema.object( @@ -148,3 +153,54 @@ export const DashboardActionParamsSchema = schema.object({ export const DashboardActionResponseSchema = schema.object({ available: schema.boolean(), }); + +export const ConverseActionParamsSchema = schema.object({ + // Bedrock API Properties + modelId: schema.maybe(schema.string()), + messages: schema.arrayOf( + schema.object({ + role: schema.string(), + content: schema.any(), + }) + ), + system: schema.arrayOf( + schema.object({ + text: schema.string(), + }) + ), + inferenceConfig: schema.object({ + temperature: schema.maybe(schema.number()), + maxTokens: schema.maybe(schema.number()), + stopSequences: schema.maybe(schema.arrayOf(schema.string())), + topP: schema.maybe(schema.number()), + }), + toolConfig: schema.maybe( + schema.object({ + tools: schema.arrayOf( + schema.object({ + toolSpec: schema.object({ + name: schema.string(), + description: schema.string(), + inputSchema: schema.object({ + json: schema.object({ + type: schema.string(), + properties: schema.object({}, { unknowns: 'allow' }), + required: schema.maybe(schema.arrayOf(schema.string())), + additionalProperties: schema.boolean(), + $schema: schema.maybe(schema.string()), + }), + }), + }), + }) + ), + toolChoice: schema.maybe(schema.object({}, { unknowns: 'allow' })), + }) + ), + additionalModelRequestFields: schema.maybe(schema.any()), + additionalModelResponseFieldPaths: schema.maybe(schema.any()), + guardrailConfig: schema.maybe(schema.any()), + // Kibana related properties + signal: schema.maybe(schema.any()), +}); + +export const ConverseActionResponseSchema = schema.object({}, { unknowns: 'allow' }); diff --git a/x-pack/plugins/stack_connectors/common/bedrock/types.ts b/x-pack/plugins/stack_connectors/common/bedrock/types.ts index 9d742e5f892a8..e3dd49538176f 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/types.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/types.ts @@ -21,6 +21,8 @@ import { RunApiLatestResponseSchema, BedrockMessageSchema, BedrockToolChoiceSchema, + ConverseActionParamsSchema, + ConverseActionResponseSchema, } from './schema'; export type Config = TypeOf; @@ -37,3 +39,5 @@ export type DashboardActionParams = TypeOf; export type DashboardActionResponse = TypeOf; export type BedrockMessage = TypeOf; export type BedrockToolChoice = TypeOf; +export type ConverseActionParams = TypeOf; +export type ConverseActionResponse = TypeOf; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts index 9bd5c64404f64..55b631ba9441c 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts @@ -21,8 +21,9 @@ import { StreamingResponseSchema, RunActionResponseSchema, RunApiLatestResponseSchema, + ConverseActionParamsSchema, } from '../../../common/bedrock/schema'; -import type { +import { Config, Secrets, RunActionParams, @@ -34,6 +35,8 @@ import type { RunApiLatestResponse, BedrockMessage, BedrockToolChoice, + ConverseActionParams, + ConverseActionResponse, } from '../../../common/bedrock/types'; import { SUB_ACTION, @@ -103,6 +106,18 @@ export class BedrockConnector extends SubActionConnector { method: 'invokeAIRaw', schema: InvokeAIRawActionParamsSchema, }); + + this.registerSubAction({ + name: SUB_ACTION.CONVERSE, + method: 'converse', + schema: ConverseActionParamsSchema, + }); + + this.registerSubAction({ + name: SUB_ACTION.CONVERSE_STREAM, + method: 'converseStream', + schema: ConverseActionParamsSchema, + }); } protected getResponseErrorMessage(error: AxiosError<{ message?: string }>): string { @@ -222,14 +237,18 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B * responsible for making a POST request to the external API endpoint and returning the response data * @param body The stringified request body to be sent in the POST request. * @param model Optional model to be used for the API request. If not provided, the default model from the connector will be used. + * @param signal Optional signal to cancel the request. + * @param timeout Optional timeout for the request. + * @param raw Optional flag to indicate if the response should be returned as raw data. + * @param apiType Optional type of API to be called. Defaults to 'invoke', . */ public async runApi( - { body, model: reqModel, signal, timeout, raw }: RunActionParams, + { body, model: reqModel, signal, timeout, raw, apiType = 'invoke' }: RunActionParams, connectorUsageCollector: ConnectorUsageCollector ): Promise { // set model on per request basis const currentModel = reqModel ?? this.model; - const path = `/model/${currentModel}/invoke`; + const path = `/model/${currentModel}/${apiType}`; const signed = this.signRequest(body, path, false); const requestArgs = { ...signed, @@ -262,18 +281,22 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B /** * NOT INTENDED TO BE CALLED DIRECTLY - * call invokeStream instead + * call invokeStream or converseStream instead * responsible for making a POST request to a specified URL with a given request body. * The response is then processed based on whether it is a streaming response or a regular response. * @param body The stringified request body to be sent in the POST request. * @param model Optional model to be used for the API request. If not provided, the default model from the connector will be used. */ private async streamApi( - { body, model: reqModel, signal, timeout }: RunActionParams, + { body, model: reqModel, signal, timeout, apiType = 'invoke' }: RunActionParams, connectorUsageCollector: ConnectorUsageCollector ): Promise { + const streamingApiRoute = { + invoke: 'invoke-with-response-stream', + converse: 'converse-stream', + }; // set model on per request basis - const path = `/model/${reqModel ?? this.model}/invoke-with-response-stream`; + const path = `/model/${reqModel ?? this.model}/${streamingApiRoute[apiType]}`; const signed = this.signRequest(body, path, true); const response = await this.request( @@ -312,7 +335,7 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B timeout, tools, toolChoice, - }: InvokeAIActionParams | InvokeAIRawActionParams, + }: InvokeAIRawActionParams, connectorUsageCollector: ConnectorUsageCollector ): Promise { const res = (await this.streamApi( @@ -411,6 +434,50 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B ); return res; } + + /** + * Sends a request to the Bedrock API to perform a conversation action. + * @param input - The parameters for the conversation action. + * @param connectorUsageCollector - The usage collector for the connector. + * @returns A promise that resolves to the response of the conversation action. + */ + public async converse( + { signal, ...converseApiInput }: ConverseActionParams, + connectorUsageCollector: ConnectorUsageCollector + ): Promise { + const res = await this.runApi( + { + body: JSON.stringify(converseApiInput), + raw: true, + apiType: 'converse', + signal, + }, + connectorUsageCollector + ); + return res; + } + + /** + * Sends a request to the Bedrock API to perform a streaming conversation action. + * @param input - The parameters for the streaming conversation action. + * @param connectorUsageCollector - The usage collector for the connector. + * @returns A promise that resolves to the streaming response of the conversation action. + */ + public async converseStream( + { signal, ...converseApiInput }: ConverseActionParams, + connectorUsageCollector: ConnectorUsageCollector + ): Promise { + const res = await this.streamApi( + { + body: JSON.stringify(converseApiInput), + apiType: 'converse', + signal, + }, + connectorUsageCollector + ); + + return res; + } } const formatBedrockBody = ({ diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.test.ts index 6023d7715f4ed..628ab7adcd363 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.test.ts @@ -101,9 +101,50 @@ describe('Azure Open AI Utils', () => { }; [chatUrl, completionUrl, completionExtensionsUrl].forEach((url: string) => { const sanitizedBodyString = getRequestWithStreamOption(url, JSON.stringify(body), true); - expect(sanitizedBodyString).toEqual( - `{\"messages\":[{\"role\":\"user\",\"content\":\"This is a test\"}],\"stream\":true}` - ); + expect(JSON.parse(sanitizedBodyString)).toEqual({ + messages: [{ content: 'This is a test', role: 'user' }], + stream: true, + stream_options: { + include_usage: true, + }, + }); + }); + }); + it('sets stream_options when stream is true', () => { + const body = { + messages: [ + { + role: 'user', + content: 'This is a test', + }, + ], + }; + [chatUrl, completionUrl, completionExtensionsUrl].forEach((url: string) => { + const sanitizedBodyString = getRequestWithStreamOption(url, JSON.stringify(body), true); + expect(JSON.parse(sanitizedBodyString)).toEqual({ + messages: [{ content: 'This is a test', role: 'user' }], + stream: true, + stream_options: { + include_usage: true, + }, + }); + }); + }); + it('does not sets stream_options when stream is false', () => { + const body = { + messages: [ + { + role: 'user', + content: 'This is a test', + }, + ], + }; + [chatUrl, completionUrl, completionExtensionsUrl].forEach((url: string) => { + const sanitizedBodyString = getRequestWithStreamOption(url, JSON.stringify(body), false); + expect(JSON.parse(sanitizedBodyString)).toEqual({ + messages: [{ content: 'This is a test', role: 'user' }], + stream: false, + }); }); }); it('overrides stream parameter if defined in body', () => { diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.ts index 02bff6ea2f63a..8825e719f0105 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/azure_openai_utils.ts @@ -48,6 +48,11 @@ export const getRequestWithStreamOption = (url: string, body: string, stream: bo const jsonBody = JSON.parse(body); if (jsonBody) { jsonBody.stream = stream; + if (stream) { + jsonBody.stream_options = { + include_usage: true, + }; + } } return JSON.stringify(jsonBody); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts index b480b72859183..cd65084badc92 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts @@ -118,6 +118,31 @@ describe('Open AI Utils', () => { ], }; + [OPENAI_CHAT_URL, OPENAI_LEGACY_COMPLETION_URL].forEach((url: string) => { + const sanitizedBodyString = getRequestWithStreamOption( + url, + JSON.stringify(body), + false, + DEFAULT_OPENAI_MODEL + ); + expect(JSON.parse(sanitizedBodyString)).toEqual({ + messages: [{ content: 'This is a test', role: 'user' }], + model: 'gpt-4', + stream: false, + }); + }); + }); + it('sets stream_options when stream is true', () => { + const body = { + model: 'gpt-4', + messages: [ + { + role: 'user', + content: 'This is a test', + }, + ], + }; + [OPENAI_CHAT_URL, OPENAI_LEGACY_COMPLETION_URL].forEach((url: string) => { const sanitizedBodyString = getRequestWithStreamOption( url, @@ -125,9 +150,39 @@ describe('Open AI Utils', () => { true, DEFAULT_OPENAI_MODEL ); - expect(sanitizedBodyString).toEqual( - `{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"This is a test\"}],\"stream\":true}` + expect(JSON.parse(sanitizedBodyString)).toEqual({ + messages: [{ content: 'This is a test', role: 'user' }], + model: 'gpt-4', + stream: true, + stream_options: { + include_usage: true, + }, + }); + }); + }); + it('does not set stream_options when stream is false', () => { + const body = { + model: 'gpt-4', + messages: [ + { + role: 'user', + content: 'This is a test', + }, + ], + }; + + [OPENAI_CHAT_URL, OPENAI_LEGACY_COMPLETION_URL].forEach((url: string) => { + const sanitizedBodyString = getRequestWithStreamOption( + url, + JSON.stringify(body), + false, + DEFAULT_OPENAI_MODEL ); + expect(JSON.parse(sanitizedBodyString)).toEqual({ + messages: [{ content: 'This is a test', role: 'user' }], + model: 'gpt-4', + stream: false, + }); }); }); @@ -182,6 +237,7 @@ describe('Open AI Utils', () => { expect(sanitizedBodyString).toEqual(bodyString); }); }); + describe('removeEndpointFromUrl', () => { test('removes "/chat/completions" from the end of the URL', () => { const originalUrl = 'https://api.openai.com/v1/chat/completions'; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts index 7dac5f4692bda..89a29105cd0ca 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts @@ -38,6 +38,11 @@ export const getRequestWithStreamOption = ( if (jsonBody) { if (APIS_ALLOWING_STREAMING.has(url)) { jsonBody.stream = stream; + if (stream) { + jsonBody.stream_options = { + include_usage: true, + }; + } } jsonBody.model = jsonBody.model || defaultModel; } diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts index 1362b7610e2cd..33d96451054f4 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts @@ -292,6 +292,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: true, + stream_options: { include_usage: true }, model: DEFAULT_OPENAI_MODEL, }), headers: { @@ -338,6 +339,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...body, stream: true, + stream_options: { include_usage: true }, }), headers: { Authorization: 'Bearer 123', @@ -397,6 +399,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: true, + stream_options: { include_usage: true }, model: DEFAULT_OPENAI_MODEL, }), headers: { @@ -422,6 +425,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: true, + stream_options: { include_usage: true }, model: DEFAULT_OPENAI_MODEL, }), headers: { @@ -448,6 +452,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: true, + stream_options: { include_usage: true }, model: DEFAULT_OPENAI_MODEL, }), headers: { @@ -1274,7 +1279,11 @@ describe('OpenAIConnector', () => { url: 'https://My-test-resource-123.openai.azure.com/openai/deployments/NEW-DEPLOYMENT-321/chat/completions?api-version=2023-05-15', method: 'post', responseSchema: StreamingResponseSchema, - data: JSON.stringify({ ...sampleAzureAiBody, stream: true }), + data: JSON.stringify({ + ...sampleAzureAiBody, + stream: true, + stream_options: { include_usage: true }, + }), headers: { 'api-key': '123', 'content-type': 'application/json', @@ -1314,6 +1323,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...body, stream: true, + stream_options: { include_usage: true }, }), headers: { 'api-key': '123', diff --git a/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_existing_case.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_existing_case.test.tsx index 7cf41aac902a6..d498565dd3908 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_existing_case.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_existing_case.test.tsx @@ -26,7 +26,7 @@ describe('AddToExistingCase', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: true, + createComment: true, update: true, }), }, @@ -51,7 +51,7 @@ describe('AddToExistingCase', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: true, + createComment: true, update: true, }), }, @@ -85,7 +85,7 @@ describe('AddToExistingCase', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: false, + createComment: false, update: false, }), }, diff --git a/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_new_case.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_new_case.test.tsx index 3baedf85b5b7e..a92a08d10c571 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_new_case.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/cases/components/add_to_new_case.test.tsx @@ -26,7 +26,7 @@ describe('AddToNewCase', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: true, + createComment: true, update: true, }), }, @@ -51,7 +51,7 @@ describe('AddToNewCase', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: true, + createComment: true, update: true, }), }, @@ -86,7 +86,7 @@ describe('AddToNewCase', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: false, + createComment: false, update: false, }), }, diff --git a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx index a43efebe98391..8e2f5d3d96a25 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx @@ -36,7 +36,7 @@ describe('useCasePermission', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: true, + createComment: true, update: true, }), }, @@ -60,7 +60,7 @@ describe('useCasePermission', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: false, + createComment: false, update: true, }), }, @@ -84,7 +84,7 @@ describe('useCasePermission', () => { helpers: { ...casesServiceMock.helpers, canUseCases: () => ({ - create: true, + createComment: true, update: true, }), }, diff --git a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.ts b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.ts index f1a1079c23af1..89e35b8074811 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.ts @@ -24,7 +24,7 @@ export const useCaseDisabled = (indicatorName: string): boolean => { // disable the item if there is no indicator name or if the user doesn't have the right permission // in the case's attachment, the indicator name is the link to open the flyout const invalidIndicatorName: boolean = indicatorName === EMPTY_VALUE; - const hasPermission: boolean = permissions.create && permissions.update; + const hasPermission: boolean = permissions.createComment && permissions.update; return invalidIndicatorName || !hasPermission; }; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 2999f54118276..41a07f263a6b7 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -3145,6 +3145,8 @@ "esqlEditor.query.EnableWordWrapLabel": "Ajouter des sauts de ligne aux barres verticales", "esqlEditor.query.errorCount": "{count} {count, plural, one {erreur} other {erreurs}}", "esqlEditor.query.errorsTitle": "Erreurs", + "esqlEditor.query.esqlQueriesCopy": "Copier la requête dans le presse-papier", + "esqlEditor.query.esqlQueriesListRun": "Exécuter la requête", "esqlEditor.query.expandLabel": "Développer", "esqlEditor.query.feedback": "Commentaires", "esqlEditor.query.hideQueriesLabel": "Masquer les recherches récentes", @@ -3154,8 +3156,6 @@ "esqlEditor.query.lineNumber": "Ligne {lineNumber}", "esqlEditor.query.querieshistory.error": "La requête a échouée", "esqlEditor.query.querieshistory.success": "La requête a été exécuté avec succès", - "esqlEditor.query.esqlQueriesCopy": "Copier la requête dans le presse-papier", - "esqlEditor.query.esqlQueriesListRun": "Exécuter la requête", "esqlEditor.query.querieshistoryTable": "Tableau d'historique des recherches", "esqlEditor.query.recentQueriesColumnLabel": "Recherches récentes", "esqlEditor.query.refreshLabel": "Actualiser", @@ -11021,12 +11021,6 @@ "xpack.apm.dependencyOperationDistributionChart.allSpansLegendLabel": "Tous les intervalles", "xpack.apm.dependencyOperationDistributionChart.failedSpansLegendLabel": "Intervalles ayant échoué", "xpack.apm.dependencyThroughputChart.chartTitle": "Rendement", - "xpack.apm.deprecations.legacyModeTitle": "Le serveur APM fonctionne en mode hérité", - "xpack.apm.deprecations.message": "L'exécution directe du binaire du serveur APM est considérée comme une option héritée et sera déclassée et retirée à l'avenir.", - "xpack.apm.deprecations.steps.apm": "Naviguer vers Observabilité/APM", - "xpack.apm.deprecations.steps.schema": "Sélectionner l'onglet \"Schema\"", - "xpack.apm.deprecations.steps.settings": "Cliquer sur \"Settings\"", - "xpack.apm.deprecations.steps.switch": "Cliquez sur \"Passer à Elastic Agent\". Vous serez guidé tout au long du processus", "xpack.apm.diagnostics.loading": "Chargement des diagnostics", "xpack.apm.diagnostics.tab.apmEvents": "Documents", "xpack.apm.diagnostics.tab.datastreams": "Flux de données", @@ -12507,7 +12501,6 @@ "xpack.banners.settings.textContent.title": "Texte de la bannière", "xpack.canvas.addCanvasElementTrigger.description": "Une nouvelle action apparaît dans le menu du panneau d'ajout Canvas", "xpack.canvas.addCanvasElementTrigger.title": "Menu Ajouter un panneau", - "xpack.canvas.appDescription": "Vos données méritent une présentation irréprochable.", "xpack.canvas.argAddPopover.addAriaLabel": "Ajouter un argument", "xpack.canvas.argFormAdvancedFailure.applyButtonLabel": "Appliquer", "xpack.canvas.argFormAdvancedFailure.resetButtonLabel": "Réinitialiser", @@ -12696,7 +12689,6 @@ "xpack.canvas.expressionTypes.argTypes.seriesStyle.styleLabel": "Style", "xpack.canvas.expressionTypes.argTypes.seriesStyleLabel": "Définir le style d'une série nommée sélectionnée", "xpack.canvas.expressionTypes.argTypes.seriesStyleTitle": "Style de la série", - "xpack.canvas.featureCatalogue.canvasSubtitle": "Concevez des présentations irréprochables.", "xpack.canvas.features.reporting.pdf": "Générer des rapports PDF", "xpack.canvas.features.reporting.pdfFeatureName": "Reporting", "xpack.canvas.formatMsg.toaster.errorStatusMessage": "Erreur {errStatus} {errStatusText} : {errMessage}.", @@ -18922,7 +18914,6 @@ "xpack.enterpriseSearch.searchNav.otherTools": "Autres outils", "xpack.enterpriseSearch.searchNav.relevance": "Pertinence", "xpack.enterpriseSearch.searchProvider.aiSearch.name": "Intelligence artificielle de recherche", - "xpack.enterpriseSearch.searchProvider.type.name": "Recherche", "xpack.enterpriseSearch.searchProvider.webCrawler.name": "Robot d'indexation d'Elastic", "xpack.enterpriseSearch.selectConnector.badgeOnClick.ariaLabel": "Cliquer pour ouvrir la fenêtre contextuelle d'explication du connecteur", "xpack.enterpriseSearch.selectConnector.connectorClientBadgeLabel": "Autogéré", @@ -22923,7 +22914,6 @@ "xpack.idxMgmt.mappingsEditor.configuration.numericFieldLabel": "Mapper les chaînes numériques en tant que nombres", "xpack.idxMgmt.mappingsEditor.configuration.routingLabel": "Demander une valeur _routing pour les opérations CRUD", "xpack.idxMgmt.mappingsEditor.configuration.sizeLabel": "Indexer la taille du champ _source en octets", - "xpack.idxMgmt.mappingsEditor.configuration.sourceFieldLabel": "Activer le champ _source", "xpack.idxMgmt.mappingsEditor.configuration.sourceFieldPathComboBoxHelpText": "Accepte un chemin d'accès au champ, y compris les caractères génériques.", "xpack.idxMgmt.mappingsEditor.configuration.subobjectsLabel": "Autoriser les objets à contenir d'autres sous-objets", "xpack.idxMgmt.mappingsEditor.configuration.throwErrorsForUnmappedFieldsLabel": "Lever une exception lorsqu'un document contient un champ non mappé", @@ -23066,7 +23056,6 @@ "xpack.idxMgmt.mappingsEditor.dimsFieldLabel": "Dimensions", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription1": "La désactivation de {source} réduit la surcharge de stockage dans l'index, mais cela a un coût. Cette action désactive également des fonctionnalités essentielles, comme la capacité à réindexer ou à déboguer les requêtes en affichant le document d'origine.", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription1.sourceText": "_source", - "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2": "Découvrez-en plus sur les alternatives à la désactivation du champ {source}.", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2.sourceText": "_source", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutTitle": "Faites preuve de prudence lorsque vous désactivez le champ _source", "xpack.idxMgmt.mappingsEditor.documentFields.searchFieldsAriaLabel": "Rechercher dans les champs mappés", @@ -36557,7 +36546,6 @@ "xpack.security.management.editRole.featureTable.cannotCustomizeSubFeaturesTooltip": "La personnalisation des privilèges de sous-fonctionnalité est une fonctionnalité soumise à abonnement.", "xpack.security.management.editRole.featureTable.customizeSubFeaturePrivilegesSwitchLabel": "Personnaliser les privilèges des sous-fonctionnalités", "xpack.security.management.editRole.featureTable.featureAccordionSwitchLabel": "{grantedCount}/{featureCount} {featureCount, plural, one {fonctionnalité accordée} other {fonctionnalités accordées}}", - "xpack.security.management.editRole.featureTable.featureVisibilityTitle": "Personnaliser les privilèges des fonctionnalités", "xpack.security.management.editRole.featureTable.managementCategoryHelpText": "Des autorisations de gestion de suite supplémentaires sont disponibles en dehors de ce menu, dans les privilèges d'index et de cluster.", "xpack.security.management.editRole.featureTable.privilegeCustomizationTooltip": "La fonctionnalité possède des privilèges de sous-fonctionnalités personnalisés. Développez cette ligne pour en savoir plus.", "xpack.security.management.editRole.indexPrivilegeForm.clustersFormRowLabel": "Clusters distants", @@ -36617,18 +36605,10 @@ "xpack.security.management.editRole.spaceAwarePrivilegeForm.kibanaAdminTitle": "kibana_admin", "xpack.security.management.editRole.spacePrivilegeForm.basePrivilegeControlLegend": "Privilèges pour toutes les fonctionnalités", "xpack.security.management.editRole.spacePrivilegeForm.cancelButton": "Annuler", - "xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivilegeDescription": "Augmentez les niveaux de privilèges sur la base de chaque fonctionnalité. Certaines fonctionnalités peuvent être masquées par l'espace ou concernées par un privilège d'espace global.", - "xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivileges": "Personnaliser par fonctionnalité", - "xpack.security.management.editRole.spacePrivilegeForm.featurePrivilegeSummaryDescription": "Certaines fonctionnalités peuvent être masquées par l'espace ou concernées par un privilège d'espace global.", - "xpack.security.management.editRole.spacePrivilegeForm.globalPrivilegeNotice": "Ces privilèges s'appliqueront à tous les espaces, actuels et futurs.", - "xpack.security.management.editRole.spacePrivilegeForm.globalPrivilegeWarning": "La création d'un privilège global peut impacter vos autres privilèges liés aux espaces.", - "xpack.security.management.editRole.spacePrivilegeForm.modalHeadline": "Ce rôle aura accès aux espaces suivants", - "xpack.security.management.editRole.spacePrivilegeForm.modalTitle": "Affecter un rôle à l'espace", "xpack.security.management.editRole.spacePrivilegeForm.privilegeSelectorFormHelpText": "Affectez le niveau de privilège que vous souhaitez accorder à toutes les fonctionnalités présentes et futures de cet espace.", "xpack.security.management.editRole.spacePrivilegeForm.privilegeSelectorFormLabel": "Privilèges pour toutes les fonctionnalités", "xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormHelpText": "Sélectionnez un ou plusieurs espaces Kibana auxquels vous souhaitez affecter des privilèges.", "xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormLabel": "Espaces", - "xpack.security.management.editRole.spacePrivilegeForm.summaryOfFeaturePrivileges": "Résumé des privilèges des fonctionnalités", "xpack.security.management.editRole.spacePrivilegeForm.supersededWarning": "Les privilèges déclarés sont moins flexibles que les privilèges globaux configurés. Affichez le résumé des privilèges pour voir les privilèges effectifs.", "xpack.security.management.editRole.spacePrivilegeForm.supersededWarningTitle": "Remplacé par les privilèges globaux", "xpack.security.management.editRole.spacePrivilegeMatrix.globalSpaceName": "Tous les espaces", @@ -36761,9 +36741,7 @@ "xpack.security.management.editRoles.indexPrivilegeForm.grantedFieldsFormRowHelpText": "Si aucun champ n'est accordé, les utilisateurs affectés à ce rôle ne pourront voir aucune donnée pour cet index.", "xpack.security.management.editRoles.indexPrivilegeForm.grantedFieldsFormRowLabel": "Champs accordés", "xpack.security.management.editRoles.indexPrivilegeForm.grantFieldPrivilegesLabel": "Accorder l'accès aux champs spécifiques", - "xpack.security.management.editRolespacePrivilegeForm.createGlobalPrivilegeButton": "Créer un privilège global", "xpack.security.management.editRolespacePrivilegeForm.createPrivilegeButton": "Ajouter un privilège Kibana", - "xpack.security.management.editRolespacePrivilegeForm.updateGlobalPrivilegeButton": "Mettre à jour le privilège global", "xpack.security.management.editRolespacePrivilegeForm.updatePrivilegeButton": "Mettre à jour le privilège d'espace", "xpack.security.management.enabledBadge": "Activé", "xpack.security.management.readonlyBadge.text": "Lecture seule", @@ -44877,7 +44855,6 @@ "xpack.spaces.management.spaceDetails.footerActions.updateSpace": "Appliquer les modifications", "xpack.spaces.management.spaceDetails.keepEditingButton": "Enregistrer avant de quitter", "xpack.spaces.management.spaceDetails.leavePageButton": "Quitter", - "xpack.spaces.management.spaceDetails.privilegeForm.heading": "Définissez les privilèges qu'un rôle donné devrait avoir dans cet espace.", "xpack.spaces.management.spaceDetails.roles.assign": "Attribuer de nouveaux rôles", "xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.description": "La mise à jour en groupe des paramètres ici remplacera les paramètres individuels actuels.", "xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.title": "Les privilèges s'appliqueront uniquement à cet espace.", @@ -44928,7 +44905,6 @@ "xpack.spaces.management.spaceIdentifier.kibanaURLForSpaceIdentifierDescription": "Vous ne pouvez pas modifier l'identifiant d'URL après sa création.", "xpack.spaces.management.spaceIdentifier.urlIdentifierTitle": "Identifiant d'URL", "xpack.spaces.management.spacesGridPage.actionsColumnName": "Actions", - "xpack.spaces.management.spacesGridPage.allFeaturesEnabled": "Toutes les fonctionnalités", "xpack.spaces.management.spacesGridPage.createSpaceButtonLabel": "Créer l'espace", "xpack.spaces.management.spacesGridPage.currentSpaceMarkerText": "actuel", "xpack.spaces.management.spacesGridPage.deleteActionDescription": "Supprimer {spaceName}", @@ -44938,13 +44914,10 @@ "xpack.spaces.management.spacesGridPage.editSpaceActionDescription": "Modifier {spaceName}.", "xpack.spaces.management.spacesGridPage.editSpaceActionName": "Modifier", "xpack.spaces.management.spacesGridPage.errorTitle": "Erreur lors du chargement des espaces", - "xpack.spaces.management.spacesGridPage.featuresColumnName": "Fonctionnalités visibles", "xpack.spaces.management.spacesGridPage.identifierColumnName": "Identificateur", "xpack.spaces.management.spacesGridPage.loadingTitle": "chargement…", - "xpack.spaces.management.spacesGridPage.noFeaturesEnabled": "Aucune fonctionnalité visible", "xpack.spaces.management.spacesGridPage.searchPlaceholder": "Recherche", "xpack.spaces.management.spacesGridPage.solutionColumnName": "Afficher la solution", - "xpack.spaces.management.spacesGridPage.someFeaturesEnabled": "{enabledFeatureCount}/{totalFeatureCount}", "xpack.spaces.management.spacesGridPage.spaceColumnName": "Espace", "xpack.spaces.management.spacesGridPage.spacesTitle": "Espaces", "xpack.spaces.management.spacesGridPage.switchSpaceActionDescription": "Basculer vers {spaceName}", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f28dd829965ff..bc63ac1b5a621 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -3139,6 +3139,8 @@ "esqlEditor.query.EnableWordWrapLabel": "パイプの改行を追加", "esqlEditor.query.errorCount": "{count} {count, plural, other {# 件のエラー}}", "esqlEditor.query.errorsTitle": "エラー", + "esqlEditor.query.esqlQueriesCopy": "クエリをクリップボードにコピー", + "esqlEditor.query.esqlQueriesListRun": "クエリーを実行", "esqlEditor.query.expandLabel": "拡張", "esqlEditor.query.feedback": "フィードバック", "esqlEditor.query.hideQueriesLabel": "最近のクエリーを非表示", @@ -3148,8 +3150,6 @@ "esqlEditor.query.lineNumber": "行{lineNumber}", "esqlEditor.query.querieshistory.error": "クエリ失敗", "esqlEditor.query.querieshistory.success": "クエリは正常に実行されました", - "esqlEditor.query.esqlQueriesCopy": "クエリをクリップボードにコピー", - "esqlEditor.query.esqlQueriesListRun": "クエリーを実行", "esqlEditor.query.querieshistoryTable": "クエリ履歴テーブル", "esqlEditor.query.recentQueriesColumnLabel": "最近のクエリー", "esqlEditor.query.refreshLabel": "更新", @@ -11005,12 +11005,6 @@ "xpack.apm.dependencyOperationDistributionChart.allSpansLegendLabel": "すべてのスパン", "xpack.apm.dependencyOperationDistributionChart.failedSpansLegendLabel": "失敗したスパン", "xpack.apm.dependencyThroughputChart.chartTitle": "スループット", - "xpack.apm.deprecations.legacyModeTitle": "APMサーバーはレガシーモードで実行されています", - "xpack.apm.deprecations.message": "APMサーバーバイナリの直接実行はレガシーオプションと見なされるため、廃止予定であり、将来は削除されます。", - "xpack.apm.deprecations.steps.apm": "Observability/APMに移動", - "xpack.apm.deprecations.steps.schema": "[スキーマ]タブを選択します", - "xpack.apm.deprecations.steps.settings": "[設定]をクリックします", - "xpack.apm.deprecations.steps.switch": "[Elasticエージェントに切り替える]をクリックします。手順が案内されます。", "xpack.apm.diagnostics.loading": "診断を読み込んでいます", "xpack.apm.diagnostics.tab.apmEvents": "ドキュメント", "xpack.apm.diagnostics.tab.datastreams": "データストリーム", @@ -12491,7 +12485,6 @@ "xpack.banners.settings.textContent.title": "バナーテキスト", "xpack.canvas.addCanvasElementTrigger.description": "新しいアクションは、キャンバスのパネルの追加メニューに表示されます", "xpack.canvas.addCanvasElementTrigger.title": "パネルの追加メニュー", - "xpack.canvas.appDescription": "データを完璧に美しく表現します。", "xpack.canvas.argAddPopover.addAriaLabel": "引数を追加", "xpack.canvas.argFormAdvancedFailure.applyButtonLabel": "適用", "xpack.canvas.argFormAdvancedFailure.resetButtonLabel": "リセット", @@ -12680,7 +12673,6 @@ "xpack.canvas.expressionTypes.argTypes.seriesStyle.styleLabel": "スタイル", "xpack.canvas.expressionTypes.argTypes.seriesStyleLabel": "選択された名前付きの数列のスタイルを設定", "xpack.canvas.expressionTypes.argTypes.seriesStyleTitle": "数列スタイル", - "xpack.canvas.featureCatalogue.canvasSubtitle": "詳細まで正確な表示を設計します。", "xpack.canvas.features.reporting.pdf": "PDFレポートを生成", "xpack.canvas.features.reporting.pdfFeatureName": "レポート", "xpack.canvas.formatMsg.toaster.errorStatusMessage": "エラー {errStatus} {errStatusText}: {errMessage}", @@ -18892,7 +18884,6 @@ "xpack.enterpriseSearch.searchNav.mngt": "スタック管理", "xpack.enterpriseSearch.searchNav.otherTools": "その他のツール", "xpack.enterpriseSearch.searchProvider.aiSearch.name": "検索AI", - "xpack.enterpriseSearch.searchProvider.type.name": "検索", "xpack.enterpriseSearch.searchProvider.webCrawler.name": "Elastic Webクローラー", "xpack.enterpriseSearch.selectConnector.badgeOnClick.ariaLabel": "クリックすると、コネクター説明ポップオーバーが開きます", "xpack.enterpriseSearch.selectConnector.connectorClientBadgeLabel": "セルフマネージド", @@ -22895,7 +22886,6 @@ "xpack.idxMgmt.mappingsEditor.configuration.numericFieldLabel": "数字の文字列の数値としてのマッピング", "xpack.idxMgmt.mappingsEditor.configuration.routingLabel": "CRUD操作のためのRequire _routing値", "xpack.idxMgmt.mappingsEditor.configuration.sizeLabel": "_sourceフィールドサイズ(バイト)にインデックスを作成", - "xpack.idxMgmt.mappingsEditor.configuration.sourceFieldLabel": "_sourceフィールドの有効化", "xpack.idxMgmt.mappingsEditor.configuration.sourceFieldPathComboBoxHelpText": "ワイルドカードを含め、フィールドへのパスを受け入れます。", "xpack.idxMgmt.mappingsEditor.configuration.subobjectsLabel": "オブジェクトがさらにサブオブジェクトを保持することを許可", "xpack.idxMgmt.mappingsEditor.configuration.throwErrorsForUnmappedFieldsLabel": "ドキュメントがマッピングされていないフィールドを含む場合に例外を選択する", @@ -23038,7 +23028,6 @@ "xpack.idxMgmt.mappingsEditor.dimsFieldLabel": "次元", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription1": "{source}を無効にすることで、インデックス内のストレージオーバーヘッドが削減されますが、これにはコストがかかります。これはまた、元のドキュメントを表示して、再インデックスやクエリーのデバッグといった重要な機能を無効にします。", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription1.sourceText": "_source", - "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2": "{source}フィールドを無効にするための代替方法の詳細", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2.sourceText": "_source", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutTitle": "_source fieldを無効にする際は慎重に行う", "xpack.idxMgmt.mappingsEditor.documentFields.searchFieldsAriaLabel": "マッピングされたフィールドの検索", @@ -36525,7 +36514,6 @@ "xpack.security.management.editRole.featureTable.cannotCustomizeSubFeaturesTooltip": "サブ機能権限のカスタマイズはサブスクリプション機能です。", "xpack.security.management.editRole.featureTable.customizeSubFeaturePrivilegesSwitchLabel": "サブ機能権限をカスタマイズする", "xpack.security.management.editRole.featureTable.featureAccordionSwitchLabel": "{grantedCount} / {featureCount} {featureCount, plural, other {機能}}が付与されました", - "xpack.security.management.editRole.featureTable.featureVisibilityTitle": "機能権限をカスタマイズ", "xpack.security.management.editRole.featureTable.managementCategoryHelpText": "追加のスタック管理権限は、このメニューの外にあるインデックス権限とクラスター権限をご覧ください。", "xpack.security.management.editRole.featureTable.privilegeCustomizationTooltip": "機能でサブ機能の権限がカスタマイズされています。この行を展開すると詳細が表示されます。", "xpack.security.management.editRole.indexPrivilegeForm.clustersFormRowLabel": "リモートクラスター", @@ -36585,18 +36573,10 @@ "xpack.security.management.editRole.spaceAwarePrivilegeForm.kibanaAdminTitle": "kibana_admin", "xpack.security.management.editRole.spacePrivilegeForm.basePrivilegeControlLegend": "すべての機能の権限", "xpack.security.management.editRole.spacePrivilegeForm.cancelButton": "キャンセル", - "xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivilegeDescription": "機能ごとに権限のレベルを上げます。機能によってはスペースごとに非表示になっているか、グローバルスペース権限による影響を受けているものもあります。", - "xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivileges": "機能ごとにカスタマイズ", - "xpack.security.management.editRole.spacePrivilegeForm.featurePrivilegeSummaryDescription": "機能によってはスペースごとに非表示になっているか、グローバルスペース権限による影響を受けているものもあります。", - "xpack.security.management.editRole.spacePrivilegeForm.globalPrivilegeNotice": "これらの権限はすべての現在および未来のスペースに適用されます。", - "xpack.security.management.editRole.spacePrivilegeForm.globalPrivilegeWarning": "グローバル権限の作成は他のスペース権限に影響を与える可能性があります。", - "xpack.security.management.editRole.spacePrivilegeForm.modalHeadline": "このロールには、次のスペースへのアクセス権が付与されます", - "xpack.security.management.editRole.spacePrivilegeForm.modalTitle": "ロールをスペースに割り当て", "xpack.security.management.editRole.spacePrivilegeForm.privilegeSelectorFormHelpText": "このスペース全体の現在と将来のすべての機能に対して、付与する権限レベルを割り当てます。", "xpack.security.management.editRole.spacePrivilegeForm.privilegeSelectorFormLabel": "すべての機能の権限", "xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormHelpText": "権限を割り当てる1つ以上のKibanaスペースを選択します。", "xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormLabel": "スペース", - "xpack.security.management.editRole.spacePrivilegeForm.summaryOfFeaturePrivileges": "機能権限のサマリー", "xpack.security.management.editRole.spacePrivilegeForm.supersededWarning": "宣言された権限は、構成済みグローバル権限よりも許容度が低くなります。権限サマリーを表示すると有効な権限がわかります。", "xpack.security.management.editRole.spacePrivilegeForm.supersededWarningTitle": "グローバル権限に置き換え", "xpack.security.management.editRole.spacePrivilegeMatrix.globalSpaceName": "すべてのスペース", @@ -36729,9 +36709,7 @@ "xpack.security.management.editRoles.indexPrivilegeForm.grantedFieldsFormRowHelpText": "フィールドが提供されていない場合、このロールのユーザーはこのインデックスのデータを表示できません。", "xpack.security.management.editRoles.indexPrivilegeForm.grantedFieldsFormRowLabel": "許可されたフィールド", "xpack.security.management.editRoles.indexPrivilegeForm.grantFieldPrivilegesLabel": "特定のフィールドへのアクセスを許可", - "xpack.security.management.editRolespacePrivilegeForm.createGlobalPrivilegeButton": "グローバル権限を作成", "xpack.security.management.editRolespacePrivilegeForm.createPrivilegeButton": "Kibanaの権限を追加", - "xpack.security.management.editRolespacePrivilegeForm.updateGlobalPrivilegeButton": "グローバル特権を更新", "xpack.security.management.editRolespacePrivilegeForm.updatePrivilegeButton": "スペース権限を更新", "xpack.security.management.enabledBadge": "有効", "xpack.security.management.readonlyBadge.text": "読み取り専用", @@ -44837,7 +44815,6 @@ "xpack.spaces.management.spaceDetails.footerActions.updateSpace": "変更を適用", "xpack.spaces.management.spaceDetails.keepEditingButton": "移動する前に保存", "xpack.spaces.management.spaceDetails.leavePageButton": "移動", - "xpack.spaces.management.spaceDetails.privilegeForm.heading": "このスペースで特定のロールに割り当てる権限を定義します。", "xpack.spaces.management.spaceDetails.roles.assign": "新しいロールを割り当て", "xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.description": "ここで設定を一括更新すると、現在の個別の設定が上書きされます。", "xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.title": "権限はこのスペースにのみ適用されます。", @@ -44888,7 +44865,6 @@ "xpack.spaces.management.spaceIdentifier.kibanaURLForSpaceIdentifierDescription": "作成した後はURL識別子を変更できません。", "xpack.spaces.management.spaceIdentifier.urlIdentifierTitle": "URL 識別子", "xpack.spaces.management.spacesGridPage.actionsColumnName": "アクション", - "xpack.spaces.management.spacesGridPage.allFeaturesEnabled": "すべての機能", "xpack.spaces.management.spacesGridPage.createSpaceButtonLabel": "スペースを作成", "xpack.spaces.management.spacesGridPage.currentSpaceMarkerText": "現在", "xpack.spaces.management.spacesGridPage.deleteActionDescription": "{spaceName}を削除", @@ -44898,13 +44874,10 @@ "xpack.spaces.management.spacesGridPage.editSpaceActionDescription": "{spaceName} を編集。", "xpack.spaces.management.spacesGridPage.editSpaceActionName": "編集", "xpack.spaces.management.spacesGridPage.errorTitle": "スペースの読み込みエラー", - "xpack.spaces.management.spacesGridPage.featuresColumnName": "表示される機能", "xpack.spaces.management.spacesGridPage.identifierColumnName": "識別子", "xpack.spaces.management.spacesGridPage.loadingTitle": "読み込み中…", - "xpack.spaces.management.spacesGridPage.noFeaturesEnabled": "表示されている機能がありません", "xpack.spaces.management.spacesGridPage.searchPlaceholder": "検索", "xpack.spaces.management.spacesGridPage.solutionColumnName": "ソリューションビュー", - "xpack.spaces.management.spacesGridPage.someFeaturesEnabled": "{enabledFeatureCount} / {totalFeatureCount}", "xpack.spaces.management.spacesGridPage.spaceColumnName": "スペース", "xpack.spaces.management.spacesGridPage.spacesTitle": "スペース", "xpack.spaces.management.spacesGridPage.switchSpaceActionDescription": "{spaceName}に切り替える", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 60f3108b1a088..b3b821da2de89 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -3095,6 +3095,8 @@ "esqlEditor.query.EnableWordWrapLabel": "在管道符上添加换行符", "esqlEditor.query.errorCount": "{count} 个{count, plural, other {错误}}", "esqlEditor.query.errorsTitle": "错误", + "esqlEditor.query.esqlQueriesCopy": "复制查询到剪贴板", + "esqlEditor.query.esqlQueriesListRun": "运行查询", "esqlEditor.query.expandLabel": "展开", "esqlEditor.query.feedback": "反馈", "esqlEditor.query.hideQueriesLabel": "隐藏最近查询", @@ -3104,8 +3106,6 @@ "esqlEditor.query.lineNumber": "第 {lineNumber} 行", "esqlEditor.query.querieshistory.error": "查询失败", "esqlEditor.query.querieshistory.success": "已成功运行查询", - "esqlEditor.query.esqlQueriesCopy": "复制查询到剪贴板", - "esqlEditor.query.esqlQueriesListRun": "运行查询", "esqlEditor.query.querieshistoryTable": "查询历史记录表", "esqlEditor.query.recentQueriesColumnLabel": "最近查询", "esqlEditor.query.refreshLabel": "刷新", @@ -10786,12 +10786,6 @@ "xpack.apm.dependencyOperationDistributionChart.allSpansLegendLabel": "所有跨度", "xpack.apm.dependencyOperationDistributionChart.failedSpansLegendLabel": "失败的跨度", "xpack.apm.dependencyThroughputChart.chartTitle": "吞吐量", - "xpack.apm.deprecations.legacyModeTitle": "APM Server 正以旧版模式运行", - "xpack.apm.deprecations.message": "直接运行 APM Server 二进制被视为是旧版选项,将被弃用并会在未来删除。", - "xpack.apm.deprecations.steps.apm": "导航到 Observability/APM", - "xpack.apm.deprecations.steps.schema": "选择'架构'选项卡", - "xpack.apm.deprecations.steps.settings": "单击'设置'", - "xpack.apm.deprecations.steps.switch": "单击'切换到 Elastic 代理'。将指导您完成此过程", "xpack.apm.diagnostics.loading": "正在加载诊断", "xpack.apm.diagnostics.tab.apmEvents": "文档", "xpack.apm.diagnostics.tab.datastreams": "数据流", @@ -12256,7 +12250,6 @@ "xpack.banners.settings.textContent.title": "横幅广告文本", "xpack.canvas.addCanvasElementTrigger.description": "一项新操作将在 Canvas 添加面板菜单中显示出来", "xpack.canvas.addCanvasElementTrigger.title": "添加面板菜单", - "xpack.canvas.appDescription": "以最佳像素展示您的数据。", "xpack.canvas.argAddPopover.addAriaLabel": "添加参数", "xpack.canvas.argFormAdvancedFailure.applyButtonLabel": "应用", "xpack.canvas.argFormAdvancedFailure.resetButtonLabel": "重置", @@ -12441,7 +12434,6 @@ "xpack.canvas.expressionTypes.argTypes.seriesStyle.styleLabel": "样式", "xpack.canvas.expressionTypes.argTypes.seriesStyleLabel": "设置选定已命名序列的样式", "xpack.canvas.expressionTypes.argTypes.seriesStyleTitle": "序列样式", - "xpack.canvas.featureCatalogue.canvasSubtitle": "设计像素级完美的演示文稿。", "xpack.canvas.features.reporting.pdf": "生成 PDF 报告", "xpack.canvas.features.reporting.pdfFeatureName": "Reporting", "xpack.canvas.formatMsg.toaster.errorStatusMessage": "错误 {errStatus} {errStatusText}:{errMessage}", @@ -18558,7 +18550,6 @@ "xpack.enterpriseSearch.searchNav.otherTools": "其他工具", "xpack.enterpriseSearch.searchNav.relevance": "相关性", "xpack.enterpriseSearch.searchProvider.aiSearch.name": "搜索 AI", - "xpack.enterpriseSearch.searchProvider.type.name": "搜索", "xpack.enterpriseSearch.searchProvider.webCrawler.name": "Elastic 网络爬虫", "xpack.enterpriseSearch.selectConnector.badgeOnClick.ariaLabel": "单击以打开连接器说明弹出框", "xpack.enterpriseSearch.selectConnector.connectorClientBadgeLabel": "自管型", @@ -22503,7 +22494,6 @@ "xpack.idxMgmt.mappingsEditor.configuration.numericFieldLabel": "将数值字符串映射为数字", "xpack.idxMgmt.mappingsEditor.configuration.routingLabel": "CRUD 操作需要 _routing 值", "xpack.idxMgmt.mappingsEditor.configuration.sizeLabel": "索引 _source 字段大小(字节)", - "xpack.idxMgmt.mappingsEditor.configuration.sourceFieldLabel": "启用 _source 字段", "xpack.idxMgmt.mappingsEditor.configuration.sourceFieldPathComboBoxHelpText": "接受字段的路径,包括通配符。", "xpack.idxMgmt.mappingsEditor.configuration.subobjectsLabel": "允许对象存放更多子对象", "xpack.idxMgmt.mappingsEditor.configuration.throwErrorsForUnmappedFieldsLabel": "文档包含未映射字段时引发异常", @@ -22644,7 +22634,6 @@ "xpack.idxMgmt.mappingsEditor.dimsFieldLabel": "维度数", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription1": "禁用 {source} 可降低索引内的存储开销,这有一定的代价。其还禁用重要的功能,如通过查看原始文档来重新索引或调试查询的功能。", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription1.sourceText": "_source", - "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2": "详细了解禁用 {source} 字段的备选方式。", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutDescription2.sourceText": "_source", "xpack.idxMgmt.mappingsEditor.disabledSourceFieldCallOutTitle": "禁用 _source 字段时要十分谨慎", "xpack.idxMgmt.mappingsEditor.documentFields.searchFieldsAriaLabel": "搜索映射的字段", @@ -35951,7 +35940,6 @@ "xpack.security.management.editRole.featureTable.cannotCustomizeSubFeaturesTooltip": "定制子功能权限为订阅功能。", "xpack.security.management.editRole.featureTable.customizeSubFeaturePrivilegesSwitchLabel": "定制子功能权限", "xpack.security.management.editRole.featureTable.featureAccordionSwitchLabel": "{grantedCount} / {featureCount} 项{featureCount, plural, other {功能}}已授予", - "xpack.security.management.editRole.featureTable.featureVisibilityTitle": "定制功能权限", "xpack.security.management.editRole.featureTable.managementCategoryHelpText": "可以在此菜单以外、在索引和集群权限中找到其他堆栈管理权限。", "xpack.security.management.editRole.featureTable.privilegeCustomizationTooltip": "功能已定制子功能权限。展开此行以了解更多信息。", "xpack.security.management.editRole.indexPrivilegeForm.clustersFormRowLabel": "远程集群", @@ -36011,18 +35999,10 @@ "xpack.security.management.editRole.spaceAwarePrivilegeForm.kibanaAdminTitle": "kibana_admin", "xpack.security.management.editRole.spacePrivilegeForm.basePrivilegeControlLegend": "所有功能的权限", "xpack.security.management.editRole.spacePrivilegeForm.cancelButton": "取消", - "xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivilegeDescription": "按功能提高权限级别。某些功能可能被工作区隐藏或受全局工作区权限影响。", - "xpack.security.management.editRole.spacePrivilegeForm.customizeFeaturePrivileges": "按功能定制", - "xpack.security.management.editRole.spacePrivilegeForm.featurePrivilegeSummaryDescription": "某些功能可能被工作区隐藏或受全局工作区权限影响。", - "xpack.security.management.editRole.spacePrivilegeForm.globalPrivilegeNotice": "这些权限将应用到所有当前和未来工作区。", - "xpack.security.management.editRole.spacePrivilegeForm.globalPrivilegeWarning": "创建全局权限可能会影响您的其他工作区权限。", - "xpack.security.management.editRole.spacePrivilegeForm.modalHeadline": "必须向此角色授权以下工作区的访问权限", - "xpack.security.management.editRole.spacePrivilegeForm.modalTitle": "将角色分配给工作区", "xpack.security.management.editRole.spacePrivilegeForm.privilegeSelectorFormHelpText": "分配您希望向此工作区的所有现有和未来功能授予的权限级别。", "xpack.security.management.editRole.spacePrivilegeForm.privilegeSelectorFormLabel": "所有功能的权限", "xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormHelpText": "选择一个或多个希望分配权限的 Kibana 工作区。", "xpack.security.management.editRole.spacePrivilegeForm.spaceSelectorFormLabel": "工作区", - "xpack.security.management.editRole.spacePrivilegeForm.summaryOfFeaturePrivileges": "功能权限的摘要", "xpack.security.management.editRole.spacePrivilegeForm.supersededWarning": "声明的权限相对配置的全局权限有较小的宽容度。查看权限摘要以查看有效的权限。", "xpack.security.management.editRole.spacePrivilegeForm.supersededWarningTitle": "已由全局权限取代", "xpack.security.management.editRole.spacePrivilegeMatrix.globalSpaceName": "所有工作区", @@ -36154,9 +36134,7 @@ "xpack.security.management.editRoles.indexPrivilegeForm.grantedFieldsFormRowHelpText": "如果未授权任何字段,则分配到此角色的用户将无法查看此索引的任何数据。", "xpack.security.management.editRoles.indexPrivilegeForm.grantedFieldsFormRowLabel": "已授权字段", "xpack.security.management.editRoles.indexPrivilegeForm.grantFieldPrivilegesLabel": "授予对特定字段的访问权限", - "xpack.security.management.editRolespacePrivilegeForm.createGlobalPrivilegeButton": "创建全局权限", "xpack.security.management.editRolespacePrivilegeForm.createPrivilegeButton": "添加 Kibana 权限", - "xpack.security.management.editRolespacePrivilegeForm.updateGlobalPrivilegeButton": "更新全局权限", "xpack.security.management.editRolespacePrivilegeForm.updatePrivilegeButton": "更新工作区权限", "xpack.security.management.enabledBadge": "已启用", "xpack.security.management.readonlyBadge.text": "只读", @@ -44153,7 +44131,6 @@ "xpack.spaces.management.spaceDetails.footerActions.updateSpace": "应用更改", "xpack.spaces.management.spaceDetails.keepEditingButton": "保存然后离开", "xpack.spaces.management.spaceDetails.leavePageButton": "离开", - "xpack.spaces.management.spaceDetails.privilegeForm.heading": "定义给定角色在此工作区中应具有的权限。", "xpack.spaces.management.spaceDetails.roles.assign": "分配新角色", "xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.description": "在此批量更新设置会覆盖当前的单个设置。", "xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.title": "权限将仅适用于此工作区。", @@ -44200,7 +44177,6 @@ "xpack.spaces.management.spaceIdentifier.kibanaURLForSpaceIdentifierDescription": "创建后,将无法更改 URL 标识符。", "xpack.spaces.management.spaceIdentifier.urlIdentifierTitle": "URL 标识符", "xpack.spaces.management.spacesGridPage.actionsColumnName": "操作", - "xpack.spaces.management.spacesGridPage.allFeaturesEnabled": "所有功能", "xpack.spaces.management.spacesGridPage.createSpaceButtonLabel": "创建工作区", "xpack.spaces.management.spacesGridPage.currentSpaceMarkerText": "当前", "xpack.spaces.management.spacesGridPage.deleteActionDescription": "删除 {spaceName}", @@ -44210,13 +44186,10 @@ "xpack.spaces.management.spacesGridPage.editSpaceActionDescription": "编辑 {spaceName}。", "xpack.spaces.management.spacesGridPage.editSpaceActionName": "编辑", "xpack.spaces.management.spacesGridPage.errorTitle": "加载工作区时出错", - "xpack.spaces.management.spacesGridPage.featuresColumnName": "功能可见", "xpack.spaces.management.spacesGridPage.identifierColumnName": "标识符", "xpack.spaces.management.spacesGridPage.loadingTitle": "正在加载……", - "xpack.spaces.management.spacesGridPage.noFeaturesEnabled": "没有可见功能", "xpack.spaces.management.spacesGridPage.searchPlaceholder": "搜索", "xpack.spaces.management.spacesGridPage.solutionColumnName": "解决方案视图", - "xpack.spaces.management.spacesGridPage.someFeaturesEnabled": "{enabledFeatureCount}/{totalFeatureCount}", "xpack.spaces.management.spacesGridPage.spaceColumnName": "工作区", "xpack.spaces.management.spacesGridPage.spacesTitle": "工作区", "xpack.spaces.management.spacesGridPage.switchSpaceActionDescription": "切换到 {spaceName}", diff --git a/x-pack/plugins/upgrade_assistant/README.md b/x-pack/plugins/upgrade_assistant/README.md index 531d4c1702c04..145f49baf0323 100644 --- a/x-pack/plugins/upgrade_assistant/README.md +++ b/x-pack/plugins/upgrade_assistant/README.md @@ -28,7 +28,7 @@ These surface runtime deprecations, e.g. a Painless script that uses a deprecate request to a deprecated API. These are also generally surfaced as deprecation headers within the response. Even if the cluster state is good, app maintainers need to watch the logs in case deprecations are discovered as data is migrated. Starting in 7.x, deprecation logs can be written to a file or a data stream ([#58924](https://github.com/elastic/elasticsearch/pull/58924)). When the data stream exists, the Upgrade Assistant provides a way to analyze the logs through Observability or Discover ([#106521](https://github.com/elastic/kibana/pull/106521)). -* [**Kibana deprecations API.**](https://github.com/elastic/kibana/blob/main/src/core/server/deprecations/README.mdx) This is information about deprecated features and configs in Kibana. These deprecations are only communicated to the user if the deployment is using these features. Kibana engineers are responsible for adding deprecations to the deprecations API for their respective team. +* [**Kibana deprecations API.**](https://github.com/elastic/kibana/blob/main/src/core/server/deprecations/README.mdx) This is information about deprecated features and configs in Kibana. These deprecations are only communicated to the user if the deployment is using these features. Kibana engineers are responsible for adding deprecations to the deprecations API for their respective team. ### Fixing problems @@ -36,14 +36,20 @@ deprecations are discovered as data is migrated. Starting in 7.x, deprecation lo Elasticsearch deprecations can be handled in a number of ways: -* **Reindexing.** When a user's index contains deprecations (e.g. mappings) a reindex solves them. Currently, the Upgrade Assistant only automates reindexing for old indices. For example, if you are currently on 7.x, and want to migrate to 8.0, but you still have indices that were created on 6.x. For this scenario, the user will see a "Reindex" button that they can click, which will perform the reindex. - * Reindexing is an atomic process in Upgrade Assistant, so that ingestion is never disrupted. - It works like this: - * Create a new index with a "reindexed-" prefix ([#30114](https://github.com/elastic/kibana/pull/30114)). - * Create an index alias pointing from the original index name to the prefixed index name. - * Reindex from the original index into the prefixed index. - * Delete the old index and rename the prefixed index. -Currently reindexing deprecations are only enabled for major version upgrades by setting the config `featureSet.reindexCorrectiveActions` to `true` on the `x.last` version of the stack. +* **Reindexing.** When a user's index contains deprecations (e.g. mappings) a reindex solves them. The Upgrade Assistant only automates reindexing for indices. For example, if you are currently on 7.x, and want to migrate to 8.0, but you still have indices that were created on 6.x. For this scenario, the user will see a "Reindex" button that they can click, which will perform the reindex. + * Reindexing is an idempotent action in Upgrade Assistant. It works like this ([overview in code](https://github.com/elastic/kibana/blob/b320a37d8b703b2fa101a93b6971b36ee2c37f06/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#L498-L540)): + 1. Set a write-block on the original index, no new data can be written during reindexing. + 2. Create a target index with the following name `reindexed-v{majorVersion}-{originalIndex}`. E.g., if `my-index` is the original, the target will be named `reindexed-v8-my-index`. + 3. [Reindex](https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-reindex.html) from the original index to the target index. Kibana will continuously report reindexing status. + 4. Once reindexing is done, in one atomic operation via the aliases API: + 1. Create an alias from the original index to the target index. All existing aliases referencing the original index will be re-pointed to the target index. E.g., `my-index` will be an alias referencing `reindexed-v8-my-index`. + 2. Delete the original index. + 3. **NOTE:** writing/indexing will effectively be re-enabled at this point via the alias, unless the original was write-blocked by users. This and other index settings are inherited from the original. + 5. The Upgrade Assistant's reindex action is complete at this point. + 1. If the original index was closed before reindexing, the new target will also be closed at this point. + + Currently reindexing deprecations are only enabled for major version upgrades by setting the config `featureSet.reindexCorrectiveActions` to `true` on the `x.last` version of the stack. + Reindexing at the moment includes some logic that is specific to the [8.0 upgrade](https://github.com/elastic/kibana/blob/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/index_settings.ts). End users could get into a bad situation if this is enabled before this logic is fixed. * **Removing settings.** Some index and cluser settings are deprecated and need to be removed. The Upgrade Assistant provides a way to auto-resolve these settings via a "Remove deprecated settings" button. Migrating system indices should only be enabled for major version upgrades. This is controlled by the config `featureSet.migrateSystemIndices` which hides the second step from the UA UI for migrating system indices. * **Upgrading or deleting snapshots**. This is specific to Machine Learning. If a user has old Machine Learning job model snapshots, they will need to be upgraded or deleted. The Upgrade Assistant provides a way to resolve this automatically for the user ([#100066](https://github.com/elastic/kibana/pull/100066)). @@ -72,7 +78,7 @@ To test the Elasticsearch deprecations page ([#107053](https://github.com/elasti PUT my_index ``` - Next, point to the 6.x data directory when running from a 7.x cluster. + Next, point to the 6.x data directory when running from a 7.x cluster. ``` yarn es snapshot -E path.data=./path_to_6.x_indices @@ -101,7 +107,7 @@ To test the Elasticsearch deprecations page ([#107053](https://github.com/elasti **2. Upgrading or deleting ML job model snapshots** - Similar to the reindex action, the ML action requires setting up a cluster on the previous major version. It also requires the trial license to be enabled. Then, you will need to create a few ML jobs in order to trigger snapshots. + Similar to the reindex action, the ML action requires setting up a cluster on the previous major version. It also requires the trial license to be enabled. Then, you will need to create a few ML jobs in order to trigger snapshots. - Add the Kibana sample data. - Navigate to Machine Learning > Create new job. @@ -111,7 +117,7 @@ To test the Elasticsearch deprecations page ([#107053](https://github.com/elasti - Click "Create job" - View the job created and click the "Start datafeed" action associated with it. Select a subset of time and click "Start". You should now have two snapshots created. If you want to add more, repeat the steps above. - Next, point to the 6.x data directory when running from a 7.x cluster. + Next, point to the 6.x data directory when running from a 7.x cluster. ``` yarn es snapshot --license trial -E path.data=./path_to_6.x_ml_snapshots @@ -119,8 +125,8 @@ To test the Elasticsearch deprecations page ([#107053](https://github.com/elasti **3. Removing deprecated settings** - The Upgrade Assistant supports removing deprecated index and cluster settings. This is determined based on the `actions` array returned from the deprecation info API. It currently does not support removing affix settings. See https://github.com/elastic/elasticsearch/pull/84246 for more details. - + The Upgrade Assistant supports removing deprecated index and cluster settings. This is determined based on the `actions` array returned from the deprecation info API. It currently does not support removing affix settings. See https://github.com/elastic/elasticsearch/pull/84246 for more details. + Run the following Console commands to trigger deprecation issues for cluster and index settings: ``` @@ -233,7 +239,7 @@ PUT /_cluster/settings ``` PUT _template/field_names_enabled { - "index_patterns": ["foo"], + "index_patterns": ["foo"], "mappings": { "_field_names": { "enabled": false @@ -331,7 +337,7 @@ This is a non-exhaustive list of different error scenarios in Upgrade Assistant. - **Error updating deprecation logging status.** Mock a `404` status code to `PUT /api/upgrade_assistant/deprecation_logging`. Alternatively, edit [this line](https://github.com/elastic/kibana/blob/545c1420c285af8f5eee56f414bd6eca735aea11/x-pack/plugins/upgrade_assistant/public/application/lib/api.ts#L77) locally and replace `deprecation_logging` with `fake_deprecation_logging`. - **Unauthorized error fetching ES deprecations.** Mock a `403` status code to `GET /api/upgrade_assistant/es_deprecations` with the response payload: `{ "statusCode": 403 }` - **Partially upgraded error fetching ES deprecations.** Mock a `426` status code to `GET /api/upgrade_assistant/es_deprecations` with the response payload: `{ "statusCode": 426, "attributes": { "allNodesUpgraded": false } }` -- **Upgraded error fetching ES deprecations.** Mock a `426` status code to `GET /api/upgrade_assistant/es_deprecations` with the response payload: `{ "statusCode": 426, "attributes": { "allNodesUpgraded": true } }` +- **Upgraded error fetching ES deprecations.** Mock a `426` status code to `GET /api/upgrade_assistant/es_deprecations` with the response payload: `{ "statusCode": 426, "attributes": { "allNodesUpgraded": true } }` ### Telemetry @@ -356,4 +362,4 @@ The Upgrade Assistant tracks several triggered events in the UI, using Kibana Us In addition to UI counters, the Upgrade Assistant has a [custom usage collector](https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/README.mdx#custom-collector). It currently is only responsible for tracking whether the user has deprecation logging enabled or not. -For testing instructions, refer to the [Kibana Usage Collection service README](https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/README.mdx#testing). \ No newline at end of file +For testing instructions, refer to the [Kibana Usage Collection service README](https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/README.mdx#testing). diff --git a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts index bf605ac119fda..aac7b49c609f5 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts @@ -159,8 +159,9 @@ export const reindexServiceFactory = ( // ------ Functions used to process the state machine /** - * Sets the original index as readonly so new data can be indexed until the reindex - * is completed. + * Sets a write-block on the original index. New data cannot be indexed until + * the reindex is completed; there will be downtime for indexing until the + * reindex is completed. * @param reindexOp */ const setReadonly = async (reindexOp: ReindexSavedObject) => { @@ -330,6 +331,9 @@ export const reindexServiceFactory = ( /** * Creates an alias that points the old index to the new index, deletes the old index. + * If old index was closed, the new index will also be closed. + * + * @note indexing/writing to the new index is effectively enabled after this action! * @param reindexOp */ const switchAlias = async (reindexOp: ReindexSavedObject) => { diff --git a/x-pack/test/accessibility/apps/group1/roles.ts b/x-pack/test/accessibility/apps/group1/roles.ts index cf798bcb853f5..8a9fe187ba35b 100644 --- a/x-pack/test/accessibility/apps/group1/roles.ts +++ b/x-pack/test/accessibility/apps/group1/roles.ts @@ -14,6 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const a11y = getService('a11y'); const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); + const find = getService('find'); const retry = getService('retry'); const kibanaServer = getService('kibanaServer'); @@ -82,6 +83,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('a11y test for customize feature privilege', async () => { + await testSubjects.click('spaceSelectorComboBox'); + const globalSpaceOption = await find.byCssSelector(`#spaceOption_\\*`); + await globalSpaceOption.click(); await testSubjects.click('featureCategory_kibana'); await a11y.testAppSnapshot(); await testSubjects.click('cancelSpacePrivilegeButton'); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts index 8adfa2cfd1b3f..f5971606ceba8 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts @@ -42,7 +42,8 @@ export default function getFlappingSettingsTests({ getService }: FtrProviderCont expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [GET /internal/alerting/rules/settings/_flapping] is unauthorized for user, this action is granted by the Kibana privileges [read-flapping-settings]', statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_query_delay_settings.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_query_delay_settings.ts index 34e9a8b68c485..3bdd083288767 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_query_delay_settings.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_query_delay_settings.ts @@ -44,7 +44,8 @@ export default function getQueryDelaySettingsTests({ getService }: FtrProviderCo expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [GET /internal/alerting/rules/settings/_query_delay] is unauthorized for user, this action is granted by the Kibana privileges [read-query-delay-settings]', statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts index 4415eda75c3c0..c4ea9224f6d6b 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts @@ -43,7 +43,8 @@ export default function updateFlappingSettingsTest({ getService }: FtrProviderCo expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [POST /internal/alerting/rules/settings/_flapping] is unauthorized for user, this action is granted by the Kibana privileges [write-flapping-settings]', statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_query_delay_settings.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_query_delay_settings.ts index 293e906de9c77..e8ac438418b9f 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_query_delay_settings.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_query_delay_settings.ts @@ -43,7 +43,8 @@ export default function updateQueryDelaySettingsTest({ getService }: FtrProvider expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [POST /internal/alerting/rules/settings/_query_delay] is unauthorized for user, this action is granted by the Kibana privileges [write-query-delay-settings]', statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts index 6fcbd569594ff..eea03445f3c4a 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/active_maintenance_windows.ts @@ -92,7 +92,8 @@ export default function activeMaintenanceWindowTests({ getService }: FtrProvider expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [GET /internal/alerting/rules/maintenance_window/_active] is unauthorized for user, this action is granted by the Kibana privileges [read-maintenance-window]', statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/archive_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/archive_maintenance_window.ts index 589c552a2489a..4f62b2e239b57 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/archive_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/archive_maintenance_window.ts @@ -65,7 +65,7 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: `API [POST /internal/alerting/rules/maintenance_window/${createdMaintenanceWindow.id}/_archive] is unauthorized for user, this action is granted by the Kibana privileges [write-maintenance-window]`, statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts index dec413ee0a9a3..1b6f32715c9ef 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts @@ -88,7 +88,8 @@ export default function createMaintenanceWindowTests({ getService }: FtrProvider expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [POST /internal/alerting/rules/maintenance_window] is unauthorized for user, this action is granted by the Kibana privileges [write-maintenance-window]', statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/delete_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/delete_maintenance_window.ts index 63175f1a0dffd..c96db91adca6c 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/delete_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/delete_maintenance_window.ts @@ -55,7 +55,7 @@ export default function deleteMaintenanceWindowTests({ getService }: FtrProvider expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: `API [DELETE /internal/alerting/rules/maintenance_window/${maintenanceWindowBody.id}] is unauthorized for user, this action is granted by the Kibana privileges [write-maintenance-window]`, statusCode: 403, }); objectRemover.add( diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/find_maintenance_windows.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/find_maintenance_windows.ts index 9c546ea6b5c27..a91a323ac1250 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/find_maintenance_windows.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/find_maintenance_windows.ts @@ -71,7 +71,8 @@ export default function findMaintenanceWindowTests({ getService }: FtrProviderCo expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [GET /internal/alerting/rules/maintenance_window/_find] is unauthorized for user, this action is granted by the Kibana privileges [read-maintenance-window]', statusCode: 403, }); break; @@ -135,7 +136,8 @@ export default function findMaintenanceWindowTests({ getService }: FtrProviderCo expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [GET /internal/alerting/rules/maintenance_window/_find?page=1&per_page=1] is unauthorized for user, this action is granted by the Kibana privileges [read-maintenance-window]', statusCode: 403, }); break; @@ -184,7 +186,8 @@ export default function findMaintenanceWindowTests({ getService }: FtrProviderCo expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: + 'API [GET /internal/alerting/rules/maintenance_window/_find?page=101&per_page=100] is unauthorized for user, this action is granted by the Kibana privileges [read-maintenance-window]', statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/finish_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/finish_maintenance_window.ts index 49db0500da75d..bce613dee554f 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/finish_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/finish_maintenance_window.ts @@ -66,7 +66,7 @@ export default function findMaintenanceWindowTests({ getService }: FtrProviderCo expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: `API [POST /internal/alerting/rules/maintenance_window/${createdMaintenanceWindow.id}/_finish] is unauthorized for user, this action is granted by the Kibana privileges [write-maintenance-window]`, statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/get_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/get_maintenance_window.ts index 4641c1a309abb..e842f3f0b6693 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/get_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/get_maintenance_window.ts @@ -61,7 +61,7 @@ export default function getMaintenanceWindowTests({ getService }: FtrProviderCon expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: `API [GET /internal/alerting/rules/maintenance_window/${createdMaintenanceWindow.id}] is unauthorized for user, this action is granted by the Kibana privileges [read-maintenance-window]`, statusCode: 403, }); break; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts index 6dee1e4b899f9..79817ade62c76 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts @@ -99,7 +99,7 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider expect(response.statusCode).to.eql(403); expect(response.body).to.eql({ error: 'Forbidden', - message: 'Forbidden', + message: `API [POST /internal/alerting/rules/maintenance_window/${createdMaintenanceWindow.id}] is unauthorized for user, this action is granted by the Kibana privileges [write-maintenance-window]`, statusCode: 403, }); break; diff --git a/x-pack/test/api_integration/apis/cases/common/roles.ts b/x-pack/test/api_integration/apis/cases/common/roles.ts index 5c3e7025900fd..21ad6943ba0df 100644 --- a/x-pack/test/api_integration/apis/cases/common/roles.ts +++ b/x-pack/test/api_integration/apis/cases/common/roles.ts @@ -111,6 +111,31 @@ export const secAll: Role = { }, }; +export const secCasesV2All: Role = { + name: 'sec_cases_v2_all_role_api_int', + privileges: { + elasticsearch: { + indices: [ + { + names: ['*'], + privileges: ['all'], + }, + ], + }, + kibana: [ + { + feature: { + siem: ['all'], + securitySolutionCasesV2: ['all'], + actions: ['all'], + actionsSimulators: ['all'], + }, + spaces: ['*'], + }, + ], + }, +}; + export const secAllSpace1: Role = { name: 'sec_all_role_space1_api_int', privileges: { @@ -384,6 +409,31 @@ export const casesAll: Role = { }, }; +export const casesV2All: Role = { + name: 'cases_v2_all_role_api_int', + privileges: { + elasticsearch: { + indices: [ + { + names: ['*'], + privileges: ['all'], + }, + ], + }, + kibana: [ + { + spaces: ['*'], + base: [], + feature: { + generalCasesV2: ['all'], + actions: ['all'], + actionsSimulators: ['all'], + }, + }, + ], + }, +}; + export const casesRead: Role = { name: 'cases_read_role_api_int', privileges: { @@ -508,6 +558,31 @@ export const obsCasesAll: Role = { }, }; +export const obsCasesV2All: Role = { + name: 'obs_cases_v2_all_role_api_int', + privileges: { + elasticsearch: { + indices: [ + { + names: ['*'], + privileges: ['all'], + }, + ], + }, + kibana: [ + { + spaces: ['*'], + base: [], + feature: { + observabilityCasesV2: ['all'], + actions: ['all'], + actionsSimulators: ['all'], + }, + }, + ], + }, +}; + export const obsCasesRead: Role = { name: 'obs_cases_read_role_api_int', privileges: { @@ -537,6 +612,7 @@ export const roles = [ secAllCasesOnlyReadDelete, secAllCasesNoDelete, secAll, + secCasesV2All, secAllSpace1, secAllCasesRead, secAllCasesNone, @@ -548,10 +624,12 @@ export const roles = [ casesOnlyReadDelete, casesNoDelete, casesAll, + casesV2All, casesRead, obsCasesOnlyDelete, obsCasesOnlyReadDelete, obsCasesNoDelete, obsCasesAll, + obsCasesV2All, obsCasesRead, ]; diff --git a/x-pack/test/api_integration/apis/cases/common/users.ts b/x-pack/test/api_integration/apis/cases/common/users.ts index 6cf938dcb0740..a64b9767498fb 100644 --- a/x-pack/test/api_integration/apis/cases/common/users.ts +++ b/x-pack/test/api_integration/apis/cases/common/users.ts @@ -8,16 +8,19 @@ import { User } from '../../../../cases_api_integration/common/lib/authentication/types'; import { casesAll, + casesV2All, casesNoDelete, casesOnlyDelete, casesOnlyReadDelete, casesRead, obsCasesAll, + obsCasesV2All, obsCasesNoDelete, obsCasesOnlyDelete, obsCasesOnlyReadDelete, obsCasesRead, secAll, + secCasesV2All, secAllCasesNoDelete, secAllCasesNone, secAllCasesOnlyDelete, @@ -58,6 +61,12 @@ export const secAllUser: User = { roles: [secAll.name], }; +export const secCasesV2AllUser: User = { + username: 'sec_cases_v2_all_user_api_int', + password: 'password', + roles: [secCasesV2All.name], +}; + export const secAllSpace1User: User = { username: 'sec_all_space1_user_api_int', password: 'password', @@ -128,6 +137,12 @@ export const casesAllUser: User = { roles: [casesAll.name], }; +export const casesV2AllUser: User = { + username: 'cases_v2_all_user_api_int', + password: 'password', + roles: [casesV2All.name], +}; + export const casesReadUser: User = { username: 'cases_read_user_api_int', password: 'password', @@ -162,6 +177,12 @@ export const obsCasesAllUser: User = { roles: [obsCasesAll.name], }; +export const obsCasesV2AllUser: User = { + username: 'obs_cases_v2_all_user_api_int', + password: 'password', + roles: [obsCasesV2All.name], +}; + export const obsCasesReadUser: User = { username: 'obs_cases_read_user_api_int', password: 'password', @@ -189,6 +210,7 @@ export const users = [ secAllCasesOnlyReadDeleteUser, secAllCasesNoDeleteUser, secAllUser, + secCasesV2AllUser, secAllSpace1User, secAllCasesReadUser, secAllCasesNoneUser, @@ -200,11 +222,13 @@ export const users = [ casesOnlyReadDeleteUser, casesNoDeleteUser, casesAllUser, + casesV2AllUser, casesReadUser, obsCasesOnlyDeleteUser, obsCasesOnlyReadDeleteUser, obsCasesNoDeleteUser, obsCasesAllUser, + obsCasesV2AllUser, obsCasesReadUser, obsSecCasesAllUser, obsSecCasesReadUser, diff --git a/x-pack/test/api_integration/apis/cases/privileges.ts b/x-pack/test/api_integration/apis/cases/privileges.ts index 96a8970adeeee..53a1767f5c1a7 100644 --- a/x-pack/test/api_integration/apis/cases/privileges.ts +++ b/x-pack/test/api_integration/apis/cases/privileges.ts @@ -7,6 +7,8 @@ import expect from '@kbn/expect'; import { APP_ID as CASES_APP_ID } from '@kbn/cases-plugin/common/constants'; +import { AttachmentType } from '@kbn/cases-plugin/common'; +import { CaseStatuses, UserCommentAttachmentPayload } from '@kbn/cases-plugin/common/types/domain'; import { APP_ID as SECURITY_SOLUTION_APP_ID } from '@kbn/security-solution-plugin/common/constants'; import { observabilityFeatureId as OBSERVABILITY_APP_ID } from '@kbn/observability-plugin/common'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -16,12 +18,16 @@ import { deleteAllCaseItems, deleteCases, getCase, + createComment, + updateCaseStatus, } from '../../../cases_api_integration/common/lib/api'; import { casesAllUser, + casesV2AllUser, casesNoDeleteUser, casesOnlyDeleteUser, obsCasesAllUser, + obsCasesV2AllUser, obsCasesNoDeleteUser, obsCasesOnlyDeleteUser, secAllCasesNoDeleteUser, @@ -29,6 +35,7 @@ import { secAllCasesOnlyDeleteUser, secAllCasesReadUser, secAllUser, + secCasesV2AllUser, secReadCasesAllUser, secReadCasesNoneUser, secReadCasesReadUser, @@ -48,10 +55,13 @@ export default ({ getService }: FtrProviderContext): void => { for (const { user, owner } of [ { user: secAllUser, owner: SECURITY_SOLUTION_APP_ID }, + { user: secCasesV2AllUser, owner: SECURITY_SOLUTION_APP_ID }, { user: secReadCasesAllUser, owner: SECURITY_SOLUTION_APP_ID }, { user: casesAllUser, owner: CASES_APP_ID }, + { user: casesV2AllUser, owner: CASES_APP_ID }, { user: casesNoDeleteUser, owner: CASES_APP_ID }, { user: obsCasesAllUser, owner: OBSERVABILITY_APP_ID }, + { user: obsCasesV2AllUser, owner: OBSERVABILITY_APP_ID }, { user: obsCasesNoDeleteUser, owner: OBSERVABILITY_APP_ID }, ]) { it(`User ${user.username} with role(s) ${user.roles.join()} can create a case`, async () => { @@ -68,8 +78,10 @@ export default ({ getService }: FtrProviderContext): void => { { user: secReadCasesReadUser, owner: SECURITY_SOLUTION_APP_ID }, { user: secReadUser, owner: SECURITY_SOLUTION_APP_ID }, { user: casesAllUser, owner: CASES_APP_ID }, + { user: casesV2AllUser, owner: CASES_APP_ID }, { user: casesNoDeleteUser, owner: CASES_APP_ID }, { user: obsCasesAllUser, owner: OBSERVABILITY_APP_ID }, + { user: obsCasesV2AllUser, owner: OBSERVABILITY_APP_ID }, { user: obsCasesNoDeleteUser, owner: OBSERVABILITY_APP_ID }, ]) { it(`User ${user.username} with role(s) ${user.roles.join()} can get a case`, async () => { @@ -125,10 +137,13 @@ export default ({ getService }: FtrProviderContext): void => { for (const { user, owner } of [ { user: secAllUser, owner: SECURITY_SOLUTION_APP_ID }, + { user: secCasesV2AllUser, owner: SECURITY_SOLUTION_APP_ID }, { user: secAllCasesOnlyDeleteUser, owner: SECURITY_SOLUTION_APP_ID }, { user: casesAllUser, owner: CASES_APP_ID }, + { user: casesV2AllUser, owner: CASES_APP_ID }, { user: casesOnlyDeleteUser, owner: CASES_APP_ID }, { user: obsCasesAllUser, owner: OBSERVABILITY_APP_ID }, + { user: obsCasesV2AllUser, owner: OBSERVABILITY_APP_ID }, { user: obsCasesOnlyDeleteUser, owner: OBSERVABILITY_APP_ID }, ]) { it(`User ${user.username} with role(s) ${user.roles.join()} can delete a case`, async () => { @@ -160,5 +175,60 @@ export default ({ getService }: FtrProviderContext): void => { }); }); } + + for (const { user, owner } of [ + { user: secAllUser, owner: SECURITY_SOLUTION_APP_ID }, + { user: secCasesV2AllUser, owner: SECURITY_SOLUTION_APP_ID }, + { user: obsCasesAllUser, owner: OBSERVABILITY_APP_ID }, + { user: obsCasesV2AllUser, owner: OBSERVABILITY_APP_ID }, + { user: casesAllUser, owner: CASES_APP_ID }, + { user: casesV2AllUser, owner: CASES_APP_ID }, + ]) { + it(`User ${user.username} with role(s) ${user.roles.join()} can reopen a case`, async () => { + const caseInfo = await createCase(supertest, getPostCaseRequest({ owner })); + await updateCaseStatus({ + supertest: supertestWithoutAuth, + caseId: caseInfo.id, + status: 'closed' as CaseStatuses, + version: '2', + expectedHttpCode: 200, + auth: { user, space: null }, + }); + + await updateCaseStatus({ + supertest: supertestWithoutAuth, + caseId: caseInfo.id, + status: 'open' as CaseStatuses, + version: '3', + expectedHttpCode: 200, + auth: { user, space: null }, + }); + }); + } + + for (const { user, owner } of [ + { user: secAllUser, owner: SECURITY_SOLUTION_APP_ID }, + { user: secCasesV2AllUser, owner: SECURITY_SOLUTION_APP_ID }, + { user: obsCasesAllUser, owner: OBSERVABILITY_APP_ID }, + { user: obsCasesV2AllUser, owner: OBSERVABILITY_APP_ID }, + { user: casesAllUser, owner: CASES_APP_ID }, + { user: casesV2AllUser, owner: CASES_APP_ID }, + ]) { + it(`User ${user.username} with role(s) ${user.roles.join()} can add comments`, async () => { + const caseInfo = await createCase(supertest, getPostCaseRequest({ owner })); + const comment: UserCommentAttachmentPayload = { + comment: 'test', + owner, + type: AttachmentType.user, + }; + await createComment({ + params: comment, + supertest: supertestWithoutAuth, + caseId: caseInfo.id, + expectedHttpCode: 200, + auth: { user, space: null }, + }); + }); + } }); }; diff --git a/x-pack/test/api_integration/apis/cloud/config.ts b/x-pack/test/api_integration/apis/cloud/config.ts new file mode 100644 index 0000000000000..87000e8fc5427 --- /dev/null +++ b/x-pack/test/api_integration/apis/cloud/config.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const baseIntegrationTestsConfig = await readConfigFile(require.resolve('../../config.ts')); + + return { + ...baseIntegrationTestsConfig.getAll(), + testFiles: [require.resolve('.')], + kbnTestServer: { + ...baseIntegrationTestsConfig.get('kbnTestServer'), + serverArgs: [ + ...baseIntegrationTestsConfig.get('kbnTestServer.serverArgs'), + '--xpack.cloud.id="ftr_fake_cloud_id:aGVsbG8uY29tOjQ0MyRFUzEyM2FiYyRrYm4xMjNhYmM="', + '--xpack.cloud.base_url="https://cloud.elastic.co"', + '--xpack.spaces.allowSolutionVisibility=true', + ], + }, + }; +} diff --git a/x-pack/test/api_integration/apis/cloud/index.ts b/x-pack/test/api_integration/apis/cloud/index.ts new file mode 100644 index 0000000000000..819a9474e0752 --- /dev/null +++ b/x-pack/test/api_integration/apis/cloud/index.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 { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('cloud data', function () { + loadTestFile(require.resolve('./set_cloud_data_route')); + }); +} diff --git a/x-pack/test/api_integration/apis/cloud/set_cloud_data_route.ts b/x-pack/test/api_integration/apis/cloud/set_cloud_data_route.ts new file mode 100644 index 0000000000000..84331ab4c129d --- /dev/null +++ b/x-pack/test/api_integration/apis/cloud/set_cloud_data_route.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + + describe('POST /internal/cloud/solution', () => { + it('set solution data', async () => { + await supertest + .post('/internal/cloud/solution') + .set('kbn-xsrf', 'xxx') + .set('x-elastic-internal-origin', 'cloud') + .set('elastic-api-version', '1') + .send({ + onboardingData: { + solutionType: 'search', + token: 'connectors', + }, + }) + .expect(200); + + const { + body: { onboardingData }, + } = await supertest + .get('/internal/cloud/solution') + .set('kbn-xsrf', 'xxx') + .set('x-elastic-internal-origin', 'cloud') + .set('elastic-api-version', '1') + .expect(200); + + expect(onboardingData).to.eql({ solutionType: 'search', token: 'connectors' }); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts b/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts index 8eb99ca1fe371..c21f33cc8793a 100644 --- a/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts +++ b/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts @@ -16,12 +16,12 @@ export interface Auth { export const getInstalledDefinitions = async ( supertest: Agent, - params: { auth?: Auth; id?: string; includeState?: boolean } = {} + params: { auth?: Auth; id?: string; includeState?: boolean; perPage?: number } = {} ): Promise<{ definitions: EntityDefinitionWithState[] }> => { - const { auth, id, includeState = true } = params; + const { auth, id, includeState = true, perPage = 1000 } = params; let req = supertest .get(`/internal/entities/definition${id ? `/${id}` : ''}`) - .query({ includeState }) + .query({ includeState, perPage }) .set('kbn-xsrf', 'xxx'); if (auth) { req = req.auth(auth.username, auth.password); diff --git a/x-pack/test/api_integration/apis/features/features/features.ts b/x-pack/test/api_integration/apis/features/features/features.ts index 547fd12a54203..4ded1782c9086 100644 --- a/x-pack/test/api_integration/apis/features/features/features.ts +++ b/x-pack/test/api_integration/apis/features/features/features.ts @@ -111,7 +111,7 @@ export default function ({ getService }: FtrProviderContext) { 'guidedOnboardingFeature', 'monitoring', 'observabilityAIAssistant', - 'observabilityCases', + 'observabilityCasesV2', 'savedObjectsManagement', 'savedQueryManagement', 'savedObjectsTagging', @@ -119,7 +119,7 @@ export default function ({ getService }: FtrProviderContext) { 'apm', 'stackAlerts', 'canvas', - 'generalCases', + 'generalCasesV2', 'infrastructure', 'inventory', 'logs', @@ -133,7 +133,7 @@ export default function ({ getService }: FtrProviderContext) { 'slo', 'securitySolutionAssistant', 'securitySolutionAttackDiscovery', - 'securitySolutionCases', + 'securitySolutionCasesV2', 'fleet', 'fleetv2', ].sort() @@ -161,7 +161,7 @@ export default function ({ getService }: FtrProviderContext) { 'guidedOnboardingFeature', 'monitoring', 'observabilityAIAssistant', - 'observabilityCases', + 'observabilityCasesV2', 'savedObjectsManagement', 'savedQueryManagement', 'savedObjectsTagging', @@ -169,7 +169,7 @@ export default function ({ getService }: FtrProviderContext) { 'apm', 'stackAlerts', 'canvas', - 'generalCases', + 'generalCasesV2', 'infrastructure', 'inventory', 'logs', @@ -183,7 +183,7 @@ export default function ({ getService }: FtrProviderContext) { 'slo', 'securitySolutionAssistant', 'securitySolutionAttackDiscovery', - 'securitySolutionCases', + 'securitySolutionCasesV2', 'fleet', 'fleetv2', ]; diff --git a/x-pack/test/api_integration/apis/security/privileges.ts b/x-pack/test/api_integration/apis/security/privileges.ts index 1ff986829415b..b269aef6ae1cc 100644 --- a/x-pack/test/api_integration/apis/security/privileges.ts +++ b/x-pack/test/api_integration/apis/security/privileges.ts @@ -30,6 +30,16 @@ export default function ({ getService }: FtrProviderContext) { 'cases_delete', 'cases_settings', ], + generalCasesV2: [ + 'all', + 'read', + 'minimal_all', + 'minimal_read', + 'cases_delete', + 'cases_settings', + 'create_comment', + 'case_reopen', + ], observabilityCases: [ 'all', 'read', @@ -38,6 +48,16 @@ export default function ({ getService }: FtrProviderContext) { 'cases_delete', 'cases_settings', ], + observabilityCasesV2: [ + 'all', + 'read', + 'minimal_all', + 'minimal_read', + 'cases_delete', + 'cases_settings', + 'create_comment', + 'case_reopen', + ], observabilityAIAssistant: ['all', 'read', 'minimal_all', 'minimal_read'], slo: ['all', 'read', 'minimal_all', 'minimal_read'], searchInferenceEndpoints: ['all', 'read', 'minimal_all', 'minimal_read'], @@ -89,6 +109,16 @@ export default function ({ getService }: FtrProviderContext) { 'cases_delete', 'cases_settings', ], + securitySolutionCasesV2: [ + 'all', + 'read', + 'minimal_all', + 'minimal_read', + 'cases_delete', + 'cases_settings', + 'create_comment', + 'case_reopen', + ], infrastructure: ['all', 'read', 'minimal_all', 'minimal_read'], logs: ['all', 'read', 'minimal_all', 'minimal_read'], dataQuality: ['all', 'read', 'minimal_all', 'minimal_read'], diff --git a/x-pack/test/api_integration/apis/security/privileges_basic.ts b/x-pack/test/api_integration/apis/security/privileges_basic.ts index 57a166ef4be9d..a97ee360062c0 100644 --- a/x-pack/test/api_integration/apis/security/privileges_basic.ts +++ b/x-pack/test/api_integration/apis/security/privileges_basic.ts @@ -32,7 +32,9 @@ export default function ({ getService }: FtrProviderContext) { graph: ['all', 'read', 'minimal_all', 'minimal_read'], maps: ['all', 'read', 'minimal_all', 'minimal_read'], generalCases: ['all', 'read', 'minimal_all', 'minimal_read'], + generalCasesV2: ['all', 'read', 'minimal_all', 'minimal_read'], observabilityCases: ['all', 'read', 'minimal_all', 'minimal_read'], + observabilityCasesV2: ['all', 'read', 'minimal_all', 'minimal_read'], observabilityAIAssistant: ['all', 'read', 'minimal_all', 'minimal_read'], slo: ['all', 'read', 'minimal_all', 'minimal_read'], canvas: ['all', 'read', 'minimal_all', 'minimal_read'], @@ -47,6 +49,7 @@ export default function ({ getService }: FtrProviderContext) { securitySolutionAssistant: ['all', 'read', 'minimal_all', 'minimal_read'], securitySolutionAttackDiscovery: ['all', 'read', 'minimal_all', 'minimal_read'], securitySolutionCases: ['all', 'read', 'minimal_all', 'minimal_read'], + securitySolutionCasesV2: ['all', 'read', 'minimal_all', 'minimal_read'], searchInferenceEndpoints: ['all', 'read', 'minimal_all', 'minimal_read'], fleetv2: ['all', 'read', 'minimal_all', 'minimal_read'], fleet: ['all', 'read', 'minimal_all', 'minimal_read'], @@ -112,6 +115,16 @@ export default function ({ getService }: FtrProviderContext) { 'cases_delete', 'cases_settings', ], + generalCasesV2: [ + 'all', + 'read', + 'minimal_all', + 'minimal_read', + 'cases_delete', + 'cases_settings', + 'create_comment', + 'case_reopen', + ], observabilityCases: [ 'all', 'read', @@ -120,6 +133,16 @@ export default function ({ getService }: FtrProviderContext) { 'cases_delete', 'cases_settings', ], + observabilityCasesV2: [ + 'all', + 'read', + 'minimal_all', + 'minimal_read', + 'cases_delete', + 'cases_settings', + 'create_comment', + 'case_reopen', + ], observabilityAIAssistant: ['all', 'read', 'minimal_all', 'minimal_read'], slo: ['all', 'read', 'minimal_all', 'minimal_read'], searchInferenceEndpoints: ['all', 'read', 'minimal_all', 'minimal_read'], @@ -177,6 +200,16 @@ export default function ({ getService }: FtrProviderContext) { 'cases_delete', 'cases_settings', ], + securitySolutionCasesV2: [ + 'all', + 'read', + 'minimal_all', + 'minimal_read', + 'cases_delete', + 'cases_settings', + 'create_comment', + 'case_reopen', + ], infrastructure: ['all', 'read', 'minimal_all', 'minimal_read'], logs: ['all', 'read', 'minimal_all', 'minimal_read'], dataQuality: ['all', 'read', 'minimal_all', 'minimal_read'], diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts index ab7f9e5736392..a8e360ad5a06f 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts @@ -38,5 +38,7 @@ export default function apmApiIntegrationTests({ loadTestFile(require.resolve('./span_links')); loadTestFile(require.resolve('./suggestions')); loadTestFile(require.resolve('./throughput')); + loadTestFile(require.resolve('./transactions')); + loadTestFile(require.resolve('./service_overview')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_groups/service_group_count/service_group_count.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_groups/service_group_count/service_group_count.spec.ts index cbb29e2729dcb..08816f01d0f2b 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_groups/service_group_count/service_group_count.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_groups/service_group_count/service_group_count.spec.ts @@ -6,6 +6,9 @@ */ import expect from '@kbn/expect'; import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { RoleCredentials } from '@kbn/ftr-common-functional-services'; +import { ApmRuleType } from '@kbn/rule-data-utils'; +import { AggregationType } from '@kbn/apm-plugin/common/rules/apm_rule_types'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; import { createServiceGroupApi, @@ -13,10 +16,14 @@ import { getServiceGroupCounts, } from '../service_groups_api_methods'; import { generateData } from './generate_data'; +import { APM_ACTION_VARIABLE_INDEX, APM_ALERTS_INDEX } from '../../alerts/helpers/alerting_helper'; export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const synthtrace = getService('synthtrace'); const apmApiClient = getService('apmApi'); + const alertingApi = getService('alertingApi'); + const samlAuth = getService('samlAuth'); + const start = Date.now() - 24 * 60 * 60 * 1000; const end = Date.now(); @@ -24,6 +31,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon let synthbeansServiceGroupId: string; let opbeansServiceGroupId: string; let apmSynthtraceEsClient: ApmSynthtraceEsClient; + let roleAuthc: RoleCredentials; before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); @@ -59,5 +67,50 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.body[synthbeansServiceGroupId]).to.have.property('services', 2); expect(response.body[opbeansServiceGroupId]).to.have.property('services', 1); }); + + describe('with alerts', () => { + let ruleId: string; + + before(async () => { + roleAuthc = await samlAuth.createM2mApiKeyWithRoleScope('admin'); + const createdRule = await alertingApi.createRule({ + name: 'Latency threshold | synth-go', + params: { + serviceName: 'synth-go', + transactionType: undefined, + windowSize: 5, + windowUnit: 'h', + threshold: 100, + aggregationType: AggregationType.Avg, + environment: 'testing', + }, + ruleTypeId: ApmRuleType.TransactionDuration, + consumer: 'apm', + roleAuthc, + }); + + ruleId = createdRule.id; + await alertingApi.waitForAlertInIndex({ ruleId, indexName: APM_ALERTS_INDEX }); + }); + + after(async () => { + await alertingApi.cleanUpAlerts({ + roleAuthc, + ruleId, + alertIndexName: APM_ALERTS_INDEX, + connectorIndexName: APM_ACTION_VARIABLE_INDEX, + consumer: 'apm', + }); + await samlAuth.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + it('returns the correct number of alerts', async () => { + const response = await getServiceGroupCounts(apmApiClient); + expect(response.status).to.be(200); + expect(Object.keys(response.body).length).to.be(2); + expect(response.body[synthbeansServiceGroupId]).to.have.property('alerts', 1); + expect(response.body[opbeansServiceGroupId]).to.have.property('alerts', 0); + }); + }); }); } diff --git a/x-pack/test/apm_api_integration/tests/service_overview/dependencies/es_utils.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/dependencies/es_utils.ts similarity index 97% rename from x-pack/test/apm_api_integration/tests/service_overview/dependencies/es_utils.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/dependencies/es_utils.ts index 3fe59f4aeaea4..453f7a50d8aa3 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/dependencies/es_utils.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/dependencies/es_utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { v4 as uuidv4 } from 'uuid'; export function createServiceDependencyDocs({ diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/dependencies/index.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/dependencies/index.spec.ts new file mode 100644 index 0000000000000..cb7f81304c3b0 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/dependencies/index.spec.ts @@ -0,0 +1,304 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { last, pick } from 'lodash'; +import type { ValuesType } from 'utility-types'; +import { type Node, NodeType } from '@kbn/apm-plugin/common/connections'; +import { + ENVIRONMENT_ALL, + ENVIRONMENT_NOT_DEFINED, +} from '@kbn/apm-plugin/common/environment_filter_values'; +import type { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import { roundNumber } from '../../utils/common'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; +import { apmDependenciesMapping, createServiceDependencyDocs } from './es_utils'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const es = getService('es'); + + const { start, end } = { + start: '2021-08-03T06:50:15.910Z', + end: '2021-08-03T07:20:15.910Z', + }; + + function getName(node: Node) { + return node.type === NodeType.service ? node.serviceName : node.dependencyName; + } + + describe('Service Overview', () => { + describe('Dependencies', () => { + describe('when data is not loaded', () => { + it('handles the empty state', async () => { + const response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/dependencies`, + params: { + path: { serviceName: 'opbeans-java' }, + query: { + start, + end, + numBuckets: 20, + environment: ENVIRONMENT_ALL.value, + }, + }, + }); + + expect(response.status).to.be(200); + expect(response.body.serviceDependencies).to.eql([]); + }); + }); + + describe('when specific data is loaded', () => { + let response: { + status: number; + body: APIReturnType<'GET /internal/apm/services/{serviceName}/dependencies'>; + }; + + const indices = { + metric: 'apm-dependencies-metric', + transaction: 'apm-dependencies-transaction', + span: 'apm-dependencies-span', + }; + + const startTime = new Date(start).getTime(); + const endTime = new Date(end).getTime(); + + after(async () => { + const allIndices = Object.values(indices).join(','); + const indexExists = await es.indices.exists({ index: allIndices }); + if (indexExists) { + await es.indices.delete({ + index: allIndices, + }); + } + }); + + before(async () => { + await es.indices.create({ + index: indices.metric, + body: { + mappings: apmDependenciesMapping, + }, + }); + + await es.indices.create({ + index: indices.transaction, + body: { + mappings: apmDependenciesMapping, + }, + }); + + await es.indices.create({ + index: indices.span, + body: { + mappings: apmDependenciesMapping, + }, + }); + + const docs = [ + ...createServiceDependencyDocs({ + service: { + name: 'opbeans-java', + environment: 'production', + }, + agentName: 'java', + span: { + type: 'external', + subtype: 'http', + }, + resource: 'opbeans-node:3000', + outcome: 'success', + responseTime: { + count: 2, + sum: 10, + }, + time: startTime, + to: { + service: { + name: 'opbeans-node', + }, + agentName: 'nodejs', + }, + }), + ...createServiceDependencyDocs({ + service: { + name: 'opbeans-java', + environment: 'production', + }, + agentName: 'java', + span: { + type: 'external', + subtype: 'http', + }, + resource: 'opbeans-node:3000', + outcome: 'failure', + responseTime: { + count: 1, + sum: 10, + }, + time: startTime, + }), + ...createServiceDependencyDocs({ + service: { + name: 'opbeans-java', + environment: 'production', + }, + agentName: 'java', + span: { + type: 'external', + subtype: 'http', + }, + resource: 'postgres', + outcome: 'success', + responseTime: { + count: 1, + sum: 3, + }, + time: startTime, + }), + ...createServiceDependencyDocs({ + service: { + name: 'opbeans-java', + environment: 'production', + }, + agentName: 'java', + span: { + type: 'external', + subtype: 'http', + }, + resource: 'opbeans-node-via-proxy', + outcome: 'success', + responseTime: { + count: 1, + sum: 1, + }, + time: endTime - 1, + to: { + service: { + name: 'opbeans-node', + }, + agentName: 'nodejs', + }, + }), + ]; + + const bulkActions = docs.reduce( + (prev, doc) => { + return [...prev, { index: { _index: indices[doc.processor.event] } }, doc]; + }, + [] as Array< + | { + index: { + _index: string; + }; + } + | ValuesType + > + ); + + await es.bulk({ + body: bulkActions, + refresh: 'wait_for', + }); + + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/dependencies`, + params: { + path: { serviceName: 'opbeans-java' }, + query: { + start, + end, + numBuckets: 20, + environment: ENVIRONMENT_ALL.value, + }, + }, + }); + }); + + it('returns a 200', () => { + expect(response.status).to.be(200); + }); + + it('returns two dependencies', () => { + expect(response.body.serviceDependencies.length).to.be(2); + }); + + it('returns opbeans-node as a dependency', () => { + const opbeansNode = response.body.serviceDependencies.find( + (item) => getName(item.location) === 'opbeans-node' + ); + + expect(opbeansNode !== undefined).to.be(true); + + const values = { + latency: roundNumber(opbeansNode?.currentStats.latency.value), + throughput: roundNumber(opbeansNode?.currentStats.throughput.value), + errorRate: roundNumber(opbeansNode?.currentStats.errorRate.value), + impact: opbeansNode?.currentStats.impact, + ...pick(opbeansNode?.location, 'serviceName', 'type', 'agentName', 'environment'), + }; + + const count = 4; + const sum = 21; + const errors = 1; + + expect(values).to.eql({ + agentName: 'nodejs', + environment: ENVIRONMENT_NOT_DEFINED.value, + serviceName: 'opbeans-node', + type: 'service', + errorRate: roundNumber(errors / count), + latency: roundNumber(sum / count), + throughput: roundNumber(count / ((endTime - startTime) / 1000 / 60)), + impact: 100, + }); + + const firstValue = roundNumber(opbeansNode?.currentStats.latency.timeseries[0].y); + const lastValue = roundNumber(last(opbeansNode?.currentStats.latency.timeseries)?.y); + + expect(firstValue).to.be(roundNumber(20 / 3)); + expect(lastValue).to.be(1); + }); + + it('returns postgres as an external dependency', () => { + const postgres = response.body.serviceDependencies.find( + (item) => getName(item.location) === 'postgres' + ); + + expect(postgres !== undefined).to.be(true); + + const values = { + latency: roundNumber(postgres?.currentStats.latency.value), + throughput: roundNumber(postgres?.currentStats.throughput.value), + errorRate: roundNumber(postgres?.currentStats.errorRate.value), + impact: postgres?.currentStats.impact, + ...pick(postgres?.location, 'spanType', 'spanSubtype', 'dependencyName', 'type'), + }; + + const count = 1; + const sum = 3; + const errors = 0; + + expect(values).to.eql({ + spanType: 'external', + spanSubtype: 'http', + dependencyName: 'postgres', + type: 'dependency', + errorRate: roundNumber(errors / count), + latency: roundNumber(sum / count), + throughput: roundNumber(count / ((endTime - startTime) / 1000 / 60)), + impact: 0, + }); + }); + }); + + // UNSUPPORTED TEST CASES - when data is loaded + // TODO: These tests should be migrated to use synthtrace: https://github.com/elastic/kibana/issues/200743 + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/get_service_node_ids.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/get_service_node_ids.ts new file mode 100644 index 0000000000000..8216c33d07140 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/get_service_node_ids.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { take } from 'lodash'; +import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; +import type { ApmApiClient } from '../custom_dashboards/api_helper'; + +export async function getServiceNodeIds({ + apmApiClient, + start, + end, + serviceName = 'opbeans-java', + count = 1, +}: { + apmApiClient: Awaited; + start: string; + end: string; + serviceName?: string; + count?: number; +}) { + const { body } = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, + params: { + path: { serviceName }, + query: { + latencyAggregationType: LatencyAggregationType.avg, + start, + end, + transactionType: 'request', + environment: 'ENVIRONMENT_ALL', + kuery: '', + sortField: 'throughput', + sortDirection: 'desc', + }, + }, + }); + + return take(body.currentPeriod.map((item) => item.serviceNodeName).sort(), count); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/index.ts new file mode 100644 index 0000000000000..5ab7be1ed1ec5 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { + describe('service_overview', () => { + loadTestFile(require.resolve('./instance_details.spec.ts')); + loadTestFile(require.resolve('./instances_detailed_statistics.spec.ts')); + loadTestFile(require.resolve('./instances_main_statistics.spec.ts')); + loadTestFile(require.resolve('./dependencies/index.spec.ts')); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instance_details.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instance_details.spec.ts new file mode 100644 index 0000000000000..94ac27b90bc5f --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instance_details.spec.ts @@ -0,0 +1,180 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import { omit } from 'lodash'; +import type { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client'; +import { apm, timerange } from '@kbn/apm-synthtrace-client'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; +import { getServiceNodeIds } from './get_service_node_ids'; + +type ServiceOverviewInstanceDetails = + APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + + const start = '2023-08-22T00:00:00.000Z'; + const end = '2023-08-22T01:00:00.000Z'; + + describe('Service Overview', () => { + let client: ApmSynthtraceEsClient; + + before(async () => { + client = await synthtrace.createApmSynthtraceEsClient(); + }); + + describe('Instance details', () => { + describe('when data is not loaded', () => { + it('handles empty state', async () => { + const response = await apmApiClient.readUser({ + endpoint: + 'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}', + params: { + path: { serviceName: 'opbeans-java', serviceNodeName: 'foo' }, + query: { + start, + end, + }, + }, + }); + + expect(response.status).to.be(200); + expect(response.body).to.eql({}); + }); + }); + + describe('when data is loaded', () => { + const range = timerange(new Date(start).getTime(), new Date(end).getTime()); + + const serviceInstance = apm + .service({ name: 'service1', environment: 'production', agentName: 'go' }) + .instance('multiple-env-service-production'); + + const metricOnlyInstance = apm + .service({ name: 'service1', environment: 'production', agentName: 'java' }) + .instance('multiple-env-service-production'); + + before(() => { + return client.index([ + range + .interval('1s') + .rate(4) + .generator((timestamp) => + serviceInstance + .transaction({ transactionName: 'GET /api' }) + .timestamp(timestamp) + .duration(1000) + .success() + ), + range + .interval('30s') + .rate(1) + .generator((timestamp) => + metricOnlyInstance + .containerId('123') + .podId('234') + .appMetrics({ + 'system.memory.actual.free': 1, + 'system.cpu.total.norm.pct': 1, + 'system.memory.total': 1, + 'system.process.cpu.total.norm.pct': 1, + }) + .timestamp(timestamp) + ), + ]); + }); + + after(async () => { + await client.clean(); + }); + + describe('fetch instance details', () => { + let response: { + status: number; + body: ServiceOverviewInstanceDetails; + }; + + let serviceNodeIds: string[]; + + before(async () => { + serviceNodeIds = await getServiceNodeIds({ + apmApiClient, + start, + end, + serviceName: 'service1', + }); + + response = await apmApiClient.readUser({ + endpoint: + 'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}', + params: { + path: { serviceName: 'service1', serviceNodeName: serviceNodeIds[0] }, + query: { + start, + end, + }, + }, + }); + }); + + it('returns the instance details', () => { + expect(response.body).to.not.eql({}); + }); + + it('return the correct data', () => { + expect(omit(response.body, '@timestamp')).to.eql({ + agent: { + name: 'java', + }, + container: { + id: '123', + }, + host: { + name: 'multiple-env-service-production', + }, + kubernetes: { + container: {}, + deployment: {}, + pod: { + uid: '234', + }, + replicaset: {}, + }, + service: { + environment: 'production', + name: 'service1', + node: { + name: 'multiple-env-service-production', + }, + }, + }); + }); + }); + }); + + describe('when data is loaded but details not found', () => { + it('handles empty state when instance id not found', async () => { + const response = await apmApiClient.readUser({ + endpoint: + 'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}', + params: { + path: { serviceName: 'opbeans-java', serviceNodeName: 'foo' }, + query: { + start, + end, + }, + }, + }); + expect(response.status).to.be(200); + expect(response.body).to.eql({}); + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instances_detailed_statistics.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instances_detailed_statistics.spec.ts new file mode 100644 index 0000000000000..b2596ae43c956 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instances_detailed_statistics.spec.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; +import { getServiceNodeIds } from './get_service_node_ids'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + + const serviceName = 'opbeans-java'; + + const { start, end } = { + start: '2021-08-03T06:50:15.910Z', + end: '2021-08-03T07:20:15.910Z', + }; + + describe('Service Overview', () => { + describe('Instances detailed statistics', () => { + describe('when data is not loaded', () => { + it('handles the empty state', async () => { + const response = await apmApiClient.readUser({ + endpoint: + 'GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics', + params: { + path: { serviceName }, + query: { + latencyAggregationType: LatencyAggregationType.avg, + start, + end, + numBuckets: 20, + transactionType: 'request', + serviceNodeIds: JSON.stringify( + await getServiceNodeIds({ apmApiClient, start, end }) + ), + environment: 'ENVIRONMENT_ALL', + kuery: '', + }, + }, + }); + + expect(response.status).to.be(200); + expect(response.body).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); + }); + }); + + // UNSUPPORTED TEST CASES - when data is loaded + // TODO: These tests should be migrated to use synthtrace: https://github.com/elastic/kibana/issues/200743 + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instances_main_statistics.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instances_main_statistics.spec.ts new file mode 100644 index 0000000000000..e0e3ba254924d --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/service_overview/instances_main_statistics.spec.ts @@ -0,0 +1,695 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import type { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import { apm, Instance, timerange } from '@kbn/apm-synthtrace-client'; +import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; +import type { InstancesSortField } from '@kbn/apm-plugin/common/instances'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client'; +import { sum } from 'lodash'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; +import { roundNumber } from '../utils/common'; + +type ServiceOverviewInstancesMainStatistics = + APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:10:00.000Z').getTime(); + + async function getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField = 'throughput', + sortDirection = 'desc', + }: { + serviceName: string; + sortField?: InstancesSortField; + sortDirection?: 'asc' | 'desc'; + }) { + const { body } = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, + params: { + path: { serviceName }, + query: { + latencyAggregationType: LatencyAggregationType.avg, + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + transactionType: 'request', + environment: 'production', + kuery: '', + sortField, + sortDirection, + }, + }, + }); + + return body.currentPeriod; + } + + describe('Service Overview', () => { + let client: ApmSynthtraceEsClient; + + before(async () => { + client = await synthtrace.createApmSynthtraceEsClient(); + }); + + describe('Instances main statistics', () => { + describe('when data is not loaded', () => { + it('handles empty state', async () => { + const response = await getServiceOverviewInstancesMainStatistics({ serviceName: 'foo' }); + expect(response).to.eql({}); + }); + }); + + describe('when data is loaded', () => { + describe('Return Top 100 instances', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + + const successfulTimestamps = range.interval('1m').rate(1); + const failedTimestamps = range.interval('1m').rate(1); + + const instances = [...Array(200).keys()].map((index) => + apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`) + ); + + const instanceSpans = (instance: Instance) => { + const successfulTraceEvents = successfulTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .duration(1000) + .success() + .destination('elasticsearch') + .timestamp(timestamp), + instance + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .duration(100) + .success() + .timestamp(timestamp) + ) + ); + + const failedTraceEvents = failedTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + + return [successfulTraceEvents, failedTraceEvents, metricsets]; + }; + + return client.index(instances.flatMap((instance) => instanceSpans(instance))); + }); + + after(async () => { + await client.clean(); + }); + describe('fetch instances', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); + }); + it('returns top 100 instances', () => { + expect(instancesMainStats.length).to.be(100); + }); + }); + }); + + describe('Order by error rate', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + /** + * Instance A + * 90 transactions = Success + * 10 transactions = Failure + * Error rate: 10% + */ + const instanceA = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-A'); + const instanceASuccessfulTraceEvents = range + .interval('1m') + .rate(10) + .generator((timestamp, index) => + index < 10 + ? instanceA + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceA + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + : instanceA + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + ); + /** + * Instance B + * 1 transactions = Success + * 9 transactions = Failure + * Error rate: 90% + */ + const instanceB = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-B'); + const instanceBSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp, index) => + index === 0 + ? instanceB + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + : instanceB + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceB + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance C + * 2 transactions = Success + * 8 transactions = Failure + * Error rate: 80% + */ + const instanceC = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-C'); + const instanceCSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp, index) => + index < 2 + ? instanceC + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + : instanceC + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceC + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance D + * 0 transactions = Success + * 10 transactions = Failure + * Error rate: 100% + */ + const instanceD = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-D'); + const instanceDSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp) => + instanceD + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceD + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance E + * 10 transactions = Success + * 0 transactions = Failure + * Error rate: 0% + */ + const instanceE = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-E'); + const instanceESuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp) => + instanceE + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + ); + + return client.index([ + instanceASuccessfulTraceEvents, + instanceBSuccessfulTraceEvents, + instanceCSuccessfulTraceEvents, + instanceDSuccessfulTraceEvents, + instanceESuccessfulTraceEvents, + ]); + }); + + after(async () => { + await client.clean(); + }); + describe('sort by error rate asc', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: 'errorRate', + sortDirection: 'asc', + }); + }); + it('returns instances sorted asc', () => { + expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ + 0, 0.1, 0.8, 0.9, 1, + ]); + }); + }); + describe('sort by error rate desc', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: 'errorRate', + sortDirection: 'desc', + }); + }); + it('returns instances sorted desc', () => { + expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ + 1, 0.9, 0.8, 0.1, 0, + ]); + }); + }); + }); + + describe('with transactions and system metrics', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + const instances = Array(3) + .fill(0) + .map((_, idx) => { + const index = idx + 1; + return { + instance: apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`), + duration: index * 1000, + rate: index * 10, + errorRate: 5, + }; + }); + + return client.index( + instances.flatMap(({ instance, duration, rate, errorRate }) => { + const successfulTraceEvents = range + .interval('1m') + .rate(rate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .success() + ); + const failedTraceEvents = range + .interval('1m') + .rate(errorRate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + return [successfulTraceEvents, failedTraceEvents, metricsets]; + }) + ); + }); + + after(async () => { + await client.clean(); + }); + + describe('test order of items', () => { + ( + [ + { + field: 'throughput', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + expectedValues: [15, 25, 35], + }, + { + field: 'throughput', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + expectedValues: [35, 25, 15], + }, + { + field: 'latency', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + expectedValues: [1000000, 2000000, 3000000], + }, + { + field: 'latency', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + expectedValues: [3000000, 2000000, 1000000], + }, + { + field: 'serviceNodeName', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + }, + { + field: 'serviceNodeName', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + }, + ] as Array<{ + field: InstancesSortField; + direction: 'asc' | 'desc'; + expectedServiceNodeNames: string[]; + expectedValues?: number[]; + }> + ).map(({ field, direction, expectedServiceNodeNames, expectedValues }) => + describe(`fetch instances main statistics ordered by ${field} ${direction}`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: field, + sortDirection: direction, + }); + }); + + it('returns ordered instance main stats', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql( + expectedServiceNodeNames + ); + if (expectedValues) { + expect( + instancesMainStats.map((item) => { + const value = item[field]; + if (typeof value === 'number') { + return roundNumber(value); + } + return value; + }) + ).to.eql(expectedValues); + } + }); + + it('returns system metrics', () => { + expect(instancesMainStats.map((item) => roundNumber(item.cpuUsage))).to.eql([ + 0.7, 0.7, 0.7, + ]); + expect(instancesMainStats.map((item) => roundNumber(item.memoryUsage))).to.eql([ + 0.2, 0.2, 0.2, + ]); + }); + }) + ); + }); + }); + + describe('with transactions only', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + const instances = Array(3) + .fill(0) + .map((_, idx) => { + const index = idx + 1; + return { + instance: apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`), + duration: index * 1000, + rate: index * 10, + errorRate: 5, + }; + }); + + return client.index( + instances.flatMap(({ instance, duration, rate, errorRate }) => { + const successfulTraceEvents = range + .interval('1m') + .rate(rate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .success() + ); + const failedTraceEvents = range + .interval('1m') + .rate(errorRate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + return [successfulTraceEvents, failedTraceEvents]; + }) + ); + }); + + after(async () => { + await client.clean(); + }); + + describe(`Fetch main statistics`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); + }); + + it('returns instances name', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ + 'instance-3', + 'instance-2', + 'instance-1', + ]); + }); + + it('returns throughput', () => { + expect(sum(instancesMainStats.map((item) => item.throughput))).to.greaterThan(0); + }); + + it('returns latency', () => { + expect(sum(instancesMainStats.map((item) => item.latency))).to.greaterThan(0); + }); + + it('returns errorRate', () => { + expect(sum(instancesMainStats.map((item) => item.errorRate))).to.greaterThan(0); + }); + + it('does not return cpu usage', () => { + expect( + instancesMainStats + .map((item) => item.cpuUsage) + .filter((value) => value !== undefined) + ).to.eql([]); + }); + + it('does not return memory usage', () => { + expect( + instancesMainStats + .map((item) => item.memoryUsage) + .filter((value) => value !== undefined) + ).to.eql([]); + }); + }); + }); + + describe('with system metrics only', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const instances = Array(3) + .fill(0) + .map((_, idx) => + apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${idx + 1}`) + ); + + return client.index( + instances.map((instance) => { + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + return metricsets; + }) + ); + }); + + after(async () => { + await client.clean(); + }); + + describe(`Fetch main statistics`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); + }); + + it('returns instances name', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ + 'instance-1', + 'instance-2', + 'instance-3', + ]); + }); + + it('does not return throughput', () => { + expect( + instancesMainStats + .map((item) => item.throughput) + .filter((value) => value !== undefined) + ).to.eql([]); + }); + + it('does not return latency', () => { + expect( + instancesMainStats + .map((item) => item.latency) + .filter((value) => value !== undefined) + ).to.eql([]); + }); + + it('does not return errorRate', () => { + expect( + instancesMainStats + .map((item) => item.errorRate) + .filter((value) => value !== undefined) + ).to.eql([]); + }); + + it('returns cpu usage', () => { + expect(sum(instancesMainStats.map((item) => item.cpuUsage))).to.greaterThan(0); + }); + + it('returns memory usage', () => { + expect(sum(instancesMainStats.map((item) => item.memoryUsage))).to.greaterThan(0); + }); + }); + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/breakdown.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/breakdown.spec.ts new file mode 100644 index 0000000000000..73437daa08654 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/breakdown.spec.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import archives from '../constants/archives_metadata'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + + const archiveName = 'apm_8.0.0'; + const { start, end } = archives[archiveName]; + const transactionType = 'request'; + + describe('Breakdown', () => { + describe('when data is not loaded', () => { + it('handles the empty state', async () => { + const response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/services/{serviceName}/transaction/charts/breakdown', + params: { + path: { serviceName: 'opbeans-node' }, + query: { + start, + end, + transactionType, + environment: 'ENVIRONMENT_ALL', + kuery: '', + }, + }, + }); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ timeseries: [] }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/error_rate.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/error_rate.spec.ts new file mode 100644 index 0000000000000..976f33a59488f --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/error_rate.spec.ts @@ -0,0 +1,436 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { apm, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { buildQueryFromFilters } from '@kbn/es-query'; +import { first, last } from 'lodash'; +import moment from 'moment'; +import { + APIClientRequestParamsOf, + APIReturnType, +} from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import { RecursivePartial } from '@kbn/apm-plugin/typings/common'; +import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; +import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +type ErrorRate = + APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/charts/error_rate'>; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + + // url parameters + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; + + async function fetchErrorCharts( + overrides?: RecursivePartial< + APIClientRequestParamsOf<'GET /internal/apm/services/{serviceName}/transactions/charts/error_rate'>['params'] + > + ) { + return await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/transactions/charts/error_rate`, + params: { + path: { serviceName: overrides?.path?.serviceName || 'opbeans-go' }, + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + transactionType: 'request', + environment: 'ENVIRONMENT_ALL', + kuery: '', + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.OneMinute, + bucketSizeInSeconds: 60, + ...overrides?.query, + }, + }, + }); + } + + describe('Error rate', () => { + describe('Error rate when data is not loaded', () => { + it('handles the empty state', async () => { + const response = await fetchErrorCharts(); + expect(response.status).to.be(200); + + const body = response.body as ErrorRate; + expect(body).to.be.eql({ + currentPeriod: { timeseries: [], average: null }, + previousPeriod: { timeseries: [], average: null }, + }); + }); + + it('handles the empty state with comparison data', async () => { + const response = await fetchErrorCharts({ + query: { + start: moment(end).subtract(7, 'minutes').toISOString(), + offset: '7m', + }, + }); + expect(response.status).to.be(200); + + const body = response.body as ErrorRate; + expect(body).to.be.eql({ + currentPeriod: { timeseries: [], average: null }, + previousPeriod: { timeseries: [], average: null }, + }); + }); + }); + + describe('Error rate when data is loaded', () => { + const config = { + firstTransaction: { + name: 'GET /apple 🍎 ', + successRate: 50, + failureRate: 50, + }, + secondTransaction: { + name: 'GET /pear 🍎 ', + successRate: 25, + failureRate: 75, + }, + }; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + const serviceGoProdInstance = apm + .service({ name: 'opbeans-go', environment: 'production', agentName: 'go' }) + .instance('instance-a'); + + const { firstTransaction, secondTransaction } = config; + + const documents = [ + timerange(start, end) + .ratePerMinute(firstTransaction.successRate) + .generator((timestamp) => + serviceGoProdInstance + .transaction({ transactionName: firstTransaction.name }) + .timestamp(timestamp) + .duration(1000) + .success() + ), + timerange(start, end) + .ratePerMinute(firstTransaction.failureRate) + .generator((timestamp) => + serviceGoProdInstance + .transaction({ transactionName: firstTransaction.name }) + .duration(1000) + .timestamp(timestamp) + .failure() + ), + timerange(start, end) + .ratePerMinute(secondTransaction.successRate) + .generator((timestamp) => + serviceGoProdInstance + .transaction({ transactionName: secondTransaction.name }) + .timestamp(timestamp) + .duration(1000) + .success() + ), + timerange(start, end) + .ratePerMinute(secondTransaction.failureRate) + .generator((timestamp) => + serviceGoProdInstance + .transaction({ transactionName: secondTransaction.name }) + .duration(1000) + .timestamp(timestamp) + .failure() + ), + ]; + await apmSynthtraceEsClient.index(documents); + }); + + after(() => apmSynthtraceEsClient.clean()); + + describe('returns the transaction error rate', () => { + let errorRateResponse: ErrorRate; + + before(async () => { + const response = await fetchErrorCharts({ + query: { transactionName: config.firstTransaction.name }, + }); + errorRateResponse = response.body; + }); + + it('returns some data', () => { + expect(errorRateResponse.currentPeriod.average).to.be.greaterThan(0); + expect(errorRateResponse.previousPeriod.average).to.be(null); + + expect(errorRateResponse.currentPeriod.timeseries).not.to.be.empty(); + expect(errorRateResponse.previousPeriod.timeseries).to.empty(); + + const nonNullDataPoints = errorRateResponse.currentPeriod.timeseries.filter( + ({ y }) => y !== null + ); + + expect(nonNullDataPoints).not.to.be.empty(); + }); + + it('has the correct start date', () => { + expect( + new Date(first(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() + ).to.eql('2021-01-01T00:00:00.000Z'); + }); + + it('has the correct end date', () => { + expect( + new Date(last(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() + ).to.eql('2021-01-01T00:14:00.000Z'); + }); + + it('has the correct number of buckets', () => { + expect(errorRateResponse.currentPeriod.timeseries.length).to.be.eql(15); + }); + + it('has the correct calculation for average', () => { + expect(errorRateResponse.currentPeriod.average).to.eql( + config.firstTransaction.failureRate / 100 + ); + }); + }); + + describe('returns the transaction error rate with comparison data per transaction name', () => { + let errorRateResponse: ErrorRate; + + before(async () => { + const query = { + transactionName: config.firstTransaction.name, + start: moment(end).subtract(7, 'minutes').toISOString(), + offset: '7m', + }; + + const response = await fetchErrorCharts({ query }); + + errorRateResponse = response.body; + }); + + it('returns some data', () => { + expect(errorRateResponse.currentPeriod.average).to.be.greaterThan(0); + expect(errorRateResponse.previousPeriod.average).to.be.greaterThan(0); + + expect(errorRateResponse.currentPeriod.timeseries).not.to.be.empty(); + expect(errorRateResponse.previousPeriod.timeseries).not.to.be.empty(); + + const currentPeriodNonNullDataPoints = errorRateResponse.currentPeriod.timeseries.filter( + ({ y }) => y !== null + ); + + const previousPeriodNonNullDataPoints = + errorRateResponse.previousPeriod.timeseries.filter(({ y }) => y !== null); + + expect(currentPeriodNonNullDataPoints).not.to.be.empty(); + expect(previousPeriodNonNullDataPoints).not.to.be.empty(); + }); + + it('has the correct start date', () => { + expect( + new Date(first(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() + ).to.eql('2021-01-01T00:07:00.000Z'); + expect( + new Date(first(errorRateResponse.previousPeriod.timeseries)?.x ?? NaN).toISOString() + ).to.eql('2021-01-01T00:07:00.000Z'); + }); + + it('has the correct end date', () => { + expect( + new Date(last(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() + ).to.eql('2021-01-01T00:14:00.000Z'); + expect( + new Date(last(errorRateResponse.previousPeriod.timeseries)?.x ?? NaN).toISOString() + ).to.eql('2021-01-01T00:14:00.000Z'); + }); + + it('has the correct number of buckets', () => { + expect(errorRateResponse.currentPeriod.timeseries.length).to.eql(8); + expect(errorRateResponse.previousPeriod.timeseries.length).to.eql(8); + }); + + it('has the correct calculation for average', () => { + expect(errorRateResponse.currentPeriod.average).to.eql( + config.firstTransaction.failureRate / 100 + ); + expect(errorRateResponse.previousPeriod.average).to.eql( + config.firstTransaction.failureRate / 100 + ); + }); + + it('matches x-axis on current period and previous period', () => { + expect(errorRateResponse.currentPeriod.timeseries.map(({ x }) => x)).to.be.eql( + errorRateResponse.previousPeriod.timeseries.map(({ x }) => x) + ); + }); + }); + + describe('returns the same error rate for tx metrics and service tx metrics ', () => { + let txMetricsErrorRateResponse: ErrorRate; + let serviceTxMetricsErrorRateResponse: ErrorRate; + + before(async () => { + const [txMetricsResponse, serviceTxMetricsResponse] = await Promise.all([ + fetchErrorCharts(), + fetchErrorCharts({ + query: { documentType: ApmDocumentType.ServiceTransactionMetric }, + }), + ]); + + txMetricsErrorRateResponse = txMetricsResponse.body; + serviceTxMetricsErrorRateResponse = serviceTxMetricsResponse.body; + }); + + describe('has the correct calculation for average', () => { + const expectedFailureRate = + (config.firstTransaction.failureRate + config.secondTransaction.failureRate) / 2 / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + + it('for service tx metrics', () => { + expect(serviceTxMetricsErrorRateResponse.currentPeriod.average).to.eql( + expectedFailureRate + ); + }); + }); + }); + + describe('handles kuery', () => { + let txMetricsErrorRateResponse: ErrorRate; + + before(async () => { + const txMetricsResponse = await fetchErrorCharts({ + query: { + kuery: 'transaction.name : "GET /pear 🍎 "', + }, + }); + txMetricsErrorRateResponse = txMetricsResponse.body; + }); + + describe('has the correct calculation for average with kuery', () => { + const expectedFailureRate = config.secondTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + }); + + describe('handles filters', () => { + const filters = [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /pear 🍎 ', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + let txMetricsErrorRateResponse: ErrorRate; + + before(async () => { + const txMetricsResponse = await fetchErrorCharts({ + query: { + filters: serializedFilters, + }, + }); + txMetricsErrorRateResponse = txMetricsResponse.body; + }); + + describe('has the correct calculation for average with filter', () => { + const expectedFailureRate = config.secondTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + + describe('has the correct calculation for average with negate filter', () => { + const expectedFailureRate = config.secondTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + }); + + describe('handles negate filters', () => { + const filters = [ + { + meta: { + disabled: false, + negate: true, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /pear 🍎 ', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + let txMetricsErrorRateResponse: ErrorRate; + + before(async () => { + const txMetricsResponse = await fetchErrorCharts({ + query: { + filters: serializedFilters, + }, + }); + txMetricsErrorRateResponse = txMetricsResponse.body; + }); + + describe('has the correct calculation for average with filter', () => { + const expectedFailureRate = config.firstTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + }); + + describe('handles bad filters request', () => { + it('for tx metrics', async () => { + try { + await fetchErrorCharts({ + query: { + filters: '{}}}', + }, + }); + } catch (e) { + expect(e.res.status).to.eql(400); + } + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/index.ts new file mode 100644 index 0000000000000..30715c862c7f5 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { + describe('transactions', () => { + loadTestFile(require.resolve('./breakdown.spec.ts')); + loadTestFile(require.resolve('./error_rate.spec.ts')); + loadTestFile(require.resolve('./latency_overall_distribution.spec.ts')); + loadTestFile(require.resolve('./latency.spec.ts')); + loadTestFile(require.resolve('./transactions_groups_alerts.spec.ts')); + loadTestFile(require.resolve('./transactions_groups_detailed_statistics.spec.ts')); + loadTestFile(require.resolve('./transactions_groups_main_statistics.spec.ts')); + loadTestFile(require.resolve('./trace_samples.spec.ts')); + }); +} diff --git a/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/latency.spec.ts similarity index 96% rename from x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/latency.spec.ts index eefe5cfb0d0fe..f369bc63ca4ef 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/latency.spec.ts @@ -17,15 +17,15 @@ import { RecursivePartial } from '@kbn/apm-plugin/typings/common'; import { meanBy } from 'lodash'; import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; type LatencyChartReturnType = APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/charts/latency'>; -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -57,10 +57,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); } - registry.when( - 'Latency with a basic license when data is not loaded ', - { config: 'basic', archives: [] }, - () => { + describe('Latency', () => { + describe('when data is not loaded ', () => { it('handles the empty state', async () => { const response = await fetchLatencyCharts(); expect(response.status).to.be(200); @@ -70,19 +68,17 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(latencyChartReturn.currentPeriod.latencyTimeseries.length).to.be(0); expect(latencyChartReturn.previousPeriod.latencyTimeseries.length).to.be(0); }); - } - ); - - // FLAKY: https://github.com/elastic/kibana/issues/177596 - registry.when( - 'Latency with a basic license when data is loaded', - { config: 'basic', archives: [] }, - () => { + }); + + describe('when data is loaded', () => { const GO_PROD_RATE = 80; const GO_DEV_RATE = 20; const GO_PROD_DURATION = 1000; const GO_DEV_DURATION = 500; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); const serviceGoProdInstance = apm .service({ name: serviceName, environment: 'production', agentName: 'go' }) .instance('instance-a'); @@ -439,6 +435,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { } }); }); - } - ); + }); + }); } diff --git a/x-pack/test/apm_api_integration/tests/transactions/latency_overall_distribution.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/latency_overall_distribution.spec.ts similarity index 68% rename from x-pack/test/apm_api_integration/tests/transactions/latency_overall_distribution.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/latency_overall_distribution.spec.ts index 0f6060517db3b..2b78a7b10088d 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/latency_overall_distribution.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/latency_overall_distribution.spec.ts @@ -7,12 +7,12 @@ import expect from '@kbn/expect'; import { LatencyDistributionChartType } from '@kbn/apm-plugin/common/latency_distribution_chart_types'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; +import { ARCHIVER_ROUTES } from '../constants/archiver'; +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const esArchiver = getService('esArchiver'); const endpoint = 'POST /internal/apm/latency/overall_distribution/transactions'; // This matches the parameters used for the other tab's search strategy approach in `../correlations/*`. @@ -29,10 +29,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }); - registry.when.skip( - 'latency overall distribution without data', - { config: 'trial', archives: [] }, - () => { + describe('Latency overall distribution', () => { + describe('without data', () => { it('handles the empty state', async () => { const response = await apmApiClient.readUser({ endpoint, @@ -43,14 +41,17 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.body?.percentileThresholdValue).to.be(undefined); expect(response.body?.overallHistogram?.length).to.be(undefined); }); - } - ); + }); - registry.when.skip( - 'latency overall distribution with data and default args', - // This uses the same archive used for the other tab's search strategy approach in `../correlations/*`. - { config: 'trial', archives: ['8.0.0'] }, - () => { + describe('with data and default args', () => { + before(async () => { + await esArchiver.load(ARCHIVER_ROUTES['8.0.0']); + }); + after(async () => { + await esArchiver.unload(ARCHIVER_ROUTES['8.0.0']); + }); + + // This uses the same archive used for the other tab's search strategy approach in `../correlations/*`. it('returns percentileThresholdValue and overall histogram', async () => { const response = await apmApiClient.readUser({ endpoint, @@ -62,6 +63,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.body?.percentileThresholdValue).to.be(1309695.875); expect(response.body?.overallHistogram?.length).to.be(101); }); - } - ); + }); + }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/trace_samples.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/trace_samples.spec.ts new file mode 100644 index 0000000000000..004165905916d --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/trace_samples.spec.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import archives from '../constants/archives_metadata'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + + const archiveName = 'apm_8.0.0'; + const { start, end } = archives[archiveName]; + + describe('Transaction trace samples', () => { + describe('when data is not loaded', () => { + it('handles empty state', async () => { + const response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/services/{serviceName}/transactions/traces/samples', + params: { + path: { serviceName: 'opbeans-java' }, + query: { + start, + end, + transactionType: 'request', + environment: 'ENVIRONMENT_ALL', + transactionName: 'APIRestController#stats', + kuery: '', + }, + }, + }); + + expect(response.status).to.be(200); + + expect(response.body.traceSamples.length).to.be(0); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_alerts.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_alerts.spec.ts similarity index 73% rename from x-pack/test/apm_api_integration/tests/transactions/transactions_groups_alerts.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_alerts.spec.ts index f6b2c7c3a74a7..6abefb559bc2d 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_alerts.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_alerts.spec.ts @@ -13,26 +13,26 @@ import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { AggregationType } from '@kbn/apm-plugin/common/rules/apm_rule_types'; import { ApmRuleType } from '@kbn/rule-data-utils'; -import { waitForAlertsForRule } from '../alerts/helpers/wait_for_alerts_for_rule'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { createApmRule, runRuleSoon, ApmAlertFields } from '../alerts/helpers/alerting_api_helper'; -import { waitForActiveRule } from '../alerts/helpers/wait_for_active_rule'; -import { cleanupRuleAndAlertState } from '../alerts/helpers/cleanup_rule_and_alert_state'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { RoleCredentials } from '@kbn/ftr-common-functional-services'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; +import { APM_ACTION_VARIABLE_INDEX, APM_ALERTS_INDEX } from '../alerts/helpers/alerting_helper'; type TransactionsGroupsMainStatistics = APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics'>; -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - const supertest = getService('supertest'); - const es = getService('es'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + const alertingApi = getService('alertingApi'); + const samlAuth = getService('samlAuth'); + const serviceName = 'synth-go'; const dayInMs = 24 * 60 * 60 * 1000; const start = Date.now() - dayInMs; const end = Date.now() + dayInMs; - const logger = getService('log'); + + type Alerts = Awaited>; async function getTransactionGroups(overrides?: { path?: { @@ -69,12 +69,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }); expect(response.status).to.be(200); + return response.body as TransactionsGroupsMainStatistics; } - // FLAKY: https://github.com/elastic/kibana/issues/177617 - registry.when('when data is loaded', { config: 'basic', archives: [] }, () => { - describe('Alerts', () => { + describe('Transaction groups alerts', () => { + describe('when data is loaded', () => { const transactions = [ { name: 'GET /api/task/avg', @@ -102,7 +102,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { type: 'request', }, ]; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + let roleAuthc: RoleCredentials; + before(async () => { + roleAuthc = await samlAuth.createM2mApiKeyWithRoleScope('admin'); + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); const serviceGoProdInstance = apm .service({ name: serviceName, environment: 'production', agentName: 'go' }) .instance('instance-a'); @@ -135,16 +140,17 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]); }); - after(() => apmSynthtraceEsClient.clean()); + after(async () => { + await samlAuth.invalidateM2mApiKeyWithRoleScope(roleAuthc); + await apmSynthtraceEsClient.clean(); + }); - // FLAKY: https://github.com/elastic/kibana/issues/198866 - describe.skip('Transaction groups with avg transaction duration alerts', () => { + describe('with avg transaction duration alerts', () => { let ruleId: string; - let alerts: ApmAlertFields[]; + let alerts: Alerts; before(async () => { - const createdRule = await createApmRule({ - supertest, + const createdRule = await alertingApi.createRule({ name: `Latency threshold | ${serviceName}`, params: { serviceName, @@ -163,30 +169,42 @@ export default function ApiTest({ getService }: FtrProviderContext) { ], }, ruleTypeId: ApmRuleType.TransactionDuration, + consumer: 'apm', + roleAuthc, }); ruleId = createdRule.id; - alerts = await waitForAlertsForRule({ es, ruleId }); + alerts = await alertingApi.waitForAlertInIndex({ + ruleId, + indexName: APM_ALERTS_INDEX, + }); }); after(async () => { - await cleanupRuleAndAlertState({ es, supertest, logger }); + await alertingApi.cleanUpAlerts({ + ruleId, + alertIndexName: APM_ALERTS_INDEX, + connectorIndexName: APM_ACTION_VARIABLE_INDEX, + consumer: 'apm', + roleAuthc, + }); }); it('checks if rule is active', async () => { - const ruleStatus = await waitForActiveRule({ ruleId, supertest }); + const ruleStatus = await alertingApi.waitForRuleStatus({ + ruleId, + expectedStatus: 'active', + roleAuthc, + }); expect(ruleStatus).to.be('active'); }); it('should successfully run the rule', async () => { - const response = await runRuleSoon({ - ruleId, - supertest, - }); + const response = await alertingApi.runRule(roleAuthc, ruleId); expect(response.status).to.be(204); }); it('indexes alert document', async () => { - expect(alerts.length).to.be(1); + expect(alerts.hits.hits.length).to.be(1); }); it('returns the correct number of alert counts', async () => { @@ -210,13 +228,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - describe('Transaction groups with p99 transaction duration alerts', () => { + describe('with p99 transaction duration alerts', () => { let ruleId: string; - let alerts: ApmAlertFields[]; + let alerts: Alerts; before(async () => { - const createdRule = await createApmRule({ - supertest, + const createdRule = await alertingApi.createRule({ name: `Latency threshold | ${serviceName}`, params: { serviceName, @@ -235,31 +252,43 @@ export default function ApiTest({ getService }: FtrProviderContext) { ], }, ruleTypeId: ApmRuleType.TransactionDuration, + consumer: 'apm', + roleAuthc, }); ruleId = createdRule.id; - alerts = await waitForAlertsForRule({ es, ruleId }); + alerts = await alertingApi.waitForAlertInIndex({ + ruleId, + indexName: APM_ALERTS_INDEX, + }); }); after(async () => { - await cleanupRuleAndAlertState({ es, supertest, logger }); + await alertingApi.cleanUpAlerts({ + ruleId, + alertIndexName: APM_ALERTS_INDEX, + connectorIndexName: APM_ACTION_VARIABLE_INDEX, + consumer: 'apm', + roleAuthc, + }); }); it('checks if rule is active', async () => { - const ruleStatus = await waitForActiveRule({ ruleId, supertest }); + const ruleStatus = await alertingApi.waitForRuleStatus({ + ruleId, + expectedStatus: 'active', + roleAuthc, + }); expect(ruleStatus).to.be('active'); }); it('should successfully run the rule', async () => { - const response = await runRuleSoon({ - ruleId, - supertest, - }); + const response = await alertingApi.runRule(roleAuthc, ruleId); expect(response.status).to.be(204); }); it('indexes alert document', async () => { - expect(alerts.length).to.be(1); + expect(alerts.hits.hits.length).to.be(1); }); it('returns the correct number of alert counts', async () => { @@ -286,13 +315,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - describe('Transaction groups with error rate alerts', () => { + describe('with error rate alerts', () => { let ruleId: string; - let alerts: ApmAlertFields[]; + let alerts: Alerts; before(async () => { - const createdRule = await createApmRule({ - supertest, + const createdRule = await alertingApi.createRule({ name: `Error rate | ${serviceName}`, params: { serviceName, @@ -310,30 +338,43 @@ export default function ApiTest({ getService }: FtrProviderContext) { ], }, ruleTypeId: ApmRuleType.TransactionErrorRate, + consumer: 'apm', + roleAuthc, }); + ruleId = createdRule.id; - alerts = await waitForAlertsForRule({ es, ruleId }); + alerts = await alertingApi.waitForAlertInIndex({ + ruleId, + indexName: APM_ALERTS_INDEX, + }); }); after(async () => { - await cleanupRuleAndAlertState({ es, supertest, logger }); + await alertingApi.cleanUpAlerts({ + ruleId, + alertIndexName: APM_ALERTS_INDEX, + connectorIndexName: APM_ACTION_VARIABLE_INDEX, + consumer: 'apm', + roleAuthc, + }); }); it('checks if rule is active', async () => { - const ruleStatus = await waitForActiveRule({ ruleId, supertest }); + const ruleStatus = await alertingApi.waitForRuleStatus({ + ruleId, + expectedStatus: 'active', + roleAuthc, + }); expect(ruleStatus).to.be('active'); }); it('should successfully run the rule', async () => { - const response = await runRuleSoon({ - ruleId, - supertest, - }); + const response = await alertingApi.runRule(roleAuthc, ruleId); expect(response.status).to.be(204); }); it('indexes alert document', async () => { - expect(alerts.length).to.be(1); + expect(alerts.hits.hits.length).to.be(1); }); it('returns the correct number of alert counts', async () => { @@ -360,7 +401,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - describe('Transaction groups without alerts', () => { + describe('without alerts', () => { it('returns the correct number of alert counts', async () => { const txGroupsTypeTask = await getTransactionGroups({ query: { transactionType: 'task' }, diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_detailed_statistics.spec.ts similarity index 94% rename from x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_detailed_statistics.spec.ts index 77a4b67b4bc4e..bc0ea9e1f501d 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_detailed_statistics.spec.ts @@ -12,16 +12,16 @@ import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregati import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; import { ApmDocumentType, ApmTransactionDocumentType } from '@kbn/apm-plugin/common/document_type'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { roundNumber } from '../../utils'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { roundNumber } from '../../../../../../apm_api_integration/utils'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; type TransactionsGroupsDetailedStatistics = APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics'>; -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -71,23 +71,21 @@ export default function ApiTest({ getService }: FtrProviderContext) { return response.body; } - registry.when( - 'Transaction groups detailed statistics when data is not loaded', - { config: 'basic', archives: [] }, - () => { + describe('Transactions groups detailed statistics', () => { + describe('when data is not loaded', () => { it('handles the empty state', async () => { const response = await callApi(); expect(response).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); }); - } - ); + }); - // FLAKY: https://github.com/elastic/kibana/issues/177619 - registry.when('data is loaded', { config: 'basic', archives: [] }, () => { - describe('transactions groups detailed stats', () => { + describe('when data is loaded', () => { const GO_PROD_RATE = 75; const GO_PROD_ERROR_RATE = 25; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); const serviceGoProdInstance = apm .service({ name: serviceName, environment: 'production', agentName: 'go' }) .instance('instance-a'); diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_main_statistics.spec.ts similarity index 88% rename from x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_main_statistics.spec.ts index d7c5e78fdcd12..df86780629f4d 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/transactions/transactions_groups_main_statistics.spec.ts @@ -11,12 +11,12 @@ import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregati import { ApmDocumentType, ApmTransactionDocumentType } from '@kbn/apm-plugin/common/document_type'; import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -45,7 +45,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start: new Date(start).toISOString(), end: new Date(end).toISOString(), - latencyAggregationType: 'avg' as LatencyAggregationType, + latencyAggregationType: LatencyAggregationType.avg, transactionType: 'request', environment: 'ENVIRONMENT_ALL', useDurationSummary: false, @@ -60,22 +60,17 @@ export default function ApiTest({ getService }: FtrProviderContext) { return response.body; } - registry.when( - 'Transaction groups main statistics when data is not loaded', - { config: 'basic', archives: [] }, - () => { + describe('Transaction groups main statistics', () => { + describe('when data is not loaded', () => { it('handles the empty state', async () => { const transactionsGroupsPrimaryStatistics = await callApi(); expect(transactionsGroupsPrimaryStatistics.transactionGroups).to.empty(); expect(transactionsGroupsPrimaryStatistics.maxCountExceeded).to.be(false); }); - } - ); + }); - // FLAKY: https://github.com/elastic/kibana/issues/177620 - registry.when('when data is loaded', { config: 'basic', archives: [] }, () => { - describe('Transaction groups main statistics', () => { + describe('when data is loaded', () => { const GO_PROD_RATE = 75; const GO_PROD_ERROR_RATE = 25; const transactions = [ @@ -92,7 +87,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { duration: 1000, }, ]; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); const serviceGoProdInstance = apm .service({ name: serviceName, environment: 'production', agentName: 'go' }) .instance('instance-a'); diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.apm.index.ts b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.apm.index.ts new file mode 100644 index 0000000000000..1bd5cfda82a11 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.apm.index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { DeploymentAgnosticFtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { + describe('Serverless Observability - Deployment-agnostic APM API integration tests', function () { + this.tags(['esGate']); + + // load new oblt APM-only deployment-agnostic test here + loadTestFile(require.resolve('../../apis/observability/apm')); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.apm.serverless.config.ts b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.apm.serverless.config.ts new file mode 100644 index 0000000000000..9d4d8b89a7e6f --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.apm.serverless.config.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createServerlessTestConfig } from '../../default_configs/serverless.config.base'; + +export default createServerlessTestConfig({ + serverlessProject: 'oblt', + testFiles: [require.resolve('./oblt.apm.index.ts')], + junit: { + reportName: 'Serverless Observability - Deployment-agnostic APM API Integration Tests', + }, +}); diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts index 6353f871a8078..abd875f8c17cf 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts @@ -7,10 +7,10 @@ import { DeploymentAgnosticFtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { - describe('Serverless Observability - Deployment-agnostic api integration tests', function () { + describe('Serverless Observability - Deployment-agnostic API integration tests', function () { this.tags(['esGate']); - // load new oblt and platform deployment-agnostic test here + // load new oblt (except APM) and platform deployment-agnostic test here loadTestFile(require.resolve('../../apis/console')); loadTestFile(require.resolve('../../apis/core')); loadTestFile(require.resolve('../../apis/management')); @@ -20,6 +20,5 @@ export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) loadTestFile(require.resolve('../../apis/painless_lab')); loadTestFile(require.resolve('../../apis/saved_objects_management')); loadTestFile(require.resolve('../../apis/observability/slo')); - loadTestFile(require.resolve('../../apis/observability/apm')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.apm.index.ts b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.apm.index.ts new file mode 100644 index 0000000000000..9e7869bfacde0 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.apm.index.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 { DeploymentAgnosticFtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { + describe('Stateful Observability - Deployment-agnostic APM API integration tests', () => { + loadTestFile(require.resolve('../../apis/observability/apm')); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.apm.stateful.config.ts b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.apm.stateful.config.ts new file mode 100644 index 0000000000000..e4eca8228aa18 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.apm.stateful.config.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createStatefulTestConfig } from '../../default_configs/stateful.config.base'; + +export default createStatefulTestConfig({ + testFiles: [require.resolve('./oblt.apm.index.ts')], + junit: { + reportName: 'Stateful Observability - Deployment-agnostic APM API Integration Tests', + }, +}); diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts index c5a3ad90f81f4..4f21d708d4186 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts @@ -8,12 +8,11 @@ import { DeploymentAgnosticFtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { - describe('apis', () => { - // load new oblt deployment-agnostic test here + describe('Stateful Observability - Deployment-agnostic API integration tests', () => { + // load new oblt (except APM) deployment-agnostic tests here loadTestFile(require.resolve('../../apis/observability/alerting')); loadTestFile(require.resolve('../../apis/observability/dataset_quality')); loadTestFile(require.resolve('../../apis/observability/slo')); loadTestFile(require.resolve('../../apis/observability/infra')); - loadTestFile(require.resolve('../../apis/observability/apm')); }); } diff --git a/x-pack/test/api_integration/services/security_solution_api.gen.ts b/x-pack/test/api_integration/services/security_solution_api.gen.ts index 6ba76b071d860..3574199709aee 100644 --- a/x-pack/test/api_integration/services/security_solution_api.gen.ts +++ b/x-pack/test/api_integration/services/security_solution_api.gen.ts @@ -140,6 +140,7 @@ import { StopRuleMigrationRequestParamsInput } from '@kbn/security-solution-plug import { SuggestUserProfilesRequestQueryInput } from '@kbn/security-solution-plugin/common/api/detection_engine/users/suggest_user_profiles_route.gen'; import { TriggerRiskScoreCalculationRequestBodyInput } from '@kbn/security-solution-plugin/common/api/entity_analytics/risk_engine/entity_calculation_route.gen'; import { UpdateRuleRequestBodyInput } from '@kbn/security-solution-plugin/common/api/detection_engine/rule_management/crud/update_rule/update_rule_route.gen'; +import { UpdateRuleMigrationRequestBodyInput } from '@kbn/security-solution-plugin/common/siem_migrations/model/api/rules/rule_migration.gen'; import { UpsertRuleMigrationResourcesRequestParamsInput, UpsertRuleMigrationResourcesRequestBodyInput, @@ -1434,6 +1435,17 @@ detection engine rules. .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Updates rules migrations attributes + */ + updateRuleMigration(props: UpdateRuleMigrationProps, kibanaSpace: string = 'default') { + return supertest + .put(routeWithNamespace('/internal/siem_migrations/rules', kibanaSpace)) + .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send(props.body as object); + }, uploadAssetCriticalityRecords(kibanaSpace: string = 'default') { return supertest .post(routeWithNamespace('/api/asset_criticality/upload_csv', kibanaSpace)) @@ -1727,6 +1739,9 @@ export interface TriggerRiskScoreCalculationProps { export interface UpdateRuleProps { body: UpdateRuleRequestBodyInput; } +export interface UpdateRuleMigrationProps { + body: UpdateRuleMigrationRequestBodyInput; +} export interface UpsertRuleMigrationResourcesProps { params: UpsertRuleMigrationResourcesRequestParamsInput; body: UpsertRuleMigrationResourcesRequestBodyInput; diff --git a/x-pack/test/api_integration_basic/apis/security_solution/cases_privileges.ts b/x-pack/test/api_integration_basic/apis/security_solution/cases_privileges.ts index a39796f1f4448..2a85320d14edf 100644 --- a/x-pack/test/api_integration_basic/apis/security_solution/cases_privileges.ts +++ b/x-pack/test/api_integration_basic/apis/security_solution/cases_privileges.ts @@ -37,7 +37,7 @@ const secAll: Role = { { feature: { siem: ['all'], - securitySolutionCases: ['all'], + securitySolutionCasesV2: ['all'], actions: ['all'], actionsSimulators: ['all'], }, @@ -68,7 +68,7 @@ const secRead: Role = { { feature: { siem: ['read'], - securitySolutionCases: ['read'], + securitySolutionCasesV2: ['read'], actions: ['all'], actionsSimulators: ['all'], }, diff --git a/x-pack/test/apm_api_integration/tests/service_groups/service_group_count/generate_data.ts b/x-pack/test/apm_api_integration/tests/service_groups/service_group_count/generate_data.ts deleted file mode 100644 index 7f9b1487bb8ef..0000000000000 --- a/x-pack/test/apm_api_integration/tests/service_groups/service_group_count/generate_data.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; - -export async function generateData({ - apmSynthtraceEsClient, - start, - end, -}: { - apmSynthtraceEsClient: ApmSynthtraceEsClient; - start: number; - end: number; -}) { - const synthServices = [ - apm - .service({ name: 'synth-go', environment: 'testing', agentName: 'go' }) - .instance('instance-1'), - apm - .service({ name: 'synth-java', environment: 'testing', agentName: 'java' }) - .instance('instance-2'), - apm - .service({ name: 'opbeans-node', environment: 'testing', agentName: 'nodejs' }) - .instance('instance-3'), - ]; - - await apmSynthtraceEsClient.index( - synthServices.map((service) => - timerange(start, end) - .interval('5m') - .rate(1) - .generator((timestamp) => - service - .transaction({ - transactionName: 'GET /api/product/list', - transactionType: 'request', - }) - .duration(2000) - .timestamp(timestamp) - .children( - service - .span({ - spanName: '/_search', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .destination('elasticsearch') - .duration(100) - .success() - .timestamp(timestamp), - service - .span({ - spanName: '/_search', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .destination('elasticsearch') - .duration(300) - .success() - .timestamp(timestamp) - ) - .errors( - service.error({ message: 'error 1', type: 'foo' }).timestamp(timestamp), - service.error({ message: 'error 2', type: 'foo' }).timestamp(timestamp), - service.error({ message: 'error 3', type: 'bar' }).timestamp(timestamp) - ) - ) - ) - ); -} diff --git a/x-pack/test/apm_api_integration/tests/service_groups/service_group_count/service_group_count.spec.ts b/x-pack/test/apm_api_integration/tests/service_groups/service_group_count/service_group_count.spec.ts deleted file mode 100644 index 8b43114ba0ed6..0000000000000 --- a/x-pack/test/apm_api_integration/tests/service_groups/service_group_count/service_group_count.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { AggregationType } from '@kbn/apm-plugin/common/rules/apm_rule_types'; -import { ApmRuleType } from '@kbn/rule-data-utils'; -import expect from '@kbn/expect'; -import { waitForActiveApmAlert } from '../../alerts/helpers/wait_for_active_apm_alerts'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; -import { createApmRule } from '../../alerts/helpers/alerting_api_helper'; -import { cleanupRuleAndAlertState } from '../../alerts/helpers/cleanup_rule_and_alert_state'; -import { - createServiceGroupApi, - deleteAllServiceGroups, - getServiceGroupCounts, -} from '../service_groups_api_methods'; -import { generateData } from './generate_data'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const supertest = getService('supertest'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - const es = getService('es'); - const log = getService('log'); - const start = Date.now() - 24 * 60 * 60 * 1000; - const end = Date.now(); - - function createRule() { - return createApmRule({ - supertest, - name: 'Latency threshold | synth-go', - params: { - serviceName: 'synth-go', - transactionType: undefined, - windowSize: 5, - windowUnit: 'h', - threshold: 100, - aggregationType: AggregationType.Avg, - environment: 'testing', - }, - ruleTypeId: ApmRuleType.TransactionDuration, - }); - } - - // FLAKY: https://github.com/elastic/kibana/issues/177655 - registry.when('Service group counts', { config: 'basic', archives: [] }, () => { - let synthbeansServiceGroupId: string; - let opbeansServiceGroupId: string; - before(async () => { - const [, { body: synthbeansServiceGroup }, { body: opbeansServiceGroup }] = await Promise.all( - [ - generateData({ start, end, apmSynthtraceEsClient }), - createServiceGroupApi({ - apmApiClient, - groupName: 'synthbeans', - kuery: 'service.name: synth*', - }), - createServiceGroupApi({ - apmApiClient, - groupName: 'opbeans', - kuery: 'service.name: opbeans*', - }), - ] - ); - synthbeansServiceGroupId = synthbeansServiceGroup.id; - opbeansServiceGroupId = opbeansServiceGroup.id; - }); - - after(async () => { - await deleteAllServiceGroups(apmApiClient); - await apmSynthtraceEsClient.clean(); - }); - - describe('with alerts', () => { - let ruleId: string; - before(async () => { - const createdRule = await createRule(); - ruleId = createdRule.id; - await waitForActiveApmAlert({ ruleId, esClient: es, log }); - }); - - after(async () => { - await cleanupRuleAndAlertState({ es, supertest, logger: log }); - }); - - it('returns the correct number of alerts', async () => { - const response = await getServiceGroupCounts(apmApiClient); - expect(response.status).to.be(200); - expect(Object.keys(response.body).length).to.be(2); - expect(response.body[synthbeansServiceGroupId]).to.have.property('alerts', 1); - expect(response.body[opbeansServiceGroupId]).to.have.property('alerts', 0); - }); - }); - }); -} diff --git a/x-pack/test/apm_api_integration/tests/service_groups/service_groups_api_methods.ts b/x-pack/test/apm_api_integration/tests/service_groups/service_groups_api_methods.ts deleted file mode 100644 index 2d0e5405cc3d1..0000000000000 --- a/x-pack/test/apm_api_integration/tests/service_groups/service_groups_api_methods.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ApmApiClient } from '../../common/config'; - -export async function getServiceGroupsApi(apmApiClient: ApmApiClient) { - return apmApiClient.writeUser({ - endpoint: 'GET /internal/apm/service-groups', - }); -} - -export async function createServiceGroupApi({ - apmApiClient, - serviceGroupId, - groupName, - kuery, - description, - color, -}: { - apmApiClient: ApmApiClient; - serviceGroupId?: string; - groupName: string; - kuery: string; - description?: string; - color?: string; -}) { - const response = await apmApiClient.writeUser({ - endpoint: 'POST /internal/apm/service-group', - params: { - query: { - serviceGroupId, - }, - body: { - groupName, - kuery, - description, - color, - }, - }, - }); - return response; -} - -export async function getServiceGroupCounts(apmApiClient: ApmApiClient) { - return apmApiClient.readUser({ - endpoint: 'GET /internal/apm/service-group/counts', - }); -} - -export async function deleteAllServiceGroups(apmApiClient: ApmApiClient) { - return await getServiceGroupsApi(apmApiClient).then((response) => { - const promises = response.body.serviceGroups.map((item) => { - if (item.id) { - return apmApiClient.writeUser({ - endpoint: 'DELETE /internal/apm/service-group', - params: { query: { serviceGroupId: item.id } }, - }); - } - }); - return Promise.all(promises); - }); -} diff --git a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap b/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap deleted file mode 100644 index f3fb16ec38b15..0000000000000 --- a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap +++ /dev/null @@ -1,30 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`APM API tests service_overview/instance_details.spec.ts basic no archive Instance details when data is loaded fetch instance details return the correct data 1`] = ` -Object { - "agent": Object { - "name": "java", - }, - "container": Object { - "id": "123", - }, - "host": Object { - "name": "multiple-env-service-production", - }, - "kubernetes": Object { - "container": Object {}, - "deployment": Object {}, - "pod": Object { - "uid": "234", - }, - "replicaset": Object {}, - }, - "service": Object { - "environment": "production", - "name": "service1", - "node": Object { - "name": "multiple-env-service-production", - }, - }, -} -`; diff --git a/x-pack/test/apm_api_integration/tests/service_overview/dependencies/index.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/dependencies/index.spec.ts index 0e841e26ddde4..fd06ee9f95266 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/dependencies/index.spec.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/dependencies/index.spec.ts @@ -6,23 +6,16 @@ */ import expect from '@kbn/expect'; -import { last, omit, pick, sortBy } from 'lodash'; -import { ValuesType } from 'utility-types'; -import { Node, NodeType } from '@kbn/apm-plugin/common/connections'; -import { - ENVIRONMENT_ALL, - ENVIRONMENT_NOT_DEFINED, -} from '@kbn/apm-plugin/common/environment_filter_values'; -import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { roundNumber } from '../../../utils'; +import { omit, sortBy } from 'lodash'; +import { type Node, NodeType } from '@kbn/apm-plugin/common/connections'; +import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; +import type { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import archives from '../../../common/fixtures/es_archiver/archives_metadata'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; -import { apmDependenciesMapping, createServiceDependencyDocs } from './es_utils'; +import type { FtrProviderContext } from '../../../common/ftr_provider_context'; export default function ApiTest({ getService }: FtrProviderContext) { const registry = getService('registry'); const apmApiClient = getService('apmApiClient'); - const es = getService('es'); const archiveName = 'apm_8.0.0'; const { start, end } = archives[archiveName]; @@ -31,278 +24,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { return node.type === NodeType.service ? node.serviceName : node.dependencyName; } - registry.when( - 'Service overview dependencies when data is not loaded', - { config: 'basic', archives: [] }, - () => { - it('handles the empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/dependencies`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - start, - end, - numBuckets: 20, - environment: ENVIRONMENT_ALL.value, - }, - }, - }); - - expect(response.status).to.be(200); - expect(response.body.serviceDependencies).to.eql([]); - }); - } - ); - - registry.when( - 'Service overview dependencies when specific data is loaded', - { config: 'basic', archives: [] }, - () => { - let response: { - status: number; - body: APIReturnType<'GET /internal/apm/services/{serviceName}/dependencies'>; - }; - - const indices = { - metric: 'apm-dependencies-metric', - transaction: 'apm-dependencies-transaction', - span: 'apm-dependencies-span', - }; - - const startTime = new Date(start).getTime(); - const endTime = new Date(end).getTime(); - - after(async () => { - const allIndices = Object.values(indices).join(','); - const indexExists = await es.indices.exists({ index: allIndices }); - if (indexExists) { - await es.indices.delete({ - index: allIndices, - }); - } - }); - - before(async () => { - await es.indices.create({ - index: indices.metric, - body: { - mappings: apmDependenciesMapping, - }, - }); - - await es.indices.create({ - index: indices.transaction, - body: { - mappings: apmDependenciesMapping, - }, - }); - - await es.indices.create({ - index: indices.span, - body: { - mappings: apmDependenciesMapping, - }, - }); - - const docs = [ - ...createServiceDependencyDocs({ - service: { - name: 'opbeans-java', - environment: 'production', - }, - agentName: 'java', - span: { - type: 'external', - subtype: 'http', - }, - resource: 'opbeans-node:3000', - outcome: 'success', - responseTime: { - count: 2, - sum: 10, - }, - time: startTime, - to: { - service: { - name: 'opbeans-node', - }, - agentName: 'nodejs', - }, - }), - ...createServiceDependencyDocs({ - service: { - name: 'opbeans-java', - environment: 'production', - }, - agentName: 'java', - span: { - type: 'external', - subtype: 'http', - }, - resource: 'opbeans-node:3000', - outcome: 'failure', - responseTime: { - count: 1, - sum: 10, - }, - time: startTime, - }), - ...createServiceDependencyDocs({ - service: { - name: 'opbeans-java', - environment: 'production', - }, - agentName: 'java', - span: { - type: 'external', - subtype: 'http', - }, - resource: 'postgres', - outcome: 'success', - responseTime: { - count: 1, - sum: 3, - }, - time: startTime, - }), - ...createServiceDependencyDocs({ - service: { - name: 'opbeans-java', - environment: 'production', - }, - agentName: 'java', - span: { - type: 'external', - subtype: 'http', - }, - resource: 'opbeans-node-via-proxy', - outcome: 'success', - responseTime: { - count: 1, - sum: 1, - }, - time: endTime - 1, - to: { - service: { - name: 'opbeans-node', - }, - agentName: 'nodejs', - }, - }), - ]; - - const bulkActions = docs.reduce( - (prev, doc) => { - return [...prev, { index: { _index: indices[doc.processor.event] } }, doc]; - }, - [] as Array< - | { - index: { - _index: string; - }; - } - | ValuesType - > - ); - - await es.bulk({ - body: bulkActions, - refresh: 'wait_for', - }); - - response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/dependencies`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - start, - end, - numBuckets: 20, - environment: ENVIRONMENT_ALL.value, - }, - }, - }); - }); - - it('returns a 200', () => { - expect(response.status).to.be(200); - }); - - it('returns two dependencies', () => { - expect(response.body.serviceDependencies.length).to.be(2); - }); - - it('returns opbeans-node as a dependency', () => { - const opbeansNode = response.body.serviceDependencies.find( - (item) => getName(item.location) === 'opbeans-node' - ); - - expect(opbeansNode !== undefined).to.be(true); - - const values = { - latency: roundNumber(opbeansNode?.currentStats.latency.value), - throughput: roundNumber(opbeansNode?.currentStats.throughput.value), - errorRate: roundNumber(opbeansNode?.currentStats.errorRate.value), - impact: opbeansNode?.currentStats.impact, - ...pick(opbeansNode?.location, 'serviceName', 'type', 'agentName', 'environment'), - }; - - const count = 4; - const sum = 21; - const errors = 1; - - expect(values).to.eql({ - agentName: 'nodejs', - environment: ENVIRONMENT_NOT_DEFINED.value, - serviceName: 'opbeans-node', - type: 'service', - errorRate: roundNumber(errors / count), - latency: roundNumber(sum / count), - throughput: roundNumber(count / ((endTime - startTime) / 1000 / 60)), - impact: 100, - }); - - const firstValue = roundNumber(opbeansNode?.currentStats.latency.timeseries[0].y); - const lastValue = roundNumber(last(opbeansNode?.currentStats.latency.timeseries)?.y); - - expect(firstValue).to.be(roundNumber(20 / 3)); - expect(lastValue).to.be(1); - }); - - it('returns postgres as an external dependency', () => { - const postgres = response.body.serviceDependencies.find( - (item) => getName(item.location) === 'postgres' - ); - - expect(postgres !== undefined).to.be(true); - - const values = { - latency: roundNumber(postgres?.currentStats.latency.value), - throughput: roundNumber(postgres?.currentStats.throughput.value), - errorRate: roundNumber(postgres?.currentStats.errorRate.value), - impact: postgres?.currentStats.impact, - ...pick(postgres?.location, 'spanType', 'spanSubtype', 'dependencyName', 'type'), - }; - - const count = 1; - const sum = 3; - const errors = 0; - - expect(values).to.eql({ - spanType: 'external', - spanSubtype: 'http', - dependencyName: 'postgres', - type: 'dependency', - errorRate: roundNumber(errors / count), - latency: roundNumber(sum / count), - throughput: roundNumber(count / ((endTime - startTime) / 1000 / 60)), - impact: 0, - }); - }); - } - ); - registry.when( 'Service overview dependencies when data is loaded', { config: 'basic', archives: [archiveName] }, @@ -311,7 +32,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { status: number; body: APIReturnType<'GET /internal/apm/services/{serviceName}/dependencies'>; }; - // eslint-disable-next-line mocha/no-sibling-hooks + before(async () => { response = await apmApiClient.readUser({ endpoint: `GET /internal/apm/services/{serviceName}/dependencies`, diff --git a/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts b/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts index ad3e872bcc879..751f772fb7507 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts @@ -6,7 +6,7 @@ */ import { take } from 'lodash'; import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; -import { ApmServices } from '../../common/config'; +import type { ApmServices } from '../../common/config'; export async function getServiceNodeIds({ apmApiClient, diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts deleted file mode 100644 index 013237934904f..0000000000000 --- a/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import expect from '@kbn/expect'; -import { omit } from 'lodash'; -import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { getServiceNodeIds } from './get_service_node_ids'; - -type ServiceOverviewInstanceDetails = - APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const synthtrace = getService('apmSynthtraceEsClient'); - - const start = '2023-08-22T00:00:00.000Z'; - const end = '2023-08-22T01:00:00.000Z'; - - registry.when( - 'Instance details when data is not loaded', - { config: 'basic', archives: [] }, - () => { - describe('when data is not loaded', () => { - it('handles empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: - 'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}', - params: { - path: { serviceName: 'opbeans-java', serviceNodeName: 'foo' }, - query: { - start, - end, - }, - }, - }); - - expect(response.status).to.be(200); - expect(response.body).to.eql({}); - }); - }); - } - ); - - // FLAKY: https://github.com/elastic/kibana/issues/177494 - registry.when('Instance details when data is loaded', { config: 'basic', archives: [] }, () => { - const range = timerange(new Date(start).getTime(), new Date(end).getTime()); - - const serviceInstance = apm - .service({ name: 'service1', environment: 'production', agentName: 'go' }) - .instance('multiple-env-service-production'); - - const metricOnlyInstance = apm - .service({ name: 'service1', environment: 'production', agentName: 'java' }) - .instance('multiple-env-service-production'); - - before(async () => { - return synthtrace.index([ - range - .interval('1s') - .rate(4) - .generator((timestamp) => - serviceInstance - .transaction({ transactionName: 'GET /api' }) - .timestamp(timestamp) - .duration(1000) - .success() - ), - range - .interval('30s') - .rate(1) - .generator((timestamp) => - metricOnlyInstance - .containerId('123') - .podId('234') - .appMetrics({ - 'system.memory.actual.free': 1, - 'system.cpu.total.norm.pct': 1, - 'system.memory.total': 1, - 'system.process.cpu.total.norm.pct': 1, - }) - .timestamp(timestamp) - ), - ]); - }); - - after(() => { - return synthtrace.clean(); - }); - - describe('fetch instance details', () => { - let response: { - status: number; - body: ServiceOverviewInstanceDetails; - }; - - let serviceNodeIds: string[]; - - before(async () => { - serviceNodeIds = await getServiceNodeIds({ - apmApiClient, - start, - end, - serviceName: 'service1', - }); - - response = await apmApiClient.readUser({ - endpoint: - 'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}', - params: { - path: { serviceName: 'service1', serviceNodeName: serviceNodeIds[0] }, - query: { - start, - end, - }, - }, - }); - }); - - it('returns the instance details', () => { - expect(response.body).to.not.eql({}); - }); - - it('return the correct data', () => { - expectSnapshot(omit(response.body, '@timestamp')).toMatch(); - }); - }); - }); - - registry.when( - 'Instance details when data is loaded but details not found', - { config: 'basic', archives: [] }, - () => { - it('handles empty state when instance id not found', async () => { - const response = await apmApiClient.readUser({ - endpoint: - 'GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}', - params: { - path: { serviceName: 'opbeans-java', serviceNodeName: 'foo' }, - query: { - start, - end, - }, - }, - }); - expect(response.status).to.be(200); - expect(response.body).to.eql({}); - }); - } - ); -} diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances_detailed_statistics.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances_detailed_statistics.spec.ts index 10cd3889613ab..af28697a254c2 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances_detailed_statistics.spec.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instances_detailed_statistics.spec.ts @@ -7,11 +7,11 @@ import expect from '@kbn/expect'; import moment from 'moment'; -import { Coordinate } from '@kbn/apm-plugin/typings/timeseries'; +import type { Coordinate } from '@kbn/apm-plugin/typings/timeseries'; import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; import { isFiniteNumber } from '@kbn/apm-plugin/common/utils/is_finite_number'; -import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import type { FtrProviderContext } from '../../common/ftr_provider_context'; import archives from '../../common/fixtures/es_archiver/archives_metadata'; import { getServiceNodeIds } from './get_service_node_ids'; @@ -28,39 +28,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { body: APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; } - registry.when( - 'Service overview instances detailed statistics when data is not loaded', - { config: 'basic', archives: [] }, - () => { - describe('when data is not loaded', () => { - it('handles the empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: - 'GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics', - params: { - path: { serviceName }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - start, - end, - numBuckets: 20, - transactionType: 'request', - serviceNodeIds: JSON.stringify( - await getServiceNodeIds({ apmApiClient, start, end }) - ), - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, - }); - - expect(response.status).to.be(200); - expect(response.body).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); - }); - }); - } - ); - registry.when( 'Service overview instances detailed statistics when data is loaded', { config: 'basic', archives: [archiveName] }, diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts deleted file mode 100644 index b0a6bf51d1ccf..0000000000000 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts +++ /dev/null @@ -1,691 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import expect from '@kbn/expect'; -import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { apm, Instance, timerange } from '@kbn/apm-synthtrace-client'; -import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; -import { InstancesSortField } from '@kbn/apm-plugin/common/instances'; -import { sum } from 'lodash'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { roundNumber } from '../../utils'; - -type ServiceOverviewInstancesMainStatistics = - APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const synthtrace = getService('apmSynthtraceEsClient'); - - const start = new Date('2021-01-01T00:00:00.000Z').getTime(); - const end = new Date('2021-01-01T00:10:00.000Z').getTime(); - - async function getServiceOverviewInstancesMainStatistics({ - serviceName, - sortField = 'throughput', - sortDirection = 'desc', - }: { - serviceName: string; - sortField?: InstancesSortField; - sortDirection?: 'asc' | 'desc'; - }) { - const { body } = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - transactionType: 'request', - environment: 'production', - kuery: '', - sortField, - sortDirection, - }, - }, - }); - - return body.currentPeriod; - } - - registry.when( - 'Instances main statistics when data is not loaded', - { config: 'basic', archives: [] }, - () => { - describe('when data is not loaded', () => { - it('handles empty state', async () => { - const response = await getServiceOverviewInstancesMainStatistics({ serviceName: 'foo' }); - expect(response).to.eql({}); - }); - }); - } - ); - - // FLAKY: https://github.com/elastic/kibana/issues/177492 - registry.when( - 'Instances main statistics when data is loaded', - { config: 'basic', archives: [] }, - () => { - describe('Return Top 100 instances', () => { - const serviceName = 'synth-node-1'; - before(() => { - const range = timerange(start, end); - const transactionName = 'foo'; - - const successfulTimestamps = range.interval('1m').rate(1); - const failedTimestamps = range.interval('1m').rate(1); - - const instances = [...Array(200).keys()].map((index) => - apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance(`instance-${index}`) - ); - - const instanceSpans = (instance: Instance) => { - const successfulTraceEvents = successfulTimestamps.generator((timestamp) => - instance - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .success() - .children( - instance - .span({ - spanName: 'GET apm-*/_search', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .duration(1000) - .success() - .destination('elasticsearch') - .timestamp(timestamp), - instance - .span({ spanName: 'custom_operation', spanType: 'custom' }) - .duration(100) - .success() - .timestamp(timestamp) - ) - ); - - const failedTraceEvents = failedTimestamps.generator((timestamp) => - instance - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instance - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - ); - - const metricsets = range - .interval('30s') - .rate(1) - .generator((timestamp) => - instance - .appMetrics({ - 'system.memory.actual.free': 800, - 'system.memory.total': 1000, - 'system.cpu.total.norm.pct': 0.6, - 'system.process.cpu.total.norm.pct': 0.7, - }) - .timestamp(timestamp) - ); - - return [successfulTraceEvents, failedTraceEvents, metricsets]; - }; - - return synthtrace.index(instances.flatMap((instance) => instanceSpans(instance))); - }); - - after(() => { - return synthtrace.clean(); - }); - describe('fetch instances', () => { - let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - before(async () => { - instancesMainStats = await getServiceOverviewInstancesMainStatistics({ - serviceName, - }); - }); - it('returns top 100 instances', () => { - expect(instancesMainStats.length).to.be(100); - }); - }); - }); - - describe('Order by error rate', () => { - const serviceName = 'synth-node-1'; - before(async () => { - const range = timerange(start, end); - const transactionName = 'foo'; - /** - * Instance A - * 90 transactions = Success - * 10 transactions = Failure - * Error rate: 10% - */ - const instanceA = apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance('instance-A'); - const instanceASuccessfulTraceEvents = range - .interval('1m') - .rate(10) - .generator((timestamp, index) => - index < 10 - ? instanceA - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instanceA - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - : instanceA - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .success() - ); - /** - * Instance B - * 1 transactions = Success - * 9 transactions = Failure - * Error rate: 90% - */ - const instanceB = apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance('instance-B'); - const instanceBSuccessfulTraceEvents = range - .interval('1m') - .rate(1) - .generator((timestamp, index) => - index === 0 - ? instanceB - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .success() - : instanceB - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instanceB - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - ); - /** - * Instance C - * 2 transactions = Success - * 8 transactions = Failure - * Error rate: 80% - */ - const instanceC = apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance('instance-C'); - const instanceCSuccessfulTraceEvents = range - .interval('1m') - .rate(1) - .generator((timestamp, index) => - index < 2 - ? instanceC - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .success() - : instanceC - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instanceC - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - ); - /** - * Instance D - * 0 transactions = Success - * 10 transactions = Failure - * Error rate: 100% - */ - const instanceD = apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance('instance-D'); - const instanceDSuccessfulTraceEvents = range - .interval('1m') - .rate(1) - .generator((timestamp) => - instanceD - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instanceD - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - ); - /** - * Instance E - * 10 transactions = Success - * 0 transactions = Failure - * Error rate: 0% - */ - const instanceE = apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance('instance-E'); - const instanceESuccessfulTraceEvents = range - .interval('1m') - .rate(1) - .generator((timestamp) => - instanceE - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(1000) - .success() - ); - return synthtrace.index([ - instanceASuccessfulTraceEvents, - instanceBSuccessfulTraceEvents, - instanceCSuccessfulTraceEvents, - instanceDSuccessfulTraceEvents, - instanceESuccessfulTraceEvents, - ]); - }); - - after(() => { - return synthtrace.clean(); - }); - describe('sort by error rate asc', () => { - let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - before(async () => { - instancesMainStats = await getServiceOverviewInstancesMainStatistics({ - serviceName, - sortField: 'errorRate', - sortDirection: 'asc', - }); - }); - it('returns instances sorted asc', () => { - expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ - 0, 0.1, 0.8, 0.9, 1, - ]); - }); - }); - describe('sort by error rate desc', () => { - let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - before(async () => { - instancesMainStats = await getServiceOverviewInstancesMainStatistics({ - serviceName, - sortField: 'errorRate', - sortDirection: 'desc', - }); - }); - it('returns instances sorted desc', () => { - expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ - 1, 0.9, 0.8, 0.1, 0, - ]); - }); - }); - }); - - describe('with transactions and system metrics', () => { - const serviceName = 'synth-node-1'; - before(async () => { - const range = timerange(start, end); - const transactionName = 'foo'; - const instances = Array(3) - .fill(0) - .map((_, idx) => { - const index = idx + 1; - return { - instance: apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance(`instance-${index}`), - duration: index * 1000, - rate: index * 10, - errorRate: 5, - }; - }); - - return synthtrace.index( - instances.flatMap(({ instance, duration, rate, errorRate }) => { - const successfulTraceEvents = range - .interval('1m') - .rate(rate) - .generator((timestamp) => - instance - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(duration) - .success() - ); - const failedTraceEvents = range - .interval('1m') - .rate(errorRate) - .generator((timestamp) => - instance - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(duration) - .failure() - .errors( - instance - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - ); - const metricsets = range - .interval('30s') - .rate(1) - .generator((timestamp) => - instance - .appMetrics({ - 'system.memory.actual.free': 800, - 'system.memory.total': 1000, - 'system.cpu.total.norm.pct': 0.6, - 'system.process.cpu.total.norm.pct': 0.7, - }) - .timestamp(timestamp) - ); - return [successfulTraceEvents, failedTraceEvents, metricsets]; - }) - ); - }); - - after(() => { - return synthtrace.clean(); - }); - - describe('test order of items', () => { - ( - [ - { - field: 'throughput', - direction: 'asc', - expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], - expectedValues: [15, 25, 35], - }, - { - field: 'throughput', - direction: 'desc', - expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], - expectedValues: [35, 25, 15], - }, - { - field: 'latency', - direction: 'asc', - expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], - expectedValues: [1000000, 2000000, 3000000], - }, - { - field: 'latency', - direction: 'desc', - expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], - expectedValues: [3000000, 2000000, 1000000], - }, - { - field: 'serviceNodeName', - direction: 'asc', - expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], - }, - { - field: 'serviceNodeName', - direction: 'desc', - expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], - }, - ] as Array<{ - field: InstancesSortField; - direction: 'asc' | 'desc'; - expectedServiceNodeNames: string[]; - expectedValues?: number[]; - }> - ).map(({ field, direction, expectedServiceNodeNames, expectedValues }) => - describe(`fetch instances main statistics ordered by ${field} ${direction}`, () => { - let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - - before(async () => { - instancesMainStats = await getServiceOverviewInstancesMainStatistics({ - serviceName, - sortField: field, - sortDirection: direction, - }); - }); - - it('returns ordered instance main stats', () => { - expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql( - expectedServiceNodeNames - ); - if (expectedValues) { - expect( - instancesMainStats.map((item) => { - const value = item[field]; - if (typeof value === 'number') { - return roundNumber(value); - } - return value; - }) - ).to.eql(expectedValues); - } - }); - - it('returns system metrics', () => { - expect(instancesMainStats.map((item) => roundNumber(item.cpuUsage))).to.eql([ - 0.7, 0.7, 0.7, - ]); - expect(instancesMainStats.map((item) => roundNumber(item.memoryUsage))).to.eql([ - 0.2, 0.2, 0.2, - ]); - }); - }) - ); - }); - }); - - describe('with transactions only', () => { - const serviceName = 'synth-node-1'; - before(async () => { - const range = timerange(start, end); - const transactionName = 'foo'; - const instances = Array(3) - .fill(0) - .map((_, idx) => { - const index = idx + 1; - return { - instance: apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance(`instance-${index}`), - duration: index * 1000, - rate: index * 10, - errorRate: 5, - }; - }); - - return synthtrace.index( - instances.flatMap(({ instance, duration, rate, errorRate }) => { - const successfulTraceEvents = range - .interval('1m') - .rate(rate) - .generator((timestamp) => - instance - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(duration) - .success() - ); - const failedTraceEvents = range - .interval('1m') - .rate(errorRate) - .generator((timestamp) => - instance - .transaction({ transactionName }) - .timestamp(timestamp) - .duration(duration) - .failure() - .errors( - instance - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - ); - return [successfulTraceEvents, failedTraceEvents]; - }) - ); - }); - - after(() => { - return synthtrace.clean(); - }); - - describe(`Fetch main statistics`, () => { - let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - - before(async () => { - instancesMainStats = await getServiceOverviewInstancesMainStatistics({ - serviceName, - }); - }); - - it('returns instances name', () => { - expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ - 'instance-3', - 'instance-2', - 'instance-1', - ]); - }); - - it('returns throughput', () => { - expect(sum(instancesMainStats.map((item) => item.throughput))).to.greaterThan(0); - }); - - it('returns latency', () => { - expect(sum(instancesMainStats.map((item) => item.latency))).to.greaterThan(0); - }); - - it('returns errorRate', () => { - expect(sum(instancesMainStats.map((item) => item.errorRate))).to.greaterThan(0); - }); - - it('does not return cpu usage', () => { - expect( - instancesMainStats.map((item) => item.cpuUsage).filter((value) => value !== undefined) - ).to.eql([]); - }); - - it('does not return memory usage', () => { - expect( - instancesMainStats - .map((item) => item.memoryUsage) - .filter((value) => value !== undefined) - ).to.eql([]); - }); - }); - }); - - describe('with system metrics only', () => { - const serviceName = 'synth-node-1'; - before(async () => { - const range = timerange(start, end); - const instances = Array(3) - .fill(0) - .map((_, idx) => - apm - .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) - .instance(`instance-${idx + 1}`) - ); - - return synthtrace.index( - instances.map((instance) => { - const metricsets = range - .interval('30s') - .rate(1) - .generator((timestamp) => - instance - .appMetrics({ - 'system.memory.actual.free': 800, - 'system.memory.total': 1000, - 'system.cpu.total.norm.pct': 0.6, - 'system.process.cpu.total.norm.pct': 0.7, - }) - .timestamp(timestamp) - ); - return metricsets; - }) - ); - }); - - after(() => { - return synthtrace.clean(); - }); - - describe(`Fetch main statistics`, () => { - let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - - before(async () => { - instancesMainStats = await getServiceOverviewInstancesMainStatistics({ - serviceName, - }); - }); - - it('returns instances name', () => { - expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ - 'instance-1', - 'instance-2', - 'instance-3', - ]); - }); - - it('does not return throughput', () => { - expect( - instancesMainStats - .map((item) => item.throughput) - .filter((value) => value !== undefined) - ).to.eql([]); - }); - - it('does not return latency', () => { - expect( - instancesMainStats.map((item) => item.latency).filter((value) => value !== undefined) - ).to.eql([]); - }); - - it('does not return errorRate', () => { - expect( - instancesMainStats - .map((item) => item.errorRate) - .filter((value) => value !== undefined) - ).to.eql([]); - }); - - it('returns cpu usage', () => { - expect(sum(instancesMainStats.map((item) => item.cpuUsage))).to.greaterThan(0); - }); - - it('returns memory usage', () => { - expect(sum(instancesMainStats.map((item) => item.memoryUsage))).to.greaterThan(0); - }); - }); - }); - } - ); -} diff --git a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/top_transaction_groups.spec.snap b/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/top_transaction_groups.spec.snap deleted file mode 100644 index e21c870c7eb52..0000000000000 --- a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/top_transaction_groups.spec.snap +++ /dev/null @@ -1,146 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`APM API tests basic apm_8.0.0 Top transaction groups when data is loaded returns the correct buckets (when ignoring samples) 1`] = ` -Array [ - Object { - "averageResponseTime": 3279, - "impact": 0, - "key": "POST /api/orders", - "p95": 3264, - "serviceName": "opbeans-node", - "transactionName": "POST /api/orders", - "transactionType": "request", - "transactionsPerMinute": 0.0333333333333333, - }, - Object { - "averageResponseTime": 2119, - "impact": 0.030253201010799, - "key": "GET /*", - "p95": 2296, - "serviceName": "opbeans-node", - "transactionName": "GET /*", - "transactionType": "request", - "transactionsPerMinute": 0.1, - }, - Object { - "averageResponseTime": 5167, - "impact": 0.0693425383792029, - "key": "GET /api/products/:id", - "p95": 6144, - "serviceName": "opbeans-node", - "transactionName": "GET /api/products/:id", - "transactionType": "request", - "transactionsPerMinute": 0.0666666666666667, - }, - Object { - "averageResponseTime": 5551, - "impact": 0.349690833515986, - "key": "GET /api/orders/:id", - "p95": 11696, - "serviceName": "opbeans-node", - "transactionName": "GET /api/orders/:id", - "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, - }, - Object { - "averageResponseTime": 9607, - "impact": 0.723177313441051, - "key": "GET /api/types", - "p95": 18672, - "serviceName": "opbeans-node", - "transactionName": "GET /api/types", - "transactionType": "request", - "transactionsPerMinute": 0.266666666666667, - }, - Object { - "averageResponseTime": 8669.22222222222, - "impact": 0.734647581660545, - "key": "GET /api/products/:id/customers", - "p95": 15920, - "serviceName": "opbeans-node", - "transactionName": "GET /api/products/:id/customers", - "transactionType": "request", - "transactionsPerMinute": 0.3, - }, - Object { - "averageResponseTime": 7571, - "impact": 0.860741901273131, - "key": "GET /api/types/:id", - "p95": 13552, - "serviceName": "opbeans-node", - "transactionName": "GET /api/types/:id", - "transactionType": "request", - "transactionsPerMinute": 0.4, - }, - Object { - "averageResponseTime": 8753.90909090909, - "impact": 0.914220675379615, - "key": "GET /api/customers/:id", - "p95": 11248, - "serviceName": "opbeans-node", - "transactionName": "GET /api/customers/:id", - "transactionType": "request", - "transactionsPerMinute": 0.366666666666667, - }, - Object { - "averageResponseTime": 7807, - "impact": 1.04204487263284, - "key": "GET /api/products/top", - "p95": 14000, - "serviceName": "opbeans-node", - "transactionName": "GET /api/products/top", - "transactionType": "request", - "transactionsPerMinute": 0.466666666666667, - }, - Object { - "averageResponseTime": 11913.6666666667, - "impact": 1.37294294450729, - "key": "GET /api/orders", - "p95": 15008, - "serviceName": "opbeans-node", - "transactionName": "GET /api/orders", - "transactionType": "request", - "transactionsPerMinute": 0.4, - }, - Object { - "averageResponseTime": 9062.52941176471, - "impact": 1.48203335322037, - "key": "GET /api/products", - "p95": 15728, - "serviceName": "opbeans-node", - "transactionName": "GET /api/products", - "transactionType": "request", - "transactionsPerMinute": 0.566666666666667, - }, - Object { - "averageResponseTime": 19858.2, - "impact": 1.91960393665109, - "key": "GET /api/stats", - "p95": 33984, - "serviceName": "opbeans-node", - "transactionName": "GET /api/stats", - "transactionType": "request", - "transactionsPerMinute": 0.333333333333333, - }, - Object { - "averageResponseTime": 22276.8181818182, - "impact": 2.37628180493074, - "key": "GET /api/customers", - "p95": 26304, - "serviceName": "opbeans-node", - "transactionName": "GET /api/customers", - "transactionType": "request", - "transactionsPerMinute": 0.366666666666667, - }, - Object { - "averageResponseTime": 107130.621052632, - "impact": 100, - "key": "GET /api", - "p95": 151520, - "serviceName": "opbeans-node", - "transactionName": "GET /api", - "transactionType": "request", - "transactionsPerMinute": 3.16666666666667, - }, -] -`; diff --git a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transaction_charts.spec.snap b/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transaction_charts.spec.snap deleted file mode 100644 index 4b3f2293498cc..0000000000000 --- a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transaction_charts.spec.snap +++ /dev/null @@ -1,1751 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Transaction charts when data is loaded returns the correct data 4`] = ` -Object { - "apmTimeseries": Object { - "overallAvgDuration": 563605.417040359, - "responseTimes": Object { - "avg": Array [ - Object { - "x": 1607435850000, - "y": null, - }, - Object { - "x": 1607435880000, - "y": 233725.666666667, - }, - Object { - "x": 1607435910000, - "y": 761099.333333333, - }, - Object { - "x": 1607435940000, - "y": 444231.666666667, - }, - Object { - "x": 1607435970000, - "y": 999194.666666667, - }, - Object { - "x": 1607436000000, - "y": 558128.666666667, - }, - Object { - "x": 1607436030000, - "y": 842340, - }, - Object { - "x": 1607436060000, - "y": 1070088, - }, - Object { - "x": 1607436090000, - "y": 1289537.66666667, - }, - Object { - "x": 1607436120000, - "y": 320373, - }, - Object { - "x": 1607436150000, - "y": 412243.857142857, - }, - Object { - "x": 1607436180000, - "y": 604852, - }, - Object { - "x": 1607436210000, - "y": 1293499, - }, - Object { - "x": 1607436240000, - "y": 272394.571428571, - }, - Object { - "x": 1607436270000, - "y": 930978.4, - }, - Object { - "x": 1607436300000, - "y": 906360, - }, - Object { - "x": 1607436330000, - "y": 232498.25, - }, - Object { - "x": 1607436360000, - "y": 201226.333333333, - }, - Object { - "x": 1607436390000, - "y": 621694.833333333, - }, - Object { - "x": 1607436420000, - "y": 1935481, - }, - Object { - "x": 1607436450000, - "y": 1157048, - }, - Object { - "x": 1607436480000, - "y": 717248.333333333, - }, - Object { - "x": 1607436510000, - "y": 660264.833333333, - }, - Object { - "x": 1607436540000, - "y": 1305048, - }, - Object { - "x": 1607436570000, - "y": 715224, - }, - Object { - "x": 1607436600000, - "y": 144978.5, - }, - Object { - "x": 1607436630000, - "y": 102661, - }, - Object { - "x": 1607436660000, - "y": 810296.5, - }, - Object { - "x": 1607436690000, - "y": 938002.25, - }, - Object { - "x": 1607436720000, - "y": 63220, - }, - Object { - "x": 1607436750000, - "y": 737306.2, - }, - Object { - "x": 1607436780000, - "y": 963865.75, - }, - Object { - "x": 1607436810000, - "y": 38124, - }, - Object { - "x": 1607436840000, - "y": 860345.6, - }, - Object { - "x": 1607436870000, - "y": null, - }, - Object { - "x": 1607436900000, - "y": 742157, - }, - Object { - "x": 1607436930000, - "y": 584849, - }, - Object { - "x": 1607436960000, - "y": 165453.2, - }, - Object { - "x": 1607436990000, - "y": 334794, - }, - Object { - "x": 1607437020000, - "y": 1397727.5, - }, - Object { - "x": 1607437050000, - "y": 1104933, - }, - Object { - "x": 1607437080000, - "y": 755694.571428571, - }, - Object { - "x": 1607437110000, - "y": 252777.25, - }, - Object { - "x": 1607437140000, - "y": 708401.333333333, - }, - Object { - "x": 1607437170000, - "y": 1153244, - }, - Object { - "x": 1607437200000, - "y": 730186.25, - }, - Object { - "x": 1607437230000, - "y": 270504.222222222, - }, - Object { - "x": 1607437260000, - "y": 938813.333333333, - }, - Object { - "x": 1607437290000, - "y": 171339, - }, - Object { - "x": 1607437320000, - "y": 345618.2, - }, - Object { - "x": 1607437350000, - "y": 1100982.25, - }, - Object { - "x": 1607437380000, - "y": 724415, - }, - Object { - "x": 1607437410000, - "y": 1273571.5, - }, - Object { - "x": 1607437440000, - "y": 329748, - }, - Object { - "x": 1607437470000, - "y": 231693.538461538, - }, - Object { - "x": 1607437500000, - "y": 620042, - }, - Object { - "x": 1607437530000, - "y": null, - }, - Object { - "x": 1607437560000, - "y": 640575.666666667, - }, - Object { - "x": 1607437590000, - "y": 177960.714285714, - }, - Object { - "x": 1607437620000, - "y": 1142976, - }, - Object { - "x": 1607437650000, - "y": 530845.5, - }, - ], - "p95": Array [ - Object { - "x": 1607435850000, - "y": null, - }, - Object { - "x": 1607435880000, - "y": 1032160, - }, - Object { - "x": 1607435910000, - "y": 1400704, - }, - Object { - "x": 1607435940000, - "y": 831360, - }, - Object { - "x": 1607435970000, - "y": 1118208, - }, - Object { - "x": 1607436000000, - "y": 921472, - }, - Object { - "x": 1607436030000, - "y": 995328, - }, - Object { - "x": 1607436060000, - "y": 1064960, - }, - Object { - "x": 1607436090000, - "y": 1560576, - }, - Object { - "x": 1607436120000, - "y": 610176, - }, - Object { - "x": 1607436150000, - "y": 1490912, - }, - Object { - "x": 1607436180000, - "y": 614400, - }, - Object { - "x": 1607436210000, - "y": 1286144, - }, - Object { - "x": 1607436240000, - "y": 1114096, - }, - Object { - "x": 1607436270000, - "y": 1843072, - }, - Object { - "x": 1607436300000, - "y": 1118208, - }, - Object { - "x": 1607436330000, - "y": 481152, - }, - Object { - "x": 1607436360000, - "y": 548848, - }, - Object { - "x": 1607436390000, - "y": 1695680, - }, - Object { - "x": 1607436420000, - "y": 1933312, - }, - Object { - "x": 1607436450000, - "y": 1429504, - }, - Object { - "x": 1607436480000, - "y": 1081216, - }, - Object { - "x": 1607436510000, - "y": 1572832, - }, - Object { - "x": 1607436540000, - "y": 1751040, - }, - Object { - "x": 1607436570000, - "y": 1087488, - }, - Object { - "x": 1607436600000, - "y": 1294320, - }, - Object { - "x": 1607436630000, - "y": 198528, - }, - Object { - "x": 1607436660000, - "y": 880640, - }, - Object { - "x": 1607436690000, - "y": 1257472, - }, - Object { - "x": 1607436720000, - "y": 180192, - }, - Object { - "x": 1607436750000, - "y": 1179520, - }, - Object { - "x": 1607436780000, - "y": 1556224, - }, - Object { - "x": 1607436810000, - "y": 37888, - }, - Object { - "x": 1607436840000, - "y": 1261504, - }, - Object { - "x": 1607436870000, - "y": null, - }, - Object { - "x": 1607436900000, - "y": 1087488, - }, - Object { - "x": 1607436930000, - "y": 581632, - }, - Object { - "x": 1607436960000, - "y": 294784, - }, - Object { - "x": 1607436990000, - "y": 1245152, - }, - Object { - "x": 1607437020000, - "y": 1654784, - }, - Object { - "x": 1607437050000, - "y": 1097728, - }, - Object { - "x": 1607437080000, - "y": 1433584, - }, - Object { - "x": 1607437110000, - "y": 925568, - }, - Object { - "x": 1607437140000, - "y": 919552, - }, - Object { - "x": 1607437170000, - "y": 1146880, - }, - Object { - "x": 1607437200000, - "y": 1507072, - }, - Object { - "x": 1607437230000, - "y": 1318880, - }, - Object { - "x": 1607437260000, - "y": 1867712, - }, - Object { - "x": 1607437290000, - "y": 210944, - }, - Object { - "x": 1607437320000, - "y": 1449952, - }, - Object { - "x": 1607437350000, - "y": 1462272, - }, - Object { - "x": 1607437380000, - "y": 724992, - }, - Object { - "x": 1607437410000, - "y": 1335296, - }, - Object { - "x": 1607437440000, - "y": 329728, - }, - Object { - "x": 1607437470000, - "y": 1409008, - }, - Object { - "x": 1607437500000, - "y": 763904, - }, - Object { - "x": 1607437530000, - "y": null, - }, - Object { - "x": 1607437560000, - "y": 1474528, - }, - Object { - "x": 1607437590000, - "y": 598000, - }, - Object { - "x": 1607437620000, - "y": 1138688, - }, - Object { - "x": 1607437650000, - "y": 822272, - }, - ], - "p99": Array [ - Object { - "x": 1607435850000, - "y": null, - }, - Object { - "x": 1607435880000, - "y": 1032160, - }, - Object { - "x": 1607435910000, - "y": 1400704, - }, - Object { - "x": 1607435940000, - "y": 831360, - }, - Object { - "x": 1607435970000, - "y": 1118208, - }, - Object { - "x": 1607436000000, - "y": 921472, - }, - Object { - "x": 1607436030000, - "y": 995328, - }, - Object { - "x": 1607436060000, - "y": 1064960, - }, - Object { - "x": 1607436090000, - "y": 1560576, - }, - Object { - "x": 1607436120000, - "y": 610176, - }, - Object { - "x": 1607436150000, - "y": 1490912, - }, - Object { - "x": 1607436180000, - "y": 614400, - }, - Object { - "x": 1607436210000, - "y": 1286144, - }, - Object { - "x": 1607436240000, - "y": 1114096, - }, - Object { - "x": 1607436270000, - "y": 1843072, - }, - Object { - "x": 1607436300000, - "y": 1118208, - }, - Object { - "x": 1607436330000, - "y": 481152, - }, - Object { - "x": 1607436360000, - "y": 548848, - }, - Object { - "x": 1607436390000, - "y": 1695680, - }, - Object { - "x": 1607436420000, - "y": 1933312, - }, - Object { - "x": 1607436450000, - "y": 1429504, - }, - Object { - "x": 1607436480000, - "y": 1081216, - }, - Object { - "x": 1607436510000, - "y": 1572832, - }, - Object { - "x": 1607436540000, - "y": 1751040, - }, - Object { - "x": 1607436570000, - "y": 1087488, - }, - Object { - "x": 1607436600000, - "y": 1294320, - }, - Object { - "x": 1607436630000, - "y": 198528, - }, - Object { - "x": 1607436660000, - "y": 880640, - }, - Object { - "x": 1607436690000, - "y": 1257472, - }, - Object { - "x": 1607436720000, - "y": 180192, - }, - Object { - "x": 1607436750000, - "y": 1179520, - }, - Object { - "x": 1607436780000, - "y": 1556224, - }, - Object { - "x": 1607436810000, - "y": 37888, - }, - Object { - "x": 1607436840000, - "y": 1261504, - }, - Object { - "x": 1607436870000, - "y": null, - }, - Object { - "x": 1607436900000, - "y": 1087488, - }, - Object { - "x": 1607436930000, - "y": 581632, - }, - Object { - "x": 1607436960000, - "y": 294784, - }, - Object { - "x": 1607436990000, - "y": 1245152, - }, - Object { - "x": 1607437020000, - "y": 1654784, - }, - Object { - "x": 1607437050000, - "y": 1097728, - }, - Object { - "x": 1607437080000, - "y": 1433584, - }, - Object { - "x": 1607437110000, - "y": 925568, - }, - Object { - "x": 1607437140000, - "y": 919552, - }, - Object { - "x": 1607437170000, - "y": 1146880, - }, - Object { - "x": 1607437200000, - "y": 1507072, - }, - Object { - "x": 1607437230000, - "y": 1318880, - }, - Object { - "x": 1607437260000, - "y": 1867712, - }, - Object { - "x": 1607437290000, - "y": 210944, - }, - Object { - "x": 1607437320000, - "y": 1449952, - }, - Object { - "x": 1607437350000, - "y": 1462272, - }, - Object { - "x": 1607437380000, - "y": 724992, - }, - Object { - "x": 1607437410000, - "y": 1335296, - }, - Object { - "x": 1607437440000, - "y": 329728, - }, - Object { - "x": 1607437470000, - "y": 1466352, - }, - Object { - "x": 1607437500000, - "y": 763904, - }, - Object { - "x": 1607437530000, - "y": null, - }, - Object { - "x": 1607437560000, - "y": 1474528, - }, - Object { - "x": 1607437590000, - "y": 598000, - }, - Object { - "x": 1607437620000, - "y": 1138688, - }, - Object { - "x": 1607437650000, - "y": 822272, - }, - ], - }, - "tpmBuckets": Array [ - Object { - "avg": 3, - "dataPoints": Array [ - Object { - "x": 1607435850000, - "y": 0, - }, - Object { - "x": 1607435880000, - "y": 8, - }, - Object { - "x": 1607435910000, - "y": 4, - }, - Object { - "x": 1607435940000, - "y": 2, - }, - Object { - "x": 1607435970000, - "y": 0, - }, - Object { - "x": 1607436000000, - "y": 2, - }, - Object { - "x": 1607436030000, - "y": 0, - }, - Object { - "x": 1607436060000, - "y": 0, - }, - Object { - "x": 1607436090000, - "y": 0, - }, - Object { - "x": 1607436120000, - "y": 2, - }, - Object { - "x": 1607436150000, - "y": 10, - }, - Object { - "x": 1607436180000, - "y": 0, - }, - Object { - "x": 1607436210000, - "y": 0, - }, - Object { - "x": 1607436240000, - "y": 10, - }, - Object { - "x": 1607436270000, - "y": 2, - }, - Object { - "x": 1607436300000, - "y": 0, - }, - Object { - "x": 1607436330000, - "y": 4, - }, - Object { - "x": 1607436360000, - "y": 4, - }, - Object { - "x": 1607436390000, - "y": 6, - }, - Object { - "x": 1607436420000, - "y": 0, - }, - Object { - "x": 1607436450000, - "y": 0, - }, - Object { - "x": 1607436480000, - "y": 2, - }, - Object { - "x": 1607436510000, - "y": 6, - }, - Object { - "x": 1607436540000, - "y": 0, - }, - Object { - "x": 1607436570000, - "y": 0, - }, - Object { - "x": 1607436600000, - "y": 14, - }, - Object { - "x": 1607436630000, - "y": 8, - }, - Object { - "x": 1607436660000, - "y": 0, - }, - Object { - "x": 1607436690000, - "y": 0, - }, - Object { - "x": 1607436720000, - "y": 8, - }, - Object { - "x": 1607436750000, - "y": 2, - }, - Object { - "x": 1607436780000, - "y": 2, - }, - Object { - "x": 1607436810000, - "y": 2, - }, - Object { - "x": 1607436840000, - "y": 2, - }, - Object { - "x": 1607436870000, - "y": 0, - }, - Object { - "x": 1607436900000, - "y": 0, - }, - Object { - "x": 1607436930000, - "y": 0, - }, - Object { - "x": 1607436960000, - "y": 4, - }, - Object { - "x": 1607436990000, - "y": 8, - }, - Object { - "x": 1607437020000, - "y": 0, - }, - Object { - "x": 1607437050000, - "y": 0, - }, - Object { - "x": 1607437080000, - "y": 6, - }, - Object { - "x": 1607437110000, - "y": 6, - }, - Object { - "x": 1607437140000, - "y": 0, - }, - Object { - "x": 1607437170000, - "y": 0, - }, - Object { - "x": 1607437200000, - "y": 2, - }, - Object { - "x": 1607437230000, - "y": 14, - }, - Object { - "x": 1607437260000, - "y": 2, - }, - Object { - "x": 1607437290000, - "y": 0, - }, - Object { - "x": 1607437320000, - "y": 4, - }, - Object { - "x": 1607437350000, - "y": 0, - }, - Object { - "x": 1607437380000, - "y": 0, - }, - Object { - "x": 1607437410000, - "y": 0, - }, - Object { - "x": 1607437440000, - "y": 0, - }, - Object { - "x": 1607437470000, - "y": 22, - }, - Object { - "x": 1607437500000, - "y": 0, - }, - Object { - "x": 1607437530000, - "y": 0, - }, - Object { - "x": 1607437560000, - "y": 6, - }, - Object { - "x": 1607437590000, - "y": 6, - }, - Object { - "x": 1607437620000, - "y": 0, - }, - Object { - "x": 1607437650000, - "y": 0, - }, - ], - "key": "HTTP 2xx", - }, - Object { - "avg": 0.1, - "dataPoints": Array [ - Object { - "x": 1607435850000, - "y": 0, - }, - Object { - "x": 1607435880000, - "y": 0, - }, - Object { - "x": 1607435910000, - "y": 0, - }, - Object { - "x": 1607435940000, - "y": 0, - }, - Object { - "x": 1607435970000, - "y": 0, - }, - Object { - "x": 1607436000000, - "y": 0, - }, - Object { - "x": 1607436030000, - "y": 0, - }, - Object { - "x": 1607436060000, - "y": 0, - }, - Object { - "x": 1607436090000, - "y": 0, - }, - Object { - "x": 1607436120000, - "y": 0, - }, - Object { - "x": 1607436150000, - "y": 0, - }, - Object { - "x": 1607436180000, - "y": 0, - }, - Object { - "x": 1607436210000, - "y": 0, - }, - Object { - "x": 1607436240000, - "y": 0, - }, - Object { - "x": 1607436270000, - "y": 0, - }, - Object { - "x": 1607436300000, - "y": 0, - }, - Object { - "x": 1607436330000, - "y": 0, - }, - Object { - "x": 1607436360000, - "y": 0, - }, - Object { - "x": 1607436390000, - "y": 0, - }, - Object { - "x": 1607436420000, - "y": 0, - }, - Object { - "x": 1607436450000, - "y": 0, - }, - Object { - "x": 1607436480000, - "y": 0, - }, - Object { - "x": 1607436510000, - "y": 0, - }, - Object { - "x": 1607436540000, - "y": 0, - }, - Object { - "x": 1607436570000, - "y": 0, - }, - Object { - "x": 1607436600000, - "y": 0, - }, - Object { - "x": 1607436630000, - "y": 0, - }, - Object { - "x": 1607436660000, - "y": 0, - }, - Object { - "x": 1607436690000, - "y": 0, - }, - Object { - "x": 1607436720000, - "y": 0, - }, - Object { - "x": 1607436750000, - "y": 0, - }, - Object { - "x": 1607436780000, - "y": 0, - }, - Object { - "x": 1607436810000, - "y": 0, - }, - Object { - "x": 1607436840000, - "y": 0, - }, - Object { - "x": 1607436870000, - "y": 0, - }, - Object { - "x": 1607436900000, - "y": 0, - }, - Object { - "x": 1607436930000, - "y": 0, - }, - Object { - "x": 1607436960000, - "y": 0, - }, - Object { - "x": 1607436990000, - "y": 0, - }, - Object { - "x": 1607437020000, - "y": 0, - }, - Object { - "x": 1607437050000, - "y": 0, - }, - Object { - "x": 1607437080000, - "y": 0, - }, - Object { - "x": 1607437110000, - "y": 0, - }, - Object { - "x": 1607437140000, - "y": 0, - }, - Object { - "x": 1607437170000, - "y": 0, - }, - Object { - "x": 1607437200000, - "y": 0, - }, - Object { - "x": 1607437230000, - "y": 0, - }, - Object { - "x": 1607437260000, - "y": 0, - }, - Object { - "x": 1607437290000, - "y": 0, - }, - Object { - "x": 1607437320000, - "y": 2, - }, - Object { - "x": 1607437350000, - "y": 0, - }, - Object { - "x": 1607437380000, - "y": 0, - }, - Object { - "x": 1607437410000, - "y": 0, - }, - Object { - "x": 1607437440000, - "y": 0, - }, - Object { - "x": 1607437470000, - "y": 0, - }, - Object { - "x": 1607437500000, - "y": 0, - }, - Object { - "x": 1607437530000, - "y": 0, - }, - Object { - "x": 1607437560000, - "y": 0, - }, - Object { - "x": 1607437590000, - "y": 4, - }, - Object { - "x": 1607437620000, - "y": 0, - }, - Object { - "x": 1607437650000, - "y": 0, - }, - ], - "key": "HTTP 4xx", - }, - Object { - "avg": 0.0666666666666667, - "dataPoints": Array [ - Object { - "x": 1607435850000, - "y": 0, - }, - Object { - "x": 1607435880000, - "y": 0, - }, - Object { - "x": 1607435910000, - "y": 0, - }, - Object { - "x": 1607435940000, - "y": 0, - }, - Object { - "x": 1607435970000, - "y": 0, - }, - Object { - "x": 1607436000000, - "y": 0, - }, - Object { - "x": 1607436030000, - "y": 0, - }, - Object { - "x": 1607436060000, - "y": 0, - }, - Object { - "x": 1607436090000, - "y": 0, - }, - Object { - "x": 1607436120000, - "y": 0, - }, - Object { - "x": 1607436150000, - "y": 0, - }, - Object { - "x": 1607436180000, - "y": 0, - }, - Object { - "x": 1607436210000, - "y": 0, - }, - Object { - "x": 1607436240000, - "y": 0, - }, - Object { - "x": 1607436270000, - "y": 0, - }, - Object { - "x": 1607436300000, - "y": 0, - }, - Object { - "x": 1607436330000, - "y": 0, - }, - Object { - "x": 1607436360000, - "y": 0, - }, - Object { - "x": 1607436390000, - "y": 0, - }, - Object { - "x": 1607436420000, - "y": 0, - }, - Object { - "x": 1607436450000, - "y": 0, - }, - Object { - "x": 1607436480000, - "y": 0, - }, - Object { - "x": 1607436510000, - "y": 0, - }, - Object { - "x": 1607436540000, - "y": 0, - }, - Object { - "x": 1607436570000, - "y": 0, - }, - Object { - "x": 1607436600000, - "y": 4, - }, - Object { - "x": 1607436630000, - "y": 0, - }, - Object { - "x": 1607436660000, - "y": 0, - }, - Object { - "x": 1607436690000, - "y": 0, - }, - Object { - "x": 1607436720000, - "y": 0, - }, - Object { - "x": 1607436750000, - "y": 0, - }, - Object { - "x": 1607436780000, - "y": 0, - }, - Object { - "x": 1607436810000, - "y": 0, - }, - Object { - "x": 1607436840000, - "y": 0, - }, - Object { - "x": 1607436870000, - "y": 0, - }, - Object { - "x": 1607436900000, - "y": 0, - }, - Object { - "x": 1607436930000, - "y": 0, - }, - Object { - "x": 1607436960000, - "y": 0, - }, - Object { - "x": 1607436990000, - "y": 0, - }, - Object { - "x": 1607437020000, - "y": 0, - }, - Object { - "x": 1607437050000, - "y": 0, - }, - Object { - "x": 1607437080000, - "y": 0, - }, - Object { - "x": 1607437110000, - "y": 0, - }, - Object { - "x": 1607437140000, - "y": 0, - }, - Object { - "x": 1607437170000, - "y": 0, - }, - Object { - "x": 1607437200000, - "y": 0, - }, - Object { - "x": 1607437230000, - "y": 0, - }, - Object { - "x": 1607437260000, - "y": 0, - }, - Object { - "x": 1607437290000, - "y": 0, - }, - Object { - "x": 1607437320000, - "y": 0, - }, - Object { - "x": 1607437350000, - "y": 0, - }, - Object { - "x": 1607437380000, - "y": 0, - }, - Object { - "x": 1607437410000, - "y": 0, - }, - Object { - "x": 1607437440000, - "y": 0, - }, - Object { - "x": 1607437470000, - "y": 0, - }, - Object { - "x": 1607437500000, - "y": 0, - }, - Object { - "x": 1607437530000, - "y": 0, - }, - Object { - "x": 1607437560000, - "y": 0, - }, - Object { - "x": 1607437590000, - "y": 0, - }, - Object { - "x": 1607437620000, - "y": 0, - }, - Object { - "x": 1607437650000, - "y": 0, - }, - ], - "key": "HTTP 5xx", - }, - Object { - "avg": 4.26666666666667, - "dataPoints": Array [ - Object { - "x": 1607435850000, - "y": 0, - }, - Object { - "x": 1607435880000, - "y": 4, - }, - Object { - "x": 1607435910000, - "y": 8, - }, - Object { - "x": 1607435940000, - "y": 4, - }, - Object { - "x": 1607435970000, - "y": 6, - }, - Object { - "x": 1607436000000, - "y": 4, - }, - Object { - "x": 1607436030000, - "y": 4, - }, - Object { - "x": 1607436060000, - "y": 2, - }, - Object { - "x": 1607436090000, - "y": 6, - }, - Object { - "x": 1607436120000, - "y": 2, - }, - Object { - "x": 1607436150000, - "y": 4, - }, - Object { - "x": 1607436180000, - "y": 4, - }, - Object { - "x": 1607436210000, - "y": 2, - }, - Object { - "x": 1607436240000, - "y": 4, - }, - Object { - "x": 1607436270000, - "y": 8, - }, - Object { - "x": 1607436300000, - "y": 4, - }, - Object { - "x": 1607436330000, - "y": 4, - }, - Object { - "x": 1607436360000, - "y": 2, - }, - Object { - "x": 1607436390000, - "y": 6, - }, - Object { - "x": 1607436420000, - "y": 2, - }, - Object { - "x": 1607436450000, - "y": 6, - }, - Object { - "x": 1607436480000, - "y": 4, - }, - Object { - "x": 1607436510000, - "y": 6, - }, - Object { - "x": 1607436540000, - "y": 6, - }, - Object { - "x": 1607436570000, - "y": 6, - }, - Object { - "x": 1607436600000, - "y": 2, - }, - Object { - "x": 1607436630000, - "y": 4, - }, - Object { - "x": 1607436660000, - "y": 4, - }, - Object { - "x": 1607436690000, - "y": 8, - }, - Object { - "x": 1607436720000, - "y": 0, - }, - Object { - "x": 1607436750000, - "y": 8, - }, - Object { - "x": 1607436780000, - "y": 6, - }, - Object { - "x": 1607436810000, - "y": 0, - }, - Object { - "x": 1607436840000, - "y": 8, - }, - Object { - "x": 1607436870000, - "y": 0, - }, - Object { - "x": 1607436900000, - "y": 6, - }, - Object { - "x": 1607436930000, - "y": 2, - }, - Object { - "x": 1607436960000, - "y": 6, - }, - Object { - "x": 1607436990000, - "y": 4, - }, - Object { - "x": 1607437020000, - "y": 4, - }, - Object { - "x": 1607437050000, - "y": 2, - }, - Object { - "x": 1607437080000, - "y": 8, - }, - Object { - "x": 1607437110000, - "y": 2, - }, - Object { - "x": 1607437140000, - "y": 6, - }, - Object { - "x": 1607437170000, - "y": 2, - }, - Object { - "x": 1607437200000, - "y": 6, - }, - Object { - "x": 1607437230000, - "y": 4, - }, - Object { - "x": 1607437260000, - "y": 4, - }, - Object { - "x": 1607437290000, - "y": 4, - }, - Object { - "x": 1607437320000, - "y": 4, - }, - Object { - "x": 1607437350000, - "y": 8, - }, - Object { - "x": 1607437380000, - "y": 4, - }, - Object { - "x": 1607437410000, - "y": 4, - }, - Object { - "x": 1607437440000, - "y": 2, - }, - Object { - "x": 1607437470000, - "y": 4, - }, - Object { - "x": 1607437500000, - "y": 6, - }, - Object { - "x": 1607437530000, - "y": 0, - }, - Object { - "x": 1607437560000, - "y": 6, - }, - Object { - "x": 1607437590000, - "y": 4, - }, - Object { - "x": 1607437620000, - "y": 2, - }, - Object { - "x": 1607437650000, - "y": 4, - }, - ], - "key": "success", - }, - ], - }, -} -`; diff --git a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_charts.spec.snap b/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_charts.spec.snap deleted file mode 100644 index 2f78b03adbf4c..0000000000000 --- a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_charts.spec.snap +++ /dev/null @@ -1,61 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`APM Transaction Overview when data is loaded and fetching transaction charts with uiFilters when not defined environments selected should return the correct anomaly boundaries 1`] = ` -Array [ - Object { - "x": 1607436000000, - "y": 0, - "y0": 0, - }, - Object { - "x": 1607436900000, - "y": 0, - "y0": 0, - }, - Object { - "x": 1607437650000, - "y": 0, - "y0": 0, - }, -] -`; - -exports[`APM Transaction Overview when data is loaded and fetching transaction charts with uiFilters with environment selected and empty kuery filter should return a non-empty anomaly series 1`] = ` -Array [ - Object { - "x": 1607436000000, - "y": 1625128.56211579, - "y0": 7533.02707532227, - }, - Object { - "x": 1607436900000, - "y": 1660982.24115757, - "y0": 5732.00699123528, - }, - Object { - "x": 1607437650000, - "y": 1660982.24115757, - "y0": 5732.00699123528, - }, -] -`; - -exports[`APM Transaction Overview when data is loaded and fetching transaction charts with uiFilters with environment selected in uiFilters should return a non-empty anomaly series 1`] = ` -Array [ - Object { - "x": 1607436000000, - "y": 1625128.56211579, - "y0": 7533.02707532227, - }, - Object { - "x": 1607436900000, - "y": 1660982.24115757, - "y0": 5732.00699123528, - }, - Object { - "x": 1607437650000, - "y": 1660982.24115757, - "y0": 5732.00699123528, - }, -] -`; diff --git a/x-pack/test/apm_api_integration/tests/transactions/breakdown.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/breakdown.spec.ts index 6b7848262c69f..d7cd6d5b87779 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/breakdown.spec.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/breakdown.spec.ts @@ -18,27 +18,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { const transactionType = 'request'; const transactionName = 'GET /api'; - registry.when('Breakdown when data is not loaded', { config: 'basic', archives: [] }, () => { - it('handles the empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: 'GET /internal/apm/services/{serviceName}/transaction/charts/breakdown', - params: { - path: { serviceName: 'opbeans-node' }, - query: { - start, - end, - transactionType, - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, - }); - - expect(response.status).to.be(200); - expect(response.body).to.eql({ timeseries: [] }); - }); - }); - registry.when( 'Breakdown when data is loaded', { config: 'basic', archives: [archiveName] }, diff --git a/x-pack/test/apm_api_integration/tests/transactions/error_rate.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/error_rate.spec.ts deleted file mode 100644 index 724390fdfa61f..0000000000000 --- a/x-pack/test/apm_api_integration/tests/transactions/error_rate.spec.ts +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import { buildQueryFromFilters } from '@kbn/es-query'; -import { first, last } from 'lodash'; -import moment from 'moment'; -import { - APIClientRequestParamsOf, - APIReturnType, -} from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { RecursivePartial } from '@kbn/apm-plugin/typings/common'; -import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; -import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; - -type ErrorRate = - APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/charts/error_rate'>; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - - // url parameters - const start = new Date('2021-01-01T00:00:00.000Z').getTime(); - const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; - - async function fetchErrorCharts( - overrides?: RecursivePartial< - APIClientRequestParamsOf<'GET /internal/apm/services/{serviceName}/transactions/charts/error_rate'>['params'] - > - ) { - return await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/transactions/charts/error_rate`, - params: { - path: { serviceName: overrides?.path?.serviceName || 'opbeans-go' }, - query: { - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - transactionType: 'request', - environment: 'ENVIRONMENT_ALL', - kuery: '', - documentType: ApmDocumentType.TransactionMetric, - rollupInterval: RollupInterval.OneMinute, - bucketSizeInSeconds: 60, - ...overrides?.query, - }, - }, - }); - } - - registry.when('Error rate when data is not loaded', { config: 'basic', archives: [] }, () => { - it('handles the empty state', async () => { - const response = await fetchErrorCharts(); - expect(response.status).to.be(200); - - const body = response.body as ErrorRate; - expect(body).to.be.eql({ - currentPeriod: { timeseries: [], average: null }, - previousPeriod: { timeseries: [], average: null }, - }); - }); - - it('handles the empty state with comparison data', async () => { - const response = await fetchErrorCharts({ - query: { - start: moment(end).subtract(7, 'minutes').toISOString(), - offset: '7m', - }, - }); - expect(response.status).to.be(200); - - const body = response.body as ErrorRate; - expect(body).to.be.eql({ - currentPeriod: { timeseries: [], average: null }, - previousPeriod: { timeseries: [], average: null }, - }); - }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177598 - registry.when('Error rate when data is loaded', { config: 'basic', archives: [] }, () => { - const config = { - firstTransaction: { - name: 'GET /apple 🍎 ', - successRate: 50, - failureRate: 50, - }, - secondTransaction: { - name: 'GET /pear 🍎 ', - successRate: 25, - failureRate: 75, - }, - }; - before(async () => { - const serviceGoProdInstance = apm - .service({ name: 'opbeans-go', environment: 'production', agentName: 'go' }) - .instance('instance-a'); - - const { firstTransaction, secondTransaction } = config; - - const documents = [ - timerange(start, end) - .ratePerMinute(firstTransaction.successRate) - .generator((timestamp) => - serviceGoProdInstance - .transaction({ transactionName: firstTransaction.name }) - .timestamp(timestamp) - .duration(1000) - .success() - ), - timerange(start, end) - .ratePerMinute(firstTransaction.failureRate) - .generator((timestamp) => - serviceGoProdInstance - .transaction({ transactionName: firstTransaction.name }) - .duration(1000) - .timestamp(timestamp) - .failure() - ), - timerange(start, end) - .ratePerMinute(secondTransaction.successRate) - .generator((timestamp) => - serviceGoProdInstance - .transaction({ transactionName: secondTransaction.name }) - .timestamp(timestamp) - .duration(1000) - .success() - ), - timerange(start, end) - .ratePerMinute(secondTransaction.failureRate) - .generator((timestamp) => - serviceGoProdInstance - .transaction({ transactionName: secondTransaction.name }) - .duration(1000) - .timestamp(timestamp) - .failure() - ), - ]; - await apmSynthtraceEsClient.index(documents); - }); - - after(() => apmSynthtraceEsClient.clean()); - - describe('returns the transaction error rate', () => { - let errorRateResponse: ErrorRate; - - before(async () => { - const response = await fetchErrorCharts({ - query: { transactionName: config.firstTransaction.name }, - }); - errorRateResponse = response.body; - }); - - it('returns some data', () => { - expect(errorRateResponse.currentPeriod.average).to.be.greaterThan(0); - expect(errorRateResponse.previousPeriod.average).to.be(null); - - expect(errorRateResponse.currentPeriod.timeseries).not.to.be.empty(); - expect(errorRateResponse.previousPeriod.timeseries).to.empty(); - - const nonNullDataPoints = errorRateResponse.currentPeriod.timeseries.filter( - ({ y }) => y !== null - ); - - expect(nonNullDataPoints).not.to.be.empty(); - }); - - it('has the correct start date', () => { - expect( - new Date(first(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() - ).to.eql('2021-01-01T00:00:00.000Z'); - }); - - it('has the correct end date', () => { - expect( - new Date(last(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() - ).to.eql('2021-01-01T00:14:00.000Z'); - }); - - it('has the correct number of buckets', () => { - expect(errorRateResponse.currentPeriod.timeseries.length).to.be.eql(15); - }); - - it('has the correct calculation for average', () => { - expect(errorRateResponse.currentPeriod.average).to.eql( - config.firstTransaction.failureRate / 100 - ); - }); - }); - - describe('returns the transaction error rate with comparison data per transaction name', () => { - let errorRateResponse: ErrorRate; - - before(async () => { - const query = { - transactionName: config.firstTransaction.name, - start: moment(end).subtract(7, 'minutes').toISOString(), - offset: '7m', - }; - - const response = await fetchErrorCharts({ query }); - - errorRateResponse = response.body; - }); - - it('returns some data', () => { - expect(errorRateResponse.currentPeriod.average).to.be.greaterThan(0); - expect(errorRateResponse.previousPeriod.average).to.be.greaterThan(0); - - expect(errorRateResponse.currentPeriod.timeseries).not.to.be.empty(); - expect(errorRateResponse.previousPeriod.timeseries).not.to.be.empty(); - - const currentPeriodNonNullDataPoints = errorRateResponse.currentPeriod.timeseries.filter( - ({ y }) => y !== null - ); - - const previousPeriodNonNullDataPoints = errorRateResponse.previousPeriod.timeseries.filter( - ({ y }) => y !== null - ); - - expect(currentPeriodNonNullDataPoints).not.to.be.empty(); - expect(previousPeriodNonNullDataPoints).not.to.be.empty(); - }); - - it('has the correct start date', () => { - expect( - new Date(first(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() - ).to.eql('2021-01-01T00:07:00.000Z'); - expect( - new Date(first(errorRateResponse.previousPeriod.timeseries)?.x ?? NaN).toISOString() - ).to.eql('2021-01-01T00:07:00.000Z'); - }); - - it('has the correct end date', () => { - expect( - new Date(last(errorRateResponse.currentPeriod.timeseries)?.x ?? NaN).toISOString() - ).to.eql('2021-01-01T00:14:00.000Z'); - expect( - new Date(last(errorRateResponse.previousPeriod.timeseries)?.x ?? NaN).toISOString() - ).to.eql('2021-01-01T00:14:00.000Z'); - }); - - it('has the correct number of buckets', () => { - expect(errorRateResponse.currentPeriod.timeseries.length).to.eql(8); - expect(errorRateResponse.previousPeriod.timeseries.length).to.eql(8); - }); - - it('has the correct calculation for average', () => { - expect(errorRateResponse.currentPeriod.average).to.eql( - config.firstTransaction.failureRate / 100 - ); - expect(errorRateResponse.previousPeriod.average).to.eql( - config.firstTransaction.failureRate / 100 - ); - }); - - it('matches x-axis on current period and previous period', () => { - expect(errorRateResponse.currentPeriod.timeseries.map(({ x }) => x)).to.be.eql( - errorRateResponse.previousPeriod.timeseries.map(({ x }) => x) - ); - }); - }); - - describe('returns the same error rate for tx metrics and service tx metrics ', () => { - let txMetricsErrorRateResponse: ErrorRate; - let serviceTxMetricsErrorRateResponse: ErrorRate; - - before(async () => { - const [txMetricsResponse, serviceTxMetricsResponse] = await Promise.all([ - fetchErrorCharts(), - fetchErrorCharts({ - query: { documentType: ApmDocumentType.ServiceTransactionMetric }, - }), - ]); - - txMetricsErrorRateResponse = txMetricsResponse.body; - serviceTxMetricsErrorRateResponse = serviceTxMetricsResponse.body; - }); - - describe('has the correct calculation for average', () => { - const expectedFailureRate = - (config.firstTransaction.failureRate + config.secondTransaction.failureRate) / 2 / 100; - - it('for tx metrics', () => { - expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); - }); - - it('for service tx metrics', () => { - expect(serviceTxMetricsErrorRateResponse.currentPeriod.average).to.eql( - expectedFailureRate - ); - }); - }); - }); - - describe('handles kuery', () => { - let txMetricsErrorRateResponse: ErrorRate; - - before(async () => { - const txMetricsResponse = await fetchErrorCharts({ - query: { - kuery: 'transaction.name : "GET /pear 🍎 "', - }, - }); - txMetricsErrorRateResponse = txMetricsResponse.body; - }); - - describe('has the correct calculation for average with kuery', () => { - const expectedFailureRate = config.secondTransaction.failureRate / 100; - - it('for tx metrics', () => { - expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); - }); - }); - }); - - describe('handles filters', () => { - const filters = [ - { - meta: { - disabled: false, - negate: false, - alias: null, - key: 'transaction.name', - params: ['GET /api/product/list'], - type: 'phrases', - }, - query: { - bool: { - minimum_should_match: 1, - should: { - match_phrase: { - 'transaction.name': 'GET /pear 🍎 ', - }, - }, - }, - }, - }, - ]; - const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); - let txMetricsErrorRateResponse: ErrorRate; - - before(async () => { - const txMetricsResponse = await fetchErrorCharts({ - query: { - filters: serializedFilters, - }, - }); - txMetricsErrorRateResponse = txMetricsResponse.body; - }); - - describe('has the correct calculation for average with filter', () => { - const expectedFailureRate = config.secondTransaction.failureRate / 100; - - it('for tx metrics', () => { - expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); - }); - }); - - describe('has the correct calculation for average with negate filter', () => { - const expectedFailureRate = config.secondTransaction.failureRate / 100; - - it('for tx metrics', () => { - expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); - }); - }); - }); - - describe('handles negate filters', () => { - const filters = [ - { - meta: { - disabled: false, - negate: true, - alias: null, - key: 'transaction.name', - params: ['GET /api/product/list'], - type: 'phrases', - }, - query: { - bool: { - minimum_should_match: 1, - should: { - match_phrase: { - 'transaction.name': 'GET /pear 🍎 ', - }, - }, - }, - }, - }, - ]; - const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); - let txMetricsErrorRateResponse: ErrorRate; - - before(async () => { - const txMetricsResponse = await fetchErrorCharts({ - query: { - filters: serializedFilters, - }, - }); - txMetricsErrorRateResponse = txMetricsResponse.body; - }); - - describe('has the correct calculation for average with filter', () => { - const expectedFailureRate = config.firstTransaction.failureRate / 100; - - it('for tx metrics', () => { - expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); - }); - }); - }); - - describe('handles bad filters request', () => { - it('for tx metrics', async () => { - try { - await fetchErrorCharts({ - query: { - filters: '{}}}', - }, - }); - } catch (e) { - expect(e.res.status).to.eql(400); - } - }); - }); - }); -} diff --git a/x-pack/test/apm_api_integration/tests/transactions/trace_samples.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/trace_samples.spec.ts index 5edc1f5a1abc4..1aad31ecc4e55 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/trace_samples.spec.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/trace_samples.spec.ts @@ -16,33 +16,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { const archiveName = 'apm_8.0.0'; const { start, end } = archives[archiveName]; - registry.when( - 'Transaction trace samples response structure when data is not loaded', - { config: 'basic', archives: [] }, - () => { - it('handles empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: 'GET /internal/apm/services/{serviceName}/transactions/traces/samples', - params: { - path: { serviceName: 'opbeans-java' }, - query: { - start, - end, - transactionType: 'request', - environment: 'ENVIRONMENT_ALL', - transactionName: 'APIRestController#stats', - kuery: '', - }, - }, - }); - - expect(response.status).to.be(200); - - expect(response.body.traceSamples.length).to.be(0); - }); - } - ); - registry.when( 'Transaction trace samples response structure when data is loaded', { config: 'basic', archives: [archiveName] }, diff --git a/x-pack/test/cases_api_integration/common/lib/api/case.ts b/x-pack/test/cases_api_integration/common/lib/api/case.ts index 759e2de460460..9f03a62032c89 100644 --- a/x-pack/test/cases_api_integration/common/lib/api/case.ts +++ b/x-pack/test/cases_api_integration/common/lib/api/case.ts @@ -6,8 +6,12 @@ */ import { CASES_URL } from '@kbn/cases-plugin/common'; -import { Case } from '@kbn/cases-plugin/common/types/domain'; -import { CasePostRequest, CasesFindResponse } from '@kbn/cases-plugin/common/types/api'; +import { Case, CaseStatuses } from '@kbn/cases-plugin/common/types/domain'; +import { + CasePostRequest, + CasesFindResponse, + CasePatchRequest, +} from '@kbn/cases-plugin/common/types/api'; import type SuperTest from 'supertest'; import { ToolingLog } from '@kbn/tooling-log'; import { User } from '../authentication/types'; @@ -91,3 +95,32 @@ export const deleteCases = async ({ return body; }; + +export const updateCaseStatus = async ({ + supertest, + caseId, + version = '2', + status = 'open' as CaseStatuses, + expectedHttpCode = 204, + auth = { user: superUser, space: null }, +}: { + supertest: SuperTest.Agent; + caseId: string; + version?: string; + status?: CaseStatuses; + expectedHttpCode?: number; + auth?: { user: User; space: string | null }; +}) => { + const updateRequest: CasePatchRequest = { + status, + version, + id: caseId, + }; + + const { body: updatedCase } = await supertest + .patch(`/api/cases/${caseId}`) + .auth(auth.user.username, auth.user.password) + .set('kbn-xsrf', 'xxx') + .send(updateRequest); + return updatedCase; +}; diff --git a/x-pack/test/cases_api_integration/common/lib/authentication/roles.ts b/x-pack/test/cases_api_integration/common/lib/authentication/roles.ts index d5969606dc414..a3b8b71d2fc97 100644 --- a/x-pack/test/cases_api_integration/common/lib/authentication/roles.ts +++ b/x-pack/test/cases_api_integration/common/lib/authentication/roles.ts @@ -7,31 +7,28 @@ import { Role } from './types'; +const defaultElasticsearchPrivileges = { + elasticsearch: { + indices: [ + { + names: ['*'], + privileges: ['all'], + }, + ], + }, +}; + export const noKibanaPrivileges: Role = { name: 'no_kibana_privileges', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, }, }; export const noCasesPrivilegesSpace1: Role = { name: 'no_cases_kibana_privileges', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -47,14 +44,7 @@ export const noCasesPrivilegesSpace1: Role = { export const noCasesConnectors: Role = { name: 'no_cases_connectors', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -71,14 +61,7 @@ export const noCasesConnectors: Role = { export const globalRead: Role = { name: 'global_read', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -96,14 +79,7 @@ export const globalRead: Role = { export const testDisabledPluginAll: Role = { name: 'test_disabled_plugin_all', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -121,14 +97,7 @@ export const testDisabledPluginAll: Role = { export const securitySolutionOnlyAll: Role = { name: 'sec_only_all', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -145,14 +114,7 @@ export const securitySolutionOnlyAll: Role = { export const securitySolutionOnlyDelete: Role = { name: 'sec_only_delete', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -169,18 +131,11 @@ export const securitySolutionOnlyDelete: Role = { export const securitySolutionOnlyReadDelete: Role = { name: 'sec_only_read_delete', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { - securitySolutionFixture: ['read', 'cases_delete'], + securitySolutionFixture: ['minimal_read', 'cases_delete'], actions: ['all'], actionsSimulators: ['all'], }, @@ -193,14 +148,58 @@ export const securitySolutionOnlyReadDelete: Role = { export const securitySolutionOnlyNoDelete: Role = { name: 'sec_only_no_delete', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], + ...defaultElasticsearchPrivileges, + kibana: [ + { + feature: { + securitySolutionFixture: ['minimal_all'], + actions: ['all'], + actionsSimulators: ['all'], }, - ], - }, + spaces: ['space1'], + }, + ], + }, +}; + +export const securitySolutionOnlyCreateComment: Role = { + name: 'sec_only_create_comment', + privileges: { + ...defaultElasticsearchPrivileges, + kibana: [ + { + feature: { + securitySolutionFixture: ['create_comment'], + actions: ['all'], + actionsSimulators: ['all'], + }, + spaces: ['space1'], + }, + ], + }, +}; + +export const securitySolutionOnlyReadCreateComment: Role = { + name: 'sec_only_read_create_comment', + privileges: { + ...defaultElasticsearchPrivileges, + kibana: [ + { + feature: { + securitySolutionFixture: ['minimal_read', 'create_comment'], + actions: ['all'], + actionsSimulators: ['all'], + }, + spaces: ['space1'], + }, + ], + }, +}; + +export const securitySolutionOnlyNoCreateComment: Role = { + name: 'sec_only_no_create_comment', + privileges: { + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -217,14 +216,7 @@ export const securitySolutionOnlyNoDelete: Role = { export const securitySolutionOnlyRead: Role = { name: 'sec_only_read', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -241,14 +233,7 @@ export const securitySolutionOnlyRead: Role = { export const securitySolutionOnlyReadAlerts: Role = { name: 'sec_only_read_alerts', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -282,14 +267,7 @@ export const securitySolutionOnlyReadNoIndexAlerts: Role = { export const observabilityOnlyAll: Role = { name: 'obs_only_all', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -306,14 +284,7 @@ export const observabilityOnlyAll: Role = { export const observabilityOnlyRead: Role = { name: 'obs_only_read', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -353,14 +324,7 @@ export const observabilityOnlyReadAlerts: Role = { export const securitySolutionOnlyAllSpacesRole: Role = { name: 'sec_only_all_spaces', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -377,14 +341,7 @@ export const securitySolutionOnlyAllSpacesRole: Role = { export const onlyActions: Role = { name: 'only_actions', privileges: { - elasticsearch: { - indices: [ - { - names: ['*'], - privileges: ['all'], - }, - ], - }, + ...defaultElasticsearchPrivileges, kibana: [ { feature: { @@ -408,6 +365,9 @@ export const roles = [ securitySolutionOnlyDelete, securitySolutionOnlyReadDelete, securitySolutionOnlyNoDelete, + securitySolutionOnlyCreateComment, + securitySolutionOnlyReadCreateComment, + securitySolutionOnlyNoCreateComment, observabilityOnlyAll, observabilityOnlyRead, observabilityOnlyReadAlerts, diff --git a/x-pack/test/cases_api_integration/common/lib/authentication/users.ts b/x-pack/test/cases_api_integration/common/lib/authentication/users.ts index 9bf90665eb181..01489d878526c 100644 --- a/x-pack/test/cases_api_integration/common/lib/authentication/users.ts +++ b/x-pack/test/cases_api_integration/common/lib/authentication/users.ts @@ -23,6 +23,9 @@ import { securitySolutionOnlyReadDelete, noCasesConnectors as noCasesConnectorRole, onlyActions as onlyActionsRole, + securitySolutionOnlyCreateComment, + securitySolutionOnlyNoCreateComment, + securitySolutionOnlyReadCreateComment, } from './roles'; import { User } from './types'; @@ -62,6 +65,24 @@ export const secOnlyNoDelete: User = { roles: [securitySolutionOnlyNoDelete.name], }; +export const secOnlyCreateComment: User = { + username: 'sec_only_create_comment', + password: 'sec_only_create_comment', + roles: [securitySolutionOnlyCreateComment.name], +}; + +export const secOnlyReadCreateComment: User = { + username: 'sec_only_read_create_comment', + password: 'sec_only_read_create_comment', + roles: [securitySolutionOnlyReadCreateComment.name], +}; + +export const secOnlyNoCreateComment: User = { + username: 'sec_only_no_create_comment', + password: 'sec_only_no_create_comment', + roles: [securitySolutionOnlyNoCreateComment.name], +}; + export const secOnlyRead: User = { username: 'sec_only_read', password: 'sec_only_read', @@ -159,6 +180,9 @@ export const users = [ secOnlyDelete, secOnlyReadDelete, secOnlyNoDelete, + secOnlyCreateComment, + secOnlyReadCreateComment, + secOnlyNoCreateComment, obsOnly, obsOnlyRead, obsOnlyReadAlerts, diff --git a/x-pack/test/cases_api_integration/common/plugins/security_solution/server/plugin.ts b/x-pack/test/cases_api_integration/common/plugins/security_solution/server/plugin.ts index e2c7cf4d88411..34f4c6d7423c0 100644 --- a/x-pack/test/cases_api_integration/common/plugins/security_solution/server/plugin.ts +++ b/x-pack/test/cases_api_integration/common/plugins/security_solution/server/plugin.ts @@ -115,6 +115,52 @@ export class FixturePlugin implements Plugin { + const supertest = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const es = getService('es'); + + describe('createComment subprivilege', () => { + afterEach(async () => { + await deleteAllCaseItems(es); + }); + + describe('user comments', () => { + it('should not create user comments', async () => { + // No privileges + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: secOnlyNoCreateComment, + space: 'space1', + } + ); + + await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + params: postCommentUserReq, + auth: { user: secOnlyNoCreateComment, space: 'space1' }, + expectedHttpCode: 403, + }); + }); + + // Create + for (const scenario of [ + { user: secOnlyReadCreateComment, space: 'space1' }, + { user: secOnlyCreateComment, space: 'space1' }, + ]) { + it(`User ${scenario.user.username} with role(s) ${scenario.user.roles.join()} and space ${ + scenario.space + } - should create user comments`, async () => { + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + params: postCommentUserReq, + auth: scenario, + expectedHttpCode: 200, + }); + }); + } + + // Update + it('should update comment without createComment privileges', async () => { + // Note: Not ideal behavior. A user unable to create should not be able to update, + // but it is a concession until the privileges are properly broken apart. + const commentUpdate = 'Heres an update because I do not want to make a new comment!'; + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + const patchedCase = await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + params: postCommentUserReq, + auth: { user: superUser, space: 'space1' }, + }); + + const updatedCommentCase = await updateComment({ + supertest, + caseId: postedCase.id, + auth: { user: secOnlyNoCreateComment, space: 'space1' }, + req: { + id: patchedCase.comments![0].id, + version: patchedCase.comments![0].version, + comment: commentUpdate, + type: AttachmentType.user, + owner: 'securitySolutionFixture', + }, + }); + + const userActions = await getCaseUserActions({ + supertest, + caseID: postedCase.id, + auth: { user: superUser, space: 'space1' }, + }); + const commentUserAction = userActions[2]; + + expect(userActions.length).to.eql(3); + expect(commentUserAction.type).to.eql('comment'); + expect(commentUserAction.action).to.eql('update'); + expect(commentUserAction.comment_id).to.eql(updatedCommentCase.comments![0].id); + expect(commentUserAction.payload).to.eql({ + comment: { + comment: commentUpdate, + type: AttachmentType.user, + owner: 'securitySolutionFixture', + }, + }); + }); + + // Update + for (const scenario of [ + { user: secOnlyCreateComment, space: 'space1' }, + { user: secOnlyReadCreateComment, space: 'space1' }, + ]) { + it(`User ${scenario.user.username} with role(s) ${scenario.user.roles.join()} and space ${ + scenario.space + } - should not update user comments`, async () => { + const commentUpdate = 'Heres an update because I do not want to make a new comment!'; + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + const patchedCase = await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + params: postCommentUserReq, + auth: { user: superUser, space: 'space1' }, + }); + + await updateComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + auth: scenario, + req: { + id: patchedCase.comments![0].id, + version: patchedCase.comments![0].version, + comment: commentUpdate, + type: AttachmentType.user, + owner: 'securitySolutionFixture', + }, + expectedHttpCode: 403, + }); + }); + } + }); + + describe('alerts', () => { + it('should not attach alerts to the case', async () => { + // No privileges + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + + await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + params: postCommentAlertMultipleIdsReq, + auth: { user: secOnlyNoCreateComment, space: 'space1' }, + expectedHttpCode: 403, + }); + }); + + // Create + for (const scenario of [ + { user: secOnlyCreateComment, space: 'space1' }, + { user: secOnlyReadCreateComment, space: 'space1' }, + ]) { + it(`User ${scenario.user.username} with role(s) ${scenario.user.roles.join()} and space ${ + scenario.space + } - should attach alerts`, async () => { + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + params: postCommentAlertMultipleIdsReq, + auth: scenario, + expectedHttpCode: 200, + }); + }); + } + + // Delete + for (const scenario of [ + { user: secOnlyNoCreateComment, space: 'space1' }, + { user: secOnlyCreateComment, space: 'space1' }, + { user: secOnlyReadCreateComment, space: 'space1' }, + ]) { + it(`User ${scenario.user.username} with role(s) ${scenario.user.roles.join()} and space ${ + scenario.space + } - should not delete attached alerts`, async () => { + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + + await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + params: postCommentAlertMultipleIdsReq, + auth: { user: superUser, space: 'space1' }, + }); + + await deleteAllComments({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + auth: scenario, + expectedHttpCode: 403, + }); + }); + } + }); + + describe('files', () => { + it('should not attach files to the case', async () => { + // No privileges + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + + await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + auth: { user: secOnlyNoCreateComment, space: 'space1' }, + params: getFilesAttachmentReq(), + expectedHttpCode: 403, + }); + }); + + // Create + for (const scenario of [ + { user: secOnlyCreateComment, space: 'space1' }, + { user: secOnlyReadCreateComment, space: 'space1' }, + ]) { + it(`User ${scenario.user.username} with role(s) ${scenario.user.roles.join()} and space ${ + scenario.space + } - should attach files`, async () => { + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + + const caseWithAttachments = await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + auth: scenario, + params: getFilesAttachmentReq(), + expectedHttpCode: 200, + }); + + const fileAttachment = + caseWithAttachments.comments![0] as ExternalReferenceSOAttachmentPayload; + + expect(caseWithAttachments.totalComment).to.be(1); + expect(fileAttachment.externalReferenceMetadata).to.eql(fileAttachmentMetadata); + }); + } + + // Delete + for (const scenario of [ + { user: secOnlyCreateComment, space: 'space1' }, + { user: secOnlyReadCreateComment, space: 'space1' }, + ]) { + it(`User ${scenario.user.username} with role(s) ${scenario.user.roles.join()} and space ${ + scenario.space + } - should not delete attached files`, async () => { + const postedCase = await createCase( + supertestWithoutAuth, + getPostCaseRequest({ owner: 'securitySolutionFixture' }), + 200, + { + user: superUser, + space: 'space1', + } + ); + + await createComment({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + auth: { user: superUser, space: 'space1' }, + params: getFilesAttachmentReq(), + expectedHttpCode: 200, + }); + + await deleteAllComments({ + supertest: supertestWithoutAuth, + caseId: postedCase.id, + auth: scenario, + expectedHttpCode: 403, + }); + }); + } + }); + }); +}; diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/delete_sub_privilege.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/delete_sub_privilege.ts index 75388fe0bfe19..22ac95050cffa 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/delete_sub_privilege.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/delete_sub_privilege.ts @@ -24,6 +24,7 @@ import { } from '../../../common/lib/api'; import { superUser, + secOnlyCreateComment, secOnlyDelete, secOnlyNoDelete, } from '../../../common/lib/authentication/users'; @@ -306,7 +307,7 @@ export default ({ getService }: FtrProviderContext): void => { supertest: supertestWithoutAuth, caseId: caseInfo.id, params: postCommentUserReq, - auth: { user: secOnlyNoDelete, space: 'space1' }, + auth: { user: secOnlyCreateComment, space: 'space1' }, }); await deleteComment({ diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/index.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/index.ts index c1038eb964313..3112dfab7ec66 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/index.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/index.ts @@ -36,6 +36,7 @@ export default ({ loadTestFile, getService }: FtrProviderContext): void => { loadTestFile(require.resolve('./attachments_framework/registered_persistable_state_trial')); // sub privileges are only available with a license above basic loadTestFile(require.resolve('./delete_sub_privilege')); + loadTestFile(require.resolve('./create_comment_sub_privilege.ts')); loadTestFile(require.resolve('./user_profiles/get_current')); // Internal routes diff --git a/x-pack/test/functional/apps/aiops/change_point_detection.ts b/x-pack/test/functional/apps/aiops/change_point_detection.ts index c0ac744e687b5..3f80d9e12e1ea 100644 --- a/x-pack/test/functional/apps/aiops/change_point_detection.ts +++ b/x-pack/test/functional/apps/aiops/change_point_detection.ts @@ -18,7 +18,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { // aiops lives in the ML UI so we need some related services. const ml = getService('ml'); - describe('change point detection', function () { + // FLAKY: https://github.com/elastic/kibana/issues/200091 + describe.skip('change point detection', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); diff --git a/x-pack/test/functional/apps/aiops/log_rate_analysis.ts b/x-pack/test/functional/apps/aiops/log_rate_analysis.ts index 8ffbea4f1a0b0..e0178cb13fe9f 100644 --- a/x-pack/test/functional/apps/aiops/log_rate_analysis.ts +++ b/x-pack/test/functional/apps/aiops/log_rate_analysis.ts @@ -348,6 +348,24 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await elasticChart.setNewChartUiDebugFlag(true); }); + it(`${testData.suiteTitle} attaches log rate analysis to a dashboard`, async () => { + await aiops.logRateAnalysisPage.navigateToDataViewSelection(); + + await ml.testExecution.logTestStep( + `${testData.suiteTitle} loads the log rate analysis page with selected data source` + ); + await ml.jobSourceSelection.selectSourceForLogRateAnalysis( + testData.sourceIndexOrSavedSearch + ); + + await ml.testExecution.logTestStep( + `${testData.suiteTitle} starting dashboard attachment process` + ); + await aiops.logRateAnalysisPage.attachToDashboard(); + + await ml.navigation.navigateToMl(); + }); + runTests(testData); }); } diff --git a/x-pack/test/functional/apps/canvas/datasource.ts b/x-pack/test/functional/apps/canvas/datasource.ts index 480510ede4e78..78010fd66f4af 100644 --- a/x-pack/test/functional/apps/canvas/datasource.ts +++ b/x-pack/test/functional/apps/canvas/datasource.ts @@ -29,6 +29,10 @@ export default function canvasExpressionTest({ getService, getPageObjects }: Ftr await kibanaServer.importExport.load( 'test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern.json' ); + // canvas application is only available when installation contains canvas workpads + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); await kibanaServer.uiSettings.update({ defaultIndex: 'kibana_sample_data_flights', @@ -46,6 +50,9 @@ export default function canvasExpressionTest({ getService, getPageObjects }: Ftr await kibanaServer.importExport.unload( 'test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern.json' ); + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); }); describe('esdocs', function () { diff --git a/x-pack/test/functional/apps/canvas/embeddables/maps.ts b/x-pack/test/functional/apps/canvas/embeddables/maps.ts index ac6a861e9796e..bd3b984e91a65 100644 --- a/x-pack/test/functional/apps/canvas/embeddables/maps.ts +++ b/x-pack/test/functional/apps/canvas/embeddables/maps.ts @@ -18,6 +18,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('maps in canvas', function () { before(async () => { await kibanaServer.savedObjects.cleanStandardList(); + // canvas application is only available when installation contains canvas workpads + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); // open canvas home await canvas.goToListingPage(); // create new workpad @@ -25,6 +29,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await canvas.setWorkpadName('maps tests'); }); + after(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + }); + describe('by-value', () => { it('creates new map embeddable', async () => { const originalEmbeddableCount = await canvas.getEmbeddableCount(); diff --git a/x-pack/test/functional/apps/canvas/embeddables/saved_search.ts b/x-pack/test/functional/apps/canvas/embeddables/saved_search.ts index f89af8b6a15c1..d6fd2fefbaf21 100644 --- a/x-pack/test/functional/apps/canvas/embeddables/saved_search.ts +++ b/x-pack/test/functional/apps/canvas/embeddables/saved_search.ts @@ -20,6 +20,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await kibanaServer.importExport.load( 'test/functional/fixtures/kbn_archiver/dashboard/current/kibana' ); + // canvas application is only available when installation contains canvas workpads + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); // open canvas home await canvas.goToListingPage(); // create new workpad diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_privileges.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_privileges.ts index 48d7216c33d59..b7eacc68dd6c3 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_privileges.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_privileges.ts @@ -146,7 +146,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const datasetWithMonitorPrivilege = apacheAccessDatasetHumanName; const datasetWithoutMonitorPrivilege = 'synth.1'; - await retry.tryForTime(5000, async () => { + await retry.tryForTime(10000, async () => { // "Size" should be available for `apacheAccessDatasetName` await testSubjects.missingOrFail( `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityInsufficientPrivileges}-sizeBytes-${datasetWithMonitorPrivilege}` diff --git a/x-pack/test/functional/apps/discover/visualize_field.ts b/x-pack/test/functional/apps/discover/visualize_field.ts index 0ee6a996652be..3d8bdc9c7d781 100644 --- a/x-pack/test/functional/apps/discover/visualize_field.ts +++ b/x-pack/test/functional/apps/discover/visualize_field.ts @@ -51,14 +51,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('discover field visualize button', () => { before(async () => { await kibanaServer.uiSettings.replace(defaultSettings); - }); - beforeEach(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json' ); + }); + + beforeEach(async () => { await common.navigateToApp('discover'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); await setDiscoverTimeRange(); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); }); after(async () => { @@ -73,7 +78,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await unifiedFieldList.expectFieldListItemVisualize('bytes'); }); - it('visualizes field to Lens and loads fields to the dimesion editor', async () => { + it('visualizes field to Lens and loads fields to the dimension editor', async () => { await unifiedFieldList.findFieldByName('bytes'); await unifiedFieldList.clickFieldListItemVisualize('bytes'); await header.waitUntilLoadingHasFinished(); diff --git a/x-pack/test/functional/apps/spaces/enter_space.ts b/x-pack/test/functional/apps/spaces/enter_space.ts index 4cff39e05b413..498b636cdce5a 100644 --- a/x-pack/test/functional/apps/spaces/enter_space.ts +++ b/x-pack/test/functional/apps/spaces/enter_space.ts @@ -20,6 +20,10 @@ export default function enterSpaceFunctionalTests({ describe('Enter Space', function () { this.tags('includeFirefox'); before(async () => { + // canvas application is only available when installation contains canvas workpads + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); await spacesService.create({ id: 'another-space', name: 'Another Space', @@ -45,6 +49,9 @@ export default function enterSpaceFunctionalTests({ await PageObjects.security.forceLogout(); }); after(async () => { + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); await spacesService.delete('another-space'); await kibanaServer.savedObjects.cleanStandardList(); }); diff --git a/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts b/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts index 0f7b14e3e8be7..3da7659419f0f 100644 --- a/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts +++ b/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts @@ -21,6 +21,7 @@ export function LogRateAnalysisPageProvider({ getService, getPageObject }: FtrPr const testSubjects = getService('testSubjects'); const retry = getService('retry'); const header = getPageObject('header'); + const dashboardPage = getPageObject('dashboard'); return { async assertTimeRangeSelectorSectionExists() { @@ -387,5 +388,52 @@ export function LogRateAnalysisPageProvider({ getService, getPageObject }: FtrPr { location: handle, offset: { x: dragAndDropOffsetPx, y: 0 } } ); }, + + async openAttachmentsMenu() { + await testSubjects.click('aiopsLogRateAnalysisAttachmentsMenuButton'); + }, + + async clickAttachToDashboard() { + await testSubjects.click('aiopsLogRateAnalysisAttachToDashboardButton'); + }, + + async confirmAttachToDashboard() { + await testSubjects.click('aiopsLogRateAnalysisAttachToDashboardSubmitButton'); + }, + + async completeSaveToDashboardForm(createNew?: boolean) { + const dashboardSelector = await testSubjects.find('add-to-dashboard-options'); + if (createNew) { + const label = await dashboardSelector.findByCssSelector( + `label[for="new-dashboard-option"]` + ); + await label.click(); + } + + await testSubjects.click('confirmSaveSavedObjectButton'); + await retry.waitForWithTimeout('Save modal to disappear', 1000, () => + testSubjects + .missingOrFail('confirmSaveSavedObjectButton') + .then(() => true) + .catch(() => false) + ); + + // make sure the dashboard page actually loaded + const dashboardItemCount = await dashboardPage.getSharedItemsCount(); + expect(dashboardItemCount).to.not.eql(undefined); + + const embeddable = await testSubjects.find('aiopsEmbeddableLogRateAnalysis', 30 * 1000); + expect(await embeddable.isDisplayed()).to.eql( + true, + 'Log rate analysis chart should be displayed in dashboard' + ); + }, + + async attachToDashboard() { + await this.openAttachmentsMenu(); + await this.clickAttachToDashboard(); + await this.confirmAttachToDashboard(); + await this.completeSaveToDashboardForm(true); + }, }; } diff --git a/x-pack/test/functional/services/ml/security_common.ts b/x-pack/test/functional/services/ml/security_common.ts index 6d9aee298beaa..05738e664796d 100644 --- a/x-pack/test/functional/services/ml/security_common.ts +++ b/x-pack/test/functional/services/ml/security_common.ts @@ -150,7 +150,7 @@ export function MachineLearningSecurityCommonProvider({ getService }: FtrProvide savedObjectsManagement: ['all'], advancedSettings: ['all'], indexPatterns: ['all'], - generalCases: ['all'], + generalCasesV2: ['all'], ml: ['none'], }, spaces: ['*'], @@ -179,7 +179,7 @@ export function MachineLearningSecurityCommonProvider({ getService }: FtrProvide savedObjectsManagement: ['all'], advancedSettings: ['all'], indexPatterns: ['all'], - generalCases: ['all'], + generalCasesV2: ['all'], }, spaces: ['*'], }, diff --git a/x-pack/test/functional/services/observability/users.ts b/x-pack/test/functional/services/observability/users.ts index 0e2915190d126..2386c08a4f90e 100644 --- a/x-pack/test/functional/services/observability/users.ts +++ b/x-pack/test/functional/services/observability/users.ts @@ -58,7 +58,7 @@ export function ObservabilityUsersProvider({ getPageObject, getService }: FtrPro */ const defineBasicObservabilityRole = ( features: Partial<{ - observabilityCases: string[]; + observabilityCasesV2: string[]; apm: string[]; logs: string[]; infrastructure: string[]; diff --git a/x-pack/test/functional_search/tests/solution_navigation.ts b/x-pack/test/functional_search/tests/solution_navigation.ts index 66bf8369b668f..b64367b11675c 100644 --- a/x-pack/test/functional_search/tests/solution_navigation.ts +++ b/x-pack/test/functional_search/tests/solution_navigation.ts @@ -14,8 +14,10 @@ export default function searchSolutionNavigation({ const { common, solutionNavigation } = getPageObjects(['common', 'solutionNavigation']); const spaces = getService('spaces'); const browser = getService('browser'); + const kibanaServer = getService('kibanaServer'); - describe('Search Solution Navigation', () => { + // FLAKY: https://github.com/elastic/kibana/issues/201037 + describe.skip('Search Solution Navigation', () => { let cleanUp: () => Promise; let spaceCreated: { id: string } = { id: '' }; @@ -28,9 +30,18 @@ export default function searchSolutionNavigation({ // Create a space with the search solution and navigate to its home page ({ cleanUp, space: spaceCreated } = await spaces.create({ solution: 'es' })); await browser.navigateTo(spaces.getRootUrl(spaceCreated.id)); + + // canvas application is only available when installation contains canvas workpads + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); }); after(async () => { + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/canvas/default' + ); + // Clean up space created await cleanUp(); }); diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/common/roles.ts b/x-pack/test/functional_with_es_ssl/apps/cases/common/roles.ts index f06c8745d6df6..0e8cb455ad299 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/common/roles.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/common/roles.ts @@ -25,7 +25,7 @@ export const casesReadDelete: Role = { kibana: [ { feature: { - generalCases: ['minimal_read', 'cases_delete'], + generalCasesV2: ['minimal_read', 'cases_delete'], actions: ['all'], actionsSimulators: ['all'], }, @@ -49,7 +49,7 @@ export const casesNoDelete: Role = { kibana: [ { feature: { - generalCases: ['minimal_all'], + generalCasesV2: ['minimal_all'], actions: ['all'], actionsSimulators: ['all'], }, @@ -73,7 +73,7 @@ export const casesAll: Role = { kibana: [ { feature: { - generalCases: ['all'], + generalCasesV2: ['all'], actions: ['all'], actionsSimulators: ['all'], }, diff --git a/x-pack/test/functional_with_es_ssl/plugins/cases/public/application.tsx b/x-pack/test/functional_with_es_ssl/plugins/cases/public/application.tsx index 31c0b25f51e94..6ab6a1cce3610 100644 --- a/x-pack/test/functional_with_es_ssl/plugins/cases/public/application.tsx +++ b/x-pack/test/functional_with_es_ssl/plugins/cases/public/application.tsx @@ -42,6 +42,8 @@ const permissions = { push: true, connectors: true, settings: true, + createComment: true, + reopenCase: true, }; const attachments = [{ type: AttachmentType.user as const, comment: 'test' }]; diff --git a/x-pack/test/observability_ai_assistant_functional/tests/feature_controls/settings_security.spec.ts b/x-pack/test/observability_ai_assistant_functional/tests/feature_controls/settings_security.spec.ts index 96f2ff4b00f7f..d466abfd552ea 100644 --- a/x-pack/test/observability_ai_assistant_functional/tests/feature_controls/settings_security.spec.ts +++ b/x-pack/test/observability_ai_assistant_functional/tests/feature_controls/settings_security.spec.ts @@ -15,8 +15,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const ui = getService('observabilityAIAssistantUI'); const testSubjects = getService('testSubjects'); - describe('ai assistant management privileges', () => { - describe('all privileges', () => { + // Failing: See https://github.com/elastic/kibana/issues/191707 + describe.skip('ai assistant management privileges', () => { + // FLAKY: https://github.com/elastic/kibana/issues/191707 + describe.skip('all privileges', () => { before(async () => { await createAndLoginUserWithCustomRole(getPageObjects, getService, { // we need all these privileges to view and modify Obs AI Assistant settings view diff --git a/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts b/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts index a71c83a5221c3..81fb1d23ba33e 100644 --- a/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts +++ b/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts @@ -43,7 +43,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ - observabilityCases: ['all'], + observabilityCasesV2: ['all'], logs: ['all'], }) ); @@ -96,7 +96,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ - observabilityCases: ['read'], + observabilityCasesV2: ['read'], logs: ['all'], }) ); diff --git a/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts b/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts index 33b2ad3ba329a..ccb4264147523 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts @@ -29,7 +29,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { before(async () => { await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ - observabilityCases: ['all'], + observabilityCasesV2: ['all'], logs: ['all'], }) ); @@ -75,7 +75,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { before(async () => { await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ - observabilityCases: ['read'], + observabilityCasesV2: ['read'], logs: ['all'], }) ); diff --git a/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts b/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts index ac6343f8e7170..90fc09af9c6ad 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts @@ -33,7 +33,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { before(async () => { await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ - observabilityCases: ['all'], + observabilityCasesV2: ['all'], logs: ['all'], }) ); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts index a7447353e805a..60d858206d68e 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts @@ -47,7 +47,8 @@ export default function ({ getService }: FtrProviderContext) { const UNREGISTERED_TASK_TYPE_ID = 'ce7e1250-3322-11eb-94c1-db6995e83f6b'; const REMOVED_TASK_TYPE_ID = 'be7e1250-3322-11eb-94c1-db6995e83f6a'; - describe('not registered task types', () => { + // FLAKY: https://github.com/elastic/kibana/issues/200154 + describe.skip('not registered task types', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/task_manager_removed_types'); }); diff --git a/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts b/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts index 1f768780a9c95..d4c87209c64c7 100644 --- a/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts +++ b/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts @@ -29,7 +29,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const toasts = getService('toasts'); - describe('discover async search', () => { + // FLAKY: https://github.com/elastic/kibana/issues/195955 + describe.skip('discover async search', () => { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( diff --git a/x-pack/test/security_api_integration/tests/features/deprecated_features.ts b/x-pack/test/security_api_integration/tests/features/deprecated_features.ts index 6e868fc5946ec..29135ff2440b2 100644 --- a/x-pack/test/security_api_integration/tests/features/deprecated_features.ts +++ b/x-pack/test/security_api_integration/tests/features/deprecated_features.ts @@ -181,6 +181,9 @@ export default function ({ getService }: FtrProviderContext) { "case_3_feature_a", "case_4_feature_a", "case_4_feature_b", + "generalCases", + "observabilityCases", + "securitySolutionCases", ] `); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts index 1fbaaa9b3fc71..8bad52ae41bdb 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts @@ -194,7 +194,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('status', () => { + // FLAKY: https://github.com/elastic/kibana/issues/200758 + describe.skip('status', () => { afterEach(async () => { await utils.cleanEngines(); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts index bc5eccd168418..9f5b0a3b79e38 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/asset_criticality.ts @@ -224,7 +224,7 @@ export default ({ getService }: FtrProviderContext) => { const createRecords = () => createAssetCriticalityRecords(records, es); - it('@skipInServerless should return the first 10 asset criticality records if no args provided', async () => { + it(' should return the first 10 asset criticality records if no args provided', async () => { await createRecords(); const { body } = await assetCriticalityRoutes.list(); @@ -259,7 +259,7 @@ export default ({ getService }: FtrProviderContext) => { ); }); - it('@skipInServerless should only return 1 asset criticality record if per_page=1', async () => { + it('should only return 1 asset criticality record if per_page=1', async () => { await createRecords(); const { body } = await assetCriticalityRoutes.list({ per_page: 1 }); @@ -273,7 +273,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body.records[0].id_value).to.eql(records[0].id_value); }); - it('@skipInServerless should return the next 10 asset criticality records if page=2', async () => { + it('should return the next 10 asset criticality records if page=2', async () => { await createRecords(); const { body } = await assetCriticalityRoutes.list({ page: 2 }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts index e5e721194d015..f13ce4e4a681c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts @@ -103,7 +103,7 @@ export default ({ getService }: FtrProviderContext): void => { ); }); - it('@skipInServerlessMKI @skipInServerless starts the latest transform', async () => { + it('@skipInServerlessMKI starts the latest transform', async () => { // Transform states that indicate the transform is running happily const TRANSFORM_STARTED_STATES = ['started', 'indexing']; diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/index.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/index.ts index e3402e0c6b80e..22e9a6f04b6e4 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('@ess @serverless SecuritySolution Saved Objects', () => { + describe('@ess @serverless @serverlessQA SecuritySolution Saved Objects', () => { loadTestFile(require.resolve('./notes')); loadTestFile(require.resolve('./pinned_events')); loadTestFile(require.resolve('./timeline')); diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/index.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/index.ts index 0d14c693ea828..b337faad85f07 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContextWithSpaces } from '../../../../ftr_provider_context_with_spaces'; export default function ({ loadTestFile }: FtrProviderContextWithSpaces) { - describe('@ess @serverless SecuritySolution Timeline', () => { + describe('@ess @serverless @serverlessQA SecuritySolution Timeline', () => { loadTestFile(require.resolve('./events')); loadTestFile(require.resolve('./timeline_details')); loadTestFile(require.resolve('./timeline')); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/callouts/missing_privileges_callout.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/callouts/missing_privileges_callout.cy.ts index 69e6bb8b35253..501c8750b55f3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/callouts/missing_privileges_callout.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/callouts/missing_privileges_callout.cy.ts @@ -44,91 +44,96 @@ const waitForPageTitleToBeShown = () => { cy.get(PAGE_TITLE).should('be.visible'); }; -describe('Detections > Callouts', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => { - before(() => { - // First, we have to open the app on behalf of a privileged user in order to initialize it. - // Otherwise the app will be disabled and show a "welcome"-like page. - login(); - visit(ALERTS_URL); - waitForPageTitleToBeShown(); - }); - - context('indicating read-only access to resources', () => { - context('On Detections home page', () => { - beforeEach(() => { - loadPageAsReadOnlyUser(ALERTS_URL); - }); +// FLAKY: https://github.com/elastic/kibana/issues/198628 +describe.skip( + 'Detections > Callouts', + { tags: ['@ess', '@serverless', '@skipInServerless'] }, + () => { + before(() => { + // First, we have to open the app on behalf of a privileged user in order to initialize it. + // Otherwise the app will be disabled and show a "welcome"-like page. + login(); + visit(ALERTS_URL); + waitForPageTitleToBeShown(); + }); + + context('indicating read-only access to resources', () => { + context('On Detections home page', () => { + beforeEach(() => { + loadPageAsReadOnlyUser(ALERTS_URL); + }); - it('dismisses callout and persists its state', () => { - waitForCallOutToBeShown(MISSING_PRIVILEGES_CALLOUT, 'primary'); + it('dismisses callout and persists its state', () => { + waitForCallOutToBeShown(MISSING_PRIVILEGES_CALLOUT, 'primary'); - dismissCallOut(MISSING_PRIVILEGES_CALLOUT); - reloadPage(); + dismissCallOut(MISSING_PRIVILEGES_CALLOUT); + reloadPage(); - getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + }); }); - }); - // FYI: Rules Management check moved to ../detection_rules/all_rules_read_only.spec.ts + // FYI: Rules Management check moved to ../detection_rules/all_rules_read_only.spec.ts - context('On Rule Details page', () => { - beforeEach(() => { - createRule(getNewRule()).then((rule) => - loadPageAsReadOnlyUser(ruleDetailsUrl(rule.body.id)) - ); - }); + context('On Rule Details page', () => { + beforeEach(() => { + createRule(getNewRule()).then((rule) => + loadPageAsReadOnlyUser(ruleDetailsUrl(rule.body.id)) + ); + }); - afterEach(() => { - deleteCustomRule(); - }); + afterEach(() => { + deleteCustomRule(); + }); - it('dismisses callout and persists its state', () => { - waitForCallOutToBeShown(MISSING_PRIVILEGES_CALLOUT, 'primary'); + it('dismisses callout and persists its state', () => { + waitForCallOutToBeShown(MISSING_PRIVILEGES_CALLOUT, 'primary'); - dismissCallOut(MISSING_PRIVILEGES_CALLOUT); - reloadPage(); + dismissCallOut(MISSING_PRIVILEGES_CALLOUT); + reloadPage(); - getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + }); }); }); - }); - context('indicating read-write access to resources', () => { - context('On Detections home page', () => { - beforeEach(() => { - loadPageAsPlatformEngineer(ALERTS_URL); - }); + context('indicating read-write access to resources', () => { + context('On Detections home page', () => { + beforeEach(() => { + loadPageAsPlatformEngineer(ALERTS_URL); + }); - it('We show no callout', () => { - getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + it('We show no callout', () => { + getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + }); }); - }); - context('On Rules Management page', () => { - beforeEach(() => { - login(ROLES.platform_engineer); - loadPageAsPlatformEngineer(RULES_MANAGEMENT_URL); - }); + context('On Rules Management page', () => { + beforeEach(() => { + login(ROLES.platform_engineer); + loadPageAsPlatformEngineer(RULES_MANAGEMENT_URL); + }); - it('We show no callout', () => { - getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + it('We show no callout', () => { + getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + }); }); - }); - context('On Rule Details page', () => { - beforeEach(() => { - createRule(getNewRule()).then((rule) => - loadPageAsPlatformEngineer(ruleDetailsUrl(rule.body.id)) - ); - }); + context('On Rule Details page', () => { + beforeEach(() => { + createRule(getNewRule()).then((rule) => + loadPageAsPlatformEngineer(ruleDetailsUrl(rule.body.id)) + ); + }); - afterEach(() => { - deleteCustomRule(); - }); + afterEach(() => { + deleteCustomRule(); + }); - it('We show no callouts', () => { - getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + it('We show no callouts', () => { + getCallOut(MISSING_PRIVILEGES_CALLOUT).should('not.exist'); + }); }); }); - }); -}); + } +); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts index 826ca78228b61..0800c2b610a27 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts @@ -23,7 +23,8 @@ import { expectedExportedTimeline } from '../../../objects/timeline'; import { closeToast } from '../../../tasks/common/toast'; import { getFullname } from '../../../tasks/common'; -describe('Export timelines', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/187550 +describe.skip('Export timelines', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); deleteTimelines(); @@ -45,8 +46,9 @@ describe('Export timelines', { tags: ['@ess', '@serverless'] }, () => { /** * TODO: Good candidate for converting to a jest Test * https://github.com/elastic/kibana/issues/195612 + * Failing: https://github.com/elastic/kibana/issues/187550 */ - it('should export custom timeline(s)', function () { + it.skip('should export custom timeline(s)', function () { cy.log('Export a custom timeline via timeline actions'); exportTimeline(this.timelineId1); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/privileges.ts b/x-pack/test/security_solution_cypress/cypress/tasks/privileges.ts index 7f2d0dea8b545..bbbaaa1e240a6 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/privileges.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/privileges.ts @@ -66,6 +66,7 @@ export const secAll: Role = { securitySolutionAssistant: ['all'], securitySolutionAttackDiscovery: ['all'], securitySolutionCases: ['all'], + securitySolutionCasesV2: ['all'], actions: ['all'], actionsSimulators: ['all'], }, @@ -99,6 +100,7 @@ export const secReadCasesAll: Role = { securitySolutionAssistant: ['all'], securitySolutionAttackDiscovery: ['all'], securitySolutionCases: ['all'], + securitySolutionCasesV2: ['all'], actions: ['all'], actionsSimulators: ['all'], }, @@ -132,6 +134,7 @@ export const secAllCasesOnlyReadDelete: Role = { securitySolutionAssistant: ['all'], securitySolutionAttackDiscovery: ['all'], securitySolutionCases: ['cases_read', 'cases_delete'], + securitySolutionCasesV2: ['cases_read', 'cases_delete'], actions: ['all'], actionsSimulators: ['all'], }, @@ -165,6 +168,7 @@ export const secAllCasesNoDelete: Role = { securitySolutionAssistant: ['all'], securitySolutionAttackDiscovery: ['all'], securitySolutionCases: ['minimal_all'], + securitySolutionCasesV2: ['minimal_all'], actions: ['all'], actionsSimulators: ['all'], }, diff --git a/x-pack/test/spaces_api_integration/common/suites/create.ts b/x-pack/test/spaces_api_integration/common/suites/create.ts index 795d177805f89..d84945fbfe032 100644 --- a/x-pack/test/spaces_api_integration/common/suites/create.ts +++ b/x-pack/test/spaces_api_integration/common/suites/create.ts @@ -81,9 +81,11 @@ export function createTestSuiteFactory(esArchiver: any, supertest: SuperTest) 'inventory', 'logs', 'observabilityCases', + 'observabilityCasesV2', 'securitySolutionAssistant', 'securitySolutionAttackDiscovery', 'securitySolutionCases', + 'securitySolutionCasesV2', 'siem', 'slo', 'uptime', diff --git a/x-pack/test/spaces_api_integration/common/suites/get_all.ts b/x-pack/test/spaces_api_integration/common/suites/get_all.ts index b90128ab12c70..9d51cbb12e469 100644 --- a/x-pack/test/spaces_api_integration/common/suites/get_all.ts +++ b/x-pack/test/spaces_api_integration/common/suites/get_all.ts @@ -80,9 +80,11 @@ const ALL_SPACE_RESULTS: Space[] = [ 'inventory', 'logs', 'observabilityCases', + 'observabilityCasesV2', 'securitySolutionAssistant', 'securitySolutionAttackDiscovery', 'securitySolutionCases', + 'securitySolutionCasesV2', 'siem', 'slo', 'uptime', diff --git a/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts b/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts index e691f84d7bdc7..4a43c3831627c 100644 --- a/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts +++ b/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts @@ -66,6 +66,7 @@ export default function ({ getService }: FtrProviderContext) { maintenanceWindow: 0, stackAlerts: 0, generalCases: 0, + generalCasesV2: 0, maps: 2, canvas: 2, ml: 0, @@ -73,6 +74,7 @@ export default function ({ getService }: FtrProviderContext) { fleet: 0, osquery: 0, observabilityCases: 0, + observabilityCasesV2: 0, uptime: 0, slo: 0, infrastructure: 0, @@ -84,6 +86,7 @@ export default function ({ getService }: FtrProviderContext) { searchInferenceEndpoints: 0, siem: 0, securitySolutionCases: 0, + securitySolutionCasesV2: 0, securitySolutionAssistant: 0, securitySolutionAttackDiscovery: 0, discover: 0, diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 2ba14ceb1218c..9db41aecbb612 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -187,6 +187,6 @@ "@kbn/alerting-types", "@kbn/ai-assistant-common", "@kbn/core-deprecations-common", - "@kbn/usage-collection-plugin" + "@kbn/usage-collection-plugin", ] } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/config.ts b/x-pack/test_serverless/api_integration/test_suites/observability/config.ts index 97a30d0f340f9..fa0714aa61544 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/config.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import { createTestConfig } from '../../config.base'; import { services as apmServices } from './apm_api_integration/common/services'; import { services as datasetQualityServices } from './dataset_quality_api_integration/common/services'; @@ -32,6 +32,5 @@ export default createTestConfig({ '--xpack.dataUsage.autoops.api.url=http://localhost:9000', `--xpack.dataUsage.autoops.api.tls.certificate=${KBN_CERT_PATH}`, `--xpack.dataUsage.autoops.api.tls.key=${KBN_KEY_PATH}`, - `--xpack.dataUsage.autoops.api.tls.ca=${CA_CERT_PATH}`, ], }); diff --git a/x-pack/test_serverless/api_integration/test_suites/search/config.ts b/x-pack/test_serverless/api_integration/test_suites/search/config.ts index 9f02dc98b88c3..4db3e86bb9787 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/config.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import { createTestConfig } from '../../config.base'; export default createTestConfig({ @@ -28,6 +28,5 @@ export default createTestConfig({ '--xpack.dataUsage.autoops.api.url=http://localhost:9000', `--xpack.dataUsage.autoops.api.tls.certificate=${KBN_CERT_PATH}`, `--xpack.dataUsage.autoops.api.tls.key=${KBN_KEY_PATH}`, - `--xpack.dataUsage.autoops.api.tls.ca=${CA_CERT_PATH}`, ], }); diff --git a/x-pack/test_serverless/api_integration/test_suites/security/config.ts b/x-pack/test_serverless/api_integration/test_suites/security/config.ts index 52b933a22b086..511ec3176ef6f 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/config.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import { createTestConfig } from '../../config.base'; export default createTestConfig({ @@ -32,6 +32,5 @@ export default createTestConfig({ '--xpack.dataUsage.autoops.api.url=http://localhost:9000', `--xpack.dataUsage.autoops.api.tls.certificate=${KBN_CERT_PATH}`, `--xpack.dataUsage.autoops.api.tls.key=${KBN_KEY_PATH}`, - `--xpack.dataUsage.autoops.api.tls.ca=${CA_CERT_PATH}`, ], }); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_render_app_wrapper.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_render_app_wrapper.ts index fd4bee4c1fffb..3506f132f9026 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_render_app_wrapper.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_render_app_wrapper.ts @@ -7,17 +7,20 @@ import kbnRison from '@kbn/rison'; import expect from '@kbn/expect'; +import type { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { common, discover, header, unifiedFieldList, dashboard, svlCommonPage } = getPageObjects([ - 'common', - 'discover', - 'header', - 'unifiedFieldList', - 'dashboard', - 'svlCommonPage', - ]); + const { common, discover, header, unifiedFieldList, dashboard, context, svlCommonPage } = + getPageObjects([ + 'common', + 'discover', + 'header', + 'unifiedFieldList', + 'dashboard', + 'context', + 'svlCommonPage', + ]); const testSubjects = getService('testSubjects'); const dataViews = getService('dataViews'); const dataGrid = getService('dataGrid'); @@ -26,8 +29,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dashboardAddPanel = getService('dashboardAddPanel'); const kibanaServer = getService('kibanaServer'); - // Failing: See https://github.com/elastic/kibana/issues/199356 - describe.skip('extension getRenderAppWrapper', () => { + describe('extension getRenderAppWrapper', () => { before(async () => { await svlCommonPage.loginAsAdmin(); }); @@ -45,17 +47,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); + await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); await unifiedFieldList.clickFieldListItemAdd('message'); - let messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + let messageCell: WebElementWrapper; await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); let message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -73,15 +79,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); - messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -97,18 +103,22 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await dataViews.switchTo('my-example-logs'); + await dataViews.switchToAndValidate('my-example-logs'); + await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); await unifiedFieldList.clickFieldListItemAdd('message'); - let messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + let messageCell: WebElementWrapper; await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); let message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -124,16 +134,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await browser.refresh(); await header.waitUntilLoadingHasFinished(); + await context.waitUntilContextLoadingHasFinished(); - messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); @@ -153,15 +164,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); - messageCell = await dataGrid.getCellElementExcludingControlColumns(0, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(0, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); }); message = await testSubjects.find('exampleRootProfileCurrentMessage'); expect(await message.getVisibleText()).to.be('This is a debug log'); - messageCell = await dataGrid.getCellElementExcludingControlColumns(1, 2); await retry.try(async () => { + messageCell = await dataGrid.getCellElementByColumnName(1, 'message'); await (await messageCell.findByTestSubject('exampleDataSourceProfileMessage')).click(); await testSubjects.existOrFail('exampleRootProfileFlyout'); message = await testSubjects.find('exampleRootProfileCurrentMessage'); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index b4c73c56a484a..03dc8cea4a100 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -141,8 +141,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should perform test query correctly', async function () { await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.selectTextBaseLang(); - const testQuery = `from logstash-* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + const testQuery = `from logstash-* | sort @timestamp | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); @@ -157,7 +161,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render when switching to a time range with no data, then back to a time range with data', async () => { await PageObjects.discover.selectTextBaseLang(); - const testQuery = `from logstash-* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + const testQuery = `from logstash-* | sort @timestamp | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); await PageObjects.header.waitUntilLoadingHasFinished(); @@ -183,7 +190,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - const testQuery = `from logstash* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + const testQuery = `from logstash* | sort @timestamp | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); await PageObjects.header.waitUntilLoadingHasFinished(); @@ -256,8 +263,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/189636 - describe.skip('switch modal', () => { + describe('switch modal', () => { beforeEach(async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.timePicker.setDefaultAbsoluteRange(); @@ -302,6 +308,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.saveSearch('esql_test2'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); const testQuery = 'from logstash-* | limit 100 | drop @timestamp'; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts index c944865d06327..0aff2b216b1b2 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts @@ -97,7 +97,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - describe('Generate CSV: new search', () => { + // FLAKY: https://github.com/elastic/kibana/issues/182603 + describe.skip('Generate CSV: new search', () => { before(async () => { await reportingAPI.initEcommerce(); }); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/visualize_field.ts b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/visualize_field.ts index 42d1ad33b30f0..7d145542e5884 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/visualize_field.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/visualize_field.ts @@ -48,7 +48,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { beforeEach(async () => { await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); await setDiscoverTimeRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); }); after(async () => { @@ -64,7 +68,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.unifiedFieldList.expectFieldListItemVisualize('bytes'); }); - it('visualizes field to Lens and loads fields to the dimesion editor', async () => { + it('visualizes field to Lens and loads fields to the dimension editor', async () => { await PageObjects.unifiedFieldList.findFieldByName('bytes'); await PageObjects.unifiedFieldList.clickFieldListItemVisualize('bytes'); await PageObjects.header.waitUntilLoadingHasFinished(); diff --git a/x-pack/test_serverless/functional/test_suites/observability/config.ts b/x-pack/test_serverless/functional/test_suites/observability/config.ts index 9fffd5623f0a3..41093df640976 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/config.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/config.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import { createTestConfig } from '../../config.base'; export default createTestConfig({ @@ -25,6 +25,5 @@ export default createTestConfig({ '--xpack.dataUsage.autoops.api.url=http://localhost:9000', `--xpack.dataUsage.autoops.api.tls.certificate=${KBN_CERT_PATH}`, `--xpack.dataUsage.autoops.api.tls.key=${KBN_KEY_PATH}`, - `--xpack.dataUsage.autoops.api.tls.ca=${CA_CERT_PATH}`, ], }); diff --git a/x-pack/test_serverless/functional/test_suites/search/config.ts b/x-pack/test_serverless/functional/test_suites/search/config.ts index aef26951908d0..5c52828a11659 100644 --- a/x-pack/test_serverless/functional/test_suites/search/config.ts +++ b/x-pack/test_serverless/functional/test_suites/search/config.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import { createTestConfig } from '../../config.base'; export default createTestConfig({ @@ -28,7 +28,6 @@ export default createTestConfig({ '--xpack.dataUsage.autoops.api.url=http://localhost:9000', `--xpack.dataUsage.autoops.api.tls.certificate=${KBN_CERT_PATH}`, `--xpack.dataUsage.autoops.api.tls.key=${KBN_KEY_PATH}`, - `--xpack.dataUsage.autoops.api.tls.ca=${CA_CERT_PATH}`, ], apps: { serverlessElasticsearch: { diff --git a/x-pack/test_serverless/functional/test_suites/search/index_management.ts b/x-pack/test_serverless/functional/test_suites/search/index_management.ts index 08b093f660640..459738cba7831 100644 --- a/x-pack/test_serverless/functional/test_suites/search/index_management.ts +++ b/x-pack/test_serverless/functional/test_suites/search/index_management.ts @@ -27,6 +27,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const testIndexName = `test-index-ftr-${Math.random()}`; const testAPIIndexName = `test-api-index-ftr-${Math.random()}`; describe('index management', function () { + // see details: https://github.com/elastic/kibana/issues/200878 + this.tags(['failsOnMKI']); before(async () => { await security.testUser.setRoles(['index_management_user']); // Navigate to the index management page diff --git a/x-pack/test_serverless/functional/test_suites/security/config.ts b/x-pack/test_serverless/functional/test_suites/security/config.ts index 1693a07b0e844..6bf456e5f6d55 100644 --- a/x-pack/test_serverless/functional/test_suites/security/config.ts +++ b/x-pack/test_serverless/functional/test_suites/security/config.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import { createTestConfig } from '../../config.base'; export default createTestConfig({ @@ -25,6 +25,5 @@ export default createTestConfig({ '--xpack.dataUsage.autoops.api.url=http://localhost:9000', `--xpack.dataUsage.autoops.api.tls.certificate=${KBN_CERT_PATH}`, `--xpack.dataUsage.autoops.api.tls.key=${KBN_KEY_PATH}`, - `--xpack.dataUsage.autoops.api.tls.ca=${CA_CERT_PATH}`, ], }); diff --git a/x-pack/test_serverless/shared/lib/security/default_http_headers.ts b/x-pack/test_serverless/shared/lib/security/default_http_headers.ts index 03c96905d6b06..18293b74ce116 100644 --- a/x-pack/test_serverless/shared/lib/security/default_http_headers.ts +++ b/x-pack/test_serverless/shared/lib/security/default_http_headers.ts @@ -8,4 +8,5 @@ export const STANDARD_HTTP_HEADERS = Object.freeze({ 'kbn-xsrf': 'cypress-creds-via-env', 'x-elastic-internal-origin': 'security-solution', + 'elastic-api-version': '2023-10-31', }); diff --git a/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml b/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml index 22b3fd31c423b..61d3378de4c68 100644 --- a/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml +++ b/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml @@ -493,6 +493,7 @@ soc_manager: - application: "kibana-.kibana" privileges: - feature_ml.read + - feature_generalCases.all - feature_siem.all - feature_siem.read_alerts - feature_siem.crud_alerts @@ -509,6 +510,7 @@ soc_manager: - feature_siem.execute_operations_all - feature_siem.scan_operations_all - feature_securitySolutionCases.all + - feature_observabilityCases.all - feature_securitySolutionAssistant.all - feature_securitySolutionAttackDiscovery.all - feature_actions.all diff --git a/yarn.lock b/yarn.lock index 5b3b6f246ff42..d5acff31b563b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -86,7 +86,20 @@ "@aws-sdk/types" "^3.222.0" tslib "^2.6.2" -"@aws-crypto/sha256-js@^5.2.0": +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== @@ -95,6 +108,13 @@ "@aws-sdk/types" "^3.222.0" tslib "^2.6.2" +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + "@aws-crypto/util@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" @@ -104,12 +124,517 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/types@^3.222.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.577.0.tgz#7700784d368ce386745f8c340d9d68cea4716f90" - integrity sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA== +"@aws-sdk/client-bedrock-agent-runtime@^3.616.0": + version "3.688.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-bedrock-agent-runtime/-/client-bedrock-agent-runtime-3.688.0.tgz#81769a896ff678d913e2838a554a9060ce3db3ab" + integrity sha512-ZaIX7nBQm2QIrl0TNgPtYvEJbMDUfFB1AT/ToKQ1IEKI3gc0tIgSdcxqorpXer+s50ZB3j9ITF4WCyhWnxfNSw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.687.0" + "@aws-sdk/client-sts" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/eventstream-serde-browser" "^3.0.11" + "@smithy/eventstream-serde-config-resolver" "^3.0.8" + "@smithy/eventstream-serde-node" "^3.0.10" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-bedrock-runtime@^3.602.0", "@aws-sdk/client-bedrock-runtime@^3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.687.0.tgz#9c08850b2cebe62da0682f76c7a5559e53829325" + integrity sha512-ayFDpIOXVOeY84CPo9KCY2emEPjLBNFT8TFeZeUjz8KiV+K0LwAKnkbLQkTweHFN2sq2pa7XqAPZ70xMjt5w3w== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.687.0" + "@aws-sdk/client-sts" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/eventstream-serde-browser" "^3.0.11" + "@smithy/eventstream-serde-config-resolver" "^3.0.8" + "@smithy/eventstream-serde-node" "^3.0.10" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + "@smithy/util-stream" "^3.2.1" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-kendra@^3.352.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-kendra/-/client-kendra-3.687.0.tgz#b55cd41694fb49ae3d0c4a47401752c322b5bafb" + integrity sha512-NreNmI6OIcuRGgtmjXiceXwcf1TPUIdg+rlPJwLFrTi6ukIu+P9e28g2ggNtZQ9pYmyUilBl2XntLIKHqvQAnQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.687.0" + "@aws-sdk/client-sts" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + "@smithy/util-utf8" "^3.0.0" + "@types/uuid" "^9.0.1" + tslib "^2.6.2" + uuid "^9.0.1" + +"@aws-sdk/client-sso-oidc@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.687.0.tgz#a327cc65b7bb2cbda305c4467bfae452b5d27927" + integrity sha512-Rdd8kLeTeh+L5ZuG4WQnWgYgdv7NorytKdZsGjiag1D8Wv3PcJvPqqWdgnI0Og717BSXVoaTYaN34FyqFYSx6Q== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.687.0.tgz#4c71b818e718f632aa3dd4047961bededa23e4a7" + integrity sha512-dfj0y9fQyX4kFill/ZG0BqBTLQILKlL7+O5M4F9xlsh2WNuV2St6WtcOg14Y1j5UODPJiJs//pO+mD1lihT5Kw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sts@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.687.0.tgz#fcb837080b225c5820f08326e98db54e48606fb1" + integrity sha512-SQjDH8O4XCTtouuCVYggB0cCCrIaTzUZIkgJUpOsIEJBLlTbNOb/BZqUShAQw2o9vxr2rCeOGjAQOYPysW/Pmg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/core@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.686.0.tgz#106a3733c250094db15ba765386db4643f5613b6" + integrity sha512-Xt3DV4DnAT3v2WURwzTxWQK34Ew+iiLzoUoguvLaZrVMFOqMMrwVjP+sizqIaHp1j7rGmFcN5I8saXnsDLuQLA== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/core" "^2.5.1" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/property-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.5" + "@smithy/signature-v4" "^4.2.0" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/util-middleware" "^3.0.8" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.686.0.tgz#71ce2df0be065dacddd873d1be7426bc8c6038ec" + integrity sha512-osD7lPO8OREkgxPiTWmA1i6XEmOth1uW9HWWj/+A2YGCj1G/t2sHu931w4Qj9NWHYZtbTTXQYVRg+TErALV7nQ== + dependencies: + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.686.0.tgz#fe84ea67fea6bb61effc0f10b99a0c3e9378d6c3" + integrity sha512-xyGAD/f3vR/wssUiZrNFWQWXZvI4zRm2wpHhoHA1cC2fbRMNFYtFn365yw6dU7l00ZLcdFB1H119AYIUZS7xbw== + dependencies: + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/property-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/util-stream" "^3.2.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.687.0.tgz#adb7f3fe381767ad1a4aee352162630f7b5f54de" + integrity sha512-6d5ZJeZch+ZosJccksN0PuXv7OSnYEmanGCnbhUqmUSz9uaVX6knZZfHCZJRgNcfSqg9QC0zsFA/51W5HCUqSQ== + dependencies: + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-env" "3.686.0" + "@aws-sdk/credential-provider-http" "3.686.0" + "@aws-sdk/credential-provider-process" "3.686.0" + "@aws-sdk/credential-provider-sso" "3.687.0" + "@aws-sdk/credential-provider-web-identity" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/credential-provider-imds" "^3.2.4" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.687.0", "@aws-sdk/credential-provider-node@^3.600.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.687.0.tgz#46bd8014bb68913ad285aed01e6920083a42d056" + integrity sha512-Pqld8Nx11NYaBUrVk3bYiGGpLCxkz8iTONlpQWoVWFhSOzlO7zloNOaYbD2XgFjjqhjlKzE91drs/f41uGeCTA== + dependencies: + "@aws-sdk/credential-provider-env" "3.686.0" + "@aws-sdk/credential-provider-http" "3.686.0" + "@aws-sdk/credential-provider-ini" "3.687.0" + "@aws-sdk/credential-provider-process" "3.686.0" + "@aws-sdk/credential-provider-sso" "3.687.0" + "@aws-sdk/credential-provider-web-identity" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/credential-provider-imds" "^3.2.4" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.686.0.tgz#7b02591d9b81fb16288618ce23d3244496c1b538" + integrity sha512-sXqaAgyzMOc+dm4CnzAR5Q6S9OWVHyZjLfW6IQkmGjqeQXmZl24c4E82+w64C+CTkJrFLzH1VNOYp1Hy5gE6Qw== + dependencies: + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.687.0.tgz#2e5704bdaa3c420c2a00a1316cdbdf57d78ae649" + integrity sha512-N1YCoE7DovIRF2ReyRrA4PZzF0WNi4ObPwdQQkVxhvSm7PwjbWxrfq7rpYB+6YB1Uq3QPzgVwUFONE36rdpxUQ== + dependencies: + "@aws-sdk/client-sso" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/token-providers" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.686.0.tgz#228be45b2f840ebf227d96ee5e326c1efa3c25a9" + integrity sha512-40UqCpPxyHCXDP7CGd9JIOZDgDZf+u1OyLaGBpjQJlz1HYuEsIWnnbTe29Yg3Ah/Zc3g4NBWcUdlGVotlnpnDg== dependencies: - "@smithy/types" "^3.0.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.686.0.tgz#16f0be33fc738968a4e10ff77cb8a04e2b2c2359" + integrity sha512-+Yc6rO02z+yhFbHmRZGvEw1vmzf/ifS9a4aBjJGeVVU+ZxaUvnk+IUZWrj4YQopUQ+bSujmMUzJLXSkbDq7yuw== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.686.0.tgz#4e094e42e10bf17d43b9c9afc3fc594f4aa72e02" + integrity sha512-cX43ODfA2+SPdX7VRxu6gXk4t4bdVJ9pkktbfnkE5t27OlwNfvSGGhnHrQL8xTOFeyQ+3T+oowf26gf1OI+vIg== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.686.0.tgz#aba097d2dcc9d3b9d4523d7ae03ac3b387617db1" + integrity sha512-jF9hQ162xLgp9zZ/3w5RUNhmwVnXDBlABEUX8jCgzaFpaa742qR/KKtjjZQ6jMbQnP+8fOCSXFAVNMU+s6v81w== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.687.0.tgz#a5feb5466d2926cd1ef5dd6f4778b33ce160ca7f" + integrity sha512-nUgsKiEinyA50CaDXojAkOasAU3Apdg7Qox6IjNUC4ZjgOu7QWsCDB5N28AYMUt06cNYeYQdfMX1aEzG85a1Mg== + dependencies: + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@smithy/core" "^2.5.1" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.686.0.tgz#3ef61e2cd95eb0ae80ecd5eef284744eb0a76d7c" + integrity sha512-6zXD3bSD8tcsMAVVwO1gO7rI1uy2fCD3czgawuPGPopeLiPpo6/3FoUWCQzk2nvEhj7p9Z4BbjwZGSlRkVrXTw== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.8" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.686.0.tgz#c7733a0a079adc9404bd9d8fc4ff52edef0a123a" + integrity sha512-9oL4kTCSePFmyKPskibeiOXV6qavPZ63/kXM9Wh9V6dTSvBtLeNnMxqGvENGKJcTdIgtoqyqA6ET9u0PJ5IRIg== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/types@3.686.0", "@aws-sdk/types@^3.222.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.686.0.tgz#01aa5307c727de9e69969c538f99ae8b53f1074f" + integrity sha512-xFnrb3wxOoJcW2Xrh63ZgFo5buIu9DF7bOHnwoUxHdNpUXicUh0AHw85TjXxyxIAd0d1psY/DU7QHoNI3OswgQ== + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.686.0.tgz#c9a621961b8efda6d82ab3523d673acb0629d6d0" + integrity sha512-7msZE2oYl+6QYeeRBjlDgxQUhq/XRky3cXE0FqLFs2muLS7XSuQEXkpOXB3R782ygAP6JX0kmBxPTLurRTikZg== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/types" "^3.6.0" + "@smithy/util-endpoints" "^2.1.4" + tslib "^2.6.2" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.679.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.679.0.tgz#8d5898624691e12ccbad839e103562002bbec85e" + integrity sha512-zKTd48/ZWrCplkXpYDABI74rQlbR0DNHs8nH95htfSLj9/mWRSwaGptoxwcihaq/77vi/fl2X3y0a1Bo8bt7RA== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.686.0.tgz#953ef68c1b54e02f9de742310f47c33452f088bc" + integrity sha512-YiQXeGYZegF1b7B2GOR61orhgv79qmI0z7+Agm3NXLO6hGfVV3kFUJbXnjtH1BgWo5hbZYW7HQ2omGb3dnb6Lg== + dependencies: + "@aws-sdk/types" "3.686.0" + "@smithy/types" "^3.6.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.687.0.tgz#6bdc45c2ef776a86614b002867aef37fc6f45b41" + integrity sha512-idkP6ojSTZ4ek1pJ8wIN7r9U3KR5dn0IkJn3KQBXQ58LWjkRqLtft2vxzdsktWwhPKjjmIKl1S0kbvqLawf8XQ== + dependencies: + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/types" "3.686.0" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" tslib "^2.6.2" "@babel/cli@^7.24.7": @@ -1847,10 +2372,10 @@ "@elastic/react-search-ui-views" "1.20.2" "@elastic/search-ui" "1.20.2" -"@elastic/request-converter@^8.15.4": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@elastic/request-converter/-/request-converter-8.16.0.tgz#e607d06d898ec290c7a9412104d7fa67d5fb9c8c" - integrity sha512-tSwCJMoX3/hme1HXi7ewfP5E+BLFV2LcItt3EB4eucWPKEtG3SqJ3iuK3ygWm1PodPz8Mww/DMaxTJFERb/usg== +"@elastic/request-converter@^8.16.1": + version "8.16.1" + resolved "https://registry.yarnpkg.com/@elastic/request-converter/-/request-converter-8.16.1.tgz#fad73db1a2ed0448501c389cf543fb77c6ffff57" + integrity sha512-lg2qCJ4kyxsP/0NpZo0+NsJfaY4JwyxGIVqD2l2Vmx9tv7ZNaZMn/TjHKBo2+jN0laJBInpxpnkPUgVWo5kw1g== dependencies: child-process-promise "^2.2.1" commander "^12.1.0" @@ -2967,13 +3492,6 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/nyc-config-typescript@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz#1f5235b28540a07219ae0dd42014912a0b19cf89" - integrity sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" @@ -7360,10 +7878,22 @@ resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== -"@langchain/community@0.3.11": - version "0.3.11" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.11.tgz#cb0f188f4e72c00beb1efdbd1fc7d7f47b70e636" - integrity sha512-hgnqsgWAhfUj9Kp0y+FGxlKot/qJFxat9GfIPJSJU4ViN434PgeMAQK53tkGZ361E2Zoo1V4RoGlSw4AjJILiA== +"@langchain/aws@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@langchain/aws/-/aws-0.1.2.tgz#607ab6d2f87c07a64176e6341ae2e9f857027b95" + integrity sha512-1cQvv8XSbaZXceAbYexSm/8WLqfEJ4VF6qbf/XLwkpUKMFGqpSBA00+Bn5p8K/Ms+PyMguZrxVNqd6daqxhDBQ== + dependencies: + "@aws-sdk/client-bedrock-agent-runtime" "^3.616.0" + "@aws-sdk/client-bedrock-runtime" "^3.602.0" + "@aws-sdk/client-kendra" "^3.352.0" + "@aws-sdk/credential-provider-node" "^3.600.0" + zod "^3.23.8" + zod-to-json-schema "^3.22.5" + +"@langchain/community@0.3.14": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.14.tgz#33c9c907f2a8cccc0af7fdeab50b2b69d85321ac" + integrity sha512-zadvK0pu15Jp028VEV4wV+lYB1ViojSolSdSNMdE82KuaK97kH/F1aynQ2W+ebHzjr0lG3dUF3OfOqHU37VgwA== dependencies: "@langchain/openai" ">=0.2.0 <0.4.0" binary-extensions "^2.2.0" @@ -8728,32 +9258,122 @@ "@types/node" ">=18.0.0" axios "^1.6.0" -"@smithy/eventstream-codec@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.1.tgz#b47f30bf4ad791ac7981b9fff58e599d18269cf9" - integrity sha512-s29NxV/ng1KXn6wPQ4qzJuQDjEtxLdS0+g5PQFirIeIZrp66FXVJ5IpZRowbt/42zB5dY8TqJ0G0L9KkgtsEZg== +"@smithy/abort-controller@^3.1.8": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.8.tgz#ce0c10ddb2b39107d70b06bbb8e4f6e368bc551d" + integrity sha512-+3DOBcUn5/rVjlxGvUPKc416SExarAQ+Qe0bqk30YSUjbepwpS7QN0cyKUSifvLJhdMZ0WPzPP5ymut0oonrpQ== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/config-resolver@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.10.tgz#d9529d9893e5fae1f14cb1ffd55517feb6d7e50f" + integrity sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw== + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.8" + tslib "^2.6.2" + +"@smithy/core@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.5.1.tgz#7f635b76778afca845bcb401d36f22fa37712f15" + integrity sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg== + dependencies: + "@smithy/middleware-serde" "^3.0.8" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-stream" "^3.2.1" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^3.2.4", "@smithy/credential-provider-imds@^3.2.5": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz#dbfd849a4a7ebd68519cd9fc35f78d091e126d0a" + integrity sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg== + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/property-provider" "^3.1.8" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + tslib "^2.6.2" + +"@smithy/eventstream-codec@^3.1.1", "@smithy/eventstream-codec@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz#5bfaffbc83ae374ffd85a755a8200ba3c7aed016" + integrity sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.6.0" "@smithy/util-hex-encoding" "^3.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.3.tgz#51df0ca39f453d78a3d6607c1ac2e96cf900c824" - integrity sha512-v61Ftn7x/ubWFqH7GHFAL/RaU7QZImTbuV95DYugYYItzpO7KaHYEuO8EskCaBpZEfzOxhUGKm4teS9YUSt69Q== +"@smithy/eventstream-serde-browser@^3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz#019f3d1016d893b65ef6efec8c5e2fa925d0ac3d" + integrity sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.3" - "@smithy/types" "^3.2.0" + "@smithy/eventstream-serde-universal" "^3.0.10" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/eventstream-serde-universal@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.3.tgz#2ecac479ba84e10221b4b70545f3d7a223b5345e" - integrity sha512-YXYt3Cjhu9tRrahbTec2uOjwOSeCNfQurcWPGNEUspBhqHoA3KrDrVj+jGbCLWvwkwhzqDnnaeHAxm+IxAjOAQ== +"@smithy/eventstream-serde-config-resolver@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz#bba17a358818e61993aaa73e36ea4023c5805556" + integrity sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg== dependencies: - "@smithy/eventstream-codec" "^3.1.1" - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-node@^3.0.10", "@smithy/eventstream-serde-node@^3.0.3": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz#da40b872001390bb47807186855faba8172b3b5b" + integrity sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw== + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.10" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-universal@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz#b24e66fec9ec003eb0a1d6733fa22ded43129281" + integrity sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww== + dependencies: + "@smithy/eventstream-codec" "^3.1.7" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz#3763cb5178745ed630ed5bc3beb6328abdc31f36" + integrity sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g== + dependencies: + "@smithy/protocol-http" "^4.1.5" + "@smithy/querystring-builder" "^3.0.8" + "@smithy/types" "^3.6.0" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + +"@smithy/hash-node@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.8.tgz#f451cc342f74830466b0b39bf985dc3022634065" + integrity sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng== + dependencies: + "@smithy/types" "^3.6.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz#4d381a4c24832371ade79e904a72c173c9851e5f" + integrity sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q== + dependencies: + "@smithy/types" "^3.6.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.0.0": @@ -8770,12 +9390,127 @@ dependencies: tslib "^2.6.2" -"@smithy/protocol-http@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.0.2.tgz#502ed3116cb0f1e3f207881df965bac620ccb2da" - integrity sha512-X/90xNWIOqSR2tLUyWxVIBdatpm35DrL44rI/xoeBWUuanE0iyCXJpTcnqlOpnEzgcu0xCKE06+g70TTu2j7RQ== +"@smithy/middleware-content-length@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz#738266f6d81436d7e3a86bea931bc64e04ae7dbf" + integrity sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz#b9ee42d29d8f3a266883d293c4d6a586f7b60979" + integrity sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA== + dependencies: + "@smithy/core" "^2.5.1" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/shared-ini-file-loader" "^3.1.9" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-middleware" "^3.0.8" + tslib "^2.6.2" + +"@smithy/middleware-retry@^3.0.25": + version "3.0.25" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz#a6b1081fc1a0991ffe1d15e567e76198af01f37c" + integrity sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg== + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/protocol-http" "^4.1.5" + "@smithy/service-error-classification" "^3.0.8" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-serde@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz#a46d10dba3c395be0d28610d55c89ff8c07c0cd3" + integrity sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA== + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/middleware-stack@^3.0.10", "@smithy/middleware-stack@^3.0.8": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.10.tgz#73e2fde5d151440844161773a17ee13375502baf" + integrity sha512-grCHyoiARDBBGPyw2BeicpjgpsDFWZZxptbVKb3CRd/ZA15F/T6rZjCCuBUjJwdck1nwUuIxYtsS4H9DDpbP5w== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/node-config-provider@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz#d27ba8e4753f1941c24ed0af824dbc6c492f510a" + integrity sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew== + dependencies: + "@smithy/property-provider" "^3.1.8" + "@smithy/shared-ini-file-loader" "^3.1.9" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/node-http-handler@^3.2.5", "@smithy/node-http-handler@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.3.1.tgz#788fc1c22c21a0cf982f4025ccf9f64217f3164f" + integrity sha512-fr+UAOMGWh6bn4YSEezBCpJn9Ukp9oR4D32sCjCo7U81evE11YePOQ58ogzyfgmjIO79YeOdfXXqr0jyhPQeMg== + dependencies: + "@smithy/abort-controller" "^3.1.8" + "@smithy/protocol-http" "^4.1.7" + "@smithy/querystring-builder" "^3.0.10" + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/property-provider@^3.1.7", "@smithy/property-provider@^3.1.8": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.8.tgz#b1c5a3949effbb9772785ad7ddc5b4b235b10fbe" + integrity sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA== + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/protocol-http@^4.1.5", "@smithy/protocol-http@^4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.7.tgz#5c67e62beb5deacdb94f2127f9a344bdf1b2ed6e" + integrity sha512-FP2LepWD0eJeOTm0SjssPcgqAlDFzOmRXqXmGhfIM52G7Lrox/pcpQf6RP4F21k0+O12zaqQt5fCDOeBtqY6Cg== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@smithy/querystring-builder@^3.0.10", "@smithy/querystring-builder@^3.0.8": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.10.tgz#db8773af85ee3977c82b8e35a5cdd178c621306d" + integrity sha512-nT9CQF3EIJtIUepXQuBFb8dxJi3WVZS3XfuDksxSCSn+/CzZowRLdhDn+2acbBv8R6eaJqPupoI/aRFIImNVPQ== + dependencies: + "@smithy/types" "^3.7.1" + "@smithy/util-uri-escape" "^3.0.0" + tslib "^2.6.2" + +"@smithy/querystring-parser@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz#057a8e2d301eea8eac7071923100ba38a824d7df" + integrity sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg== + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/service-error-classification@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz#265ad2573b972f6c7bdd1ad6c5155a88aeeea1c4" + integrity sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g== + dependencies: + "@smithy/types" "^3.6.0" + +"@smithy/shared-ini-file-loader@^3.1.8", "@smithy/shared-ini-file-loader@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz#1b77852b5bb176445e1d80333fa3f739313a4928" + integrity sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA== + dependencies: + "@smithy/types" "^3.6.0" tslib "^2.6.2" "@smithy/signature-v4@^3.1.1": @@ -8791,10 +9526,69 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/types@^3.0.0", "@smithy/types@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.2.0.tgz#1350fe8a50d5e35e12ffb34be46d946860b2b5ab" - integrity sha512-cKyeKAPazZRVqm7QPvcPD2jEIt2wqDPAL1KJKb0f/5I7uhollvsWZuZKLclmyP6a+Jwmr3OV3t+X0pZUUHS9BA== +"@smithy/signature-v4@^4.2.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.2.1.tgz#a918fd7d99af9f60aa07617506fa54be408126ee" + integrity sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-uri-escape" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/smithy-client@^3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.4.2.tgz#a6e3ed98330ce170cf482e765bd0c21e0fde8ae4" + integrity sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA== + dependencies: + "@smithy/core" "^2.5.1" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + "@smithy/util-stream" "^3.2.1" + tslib "^2.6.2" + +"@smithy/types@^3.2.0", "@smithy/types@^3.6.0", "@smithy/types@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.7.1.tgz#4af54c4e28351e9101996785a33f2fdbf93debe7" + integrity sha512-XKLcLXZY7sUQgvvWyeaL/qwNPp6V3dWcUjqrQKjSb+tzYiCy340R/c64LV5j+Tnb2GhmunEX0eou+L+m2hJNYA== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.8.tgz#8057d91d55ba8df97d74576e000f927b42da9e18" + integrity sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg== + dependencies: + "@smithy/querystring-parser" "^3.0.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/util-base64@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-3.0.0.tgz#f7a9a82adf34e27a72d0719395713edf0e493017" + integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz#86ec2f6256310b4845a2f064e2f571c1ca164ded" + integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz#99a291bae40d8932166907fe981d6a1f54298a6d" + integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== dependencies: tslib "^2.6.2" @@ -8814,6 +9608,46 @@ "@smithy/is-array-buffer" "^3.0.0" tslib "^2.6.2" +"@smithy/util-config-provider@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz#62c6b73b22a430e84888a8f8da4b6029dd5b8efe" + integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^3.0.25": + version "3.0.25" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz#ef9b84272d1db23503ff155f9075a4543ab6dab7" + integrity sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA== + dependencies: + "@smithy/property-provider" "^3.1.8" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^3.0.25": + version "3.0.25" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz#c16fe3995c8e90ae318e336178392173aebe1e37" + integrity sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g== + dependencies: + "@smithy/config-resolver" "^3.0.10" + "@smithy/credential-provider-imds" "^3.2.5" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/property-provider" "^3.1.8" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/util-endpoints@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz#a29134c2b1982442c5fc3be18d9b22796e8eb964" + integrity sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ== + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + "@smithy/util-hex-encoding@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz#32938b33d5bf2a15796cd3f178a55b4155c535e6" @@ -8821,12 +9655,35 @@ dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.2.tgz#6daeb9db060552d851801cd7a0afd68769e2f98b" - integrity sha512-7WW5SD0XVrpfqljBYzS5rLR+EiDzl7wCVJZ9Lo6ChNFV4VYDk37Z1QI5w/LnYtU/QKnSawYoHRd7VjSyC8QRQQ== +"@smithy/util-middleware@^3.0.2", "@smithy/util-middleware@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.8.tgz#372bc7a2845408ad69da039d277fc23c2734d0c6" + integrity sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/util-retry@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.8.tgz#9c607c175a4d8a87b5d8ebaf308f6b849e4dc4d0" + integrity sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow== + dependencies: + "@smithy/service-error-classification" "^3.0.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/util-stream@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.2.1.tgz#f3055dc4c8caba8af4e47191ea7e773d0e5a429d" + integrity sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A== + dependencies: + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/types" "^3.6.0" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" "@smithy/util-uri-escape@^3.0.0": @@ -11584,6 +12441,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.0.tgz#53ef263e5239728b56096b0a869595135b7952d2" integrity sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q== +"@types/uuid@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== + "@types/vinyl-fs@*", "@types/vinyl-fs@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/vinyl-fs/-/vinyl-fs-3.0.2.tgz#cbaef5160ad7695483af0aa1b4fe67f166c18feb" @@ -13567,6 +14429,11 @@ bowser@^1.7.3: resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + boxen@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" @@ -17221,10 +18088,10 @@ eslint-plugin-cypress@^2.15.1: dependencies: globals "^13.20.0" -eslint-plugin-depend@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-depend/-/eslint-plugin-depend-0.11.0.tgz#ef82f6d8c6ae924a42c489dd6bd5b9f3f4eeba82" - integrity sha512-IwF06BrcdYoELuFd18sdVHhvDfF23xbr8pG/ONqrwB4gXjJ7281mEDEmACKWyvMY63afph8+2aOLbeuvr9mbdg== +eslint-plugin-depend@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-depend/-/eslint-plugin-depend-0.12.0.tgz#f0417c69640f3e5b3aee602ea227592313d226eb" + integrity sha512-bS5ESnC3eXDJPNv0RKkzRbLO45hRRLR/dleAUdbysXChWz1bAxa4MRh14EtDREn7fZieueqz4L7TfQQbzvdYHA== dependencies: fd-package-json "^1.2.0" module-replacements "^2.1.0" @@ -17938,6 +18805,13 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" @@ -29457,6 +30331,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + style-loader@^1.1.3, style-loader@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" @@ -30021,10 +30900,10 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.26.0, terser@^5.3.4, terser@^5.34.0, terser@^5.9.0: - version "5.34.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.1.tgz#af40386bdbe54af0d063e0670afd55c3105abeb6" - integrity sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA== +terser@^5.26.0, terser@^5.3.4, terser@^5.36.0, terser@^5.9.0: + version "5.36.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" + integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2"