diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 6db75b64a1e08c..0c6714d1c75b77 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -15,17 +15,13 @@ "build_drafts": false, "trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))|^\\/ci$", "always_trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))|^\\/ci$", - "skip_ci_labels": ["skip-ci", "jenkins-ci"], + "skip_ci_labels": ["skip-ci"], "skip_target_branches": ["6.8", "7.11", "7.12"], "enable_skippable_commits": true, "skip_ci_on_only_changed": [ "^dev_docs/", "^docs/", "^rfcs/", - "^.ci/.+\\.yml$", - "^.ci/es-snapshots/", - "^.ci/pipeline-library/", - "^.ci/Jenkinsfile_[^/]+$", "^\\.github/", "\\.md$", "\\.mdx$", @@ -71,10 +67,6 @@ "^dev_docs/", "^docs/", "^rfcs/", - "^.ci/.+\\.yml$", - "^.ci/es-snapshots/", - "^.ci/pipeline-library/", - "^.ci/Jenkinsfile_[^/]+$", "^\\.github/", "\\.md$", "\\.mdx$", diff --git a/.ci/Dockerfile b/.ci/Dockerfile deleted file mode 100644 index 109b9ffab3cc56..00000000000000 --- a/.ci/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -# NOTE: This Dockerfile is ONLY used to run certain tasks in CI. It is not used to run Kibana or as a distributable. -# If you're looking for the Kibana Docker image distributable, please see: src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.ts - -ARG NODE_VERSION=18.18.2 - -FROM node:${NODE_VERSION} AS base - -RUN apt-get update && \ - apt-get -y install xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 \ - libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 \ - libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 \ - libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 \ - libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget openjdk-11-jre && \ - rm -rf /var/lib/apt/lists/* - -RUN curl -sSL https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ - && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ - && apt-get update \ - && apt-get install -y rsync jq bsdtar google-chrome-stable \ - --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -RUN LATEST_VAULT_RELEASE=$(curl -s https://api.github.com/repos/hashicorp/vault/tags | jq --raw-output .[0].name[1:]) \ - && curl -L https://releases.hashicorp.com/vault/${LATEST_VAULT_RELEASE}/vault_${LATEST_VAULT_RELEASE}_linux_amd64.zip -o vault.zip \ - && unzip vault.zip \ - && rm vault.zip \ - && chmod +x vault \ - && mv vault /usr/local/bin/vault - -RUN groupadd -r kibana && useradd -r -g kibana kibana && mkdir /home/kibana && chown kibana:kibana /home/kibana - -COPY ./bash_standard_lib.sh /usr/local/bin/bash_standard_lib.sh -RUN chmod +x /usr/local/bin/bash_standard_lib.sh - -COPY ./runbld /usr/local/bin/runbld -RUN chmod +x /usr/local/bin/runbld - -USER kibana diff --git a/.ci/Jenkinsfile_baseline_capture b/.ci/Jenkinsfile_baseline_capture deleted file mode 100644 index ff3803cd903cd9..00000000000000 --- a/.ci/Jenkinsfile_baseline_capture +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/groovy - -library 'kibana-pipeline-library' -kibanaLibrary.load() - -kibanaPipeline(timeoutMinutes: 210) { - githubCommitStatus.trackBuild(params.commit, 'kibana-ci-baseline') { - ciStats.trackBuild { - catchErrors { - slackNotifications.onFailure( - title: "*<${env.BUILD_URL}|[${params.branch}] Baseline Capture Failure>*", - message: "[${params.branch}/${params.commit}] Baseline Capture Failure", - ) { - retryable.enable(2) - - catchErrors { - workers.ci( - name: 'baseline-worker', - size: 'xl', - ramDisk: true, - runErrorReporter: false, - bootstrapped: false - ) { - withGcpServiceAccount.fromVaultSecret('secret/ci/elastic-kibana/ci-artifacts-key', 'value') { - withEnv([ - 'DISABLE_BOOTSTRAP_VALIDATION=true', - ]) { - kibanaPipeline.doSetup() - } - } - - kibanaPipeline.withCiTaskQueue([parallel: 2]) { - catchErrors { - tasks([ - kibanaPipeline.functionalTestProcess('xpack-baseline', './test/scripts/jenkins_xpack_baseline.sh'), - kibanaPipeline.scriptTask('Check Public API Docs', 'test/scripts/checks/baseline_plugin_public_api_docs.sh'), - ]) - } - } - } - } - } - } - } - - kibanaPipeline.sendMail() - } -} diff --git a/.ci/Jenkinsfile_baseline_trigger b/.ci/Jenkinsfile_baseline_trigger deleted file mode 100644 index fd1c267fb3301f..00000000000000 --- a/.ci/Jenkinsfile_baseline_trigger +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/groovy - -return - -def MAXIMUM_COMMITS_TO_CHECK = 10 -def MAXIMUM_COMMITS_TO_BUILD = 5 - -if (!params.branches_yaml) { - error "'branches_yaml' parameter must be specified" -} - -def additionalBranches = [] - -def branches = readYaml(text: params.branches_yaml) + additionalBranches - -library 'kibana-pipeline-library' -kibanaLibrary.load() - -withGithubCredentials { - branches.each { branch -> - if (branch == '6.8') { - // skip 6.8, it is tracked but we don't need snapshots for it and haven't backported - // the baseline capture scripts to it. - return; - } - - stage(branch) { - def commits = getCommits(branch, MAXIMUM_COMMITS_TO_CHECK, MAXIMUM_COMMITS_TO_BUILD) - - commits.take(MAXIMUM_COMMITS_TO_BUILD).each { commit -> - catchErrors { - githubCommitStatus.create(commit, 'pending', 'Baseline started.', 'kibana-ci-baseline') - - build( - propagate: false, - wait: false, - job: 'elastic+kibana+baseline-capture', - parameters: [ - string(name: 'branch_specifier', value: branch), - string(name: 'commit', value: commit), - ] - ) - } - } - } - } -} - -def getCommits(String branch, maximumCommitsToCheck, maximumCommitsToBuild) { - print "Getting latest commits for ${branch}..." - def commits = githubApi.get("repos/elastic/kibana/commits?sha=${branch}").take(maximumCommitsToCheck).collect { it.sha } - def commitsToBuild = [] - - for (commit in commits) { - print "Getting statuses for ${commit}" - def status = githubApi.get("repos/elastic/kibana/statuses/${commit}").find { it.context == 'kibana-ci-baseline' } - print "Commit '${commit}' already built? ${status ? 'Yes' : 'No'}" - - if (!status) { - commitsToBuild << commit - } else { - // Stop at the first commit we find that's already been triggered - break - } - - if (commitsToBuild.size() >= maximumCommitsToBuild) { - break - } - } - - return commitsToBuild.reverse() // We want the builds to trigger oldest-to-newest -} diff --git a/.ci/Jenkinsfile_flaky b/.ci/Jenkinsfile_flaky deleted file mode 100644 index 370643789c2cde..00000000000000 --- a/.ci/Jenkinsfile_flaky +++ /dev/null @@ -1,150 +0,0 @@ -#!/bin/groovy - -library 'kibana-pipeline-library' -kibanaLibrary.load() - -def TASK_PARAM = params.TASK ?: params.CI_GROUP -// Looks like 'oss:ciGroup:1', 'oss:firefoxSmoke' -def JOB_PARTS = TASK_PARAM.split(':') -def IS_XPACK = JOB_PARTS[0] == 'xpack' -def JOB = JOB_PARTS.size() > 1 ? JOB_PARTS[1] : JOB_PARTS[0] -def CI_GROUP = JOB_PARTS.size() > 2 ? JOB_PARTS[2] : '' -def EXECUTIONS = params.NUMBER_EXECUTIONS.toInteger() -def AGENT_COUNT = getAgentCount(EXECUTIONS) -def NEED_BUILD = JOB != 'jestIntegration' && JOB != 'apiIntegration' - -currentBuild.displayName += trunc(" ${params.GITHUB_OWNER}:${params.branch_specifier}", 24) -currentBuild.description = "${params.CI_GROUP}
Agents: ${AGENT_COUNT}
Executions: ${params.NUMBER_EXECUTIONS}" - -kibanaPipeline(timeoutMinutes: 180) { - def agents = [:] - def workerFailures = [] - - def worker = getWorkerFromParams(IS_XPACK, JOB, CI_GROUP) - - for(def agentNumber = 1; agentNumber <= AGENT_COUNT; agentNumber++) { - def agentExecutions = floor(EXECUTIONS/AGENT_COUNT) + (agentNumber <= EXECUTIONS%AGENT_COUNT ? 1 : 0) - - agents["agent-${agentNumber}"] = { - agentProcess( - agentNumber: agentNumber, - agentExecutions: agentExecutions, - worker: worker, - workerFailures: workerFailures, - needBuild: NEED_BUILD, - isXpack: IS_XPACK, - ciGroup: CI_GROUP - ) - } - } - - parallel(agents) - - currentBuild.description += ", Failures: ${workerFailures.size()}" - - if (workerFailures.size() > 0) { - print "There were ${workerFailures.size()} test suite failures." - print "The executions that failed were:" - print workerFailures.join("\n") - print "Please check 'Test Result' and 'Pipeline Steps' pages for more info" - } -} - -def agentProcess(Map params = [:]) { - def config = [ - agentNumber: 1, - agentExecutions: 0, - worker: {}, - workerFailures: [], - needBuild: false, - isXpack: false, - ciGroup: null, - ] + params - - catchErrors { - print "Agent ${config.agentNumber} - ${config.agentExecutions} executions" - - withEnv([ - 'IGNORE_SHIP_CI_STATS_ERROR=true', - ]) { - kibanaPipeline.withTasks([ - parallel: 20, - ]) { - task { - if (config.needBuild) { - kibanaPipeline.buildKibana() - } - - for(def i = 0; i < config.agentExecutions; i++) { - def taskNumber = i - task({ - withEnv([ - "REMOVE_KIBANA_INSTALL_DIR=1", - ]) { - catchErrors { - try { - config.worker() - } catch (ex) { - config.workerFailures << "agent-${config.agentNumber}-${taskNumber}" - throw ex - } - } - } - }) - } - } - } - } - } -} - -def getWorkerFromParams(isXpack, job, ciGroup) { - if (!isXpack) { - if (job == 'accessibility') { - return kibanaPipeline.functionalTestProcess('kibana-accessibility', './test/scripts/jenkins_accessibility.sh') - } else if (job == 'firefoxSmoke') { - return kibanaPipeline.functionalTestProcess('firefoxSmoke', './test/scripts/jenkins_firefox_smoke.sh') - } else if (job == 'visualRegression') { - return kibanaPipeline.functionalTestProcess('visualRegression', './test/scripts/jenkins_visual_regression.sh') - } else if (job == 'jestIntegration') { - return kibanaPipeline.scriptTaskDocker('Jest Integration Tests', 'test/scripts/test/jest_integration.sh') - } else if (job == 'apiIntegration') { - return kibanaPipeline.scriptTask('API Integration Tests', 'test/scripts/test/api_integration.sh') - } else if (job == 'pluginFunctional') { - return kibanaPipeline.functionalTestProcess('oss-pluginFunctional', './test/scripts/jenkins_plugin_functional.sh') - } else { - return kibanaPipeline.ossCiGroupProcess(ciGroup) - } - } - - if (job == 'accessibility') { - return kibanaPipeline.functionalTestProcess('xpack-accessibility', './test/scripts/jenkins_xpack_accessibility.sh') - } else if (job == 'firefoxSmoke') { - return kibanaPipeline.functionalTestProcess('xpack-firefoxSmoke', './test/scripts/jenkins_xpack_firefox_smoke.sh') - } else if (job == 'visualRegression') { - return kibanaPipeline.functionalTestProcess('xpack-visualRegression', './test/scripts/jenkins_xpack_visual_regression.sh') - } else { - return kibanaPipeline.xpackCiGroupProcess(ciGroup) - } -} - -def getAgentCount(executions) { - // Increase agent count every 20 worker processess, up to 3 agents maximum - return Math.min(3, 1 + floor(executions/20)) -} - -def trunc(str, length) { - if (str.size() >= length) { - return str.take(length) + "..." - } - - return str; -} - -// All of the real rounding/truncating methods are sandboxed -def floor(num) { - return num - .toString() - .split('\\.')[0] - .toInteger() -} diff --git a/.ci/Jenkinsfile_security_cypress b/.ci/Jenkinsfile_security_cypress deleted file mode 100644 index d48b9965919dc2..00000000000000 --- a/.ci/Jenkinsfile_security_cypress +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/groovy - -library 'kibana-pipeline-library' -kibanaLibrary.load() - -kibanaPipeline(timeoutMinutes: 180) { - slackNotifications.onFailure( - disabled: !params.NOTIFY_ON_FAILURE, - channel: '#security-solution-slack-testing' - ) { - catchError { - withEnv([ - 'CI_PARALLEL_PROCESS_NUMBER=1', - 'IGNORE_SHIP_CI_STATS_ERROR=true', - ]) { - def job = 'xpack-securityCypress' - - workers.ci(name: job, size: 'l', ramDisk: true) { - kibanaPipeline.bash('test/scripts/jenkins_build_kibana.sh', 'Build Distributable') - kibanaPipeline.functionalTestProcess(job, 'test/scripts/jenkins_security_solution_cypress_chrome.sh')() - // Temporarily disabled to figure out test flake - // kibanaPipeline.functionalTestProcess(job, 'test/scripts/jenkins_security_solution_cypress_firefox.sh')() - } - } - } - } - - if (params.NOTIFY_ON_FAILURE) { - kibanaPipeline.sendMail(to: 'siem_dev_team@elastic.co') - } -} diff --git a/.ci/build_docker.sh b/.ci/build_docker.sh deleted file mode 100755 index 07013f13cdae5e..00000000000000 --- a/.ci/build_docker.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -cd "$(dirname "${0}")" - -cp /usr/local/bin/runbld ./ -cp /usr/local/bin/bash_standard_lib.sh ./ - -if which docker >/dev/null; then - docker build -t kibana-ci -f ./Dockerfile . -else - echo "Docker binary is not available. Skipping the docker build this time." -fi diff --git a/.ci/ci_groups.yml b/.ci/ci_groups.yml deleted file mode 100644 index 508f118ce9dd7c..00000000000000 --- a/.ci/ci_groups.yml +++ /dev/null @@ -1,46 +0,0 @@ -root: - - ciGroup1 - - ciGroup2 - - ciGroup3 - - ciGroup4 - - ciGroup5 - - ciGroup6 - - ciGroup7 - - ciGroup8 - - ciGroup9 - - ciGroup10 - - ciGroup11 - - ciGroup12 - -xpack: - - ciGroup1 - - ciGroup2 - - ciGroup3 - - ciGroup4 - - ciGroup5 - - ciGroup6 - - ciGroup7 - - ciGroup8 - - ciGroup9 - - ciGroup10 - - ciGroup11 - - ciGroup12 - - ciGroup13 - - ciGroup14 - - ciGroup15 - - ciGroup16 - - ciGroup17 - - ciGroup18 - - ciGroup19 - - ciGroup20 - - ciGroup21 - - ciGroup22 - - ciGroup23 - - ciGroup24 - - ciGroup25 - - ciGroup26 - - ciGroup27 - - ciGroup28 - - ciGroup29 - - ciGroup30 - - ciGroup31 diff --git a/.ci/es-snapshots/Jenkinsfile_build_es b/.ci/es-snapshots/Jenkinsfile_build_es deleted file mode 100644 index 7ace3b441144c5..00000000000000 --- a/.ci/es-snapshots/Jenkinsfile_build_es +++ /dev/null @@ -1,165 +0,0 @@ -#!/bin/groovy - -// This job effectively has two SCM configurations: -// one for kibana, used to check out this Jenkinsfile (which means it's the job's main SCM configuration), as well as kick-off the downstream verification job -// one for elasticsearch, used to check out the elasticsearch source before building it - -// There are two parameters that drive which branch is checked out for each of these, but they will typically be the same -// 'branch_specifier' is for kibana / the job itself -// ES_BRANCH is for elasticsearch - -library 'kibana-pipeline-library' -kibanaLibrary.load() - -def ES_BRANCH = params.ES_BRANCH - -if (!ES_BRANCH) { - error "Parameter 'ES_BRANCH' must be specified." -} - -currentBuild.displayName += " - ${ES_BRANCH}" -currentBuild.description = "ES: ${ES_BRANCH}
Kibana: ${params.branch_specifier}" - -def PROMOTE_WITHOUT_VERIFY = !!params.PROMOTE_WITHOUT_VERIFICATION - -timeout(time: 120, unit: 'MINUTES') { - timestamps { - ansiColor('xterm') { - slackNotifications.onFailure { - node(workers.label('l')) { - catchErrors { - def VERSION - def SNAPSHOT_ID - def DESTINATION - - def scmVars = checkoutEs(ES_BRANCH) - def GIT_COMMIT = scmVars.GIT_COMMIT - def GIT_COMMIT_SHORT = sh(script: "git rev-parse --short ${GIT_COMMIT}", returnStdout: true).trim() - - buildArchives('to-archive') - - dir('to-archive') { - def now = new Date() - def date = now.format("yyyyMMdd-HHmmss") - - def filesRaw = sh(script: "ls -1", returnStdout: true).trim() - def files = filesRaw - .split("\n") - .collect { filename -> - // Filename examples - // elasticsearch-oss-8.0.0-SNAPSHOT-linux-x86_64.tar.gz - // elasticsearch-8.0.0-SNAPSHOT-linux-x86_64.tar.gz - def parts = filename.replace("elasticsearch-oss", "oss").split("-") - - VERSION = VERSION ?: parts[1] - SNAPSHOT_ID = SNAPSHOT_ID ?: "${date}_${GIT_COMMIT_SHORT}" - DESTINATION = DESTINATION ?: "${VERSION}/archives/${SNAPSHOT_ID}" - - return [ - filename: filename, - checksum: filename + '.sha512', - url: "https://storage.googleapis.com/kibana-ci-es-snapshots-daily/${DESTINATION}/${filename}".toString(), - version: parts[1], - platform: parts[3], - architecture: parts[4].split('\\.')[0], - license: parts[0] == 'oss' ? 'oss' : 'default', - ] - } - - sh 'find * -exec bash -c "shasum -a 512 {} > {}.sha512" \\;' - - def manifest = [ - bucket: "kibana-ci-es-snapshots-daily/${DESTINATION}".toString(), - branch: ES_BRANCH, - sha: GIT_COMMIT, - sha_short: GIT_COMMIT_SHORT, - version: VERSION, - generated: now.format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")), - archives: files, - ] - def manifestJson = toJSON(manifest).toString() - writeFile file: 'manifest.json', text: manifestJson - - upload(DESTINATION, '*.*') - - sh "cp manifest.json manifest-latest.json" - upload(VERSION, 'manifest-latest.json') - } - - if (PROMOTE_WITHOUT_VERIFY) { - esSnapshots.promote(VERSION, SNAPSHOT_ID) - - emailext( - to: 'build-kibana@elastic.co', - subject: "ES snapshot promoted without verification: ${params.ES_BRANCH}", - body: '${SCRIPT,template="groovy-html.template"}', - mimeType: 'text/html', - ) - } else { - build( - propagate: false, - wait: false, - job: 'elasticsearch+snapshots+verify', - parameters: [ - string(name: 'branch_specifier', value: branch_specifier), - string(name: 'SNAPSHOT_VERSION', value: VERSION), - string(name: 'SNAPSHOT_ID', value: SNAPSHOT_ID), - ] - ) - } - } - - kibanaPipeline.sendMail() - } - } - } - } -} - -def checkoutEs(branch) { - retryWithDelay(8, 15) { - return checkout([ - $class: 'GitSCM', - branches: [[name: branch]], - doGenerateSubmoduleConfigurations: false, - extensions: [], - submoduleCfg: [], - userRemoteConfigs: [[ - credentialsId: 'f6c7695a-671e-4f4f-a331-acdce44ff9ba', - url: 'git@github.com:elastic/elasticsearch', - ]], - ]) - } -} - -def upload(destination, pattern) { - return googleStorageUpload( - credentialsId: 'kibana-ci-gcs-plugin', - bucket: "gs://kibana-ci-es-snapshots-daily/${destination}", - pattern: pattern, - sharedPublicly: false, - showInline: false, - ) -} - -def buildArchives(destination) { - def props = readProperties file: '.ci/java-versions.properties' - withEnv([ - // Select the correct JDK for this branch - "PATH=/var/lib/jenkins/.java/${props.ES_BUILD_JAVA}/bin:${env.PATH}", - - // These Jenkins env vars trigger some automation in the elasticsearch repo that we don't want - "BUILD_NUMBER=", - "JENKINS_URL=", - "BUILD_URL=", - "JOB_NAME=", - "NODE_NAME=", - ]) { - sh """ - ./gradlew -Dbuild.docker=true assemble --parallel - mkdir -p ${destination} - find distribution -type f \\( -name 'elasticsearch-*-*-*-*.tar.gz' -o -name 'elasticsearch-*-*-*-*.zip' \\) -not -path *no-jdk* -not -path *build-context* -exec cp {} ${destination} \\; - docker images "docker.elastic.co/elasticsearch/elasticsearch" --format "{{.Tag}}" | xargs -n1 bash -c 'docker save docker.elastic.co/elasticsearch/elasticsearch:\${0} | gzip > ${destination}/elasticsearch-\${0}-docker-image.tar.gz' - """ - } -} diff --git a/.ci/es-snapshots/Jenkinsfile_trigger_build_es b/.ci/es-snapshots/Jenkinsfile_trigger_build_es deleted file mode 100644 index d4e59ca3e411be..00000000000000 --- a/.ci/es-snapshots/Jenkinsfile_trigger_build_es +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/groovy - -// Only run this pipeline for 6.8. Higher branches are now running in Buildkite. -def branches = ['6.8'] - -branches.each { branch -> - build( - propagate: false, - wait: false, - job: 'elasticsearch+snapshots+build', - parameters: [ - string(name: 'branch_specifier', value: branch), - string(name: 'ES_BRANCH', value: branch), - ] - ) -} diff --git a/.ci/es-snapshots/Jenkinsfile_verify_es b/.ci/es-snapshots/Jenkinsfile_verify_es deleted file mode 100644 index dc3a3cde7d658a..00000000000000 --- a/.ci/es-snapshots/Jenkinsfile_verify_es +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/groovy - -library 'kibana-pipeline-library' -kibanaLibrary.load() - -def SNAPSHOT_VERSION = params.SNAPSHOT_VERSION -def SNAPSHOT_ID = params.SNAPSHOT_ID - -if (!SNAPSHOT_VERSION) { - error "Parameter SNAPSHOT_VERSION must be specified" -} - -if (!SNAPSHOT_ID) { - error "Parameter SNAPSHOT_ID must be specified" -} - -currentBuild.displayName += " - ${SNAPSHOT_VERSION}" -currentBuild.description = "ES: ${SNAPSHOT_VERSION}
Kibana: ${params.branch_specifier}" - -def SNAPSHOT_MANIFEST = "https://storage.googleapis.com/kibana-ci-es-snapshots-daily/${SNAPSHOT_VERSION}/archives/${SNAPSHOT_ID}/manifest.json" - -kibanaPipeline(timeoutMinutes: 210) { - catchErrors { - slackNotifications.onFailure( - title: "*<${env.BUILD_URL}|[${SNAPSHOT_VERSION}] ES Snapshot Verification Failure>*", - message: "[${SNAPSHOT_VERSION}] ES Snapshot Verification Failure", - ) { - retryable.enable(2) - withEnv([ - "ES_SNAPSHOT_MANIFEST=${SNAPSHOT_MANIFEST}", - 'IGNORE_SHIP_CI_STATS_ERROR=true', - ]) { - kibanaPipeline.withTasks { - tasks([ - kibanaPipeline.scriptTaskDocker('Jest Integration Tests', 'test/scripts/test/jest_integration.sh'), - kibanaPipeline.scriptTask('API Integration Tests', 'test/scripts/test/api_integration.sh'), - ]) - - task { - kibanaPipeline.buildKibana(16) - tasks.ossCiGroups() - tasks.xpackCiGroups() - tasks.xpackCiGroupDocker() - } - } - } - - promoteSnapshot(SNAPSHOT_VERSION, SNAPSHOT_ID) - } - } - - kibanaPipeline.sendMail() -} - -def promoteSnapshot(snapshotVersion, snapshotId) { - if (buildUtils.getBuildStatus() == 'SUCCESS') { - node(workers.label('s')) { - esSnapshots.promote(snapshotVersion, snapshotId) - } - } -} diff --git a/.ci/packer_cache.sh b/.ci/packer_cache.sh deleted file mode 100755 index fc5a52f1ac9919..00000000000000 --- a/.ci/packer_cache.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [[ "$(which docker)" != "" && "$(command uname -m)" != "aarch64" ]]; then - # cache image used by kibana-load-testing project - docker pull "maven:3.6.3-openjdk-8-slim" -fi - -./.ci/packer_cache_for_branch.sh main -./.ci/packer_cache_for_branch.sh 7.16 diff --git a/.ci/packer_cache_for_branch.sh b/.ci/packer_cache_for_branch.sh deleted file mode 100755 index 78548f4667a9f0..00000000000000 --- a/.ci/packer_cache_for_branch.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env bash - -set -e - -branch="$1" -checkoutDir="$(pwd)" - -function cleanup() -{ - if [[ "$branch" != "main" ]]; then - rm --preserve-root -rf "$checkoutDir" - fi - - exit 0 -} - -trap 'cleanup' 0 - -if [[ "$branch" != "main" ]]; then - checkoutDir="/tmp/kibana-$branch" - git clone https://github.com/elastic/kibana.git --branch "$branch" --depth 1 "$checkoutDir" - cd "$checkoutDir" -fi - -source src/dev/ci_setup/setup.sh; - -# download es snapshots -node scripts/es snapshot --download-only; - -# download reporting browsers -(cd "x-pack" && node ../node_modules/.bin/gulp downloadChromium); - -# cache the chromedriver archive -chromedriverDistVersion="$(node -e "console.log(require('chromedriver').version)")" -chromedriverPkgVersion="$(node -e "console.log(require('./package.json').devDependencies.chromedriver)")" -if [ -z "$chromedriverDistVersion" ] || [ -z "$chromedriverPkgVersion" ]; then - echo "UNABLE TO DETERMINE CHROMEDRIVER VERSIONS" - exit 1 -fi -mkdir -p .chromedriver -curl "https://chromedriver.storage.googleapis.com/$chromedriverDistVersion/chromedriver_linux64.zip" > .chromedriver/chromedriver.zip -echo "$chromedriverPkgVersion" > .chromedriver/pkgVersion - -# cache the geckodriver archive -geckodriverPkgVersion="$(node -e "console.log(require('./package.json').devDependencies.geckodriver)")" -if [ -z "$geckodriverPkgVersion" ]; then - echo "UNABLE TO DETERMINE geckodriver VERSIONS" - exit 1 -fi -mkdir -p ".geckodriver" -cp "node_modules/geckodriver/geckodriver.tar.gz" .geckodriver/geckodriver.tar.gz -echo "$geckodriverPkgVersion" > .geckodriver/pkgVersion - -echo "Creating bootstrap_cache archive" - -# archive cacheable directories -mkdir -p "$HOME/.kibana/bootstrap_cache" -tar -cf "$HOME/.kibana/bootstrap_cache/$branch.tar" \ - .chromium \ - .es \ - .chromedriver \ - .geckodriver \ - .yarn-local-mirror; - -echo "created $HOME/.kibana/bootstrap_cache/$branch.tar" - -.ci/build_docker.sh - diff --git a/.ci/pipeline-library/README.md b/.ci/pipeline-library/README.md deleted file mode 100644 index 71d7c39e37f4fe..00000000000000 --- a/.ci/pipeline-library/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Kibana Jenkins Pipeline Library - -## Running tests - -```bash -cd .ci/pipeline-library -./gradlew test -``` \ No newline at end of file diff --git a/.ci/pipeline-library/build.gradle b/.ci/pipeline-library/build.gradle deleted file mode 100644 index ac5e7a4ed034a2..00000000000000 --- a/.ci/pipeline-library/build.gradle +++ /dev/null @@ -1,46 +0,0 @@ -plugins { - id 'groovy' - id 'idea' -} - -group = 'co.elastic.kibana.pipeline' -version = '0.0.1' - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -repositories { - maven { url 'https://repo.jenkins-ci.org/releases/' } - maven { url 'https://repo.maven.apache.org/maven2' } -} - -dependencies { - implementation 'org.codehaus.groovy:groovy-all:2.4.12' - implementation 'org.jenkins-ci.main:jenkins-core:2.23' - implementation 'org.jenkins-ci.plugins.workflow:workflow-step-api:2.19@jar' - testImplementation 'com.lesfurets:jenkins-pipeline-unit:1.4' - testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:2.+' - testImplementation 'org.assertj:assertj-core:3.15+' // Temporary https://github.com/jenkinsci/JenkinsPipelineUnit/issues/209 -} - -sourceSets { - main { - groovy { - srcDirs = ['vars'] - } - } - - test { - groovy { - srcDirs = ['src/test'] - } - } -} - -test { - testLogging { - events 'passed', 'skipped', 'failed' - exceptionFormat = 'full' - } -} diff --git a/.ci/pipeline-library/gradle/wrapper/gradle-wrapper.jar b/.ci/pipeline-library/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 62d4c053550b91..00000000000000 Binary files a/.ci/pipeline-library/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/.ci/pipeline-library/gradle/wrapper/gradle-wrapper.properties b/.ci/pipeline-library/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index a4f0001d203b29..00000000000000 --- a/.ci/pipeline-library/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/.ci/pipeline-library/gradlew b/.ci/pipeline-library/gradlew deleted file mode 100755 index fbd7c515832dab..00000000000000 --- a/.ci/pipeline-library/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/.ci/pipeline-library/gradlew.bat b/.ci/pipeline-library/gradlew.bat deleted file mode 100644 index a9f778a7a964b6..00000000000000 --- a/.ci/pipeline-library/gradlew.bat +++ /dev/null @@ -1,104 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/.ci/pipeline-library/src/test/KibanaBasePipelineTest.groovy b/.ci/pipeline-library/src/test/KibanaBasePipelineTest.groovy deleted file mode 100644 index 4112cb3c0e14bd..00000000000000 --- a/.ci/pipeline-library/src/test/KibanaBasePipelineTest.groovy +++ /dev/null @@ -1,113 +0,0 @@ -import com.lesfurets.jenkins.unit.* -import org.junit.Before - -class KibanaBasePipelineTest extends BasePipelineTest { - Map env = [:] - Map params = [:] - - public def Mocks = [ - TEST_FAILURE_URL: 'https://localhost/', - TEST_FAILURE_NAME: 'Kibana Pipeline / kibana-xpack-agent / Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/fake/test·ts.Fake test should & pass &', - ] - - @Before - void setUp() { - super.setUp() - - env.BRANCH_NAME = 'master' - env.BUILD_ID = '1' - env.BUILD_DISPLAY_NAME = "#${env.BUILD_ID}" - - env.JENKINS_URL = 'http://jenkins.localhost:8080' - env.BUILD_URL = "${env.JENKINS_URL}/job/elastic+kibana+${env.BRANCH_NAME}/${env.BUILD_ID}/".toString() - - env.JOB_BASE_NAME = "elastic / kibana # ${env.BRANCH_NAME}".toString() - env.JOB_NAME = env.JOB_BASE_NAME - - env.WORKSPACE = 'WS' - - props([ - buildUtils: [ - getBuildStatus: { 'SUCCESS' }, - printStacktrace: { ex -> print ex }, - ], - githubPr: [ - isPr: { false }, - ], - jenkinsApi: [ getFailedSteps: { [] } ], - testUtils: [ getFailures: { [] } ], - ]) - - vars([ - env: env, - params: params, - ]) - - // Some wrappers that can just be mocked to immediately call the closure passed in - [ - 'catchError', - 'catchErrors', - 'timestamps', - 'withGithubCredentials', - ].each { - helper.registerAllowedMethod(it, [Closure.class], null) - } - } - - void props(Map properties) { - properties.each { - binding.setProperty(it.key, it.value) - } - } - - void prop(String propertyName, Object propertyValue) { - binding.setProperty(propertyName, propertyValue) - } - - void vars(Map variables) { - variables.each { - binding.setVariable(it.key, it.value) - } - } - - void var(String variableName, Object variableValue) { - binding.setVariable(variableName, variableValue) - } - - def fnMock(String name) { - return helper.callStack.find { it.methodName == name } - } - - def fnMocks(String name) { - helper.callStack.findAll { it.methodName == name } - } - - void mockFailureBuild() { - props([ - buildUtils: [ - getBuildStatus: { 'FAILURE' }, - printStacktrace: { ex -> print ex }, - ], - jenkinsApi: [ getFailedSteps: { [ - [ - displayName: 'Check out from version control', - logs: 'http://jenkins.localhost:8080', - ], - [ - displayName: 'Execute test task', - logs: 'http://jenkins.localhost:8080', - ], - ] } ], - testUtils: [ - getFailures: { - return [ - [ - url: Mocks.TEST_FAILURE_URL, - fullDisplayName: Mocks.TEST_FAILURE_NAME, - ] - ] - }, - ], - ]) - } -} diff --git a/.ci/pipeline-library/src/test/buildState.groovy b/.ci/pipeline-library/src/test/buildState.groovy deleted file mode 100644 index b748cce29e7f4b..00000000000000 --- a/.ci/pipeline-library/src/test/buildState.groovy +++ /dev/null @@ -1,48 +0,0 @@ -import org.junit.* -import static groovy.test.GroovyAssert.* - -class BuildStateTest extends KibanaBasePipelineTest { - def buildState - - @Before - void setUp() { - super.setUp() - - buildState = loadScript("vars/buildState.groovy") - } - - @Test - void 'get() returns existing data'() { - buildState.add('test', 1) - def actual = buildState.get('test') - assertEquals(1, actual) - } - - @Test - void 'get() returns null for missing data'() { - def actual = buildState.get('missing_key') - assertEquals(null, actual) - } - - @Test - void 'add() does not overwrite existing keys'() { - assertTrue(buildState.add('test', 1)) - assertFalse(buildState.add('test', 2)) - - def actual = buildState.get('test') - - assertEquals(1, actual) - } - - @Test - void 'set() overwrites existing keys'() { - assertFalse(buildState.has('test')) - buildState.set('test', 1) - assertTrue(buildState.has('test')) - buildState.set('test', 2) - - def actual = buildState.get('test') - - assertEquals(2, actual) - } -} diff --git a/.ci/pipeline-library/src/test/githubCommitStatus.groovy b/.ci/pipeline-library/src/test/githubCommitStatus.groovy deleted file mode 100644 index c770d5596f9cb6..00000000000000 --- a/.ci/pipeline-library/src/test/githubCommitStatus.groovy +++ /dev/null @@ -1,87 +0,0 @@ -import org.junit.* -import static org.mockito.Mockito.*; - -class GithubCommitStatusTest extends KibanaBasePipelineTest { - def githubCommitStatus - def githubApiMock - def buildStateMock - - def EXPECTED_STATUS_URL = 'repos/elastic/kibana/statuses/COMMIT_HASH' - def EXPECTED_CONTEXT = 'kibana-ci' - def EXPECTED_BUILD_URL = 'http://jenkins.localhost:8080/job/elastic+kibana+master/1/' - - interface BuildState { - Object get(String key) - Object has(String key) - } - - interface GithubApi { - Object post(String url, Map data) - } - - @Before - void setUp() { - super.setUp() - - buildStateMock = mock(BuildState) - githubApiMock = mock(GithubApi) - - when(buildStateMock.has('checkoutInfo')).thenReturn(true) - when(buildStateMock.get('checkoutInfo')).thenReturn([ commit: 'COMMIT_HASH', ]) - when(githubApiMock.post(any(), any())).thenReturn(null) - - props([ - buildState: buildStateMock, - githubApi: githubApiMock, - ]) - - githubCommitStatus = loadScript("vars/githubCommitStatus.groovy") - } - - void verifyStatusCreate(String state, String description) { - verify(githubApiMock).post( - EXPECTED_STATUS_URL, - [ - 'state': state, - 'description': description, - 'context': EXPECTED_CONTEXT, - 'target_url': EXPECTED_BUILD_URL, - ] - ) - } - - @Test - void 'onStart() should create a pending status'() { - githubCommitStatus.onStart() - verifyStatusCreate('pending', 'Build started.') - } - - @Test - void 'onFinish() should create a success status'() { - githubCommitStatus.onFinish() - verifyStatusCreate('success', 'Build completed successfully.') - } - - @Test - void 'onFinish() should create an error status for failed builds'() { - mockFailureBuild() - githubCommitStatus.onFinish() - verifyStatusCreate('error', 'Build failed.') - } - - @Test - void 'onStart() should exit early for PRs'() { - prop('githubPr', [ isPr: { true } ]) - - githubCommitStatus.onStart() - verifyZeroInteractions(githubApiMock) - } - - @Test - void 'onFinish() should exit early for PRs'() { - prop('githubPr', [ isPr: { true } ]) - - githubCommitStatus.onFinish() - verifyZeroInteractions(githubApiMock) - } -} diff --git a/.ci/pipeline-library/src/test/prChanges.groovy b/.ci/pipeline-library/src/test/prChanges.groovy deleted file mode 100644 index e3f82e6102acc7..00000000000000 --- a/.ci/pipeline-library/src/test/prChanges.groovy +++ /dev/null @@ -1,113 +0,0 @@ -import org.junit.* -import static groovy.test.GroovyAssert.* - -class PrChangesTest extends KibanaBasePipelineTest { - def prChanges - - @Before - void setUp() { - super.setUp() - - env.ghprbPullId = '1' - - props([ - githubPr: [ - isPr: { true }, - ], - ]) - - prChanges = loadScript("vars/prChanges.groovy") - } - - @Test - void 'areChangesSkippable() with no changes'() { - props([ - githubPrs: [ - getChanges: { [] }, - ], - ]) - - assertTrue(prChanges.areChangesSkippable()) - } - - @Test - void 'areChangesSkippable() with skippable changes'() { - props([ - githubPrs: [ - getChanges: { [ - [filename: 'docs/test/a-fake-doc.asciidoc'], - [filename: 'README.md'], - ] }, - ], - ]) - - assertTrue(prChanges.areChangesSkippable()) - } - - @Test - void 'areChangesSkippable() with skippable renames'() { - props([ - githubPrs: [ - getChanges: { [ - [ filename: 'docs/test/a-fake-doc.asciidoc', previousFilename: 'docs/test/a-different-fake-doc.asciidoc' ], - [ filename: 'README.md', previousFilename: 'README-old.md' ], - ] }, - ], - ]) - - assertTrue(prChanges.areChangesSkippable()) - } - - @Test - void 'areChangesSkippable() with unskippable changes'() { - props([ - githubPrs: [ - getChanges: { [ - [filename: 'src/core/index.ts'], - ] }, - ], - ]) - - assertFalse(prChanges.areChangesSkippable()) - } - - @Test - void 'areChangesSkippable() with skippable and unskippable changes'() { - props([ - githubPrs: [ - getChanges: { [ - [filename: 'README.md'], - [filename: 'src/core/index.ts'], - ] }, - ], - ]) - - assertFalse(prChanges.areChangesSkippable()) - } - - @Test - void 'areChangesSkippable() with skippable changes that are in notSkippablePaths'() { - props([ - githubPrs: [ - getChanges: { [ - [filename: 'docs/developer/plugin-list.asciidoc'], - ] }, - ], - ]) - - assertFalse(prChanges.areChangesSkippable()) - } - - @Test - void 'areChangesSkippable() with plugin readme changes'() { - props([ - githubPrs: [ - getChanges: { [ - [filename: 'src/plugins/foo/README.asciidoc'], - ] }, - ], - ]) - - assertFalse(prChanges.areChangesSkippable()) - } -} diff --git a/.ci/pipeline-library/src/test/slackNotifications.groovy b/.ci/pipeline-library/src/test/slackNotifications.groovy deleted file mode 100644 index 33b3afed80bde3..00000000000000 --- a/.ci/pipeline-library/src/test/slackNotifications.groovy +++ /dev/null @@ -1,185 +0,0 @@ -import org.junit.* -import static groovy.test.GroovyAssert.* - -class SlackNotificationsTest extends KibanaBasePipelineTest { - def slackNotifications - - @Before - void setUp() { - super.setUp() - - helper.registerAllowedMethod('slackSend', [Map.class], null) - prop('buildState', loadScript("vars/buildState.groovy")) - slackNotifications = loadScript('vars/slackNotifications.groovy') - } - - @Test - void 'getTestFailures() should properly format failure steps'() { - mockFailureBuild() - - def failureMessage = slackNotifications.getTestFailures() - - assertEquals( - "*Test Failures*\n• <${Mocks.TEST_FAILURE_URL}|x-pack/test/functional/apps/fake/test·ts.Fake test <Component> should & pass &>", - failureMessage - ) - } - - @Test - void 'sendFailedBuild() should call slackSend() with an in-progress message'() { - mockFailureBuild() - - slackNotifications.sendFailedBuild() - - def args = fnMock('slackSend').args[0] - - def expected = [ - channel: '#kibana-operations-alerts', - username: 'Kibana Operations', - iconEmoji: ':jenkins:', - color: 'danger', - message: ':hourglass_flowing_sand: elastic / kibana # master #1', - ] - - expected.each { - assertEquals(it.value.toString(), args[it.key].toString()) - } - - assertEquals( - ":hourglass_flowing_sand: **", - args.blocks[0].text.text.toString() - ) - - assertEquals( - "*Failed Steps*\n• ", - args.blocks[1].text.text.toString() - ) - - assertEquals( - "*Test Failures*\n• ", - args.blocks[2].text.text.toString() - ) - } - - @Test - void 'sendFailedBuild() should call slackSend() with message'() { - mockFailureBuild() - - slackNotifications.sendFailedBuild(isFinal: true) - - def args = fnMock('slackSend').args[0] - - def expected = [ - channel: '#kibana-operations-alerts', - username: 'Kibana Operations', - iconEmoji: ':jenkins:', - color: 'danger', - message: ':broken_heart: elastic / kibana # master #1', - ] - - expected.each { - assertEquals(it.value.toString(), args[it.key].toString()) - } - - assertEquals( - ":broken_heart: **", - args.blocks[0].text.text.toString() - ) - - assertEquals( - "*Failed Steps*\n• ", - args.blocks[1].text.text.toString() - ) - - assertEquals( - "*Test Failures*\n• ", - args.blocks[2].text.text.toString() - ) - } - - @Test - void 'sendFailedBuild() should call slackSend() with a backup message when first attempt fails'() { - mockFailureBuild() - def counter = 0 - helper.registerAllowedMethod('slackSend', [Map.class], { ++counter > 1 }) - slackNotifications.sendFailedBuild(isFinal: true) - - def args = fnMocks('slackSend')[1].args[0] - - def expected = [ - channel: '#kibana-operations-alerts', - username: 'Kibana Operations', - iconEmoji: ':jenkins:', - color: 'danger', - message: ':broken_heart: elastic / kibana # master #1', - ] - - expected.each { - assertEquals(it.value.toString(), args[it.key].toString()) - } - - assertEquals( - ":broken_heart: **" + - "\n\nFirst attempt at sending this notification failed. Please check the build.", - args.blocks[0].text.text.toString() - ) - } - - @Test - void 'sendFailedBuild() should call slackSend() with a channel id and timestamp on second call'() { - mockFailureBuild() - helper.registerAllowedMethod('slackSend', [Map.class], { [ channelId: 'CHANNEL_ID', ts: 'TIMESTAMP' ] }) - slackNotifications.sendFailedBuild(isFinal: false) - slackNotifications.sendFailedBuild(isFinal: true) - - def args = fnMocks('slackSend')[1].args[0] - - def expected = [ - channel: 'CHANNEL_ID', - timestamp: 'TIMESTAMP', - username: 'Kibana Operations', - iconEmoji: ':jenkins:', - color: 'danger', - message: ':broken_heart: elastic / kibana # master #1', - ] - - expected.each { - assertEquals(it.value.toString(), args[it.key].toString()) - } - } - - @Test - void 'getTestFailures() should truncate list of failures to 10'() { - prop('testUtils', [ - getFailures: { - return (1..12).collect { - return [ - url: Mocks.TEST_FAILURE_URL, - fullDisplayName: "Failure #${it}", - ] - } - }, - ]) - - def message = (String) slackNotifications.getTestFailures() - - assertTrue("Message ends with truncated indicator", message.endsWith("...and 2 more")) - assertTrue("Message contains Failure #10", message.contains("Failure #10")) - assertTrue("Message does not contain Failure #11", !message.contains("Failure #11")) - } - - @Test - void 'shortenMessage() should truncate a long message, but leave parts that fit'() { - assertEquals('Hello\nHello\n[...truncated...]', slackNotifications.shortenMessage('Hello\nHello\nthis is a long string', 29)) - } - - @Test - void 'shortenMessage() should not modify a short message'() { - assertEquals('Hello world', slackNotifications.shortenMessage('Hello world', 11)) - } - - @Test - void 'shortenMessage() should truncate an entire message with only one part'() { - assertEquals('[...truncated...]', slackNotifications.shortenMessage('Hello world this is a really long message', 40)) - } -} diff --git a/.ci/pipeline-library/vars b/.ci/pipeline-library/vars deleted file mode 120000 index 8559d2e08fc22c..00000000000000 --- a/.ci/pipeline-library/vars +++ /dev/null @@ -1 +0,0 @@ -../../vars \ No newline at end of file diff --git a/.ci/runbld_no_junit.yml b/.ci/runbld_no_junit.yml deleted file mode 100644 index 1bcb7e22a26480..00000000000000 --- a/.ci/runbld_no_junit.yml +++ /dev/null @@ -1,6 +0,0 @@ -# This file is not picked up by anything automatically -# It is used by being passed as an argument to runbld, when automatic processing of junit reports is not desired -profiles: -- ".*": # Match any job - tests: - junit-filename-pattern: false diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9ec0cc7fab0a4c..7d95257248bfc8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1497,17 +1497,12 @@ x-pack/test/threat_intelligence_cypress @elastic/protections-experience x-pack/plugins/security_solution/common/entity_analytics @elastic/security-entity-analytics x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score @elastic/security-entity-analytics x-pack/plugins/security_solution/public/entity_analytics @elastic/security-entity-analytics -x-pack/plugins/security_solution/public/explore/components/risk_score @elastic/security-entity-analytics -x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx @elastic/security-entity-analytics -x-pack/plugins/security_solution/public/overview/components/entity_analytics x-pack/plugins/security_solution/server/lib/entity_analytics @elastic/security-entity-analytics x-pack/plugins/security_solution/server/lib/risk_score @elastic/security-entity-analytics x-pack/test/security_solution_api_integration/test_suites/entity_analytics @elastic/security-entity-analytics x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics @elastic/security-entity-analytics x-pack/plugins/security_solution/public/flyout/entity_details @elastic/security-entity-analytics x-pack/plugins/security_solution/common/api/entity_analytics @elastic/security-entity-analytics -/x-pack/plugins/security_solution/public/entity_analytics @elastic/security-entity-analytics -/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics @elastic/security-entity-analytics # Security Defend Workflows - OSQuery Ownership /x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions @elastic/security-defend-workflows diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 7dd3d0f41d27ae..00000000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/groovy - -if (!env.ghprbPullId) { - print "Non-PR builds are now in Buildkite." - return -} - -library 'kibana-pipeline-library' -kibanaLibrary.load() - -kibanaPipeline(timeoutMinutes: 210, checkPrChanges: true, setCommitStatus: true) { - slackNotifications.onFailure(disabled: !params.NOTIFY_ON_FAILURE) { - githubPr.withDefaultPrComments { - ciStats.trackBuild(requireSuccess: githubPr.isTrackedBranchPr()) { - catchError { - retryable.enable() - kibanaPipeline.allCiTasks() - } - } - } - } - - if (params.NOTIFY_ON_FAILURE) { - kibanaPipeline.sendMail() - } -} diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 49623728f1afe9..e614bdff172f99 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -60,6 +60,7 @@ yarn_install( "GECKODRIVER_CDNURL": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache", "CHROMEDRIVER_CDNURL": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache", "CHROMEDRIVER_CDNBINARIESURL": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache", + "SASS_BINARY_SITE": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-sass", "RE2_DOWNLOAD_MIRROR": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2", "CYPRESS_DOWNLOAD_MIRROR": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/cypress", } diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 2cded533c95f55..695c92690cee6d 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-12-21 +date: 2023-12-22 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 913f3c4ce32b7c..77b33f3bf0b42f 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index 6fc92bf20893c9..b3cd887f032121 100644 --- a/api_docs/ai_assistant_management_observability.mdx +++ b/api_docs/ai_assistant_management_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementObservability title: "aiAssistantManagementObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementObservability plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementObservability'] --- import aiAssistantManagementObservabilityObj from './ai_assistant_management_observability.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index a2e3760e8c1e95..3508c9dfd01cce 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2023-12-21 +date: 2023-12-22 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 27b1437ee378fb..8df9bcab19eb72 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-12-21 +date: 2023-12-22 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 cefe8c8b8447bd..75d6cba6a75d68 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-12-21 +date: 2023-12-22 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 f1563ff517d3e1..099de1df7c2879 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-12-21 +date: 2023-12-22 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 ff1c317c4f8797..65a45586169e15 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index b532615b319703..d424caf49e3d4e 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index ab1916c43b03ce..e3e3d0e5086c4d 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-12-21 +date: 2023-12-22 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 69dae7f8fdf441..5183bd3057bcae 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-12-21 +date: 2023-12-22 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 bbddf43deb3cf3..6990eb0fbf9fd7 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index aaca7e7b1ee11b..ef26980ba8806c 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 80c9cc7916a854..f91ebcedc07968 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-12-21 +date: 2023-12-22 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 14e28bd4d9ba70..1c74a5dba3c877 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-12-21 +date: 2023-12-22 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 e7381f6f1b77aa..6b36e60e77cebf 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-12-21 +date: 2023-12-22 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 a36d09c49ea798..8b3e08aae6c9fb 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index bee7674145ec25..9597661ca9abe2 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 5e9aca55ddd29f..0216ba8cadc172 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-12-21 +date: 2023-12-22 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 167af207774c69..93a13d1c8740cd 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-12-21 +date: 2023-12-22 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 fe09361ff4bf64..4a2db6e9c9b50b 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-12-21 +date: 2023-12-22 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 889a08840b53f2..68b1579aa1f16a 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-12-21 +date: 2023-12-22 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 2cb09be42de16b..d3eb65901aa7d2 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-12-21 +date: 2023-12-22 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 24c32f43b23ca9..a2f9f4c26eae77 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-12-21 +date: 2023-12-22 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 4ecbaff344e4f0..52df2d2b317f8a 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-12-21 +date: 2023-12-22 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 446ea5e8289b43..3b36a3252818d7 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 73c8b2040c0324..685aa3c1551e13 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-12-21 +date: 2023-12-22 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 df0dab9ab0977f..6b718d26ddb49b 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index a7696ffb2b114b..ca713322f2be6f 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-12-21 +date: 2023-12-22 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 0bce395adfbb2a..f98b83013d32dd 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-12-21 +date: 2023-12-22 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 280caf73202772..7e375b3ba52bcc 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index a7b37e0f30c9a9..8a3f8b0b0cd7a1 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 38a69806ef3c9f..b7077e1ff204d3 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-12-21 +date: 2023-12-22 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 8b31bada0a8f77..a17d16efc96f50 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2023-12-21 +date: 2023-12-22 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 4d04d0c26a7a53..9207a16185bbc7 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 3f1f507466d5ce..41901a6cf658b7 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1345,7 +1345,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [wrap_search_source_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.ts#:~:text=create) | - | | | [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch) | - | | | [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/eql/api.ts#:~:text=options) | - | -| | [use_update_data_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.tsx#:~:text=toMountPoint), [use_update_data_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.tsx#:~:text=toMountPoint), [use_update_data_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.tsx#:~:text=toMountPoint), [ingest_pipelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts#:~:text=toMountPoint), [ingest_pipelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts#:~:text=toMountPoint), [ingest_pipelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts#:~:text=toMountPoint), [stored_scripts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts#:~:text=toMountPoint), [stored_scripts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts#:~:text=toMountPoint), [stored_scripts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts#:~:text=toMountPoint), [saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/saved_objects.ts#:~:text=toMountPoint)+ 3 more | - | +| | [use_update_data_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.tsx#:~:text=toMountPoint), [use_update_data_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.tsx#:~:text=toMountPoint), [use_update_data_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.tsx#:~:text=toMountPoint), [ingest_pipelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts#:~:text=toMountPoint), [ingest_pipelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts#:~:text=toMountPoint), [ingest_pipelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts#:~:text=toMountPoint), [stored_scripts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts#:~:text=toMountPoint), [stored_scripts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts#:~:text=toMountPoint), [stored_scripts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts#:~:text=toMountPoint), [saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/saved_objects.ts#:~:text=toMountPoint)+ 3 more | - | | | [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/app.tsx#:~:text=KibanaThemeProvider), [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/app.tsx#:~:text=KibanaThemeProvider), [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/app.tsx#:~:text=KibanaThemeProvider) | - | | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 7c5b3c2f8d1db1..4b9d345a7f2da0 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 49721a6640a54f..b0d882dc22ab00 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-12-21 +date: 2023-12-22 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 8f7aec0b851b39..404be2fdaddf27 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-12-21 +date: 2023-12-22 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 85ca05e54e5953..61fad7aeedc8b6 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 7b48d973032dcf..6d5efb33b0495c 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 181af89056834d..1edb0e22c91b6d 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-12-21 +date: 2023-12-22 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 bf4e662fd0a0fd..c0a29180191f8e 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-12-21 +date: 2023-12-22 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 35a002361207dd..4000f8edbd17f5 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-12-21 +date: 2023-12-22 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 6c9ebefe470a1f..6028e6a4b2bd86 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-12-21 +date: 2023-12-22 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 4dc9677142a408..616346e5ce1193 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 9b12313037818c..414657e8a38712 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 74875b894bcff3..b0dd3d5dc73567 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-12-21 +date: 2023-12-22 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 4d2edcbef9ca3a..1ed8deb13c798c 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-12-21 +date: 2023-12-22 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 f2ed4e3b823d86..042d197c9920f6 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-12-21 +date: 2023-12-22 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 ebb713229170bf..a3042bce0da2e4 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-12-21 +date: 2023-12-22 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 3a6b885e442164..df2203708c6630 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-12-21 +date: 2023-12-22 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 722c2b99c2ef05..ed3366bf0dd785 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-12-21 +date: 2023-12-22 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 610d50666ab091..f3589ed8f00a3f 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-12-21 +date: 2023-12-22 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 68f66b95d6ef5e..de93553f57a968 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-12-21 +date: 2023-12-22 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 e31ab8977443f7..e58aefecc88a7e 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-12-21 +date: 2023-12-22 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 660d8bb3deebce..5ff1e36ed5685a 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-12-21 +date: 2023-12-22 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 17bbed8aebef6b..7475914e1ffc0e 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-12-21 +date: 2023-12-22 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 6d9060dc5c0945..3e1f42bb343b9f 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-12-21 +date: 2023-12-22 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 de0b7c7e0c5944..2047dd244f4af8 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-12-21 +date: 2023-12-22 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 9ecebe60afcf6b..0af32e6f3e1263 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-12-21 +date: 2023-12-22 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 813405b56e762d..63dee50799a56b 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-12-21 +date: 2023-12-22 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 bcee8974cf16dc..e6dc779446a589 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-12-21 +date: 2023-12-22 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 91684d0d6f6d1d..802013bb1e3fd4 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-12-21 +date: 2023-12-22 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 723bbe47f86366..920d2fa5b27c8f 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 2da7a5a30b9529..a35aa893b1c438 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-12-21 +date: 2023-12-22 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 49f3495a7855f1..2460a90ea2552e 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 424efa731fab64..f9e28d7ca0ea6b 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-12-21 +date: 2023-12-22 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 57b7d033f8b80e..a22f832582169a 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-12-21 +date: 2023-12-22 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 df688b57a80601..1a99eafe7da17f 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 07073193bcd14d..5569dfe157d2ab 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 83601545625689..984f719614cfad 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-12-21 +date: 2023-12-22 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 53c554241d254f..3f77211fcb0ab3 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-12-21 +date: 2023-12-22 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 d441a1857be396..be9fa8ab2f1dd2 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index f76e485895325c..a80766c53e763e 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-12-21 +date: 2023-12-22 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 10a95dffca26c1..c0c4f0ae77e304 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-12-21 +date: 2023-12-22 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 98e0f0b6ed8c83..996d1734c69f99 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 5a6be0813c9828..356efa803d0fee 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index a9fc5189115317..fa612aeb81f5eb 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index b6ade9184308c7..3dd6a694144929 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 58c3128bc9f021..c90798a1f7a6b5 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 7e47dda753d5bf..64a897ebdcd407 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index cd14083f5a4a69..833580a8999b8b 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 7348d48a89b388..35a335a49fe1ed 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 5ef982036e984c..61b5dd98a3b764 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index e0f63ca0a1692e..730e726853bf56 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-12-21 +date: 2023-12-22 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 9794f4cb1680bd..2ed171fa7bba85 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2023-12-21 +date: 2023-12-22 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 cd9ee52924db35..fe1daf0dd82a74 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index e9920dea1c7f6b..eb9c7dc18a5af2 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-12-21 +date: 2023-12-22 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 ee15ca922d6a17..9b21ee8840b5aa 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index d85322e4f1541b..864e2447dce7fe 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 5f49867f330308..57ae16467cb7cd 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index a84b4c1b777bdd..b4dc464a15b924 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 775cfc7603fd9b..faaefdccbb1f8b 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 7bbd11809f9145..93e7b709071b04 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index a5261dd76295f3..4657d847c87723 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 2308c1d2bb90ef..57dd1cb8f860ed 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index cd8c2e5031d80f..b9153ed2793601 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index fa9c84e411c3fb..88d9f6b7531659 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-12-21 +date: 2023-12-22 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 29746d8baccfdd..6bcf839ef5b6e4 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 02c6abcf182b97..dbdf3057db495a 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index e3475f686a38ea..a8d71fa32aae79 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-12-21 +date: 2023-12-22 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 e048ddc047ef94..cedfe269a492d9 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2023-12-21 +date: 2023-12-22 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 0963be5da634e6..1c1406f7f17dc4 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2023-12-21 +date: 2023-12-22 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 92311c3dc81753..6d0df58244e032 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2023-12-21 +date: 2023-12-22 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 d3627857ebbd43..34373b30ecee90 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index f3d43f621a3bab..4f3b31d00e8794 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-12-21 +date: 2023-12-22 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 ae81f88ecddb60..114bcd6dc84093 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-12-21 +date: 2023-12-22 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 2273180eaa78ff..b36d6e4997952b 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-12-21 +date: 2023-12-22 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 fc4c1ef3e89de5..92dd74d04c0e35 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-12-21 +date: 2023-12-22 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 d61211e4b324b6..c6e8f14f8b456b 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-12-21 +date: 2023-12-22 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 b55cd4a00a2e57..ac257e0bd630ae 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-12-21 +date: 2023-12-22 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 f64562e83c7101..f035fdcdd8280f 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 2070eb71b3dc3a..4a92b36c2999ff 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 9daca0998df43f..f5dcdeed57b258 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: 2023-12-21 +date: 2023-12-22 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 9e8e71d82cc24c..ed6b49ef3a322b 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-12-21 +date: 2023-12-22 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 a0e29465bd5d20..fe9eb61f78b882 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-12-21 +date: 2023-12-22 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 43c203826913fb..00d9a9751dacb0 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 ace85fb984a6ef..95533707de4d34 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-12-21 +date: 2023-12-22 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 b9c53b58502bfc..88deb63fd5addc 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index ecd8263d958fd0..56f066af4734a1 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-12-21 +date: 2023-12-22 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 eeafff3e3f53e7..193149eabb5e9a 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-12-21 +date: 2023-12-22 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 c395e57bd5c378..24c1e5df83af19 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2023-12-21 +date: 2023-12-22 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 28f829569c70fa..a46b16d008f5a5 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index ac15e36f3e620c..06fb677025286e 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 35e49738c9ee18..39af130175d146 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 f6885853bab389..4337843d06b5b1 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 6e7b35122b360d..25f2f0a9c39500 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index a2a209f1f5c3c9..e9d66444a462d5 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-12-21 +date: 2023-12-22 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 c5bba2659b8e0a..4e0681033cadb4 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 a50b6ee3737ca7..74b7fe36941593 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 5ef25a22fdd7e2..9d24ccaa0cd608 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 95bfa2b1f470d6..075aa0d1be4053 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 f462d587430a24..760c54f4cf3e0e 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 95bbfa98d1587d..5584f48874d443 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-12-21 +date: 2023-12-22 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 6e3db2df263f8a..317137399bca9b 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 540041cdfae266..99f6b8ec101303 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 4d5a45ce4f5146..3762754e9f1f13 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 984168575a1609..28d499efc2b438 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 db906e2aae7abc..883bde6576ca32 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-12-21 +date: 2023-12-22 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 a2ec8bd66365ee..9ee58e63313dea 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 26e01b07a38cc6..9bab6d34784f92 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 3925a4050d7a2a..5498fb1f6c4c72 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 086fff1793b4a3..e24c4e66a7508f 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-12-21 +date: 2023-12-22 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 13929a85fc45a7..53a56c1019aff7 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-12-21 +date: 2023-12-22 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 5784f6aaad2537..c1fae432cc4647 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index f4f709a7302989..386bf47ce00888 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 2b75ad47f9b0d3..190cdad59cfd5e 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 7c29647aadd524..52288b2e2cc5e7 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 9626c62b68df67..414a494d2d4002 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 39b4a0a0481e53..bd1a209dfdd1c2 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 de789aaa6b3f54..787c53ec32d0ad 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 5f2ff3b8b2d613..4cd52bc7bd7dec 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-12-21 +date: 2023-12-22 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 988e68ec151330..c2d970229b18ef 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-12-21 +date: 2023-12-22 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 8875485c9aabb4..c2abeb55966272 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 530e943b8e926b..5ff5a272f74304 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 a87366790ba8b2..21710bf17389a6 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 5e52613ec7563d..77d45c586f7e8e 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 67cf325c43a0e6..b591077eaa2b6b 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 fb8e41bc8e5720..770641b349b0aa 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-12-21 +date: 2023-12-22 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 eaf60bbd317999..cda137bc31e2ef 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-12-21 +date: 2023-12-22 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 e9c69de86b77bc..8385b5a657905e 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 6de5b1f562edeb..e348604e746810 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 10829b1e6275aa..e22208732af710 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 2f57ff67171860..b0c81cac647fcc 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 bae2165a50a875..c53fed2153c05b 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-12-21 +date: 2023-12-22 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 2355fa68afbb88..93da39c2d9cddd 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 2b7a7e5f90047b..64791190ced842 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 1634b62b279178..e86dab666def7d 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 c9dff23c3fc428..939e53b6330fec 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-12-21 +date: 2023-12-22 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 fbbdf852ae1722..7b710c71e73a3c 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 dd21efd9047060..a78a946f8a07f8 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 53df4b35df5aaf..a1cf5de5648a26 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 8ebb452e60bf2f..610a406bcdd873 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 ac638f6518370c..2244af8b6b902f 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 ecfe86d8adc278..bcfa71bc7f4701 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 22ec8ff9b7f15f..11af05d6a97473 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 c467d178aaa9cf..01163f304da44d 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-12-21 +date: 2023-12-22 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 21cfe850579fce..dc047d543b04a5 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-12-21 +date: 2023-12-22 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 3237035fec0159..fe91dd3c5229ed 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 3f31f1f7edb844..cbcc9ec778cd4e 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 c1c340f9cccc7b..f9c1eb8ee342bd 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 82fc0ca9ca40b8..2f4fb81f919eb7 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 21cbe5fe4dfa03..c4246446a37da9 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 986a34823dcadd..43feae53311edb 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 57d3f7b03ae1b9..c72f035f984276 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 1d515d7566223b..a741083e63268f 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-12-21 +date: 2023-12-22 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 04a2bb69f59f66..10a3d2448da9ae 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 91fa8a5ad49bd1..4551aa350759e3 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-12-21 +date: 2023-12-22 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 ade659bb9ef916..fa63edc9e2f9ec 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-12-21 +date: 2023-12-22 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 c6fc808e859cf3..01d6800ead5b13 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 5bcb87cf8fbd0c..7a08235cec3d42 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 ffa07aefb50bc8..14bc10bb283af5 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 89d2a7c8716326..ba5a80e1243139 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 5c643711446533..48e78d70d9e4bd 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3412,6 +3412,10 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/get.ts" }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/api_keys/has_active.ts" + }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/anonymous_access/get_capabilities.ts" @@ -5524,6 +5528,10 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/get.test.ts" }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/api_keys/has_active.test.ts" + }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/authentication/index.test.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 3878dda022f742..21a6896829f488 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-12-21 +date: 2023-12-22 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 3b2c869a440f69..057f929ca45830 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 315bff5546a26b..667975b02ed9ca 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 ee4117cafdf518..db528585a2381e 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 68284739bceea3..d933e689b329c6 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 3656480a1b1617..a1ddb576e2cc9f 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-12-21 +date: 2023-12-22 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 73c42cd26676ea..1cb964f3f4c070 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 e99ae71e0ed32d..42bf1924641491 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 0fbecc550b8900..934cf3ddfb0876 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 374f99df7846ec..49354657c4b2fe 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 0cfbc9010c875c..1ffe6e6281e032 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 94fd96b52cbf7e..e977076551ba70 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 40197f67df0132..d24e599caf2ac7 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 bbeea34bc66362..d9c0a57c13af35 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-12-21 +date: 2023-12-22 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 06bbaebd8709ec..9de8134121896f 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 1ca8d6b6236159..585cabdf2367e4 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 33c55994265693..224e4bb45402a3 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 9b3045e3fa8ae6..ba463021093230 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-12-21 +date: 2023-12-22 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 b30296c72dab91..8d046b8dc95175 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 a9aa834345570c..11f5e154916ec7 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 3c12d01bf72c1c..06bc6639826b03 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 d503e9ba8c50e9..666396762d24b0 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 28dff19fe2d240..2b1926bc3df8b0 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-12-21 +date: 2023-12-22 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 cc635864065ef6..689f04ba97890b 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 8b1cae196fcf18..cf64598d04ac3d 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 af8ca1ed8eb08c..d893a2d2060a48 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 33030427e39e63..5d43fa669f1d9b 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-12-21 +date: 2023-12-22 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 2005c0eb786627..4a8320038272b8 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 955df9242dee5d..68d82a9e1b1f19 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 a7571fab6a007b..783576b11f442f 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 93efe83e1a368f..57b4645947bb5d 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 91e4b7602c9fee..2b23ad5e3fcb42 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index b1fe595fb61196..8f734e1c99ea54 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 65fc5ba808174c..6fdf9359951b3b 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 8aef508ce708dd..ca61c2a3993d8f 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 35636514e7b0f2..5762e3aedb4e78 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 5e1aa4e0516ce5..04bf44697e3c22 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 b43d393843b38a..c9f880cecb7685 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 cb60cff7899ca0..c18718780342f8 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2023-12-21 +date: 2023-12-22 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 059b444eee8a65..b51946928a615e 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-12-21 +date: 2023-12-22 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 b7e7d6d240fe99..a209ce88902365 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 f9a227b51b9802..bebb8af10d1880 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-12-21 +date: 2023-12-22 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 c3d592b4ccd01d..3e72e3ade48490 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index e3cfc0016205a5..e91f0321b2cfaf 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 dc894ce4088329..c480988e8debdb 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 6562cc04b8d2b4..e958e6c4038a0f 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 8860cc64b0ff2b..60acf254d80ac2 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 46145e7dafea3d..a10143986abeca 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index d18706056fc8c5..9e6177372823a1 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-12-21 +date: 2023-12-22 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 976ac03873c077..7917619e885770 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 c945b37884f049..af6bc48dcdbd37 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 64d3947380a897..694a759dc3be22 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 c14cbd07dcb33b..a6ef79c8e937ea 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 b2a5ee9c740c2f..53c090b7935934 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index bc618bf1d5280f..f4c0a6735d14ff 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index c52c8874543747..2e6abf724a7174 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-12-21 +date: 2023-12-22 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 339f26f9512079..7077d3eea542d5 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 aba3efb9f39e6e..df126dcacdb257 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 92fc33c8a512d5..98ee89d06bd602 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 8a748b894289fa..47470a6051f4c0 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 2bf8adc73f0120..32557f52457f5e 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-12-21 +date: 2023-12-22 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 751587b7a7143c..f507615660621c 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 ba9afc922f5d2d..94dbc4d959ca3d 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 3547870869976b..c3d1c9d0e47572 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index e755903cab5c2c..0f10c18a76c1a8 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index b660994a8e5770..7b1dec3519845c 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index b76e97cf6f4a25..b05da23d958636 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-12-21 +date: 2023-12-22 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 23ea6489fcf40e..ab60b33236ae55 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 4be2f0a68513e6..47380b1d44e6ad 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 f9d2dc98b5ab42..51414b8a3caee7 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-12-21 +date: 2023-12-22 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 57b198a45efe20..eb987fcedaff6f 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 5df791a730448a..34c2ab50c9e8c0 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-12-21 +date: 2023-12-22 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 0caed2822c4b20..98af7ec16632f7 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2023-12-21 +date: 2023-12-22 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 2c657268a5d787..455d5a22f78fad 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-12-21 +date: 2023-12-22 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 636431f7bf687a..94935cd3f8577a 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 9f5784d5b9c640..98d5fe78f1ce10 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 64b447f427080c..36581891715fa5 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 9d2855bfa8518b..e155dbb9f81160 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 f9d3245d82ead6..301eb06096fda5 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 91b53edb813d82..2fd021aea6681b 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 611c7b1032e3e7..958efda278745d 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-12-21 +date: 2023-12-22 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 9df78e54783bfa..b45c2767f06c80 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-12-21 +date: 2023-12-22 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 c1f26fe313a7dd..ac9023d7377c27 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 5f84689ca7a3ea..28a4b18b2b66c6 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 a68e6da729d0b7..f2bdabe0f80aaa 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-12-21 +date: 2023-12-22 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 84d53652d3ef57..b1ae1969157de8 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 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 bb30fde7b6ba31..e4292d8e1c151c 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index b1d3b8b2647ab9..2f1b69a0d9672c 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 5982b088a67b5c..69b463e3c1b87f 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 98456142fa228d..f9044784c1ba01 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 c844f84771dbb2..d009d59533b558 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-12-21 +date: 2023-12-22 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 6ca93ee6cd8127..90f72f9bcb56ef 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-12-21 +date: 2023-12-22 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 d0b256ca06698c..77afd949cb0105 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2023-12-21 +date: 2023-12-22 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 592f46b80a9226..19fb4dd69bde57 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-12-21 +date: 2023-12-22 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 a9616f0320a58a..c2636107ed2d6a 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index b4566e31857080..4893aa8c2653e8 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 9901ba85c631b6..f7e0b76cbc8e76 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-12-21 +date: 2023-12-22 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 de417779892ebf..841b5395ce2783 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-12-21 +date: 2023-12-22 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 ab1fe7c3565ef0..334f446ad371f3 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 0c8d3df2a61011..27c6505edec783 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-12-21 +date: 2023-12-22 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 3f5fce00d87668..6dfaeb0c0752e7 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-12-21 +date: 2023-12-22 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 7a7c81abc68e28..a68c92b929de57 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index c87af96299e9c8..8c725464394169 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index ad6f9478e9ad3e..6780189ed5abe9 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-12-21 +date: 2023-12-22 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 1ff3d6a0c29c2d..f138fc09911cfb 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-12-21 +date: 2023-12-22 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 981516377d3b20..0b46d38a435aab 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-12-21 +date: 2023-12-22 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 abdddd7ae7ceaf..b4b37fa3bb98ab 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-12-21 +date: 2023-12-22 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 9607746f811174..b7837f6fa78cb7 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-12-21 +date: 2023-12-22 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 b071b24947c9e3..cc4025ece54312 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-12-21 +date: 2023-12-22 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 91deb5cd6acae8..c7ee0527405752 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-12-21 +date: 2023-12-22 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 4afa160c819c89..73777f8fa2c2b3 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 3ea72495146087..9e94736f581298 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 74cde01bba07b6..24e47b27351cd8 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-12-21 +date: 2023-12-22 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 a50db44addd846..0ebe09e0224022 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 b5d1d4d6aa8f9c..a4b25b66f38dea 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-12-21 +date: 2023-12-22 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 ba71492ecec06d..a7d7fcab4a56f8 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index 06bfb551f0db34..dd9a04ea812d5c 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 769f84c7a571fb..2e56dd07656204 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-12-21 +date: 2023-12-22 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 c9e17d49ca1447..58d9c08e10ce6b 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2023-12-21 +date: 2023-12-22 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.devdocs.json b/api_docs/kbn_elastic_assistant.devdocs.json index 8b855265a22ca1..ea58540def0947 100644 --- a/api_docs/kbn_elastic_assistant.devdocs.json +++ b/api_docs/kbn_elastic_assistant.devdocs.json @@ -159,7 +159,7 @@ "label": "AssistantProvider", "description": [], "signature": [ - "({ actionTypeRegistry, alertsIndexPattern, assistantAvailability, assistantStreamingEnabled, assistantTelemetry, augmentMessageCodeBlocks, baseAllow, baseAllowReplacement, defaultAllow, defaultAllowReplacement, docLinks, basePath, basePromptContexts, baseQuickPrompts, baseSystemPrompts, children, getComments, http, getInitialConversations, modelEvaluatorEnabled, nameSpace, ragOnAlerts, setConversations, setDefaultAllow, setDefaultAllowReplacement, title, toasts, }: React.PropsWithChildren<", + "({ actionTypeRegistry, alertsIndexPattern, assistantAvailability, assistantStreamingEnabled, assistantTelemetry, augmentMessageCodeBlocks, baseAllow, baseAllowReplacement, defaultAllow, defaultAllowReplacement, docLinks, basePath, basePromptContexts, baseQuickPrompts, baseSystemPrompts, children, getComments, http, getInitialConversations, modelEvaluatorEnabled, nameSpace, setConversations, setDefaultAllow, setDefaultAllowReplacement, title, toasts, }: React.PropsWithChildren<", "AssistantProviderProps", ">) => JSX.Element" ], @@ -172,7 +172,7 @@ "id": "def-public.AssistantProvider.$1", "type": "CompoundType", "tags": [], - "label": "{\n actionTypeRegistry,\n alertsIndexPattern,\n assistantAvailability,\n assistantStreamingEnabled = false,\n assistantTelemetry,\n augmentMessageCodeBlocks,\n baseAllow,\n baseAllowReplacement,\n defaultAllow,\n defaultAllowReplacement,\n docLinks,\n basePath,\n basePromptContexts = [],\n baseQuickPrompts = [],\n baseSystemPrompts = BASE_SYSTEM_PROMPTS,\n children,\n getComments,\n http,\n getInitialConversations,\n modelEvaluatorEnabled = false,\n nameSpace = DEFAULT_ASSISTANT_NAMESPACE,\n ragOnAlerts = false,\n setConversations,\n setDefaultAllow,\n setDefaultAllowReplacement,\n title = DEFAULT_ASSISTANT_TITLE,\n toasts,\n}", + "label": "{\n actionTypeRegistry,\n alertsIndexPattern,\n assistantAvailability,\n assistantStreamingEnabled = false,\n assistantTelemetry,\n augmentMessageCodeBlocks,\n baseAllow,\n baseAllowReplacement,\n defaultAllow,\n defaultAllowReplacement,\n docLinks,\n basePath,\n basePromptContexts = [],\n baseQuickPrompts = [],\n baseSystemPrompts = BASE_SYSTEM_PROMPTS,\n children,\n getComments,\n http,\n getInitialConversations,\n modelEvaluatorEnabled = false,\n nameSpace = DEFAULT_ASSISTANT_NAMESPACE,\n setConversations,\n setDefaultAllow,\n setDefaultAllowReplacement,\n title = DEFAULT_ASSISTANT_TITLE,\n toasts,\n}", "description": [], "signature": [ "React.PropsWithChildren<", diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 1838e84c5e82d0..a0f820ffdc2cfb 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 14d5b49ef145a2..d8b364df840c40 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index e2300f88a31015..b6e27b5d90a447 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-12-21 +date: 2023-12-22 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 727c0410b35d15..39ecb08ef3bde2 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-12-21 +date: 2023-12-22 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 d5dcf9ba5f3087..1aaca7ccebd8d9 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-12-21 +date: 2023-12-22 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 83f290afe8d5dc..f4bec2cbc65e30 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-12-21 +date: 2023-12-22 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 d106508e62a3f5..050b422128f554 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-12-21 +date: 2023-12-22 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 7f3ea3894a077a..ab5213b24291f0 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index a21c94b33bd722..bd6d149c45b951 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-12-21 +date: 2023-12-22 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 4650387b4e8dec..7c263dc0988864 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-12-21 +date: 2023-12-22 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 736802ee4edf23..03b6437ca94390 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-12-21 +date: 2023-12-22 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 225f9154c0c877..1963f73f4175b0 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-12-21 +date: 2023-12-22 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 354ed95ff18342..4bf91783a344cb 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 46fd82d33a3692..f9d3fea42ddf39 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 485a82f935345f..f4344f28802d70 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-12-21 +date: 2023-12-22 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 58a04b102d2d4f..739bc173363f30 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: 2023-12-21 +date: 2023-12-22 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 ced2d9b02baa12..48dbd3077ff4d6 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-12-21 +date: 2023-12-22 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 acdd4ca7108fcd..5cb255c02b5d8b 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-12-21 +date: 2023-12-22 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 f9ab63c7b8454f..665c891f4bc472 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index b4cb4f54e3c907..767c62d947178b 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-12-21 +date: 2023-12-22 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 9a30535f9846c4..40102ffbddfb58 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-12-21 +date: 2023-12-22 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 2348a73dada969..a255305804769b 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 f1192c6392ba6a..14a9b7fdf681b5 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-12-21 +date: 2023-12-22 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 6df85d7c3fbf9b..9a5f3684577327 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-12-21 +date: 2023-12-22 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 97f335e2b29a91..7ec6dee933441c 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-12-21 +date: 2023-12-22 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 a7b9c0e7965e7b..d0d44489b78293 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-12-21 +date: 2023-12-22 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 b76d82f9c63a0c..50ccbbe5a0b928 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-12-21 +date: 2023-12-22 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 063d2caa0ce095..4549adf06df965 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index e16c880e29b258..47b4cd89295f0a 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-12-21 +date: 2023-12-22 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 736f247e927c05..cc6e0d6b60e44a 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 5ecb0dc6f48b31..cee10aaba33851 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 587266e89ce0e0..528cb31a980ef5 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-12-21 +date: 2023-12-22 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 5e097f4cad1ebd..20e97a380bb02a 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-12-21 +date: 2023-12-22 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 7a68f42df30f86..37fb589b59b279 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 538469a414ea9b..1c22f7fe8e6dec 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index f006aeac14ef46..4dcb648ebfa6cd 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index fa1b633c38df01..cda0b814df8be7 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index c9e80ba261d71d..4ef82e3020b2a4 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-12-21 +date: 2023-12-22 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 77180e8b6218d4..d9150059869426 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index a5e8bbe0c175ed..2b62d134d70ca0 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-12-21 +date: 2023-12-22 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 2ade745aeb61ea..37b29203b154a9 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-12-21 +date: 2023-12-22 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 6dff98790c046f..f02a2d63d0eb67 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2023-12-21 +date: 2023-12-22 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 b5f6c56a0c6a1e..349f1f83598fc6 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2023-12-21 +date: 2023-12-22 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 5dee0c8129f84d..cf934ab6e44359 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-12-21 +date: 2023-12-22 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 9d0b0d59822603..5caac58100760b 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-12-21 +date: 2023-12-22 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 86db4fa4d568c9..c190b5fce6cf4a 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2023-12-21 +date: 2023-12-22 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 5728b144297fb2..696e1b469bdc9a 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-12-21 +date: 2023-12-22 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 bf887b0f0d4951..f1ecaceb348385 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-12-21 +date: 2023-12-22 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 8d232226abb176..68b0368298511b 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-12-21 +date: 2023-12-22 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 52f8367985b17b..863330786164dc 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-12-21 +date: 2023-12-22 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 b23991555ea24d..da1a517d31e629 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-12-21 +date: 2023-12-22 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 40723ca74a8881..5d5f115e466406 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 9527a07532e8aa..ac216ddf548f5a 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-12-21 +date: 2023-12-22 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 d8f183ce4b63ed..5692ee22a846a3 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 c331dda348956d..f17511081fa034 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 ef511ba7c9c7a3..347180a77cee11 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 1f1403134c7d08..af1d031567e812 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-12-21 +date: 2023-12-22 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 b4cce1b1f40561..3cbf602d154d9a 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2023-12-21 +date: 2023-12-22 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 fb9f40daf38158..f5afb4de017bbe 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 663d847add458f..0f5ba21a0f5bdc 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-12-21 +date: 2023-12-22 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 55d74f2dc9a788..489e63c15a26de 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-12-21 +date: 2023-12-22 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 ee875c4b9b0869..551a9e49d943e2 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 9625b2901c5a64..47451e35680427 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index d4b84ca095d03f..c38642d7cba3c7 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-12-21 +date: 2023-12-22 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 3e8055e22bfe96..0c0d081584ab85 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-12-21 +date: 2023-12-22 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 9b6a1a8d56e4ae..a024c0684e33af 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-12-21 +date: 2023-12-22 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 d87dcee33b8345..750cbd94bda727 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-12-21 +date: 2023-12-22 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 fb528775d6d6e5..38f29d405ce3e2 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-12-21 +date: 2023-12-22 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 104c9bd08cbd00..42eda059d2b2e4 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-12-21 +date: 2023-12-22 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 fa5d8a26da85c2..24e97c2a04c97d 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index f1ec133743bf93..837c83393f17e0 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 d76ce7eb02acc8..9e12561cd2a4d4 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 1c4722fb1e2734..a0cc2d80293ffa 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 dfdf19203f1941..cc6f3ef07fc43e 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 e4cfbe7a1c1bb3..05d436af1a3cfa 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 857f1f1f627f8c..62d4bf250d8127 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 161c34fe354465..2df8f82c09a0cd 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2023-12-21 +date: 2023-12-22 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 8cd0569d7058b4..2f0a268ae7fb83 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 476a8ca11fe6ef..b8f17eb7c02c0b 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-12-21 +date: 2023-12-22 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 e01ef66fd8acee..7ee3bc0c078803 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index d4885592b16373..e7d3a4e6d383b8 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index a933509a8fc3c5..329a9e98008d62 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2023-12-21 +date: 2023-12-22 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 aee6941054ce44..c2cc713a5bb491 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 9c7d00cb1c1ce5..91280607182e66 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2023-12-21 +date: 2023-12-22 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 d7076d0b70c8c4..f5e546ddf03f39 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-12-21 +date: 2023-12-22 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 40ec00d6629045..fe5a464b4cc1cb 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-12-21 +date: 2023-12-22 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 1c534416c68cb2..fa8b950a3b3c91 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-12-21 +date: 2023-12-22 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 afb5c544aeb70e..9a8499d7fa2ffe 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-12-21 +date: 2023-12-22 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 2a3e058e47b17a..c81e3f19fe3a50 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2023-12-21 +date: 2023-12-22 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 ca654854e531d5..e4bb88d5e6fde9 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index cb11ae38713d90..a763d264941c34 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-12-21 +date: 2023-12-22 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 1261d477deec46..178592e980485a 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 4975684673070e..13d4799935447e 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 bcb68a4999dfa9..ea845501b36a41 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-12-21 +date: 2023-12-22 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 72b5d45ef3804e..1d016920b2d608 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 6734b12533be6f..514b1cab3ba739 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-12-21 +date: 2023-12-22 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 6eaef4024c13f0..1facb5f0a3c085 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-12-21 +date: 2023-12-22 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 97302f7e5ddefd..ebff472f208959 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-12-21 +date: 2023-12-22 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 766912c60a09c6..ae49c055fd8c98 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-12-21 +date: 2023-12-22 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 1d96d5a8693f96..7c454a5104bc98 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-12-21 +date: 2023-12-22 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 3f0fd940b4577c..8a96da47741aca 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 2e08a38bd8f2fc..5aa409dee31e17 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-12-21 +date: 2023-12-22 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 f462a62afa7693..13e22a31ac1cd0 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-12-21 +date: 2023-12-22 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 9be75b489fe1eb..a9694fe2f6a7e0 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-12-21 +date: 2023-12-22 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 ec1cad8776d5cd..8443b28704703c 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-12-21 +date: 2023-12-22 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 ae4b0db271aebe..5b34d4c7e10391 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 93ff6845750a2e..5091c832939745 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2023-12-21 +date: 2023-12-22 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 a4d9ea81b1c2c4..9a92686f923c77 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2023-12-21 +date: 2023-12-22 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 e9d60015e69f14..a40fd62b9b3f73 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2023-12-21 +date: 2023-12-22 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 d71b6f36a07d24..1a9be4c53743eb 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2023-12-21 +date: 2023-12-22 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 43e24ba0b2f1f8..da649e07ca4a23 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2023-12-21 +date: 2023-12-22 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 180e38e7d74aa6..822346563c31b9 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2023-12-21 +date: 2023-12-22 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 c8c95aba2fdb6f..905dfb25578d78 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2023-12-21 +date: 2023-12-22 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 fe10766f2ff6a7..cf3602dde955ca 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2023-12-21 +date: 2023-12-22 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 a7f540efabc238..6bf149f6821117 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2023-12-21 +date: 2023-12-22 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 1f20773ed98cb9..1650103171192f 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 4538e15c2dd2e6..7ed9fe78af28b7 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 46792eff4da48d..3cd56fd6d76849 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: 2023-12-21 +date: 2023-12-22 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 2c87eebdfbf63b..2fce5484affd28 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.devdocs.json b/api_docs/kbn_rule_data_utils.devdocs.json index 2dee374f7c5725..e4de662c8e2a83 100644 --- a/api_docs/kbn_rule_data_utils.devdocs.json +++ b/api_docs/kbn_rule_data_utils.devdocs.json @@ -1631,6 +1631,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/rule-data-utils", + "id": "def-common.ML_ANOMALY_DETECTION_RULE_TYPE_ID", + "type": "string", + "tags": [], + "label": "ML_ANOMALY_DETECTION_RULE_TYPE_ID", + "description": [], + "signature": [ + "\"xpack.ml.anomaly_detection_alert\"" + ], + "path": "packages/kbn-rule-data-utils/src/rule_types/stack_rules.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/rule-data-utils", "id": "def-common.OBSERVABILITY_THRESHOLD_RULE_TYPE_ID", @@ -1654,7 +1669,7 @@ "label": "RuleCreationValidConsumer", "description": [], "signature": [ - "\"observability\" | \"stackAlerts\" | \"logs\" | \"infrastructure\"" + "\"observability\" | \"stackAlerts\" | \"alerts\" | \"logs\" | \"infrastructure\"" ], "path": "packages/kbn-rule-data-utils/src/rule_types/index.ts", "deprecated": false, diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index fb82dfcadcaf71..63e1acbbaeb109 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-detections-response](https://github.com/orgs/elastic/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 119 | 0 | 116 | 0 | +| 120 | 0 | 117 | 0 | ## Common diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index af33349d307a50..4d1b2794d55130 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 2a641830beae68..1185655dbb2562 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-12-21 +date: 2023-12-22 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 ac28e4ba909945..203dd6254948a7 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-12-21 +date: 2023-12-22 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 76f049106e4647..8b32ff505f4ecf 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2023-12-21 +date: 2023-12-22 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 67a450e95dc029..6f91fa8d4a6a4d 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2023-12-21 +date: 2023-12-22 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 c8733af8f3b4f4..228d15c9a6e7f8 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 361e44f7525b91..0b44e768dfff99 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2023-12-21 +date: 2023-12-22 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 c1eddbd21e6ecd..0e3a51f42b6a70 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2023-12-21 +date: 2023-12-22 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 1ee3409edb4411..95980a551449c2 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 2275e43f86531e..0764c684a5846a 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-12-21 +date: 2023-12-22 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 e98dcbc0fb3e18..ea6a20550eafc8 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-12-21 +date: 2023-12-22 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 198fd8d906c6ac..aa199a8b3ba406 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-12-21 +date: 2023-12-22 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 a86bd69301014d..98dd38c141de6d 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index d46b9573b02abb..a107a623ad228b 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-12-21 +date: 2023-12-22 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 752391b00c71e6..d311b80226c7cd 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-12-21 +date: 2023-12-22 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 1c30c2dd9ddaeb..d1869f9a4816b0 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-12-21 +date: 2023-12-22 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 c69cc00e9bd5d3..9c8f46c00fa4e4 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 485f91badfd291..33e35bdb985741 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 99bcebd52620c4..b9cf2b0b9739ba 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index daa59d3a14a8fe..46319a182d9269 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 dad69dd4f7d3c3..260270596e03b0 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-12-21 +date: 2023-12-22 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 457a7d0f43b9ac..83cf0e7c695406 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-12-21 +date: 2023-12-22 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 888396c1502592..f358714352b5b4 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-12-21 +date: 2023-12-22 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 6cd8f93dc42ce2..c3af10c0534b63 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 d6e71ec16ff109..09680f8121c3dc 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-12-21 +date: 2023-12-22 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 ce41a5911691f4..3c036a6dd57f37 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-12-21 +date: 2023-12-22 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 f1d90b86434766..02465aeb2b48c0 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-12-21 +date: 2023-12-22 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 a17d58fef29578..1b521138d70b5e 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 5bc2204e82bb74..11a94475369146 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-12-21 +date: 2023-12-22 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 7788a5d4355dd2..1ddc3e3ce890d0 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-12-21 +date: 2023-12-22 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 609f341dc1b05b..eb81380a5d4c11 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 2cc9052e6efbb4..b7fd265e403064 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-12-21 +date: 2023-12-22 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 145a3a4e98f6cd..c1807025a970ea 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 4d19913b46abcf..623fa4620616eb 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-12-21 +date: 2023-12-22 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 90e9414c322d84..64f4f2305ced14 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-12-21 +date: 2023-12-22 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 4dae4a8365fb99..782e34ba4b4f33 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-12-21 +date: 2023-12-22 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 1f5140ac73696e..f5f47312a2239d 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-12-21 +date: 2023-12-22 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 5e1ef4e7cc4cd8..1ac366bfe562e4 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-12-21 +date: 2023-12-22 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 5e737ffe67b0c2..fa32927d59d675 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-12-21 +date: 2023-12-22 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 34d9e1cd7c3f8f..1441ab5f319ae1 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-12-21 +date: 2023-12-22 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 0edcb0420cf0b3..656a38b53a56a6 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-12-21 +date: 2023-12-22 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 b2a4991f0150db..7e49f604f850c7 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-12-21 +date: 2023-12-22 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 731b7d47abda65..fcb72c805f2812 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-12-21 +date: 2023-12-22 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 b402fab6533ba1..cff4b075ab221b 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-12-21 +date: 2023-12-22 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 d2d7c19d98f93b..45b12b3750b493 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 2ee426316121dd..241be1e2dc8a5c 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-12-21 +date: 2023-12-22 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 50108c9335524e..e55ced58eeebea 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2023-12-21 +date: 2023-12-22 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 a60c0a9caec899..85318791c993f1 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-12-21 +date: 2023-12-22 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 564d7c1f72c998..bf0f37a363d428 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-12-21 +date: 2023-12-22 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 db69b2c21e993f..0114f454064a6c 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 ed36cadf1dd827..8166713a8fc1a3 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 9a7b32461ba39e..93d9c46622dbc4 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-12-21 +date: 2023-12-22 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 f10f62d557f53c..2150ad50b555fd 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-12-21 +date: 2023-12-22 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 cadb839de4d01e..8d53487db5291c 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-12-21 +date: 2023-12-22 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 d1ebebbf8a1e0a..0043a99a45cfe0 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-12-21 +date: 2023-12-22 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 4e23dbadfc9bda..f02a6548563987 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-12-21 +date: 2023-12-22 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 23c1ab42492420..017111547abd9b 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 4000466839f8f7..f971b9f5f20001 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-12-21 +date: 2023-12-22 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 6fc345cdff8dc6..275ab12248e30d 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 4e0c87fcd147ca..b1f43e50f6f2a5 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-12-21 +date: 2023-12-22 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 02dd7e6dab7587..60ad579b6d45e4 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 04b9041cfb4daf..3aac7dfb252d14 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-12-21 +date: 2023-12-22 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 8537917d2ff7a3..ec1aeb8bb099e2 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 096853f46f3c49..e3b2477e0a7344 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-12-21 +date: 2023-12-22 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 8bb57fa2a8302c..89e43d011ad580 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 0a73e8c82489c9..21abb0c680ff27 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-12-21 +date: 2023-12-22 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 b3a4be7b334b7c..967bcac1dbb91f 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-12-21 +date: 2023-12-22 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 038d4faba2241f..4c17331e53a35f 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 a8061ccfe81f24..67f4eaa9072856 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 d30b04f051926c..129e716b310ac2 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index eb3833fa9b1e08..2cf47e4d6ae530 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-12-21 +date: 2023-12-22 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 51da2411721391..14e8a192349573 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 2c03e16d1fc510..82e7dc484d482e 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-12-21 +date: 2023-12-22 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 ba28fe3f7d2dc6..15d52426fb4106 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-12-21 +date: 2023-12-22 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 5709c448d789f2..bb9db8c3955485 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-12-21 +date: 2023-12-22 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 9a2940efe64f9a..a0fbad4c9f3831 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-12-21 +date: 2023-12-22 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 fcc8046d13a633..9dd408ae04b732 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 7c59a633a5dd47..80f255e05f2d22 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-12-21 +date: 2023-12-22 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 ceb9a840c2a625..aec67816b98f75 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-12-21 +date: 2023-12-22 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 b9411bcd7e437a..91c8c4e1b9a0af 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 61a90c02e971a1..59844e84d6ba54 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-12-21 +date: 2023-12-22 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 5d042ac9453c0d..d0c05b71a4ebb9 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-12-21 +date: 2023-12-22 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 8c83d7b479f284..8305de18748938 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index dafa7e902090fa..da635921795853 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-12-21 +date: 2023-12-22 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 38873e11feae91..337ffc839be742 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index b6adb6aa52c70d..d06f76a0f9ef38 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-12-21 +date: 2023-12-22 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 4634783a3495b0..2d09bfa55c05a3 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 855e9d75cb1472..fab964a0532048 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index a222ccab26b217..5b4925ec043d93 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 27f68438ecc484..2e64f0a66076ce 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index e51582dcdfc2e2..231cb6fa28b345 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-12-21 +date: 2023-12-22 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 26bd1db7ee89c4..a9fa5b5076f27b 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-12-21 +date: 2023-12-22 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 b8cba57bb09472..fa640cb01aee4d 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 30e320001d442f..fd2e7f9e93986e 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index c749f451f72644..9ebabf6d9866f9 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-12-21 +date: 2023-12-22 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 4764ff63f7c4d4..e1c8ef91135e07 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-12-21 +date: 2023-12-22 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 1b0ccd381712a2..905c287292f1d3 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-12-21 +date: 2023-12-22 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 2700f12fc973b1..153761a38bfdf8 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-12-21 +date: 2023-12-22 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 cef793436ec50b..c7d55ba40d8b75 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index fcac56c602b0e4..ca2c0f6143be7b 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 70ee024c368f18..92e1bffc82f39c 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-12-21 +date: 2023-12-22 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 900a4d6c7bce8a..d892f97529b62a 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-12-21 +date: 2023-12-22 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 98862238bb9097..547ba024933763 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-12-21 +date: 2023-12-22 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 819717c4d1ff90..3370cc57518c38 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-12-21 +date: 2023-12-22 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 65c46038f6aeb0..c6cb7073c859d7 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-12-21 +date: 2023-12-22 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 7390e6b1b8d428..fef2bfc2693e28 100644 --- a/api_docs/kbn_visualization_ui_components.devdocs.json +++ b/api_docs/kbn_visualization_ui_components.devdocs.json @@ -1945,39 +1945,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/visualization-ui-components", - "id": "def-public.TooltipWrapper", - "type": "Function", - "tags": [], - "label": "TooltipWrapper", - "description": [], - "signature": [ - "({ children, condition, tooltipContent, ...tooltipProps }: React.PropsWithChildren) => JSX.Element" - ], - "path": "packages/kbn-visualization-ui-components/components/tooltip_wrapper.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/visualization-ui-components", - "id": "def-public.TooltipWrapper.$1", - "type": "CompoundType", - "tags": [], - "label": "{\n children,\n condition,\n tooltipContent,\n ...tooltipProps\n}", - "description": [], - "signature": [ - "React.PropsWithChildren" - ], - "path": "packages/kbn-visualization-ui-components/components/tooltip_wrapper.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/visualization-ui-components", "id": "def-public.useDebouncedValue", diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index ed530e49d0d3c2..04af4ac3d0c9ba 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 154 | 0 | 151 | 3 | +| 152 | 0 | 149 | 3 | ## Client diff --git a/api_docs/kbn_visualization_utils.devdocs.json b/api_docs/kbn_visualization_utils.devdocs.json index d76530afc1e288..649bfd18f772ab 100644 --- a/api_docs/kbn_visualization_utils.devdocs.json +++ b/api_docs/kbn_visualization_utils.devdocs.json @@ -67,6 +67,39 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/visualization-utils", + "id": "def-common.TooltipWrapper", + "type": "Function", + "tags": [], + "label": "TooltipWrapper", + "description": [], + "signature": [ + "({ children, condition, tooltipContent, ...tooltipProps }: React.PropsWithChildren) => JSX.Element" + ], + "path": "packages/kbn-visualization-utils/src/tooltip_wrapper.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/visualization-utils", + "id": "def-common.TooltipWrapper.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n children,\n condition,\n tooltipContent,\n ...tooltipProps\n}", + "description": [], + "signature": [ + "React.PropsWithChildren" + ], + "path": "packages/kbn-visualization-utils/src/tooltip_wrapper.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [], diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 3050f707cb63b4..dc0d5cb4fc5535 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2 | 0 | 1 | 0 | +| 4 | 0 | 3 | 0 | ## Common diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 39f0156a7f3931..305e0f12b70c4e 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-12-21 +date: 2023-12-22 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 4f4441e0d5bcd6..8db7eb2fa794b4 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index e31e880f0303cc..ce08383caf11dd 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2023-12-21 +date: 2023-12-22 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 06bea3a9af2170..4ddd0b8f3b742b 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 193309dd1a10c8..14271d81ea4be9 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -3182,35 +3182,35 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/saved_objects.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/saved_objects.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/saved_objects.ts" + "path": "x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/saved_objects.ts" }, { "plugin": "securitySolution", @@ -3491,6 +3491,39 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.useDarkMode", + "type": "Function", + "tags": [], + "label": "useDarkMode", + "description": [], + "signature": [ + "(defaultValue?: boolean | undefined) => boolean" + ], + "path": "src/plugins/kibana_react/public/dark_mode/use_dark_mode.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "kibanaReact", + "id": "def-public.useDarkMode.$1", + "type": "CompoundType", + "tags": [], + "label": "defaultValue", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/kibana_react/public/dark_mode/use_dark_mode.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "kibanaReact", "id": "def-public.useExecutionContext", diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 3a736d65bad579..8c231df6323c3e 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.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 | |-------------------|-----------|------------------------|-----------------| -| 161 | 0 | 127 | 3 | +| 163 | 0 | 129 | 3 | ## Client diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 4fecd5e7d96e48..65fc88d9e16b17 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-12-21 +date: 2023-12-22 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 bcad5afe8964b7..0f579df94d0c8f 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-12-21 +date: 2023-12-22 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 43a45ad70fb15e..baef297e564498 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-12-21 +date: 2023-12-22 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 6a4c82b8a8794e..3da9361a4c785a 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-12-21 +date: 2023-12-22 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 c545d98dace7ca..c93b37536c8ba1 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-12-21 +date: 2023-12-22 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 5cdcdabe6ece99..14b7ee7b6c5c5b 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-12-21 +date: 2023-12-22 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 96287b83998f40..20285f441e6fcf 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: 2023-12-21 +date: 2023-12-22 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 c9858c1b336684..df7c23d2192c21 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index f7d80ed35744e9..1fd983ac3ed2ab 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 34f168ca6d1cdf..e43db323bc72e0 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-12-21 +date: 2023-12-22 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 fb75971d421803..eecf752d022122 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-12-21 +date: 2023-12-22 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 922773a9fa48e3..2469ccc7596517 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-12-21 +date: 2023-12-22 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 9759248cfe03ec..ef3712a07089d0 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-12-21 +date: 2023-12-22 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 9d4a25d840dfe1..3a41231e90ac81 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: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index 7006f03c266491..5bce2600d35f6c 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -2574,6 +2574,22 @@ "initialIsOpen": false } ], - "objects": [] + "objects": [ + { + "parentPluginId": "ml", + "id": "def-common.ML_ALERT_TYPES", + "type": "Object", + "tags": [], + "label": "ML_ALERT_TYPES", + "description": [], + "signature": [ + "{ readonly ANOMALY_DETECTION: \"xpack.ml.anomaly_detection_alert\"; readonly AD_JOBS_HEALTH: \"xpack.ml.anomaly_detection_jobs_health\"; }" + ], + "path": "x-pack/plugins/ml/common/constants/alerts.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ] } } \ No newline at end of file diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 39c8b7f0936bc0..c7d390bfa12ea0 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 150 | 3 | 64 | 33 | +| 151 | 3 | 65 | 33 | ## Client @@ -62,6 +62,9 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi ## Common +### Objects + + ### Functions diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index d50d6bd0f569e2..63ffa79a8d98c4 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: 2023-12-21 +date: 2023-12-22 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 e1e604ffd2fa3e..eebbef32efe94a 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-12-21 +date: 2023-12-22 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 49f02cdd7ef855..ac1aff11ff6b3a 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 2606500208d222..07700bcdf64453 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-12-21 +date: 2023-12-22 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 1a1a394eb8a864..400d230ed7bdc4 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-12-21 +date: 2023-12-22 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 1a945f3286452e..2a9b518bccbb3e 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-12-21 +date: 2023-12-22 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 511c367dfd527a..293b0e58322ae0 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-12-21 +date: 2023-12-22 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 deb64ecc9534ed..423280f403ac4c 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -14435,79 +14435,6 @@ } ] }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.profilingUseLegacyCo2Calculation", - "type": "Object", - "tags": [], - "label": "[profilingUseLegacyCo2Calculation]", - "description": [], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.profilingUseLegacyCo2Calculation.category", - "type": "Array", - "tags": [], - "label": "category", - "description": [], - "signature": [ - "string[]" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.profilingUseLegacyCo2Calculation.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.profilingUseLegacyCo2Calculation.value", - "type": "boolean", - "tags": [], - "label": "value", - "description": [], - "signature": [ - "false" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.profilingUseLegacyCo2Calculation.schema", - "type": "Object", - "tags": [], - "label": "schema", - "description": [], - "signature": [ - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - "" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, { "parentPluginId": "observability", "id": "def-server.uiSettings.profilingAWSCostDiscountRate", @@ -16196,21 +16123,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-common.profilingUseLegacyCo2Calculation", - "type": "string", - "tags": [], - "label": "profilingUseLegacyCo2Calculation", - "description": [], - "signature": [ - "\"observability:profilingUseLegacyCo2Calculation\"" - ], - "path": "x-pack/plugins/observability/common/ui_settings_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-common.ruleDetailsLocatorID", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 6d84e75abce28e..b147c10b8c87a6 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-12-21 +date: 2023-12-22 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 | |-------------------|-----------|------------------------|-----------------| -| 609 | 2 | 600 | 17 | +| 603 | 2 | 594 | 17 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index b877662dc6996e..6b17caa652cb64 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index aba2a4083a869d..5dcc4481ae575a 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 337c6c985de7c2..dab31df9f7f257 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 9961c7ee45b199..731be74cb2e765 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-12-21 +date: 2023-12-22 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 5901b5a78fe7ba..f35a869b128505 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-12-21 +date: 2023-12-22 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 76013e66cdf0e7..6fa1e15704e8a7 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-12-21 +date: 2023-12-22 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 4747b5e1d153cf..90f44afb4f312e 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 77945 | 234 | 66664 | 1633 | +| 77946 | 234 | 66665 | 1633 | ## Plugin Directory @@ -116,7 +116,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 123 | 2 | 96 | 4 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides UI and APIs for the interactive setup mode. | 28 | 0 | 18 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 161 | 0 | 127 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 163 | 0 | 129 | 3 | | kibanaUsageCollection | [@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) | - | 611 | 3 | 418 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | @@ -133,7 +133,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 260 | 0 | 259 | 28 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 60 | 0 | 60 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Exposes utilities for accessing metrics data | 104 | 8 | 104 | 7 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 150 | 3 | 64 | 33 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 151 | 3 | 65 | 33 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 25 | 0 | 19 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 15 | 3 | 13 | 1 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 9 | 0 | 9 | 0 | @@ -141,7 +141,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 609 | 2 | 600 | 17 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 603 | 2 | 594 | 17 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 75 | 0 | 73 | 13 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 18 | 0 | 18 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 14 | 0 | 14 | 0 | @@ -189,7 +189,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 240 | 1 | 196 | 17 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 592 | 1 | 566 | 58 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 595 | 1 | 569 | 58 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 135 | 0 | 93 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 212 | 0 | 145 | 11 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 10 | 0 | 7 | 2 | @@ -573,7 +573,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 2 | 8 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 2 | 0 | 1 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | -| | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 119 | 0 | 116 | 0 | +| | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 120 | 0 | 117 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 75 | 0 | 75 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2649 | 0 | 2649 | 0 | @@ -679,8 +679,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 16 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 24 | 0 | 14 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 154 | 0 | 151 | 3 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 2 | 0 | 1 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 152 | 0 | 149 | 3 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 4 | 0 | 3 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 13 | 0 | 13 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 2 | 0 | | | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 18 | 0 | 9 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index c5fcf6bfdcb845..28f210fe2b8e2b 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 316aac69a7a248..c1353b0f30b4a2 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-12-21 +date: 2023-12-22 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 db31aaa30770b5..3ee22f24192a58 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-12-21 +date: 2023-12-22 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 0c3a29e2f02922..9e4a4cb3b80e1d 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-12-21 +date: 2023-12-22 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 0e0f3fa5e0d8bf..831dffcc293d21 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-12-21 +date: 2023-12-22 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 6cd47a02f92ab7..2e832369da3c3d 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-12-21 +date: 2023-12-22 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 d7de2b78ab759f..12b717b1436ce3 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-12-21 +date: 2023-12-22 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 4e93860f6f085c..a114d2f14e382f 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index aadb38dd6a1124..e7a2de7bb02601 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index e00b28a628f23f..91db479ca910c5 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-12-21 +date: 2023-12-22 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 93157b055943f1..b2ded45c12f3fb 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-12-21 +date: 2023-12-22 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 28287a1053a899..cae0f7dda8a108 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-12-21 +date: 2023-12-22 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 7ddd453c5b9696..b5c9582279e05a 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-12-21 +date: 2023-12-22 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 4d2e24cbe2e679..e1cce405377548 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-12-21 +date: 2023-12-22 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 19dd5b85890a5f..cf1b7f7de337e4 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-12-21 +date: 2023-12-22 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 3e00d449b78b61..86ba37a57ea84e 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 0ede3f065f01e6..6144c2f5f9f86b 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-12-21 +date: 2023-12-22 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 90e9ace7ef4dd4..c22d74cdd9d0e8 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -114,7 +114,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantRagOnAlerts: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly alertSuppressionForThresholdRuleEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/plugin.tsx", "deprecated": false, @@ -568,7 +568,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"assistantRagOnAlerts\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"alertSuppressionForThresholdRuleEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | undefined" + "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -648,7 +648,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"assistantRagOnAlerts\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"alertSuppressionForThresholdRuleEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | undefined" + "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1913,7 +1913,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantRagOnAlerts: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly alertSuppressionForThresholdRuleEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3018,7 +3018,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantRagOnAlerts: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly alertSuppressionForThresholdRuleEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3194,7 +3194,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantRagOnAlerts: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly alertSuppressionForThresholdRuleEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3243,7 +3243,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 tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantRagOnAlerts: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly alertSuppressionForThresholdRuleEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" ], "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 c35d33c5a18303..189a7784a3174f 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-12-21 +date: 2023-12-22 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 0c8033309906aa..bfd2536e418869 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-12-21 +date: 2023-12-22 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 52d425948f887e..08f805175de7eb 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-12-21 +date: 2023-12-22 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 5a8d4beb657894..57b66e0b486cc8 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-12-21 +date: 2023-12-22 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 503bfed68c52f6..93eb5cc15402dc 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-12-21 +date: 2023-12-22 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 1b254a56e0845f..798f274d69f37b 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-12-21 +date: 2023-12-22 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 7df80b70f7d48b..ad823dad1f6bbe 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-12-21 +date: 2023-12-22 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 7df436cbd7e9f1..85658cea199377 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 65d446a3668992..10887a79951a8b 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-12-21 +date: 2023-12-22 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 3b217b70a5f84e..e8a511ae50d25f 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-12-21 +date: 2023-12-22 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 41fb5eba150b7e..c737cd5336e23c 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-12-21 +date: 2023-12-22 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 db49c370487ca5..cd27ded3c46f5a 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index ae1bc369776341..a6c2e53ea15bce 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-12-21 +date: 2023-12-22 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 bec624ee7bc0a1..753fcd38926ec7 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-12-21 +date: 2023-12-22 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 022872c85c626d..d9ae4f8c672b92 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index e89823beb2c2a8..86f1e74ab458ed 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 60093707708af5..633e612c8e969a 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 856b1a94c8e2a5..465197b2c7ff1c 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 5517b603b50168..98d0a30b57403b 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-12-21 +date: 2023-12-22 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 66a6f9bbf7318d..da99b908218abb 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-12-21 +date: 2023-12-22 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 aa7207521614e2..4d3664a40e6b47 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index fc734b95daecbc..999d1112edac7a 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -6474,7 +6474,7 @@ "label": "RuleCreationValidConsumer", "description": [], "signature": [ - "\"observability\" | \"stackAlerts\" | \"logs\" | \"infrastructure\"" + "\"observability\" | \"stackAlerts\" | \"alerts\" | \"logs\" | \"infrastructure\"" ], "path": "packages/kbn-rule-data-utils/src/rule_types/index.ts", "deprecated": false, @@ -9108,7 +9108,7 @@ "label": "buildAggregation", "description": [], "signature": [ - "({ timeSeries, aggType, aggField, termField, termSize, condition, topHitsSize, }: ", + "({ timeSeries, aggType, aggField, termField, termSize, sourceFieldsParams, condition, topHitsSize, }: ", { "pluginId": "triggersActionsUi", "scope": "common", @@ -9129,7 +9129,7 @@ "id": "def-common.buildAggregation.$1", "type": "Object", "tags": [], - "label": "{\n timeSeries,\n aggType,\n aggField,\n termField,\n termSize,\n condition,\n topHitsSize,\n}", + "label": "{\n timeSeries,\n aggType,\n aggField,\n termField,\n termSize,\n sourceFieldsParams,\n condition,\n topHitsSize,\n}", "description": [], "signature": [ { @@ -9392,7 +9392,7 @@ "label": "parseAggregationResults", "description": [], "signature": [ - "({ isCountAgg, isGroupAgg, esResult, resultLimit, }: ParseAggregationResultsOpts) => ", + "({ isCountAgg, isGroupAgg, esResult, resultLimit, sourceFieldsParams, generateSourceFieldsFromHits, }: ParseAggregationResultsOpts) => ", { "pluginId": "triggersActionsUi", "scope": "common", @@ -9410,7 +9410,7 @@ "id": "def-common.parseAggregationResults.$1", "type": "Object", "tags": [], - "label": "{\n isCountAgg,\n isGroupAgg,\n esResult,\n resultLimit,\n}", + "label": "{\n isCountAgg,\n isGroupAgg,\n esResult,\n resultLimit,\n sourceFieldsParams = [],\n generateSourceFieldsFromHits = false,\n}", "description": [], "signature": [ "ParseAggregationResultsOpts" @@ -9574,6 +9574,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-common.BuildAggregationOpts.sourceFieldsParams", + "type": "Array", + "tags": [], + "label": "sourceFieldsParams", + "description": [], + "signature": [ + "{ label: string; searchPath: string; }[] | undefined" + ], + "path": "x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "triggersActionsUi", "id": "def-common.BuildAggregationOpts.topHitsSize", @@ -9813,6 +9827,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-common.ParsedAggregationGroup.sourceFields", + "type": "Array", + "tags": [], + "label": "sourceFields", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "triggersActionsUi", "id": "def-common.ParsedAggregationGroup.value", @@ -10070,6 +10098,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-common.MAX_SOURCE_FIELDS_TO_COPY", + "type": "number", + "tags": [], + "label": "MAX_SOURCE_FIELDS_TO_COPY", + "description": [], + "signature": [ + "10" + ], + "path": "x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "triggersActionsUi", "id": "def-common.MetricResult", diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 382c520ca566a8..6d7a8bc88a161b 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 592 | 1 | 566 | 58 | +| 595 | 1 | 569 | 58 | ## Client diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 1cecdd6add6b23..1224f6383b4690 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-12-21 +date: 2023-12-22 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 f91f347581c573..876b0fc466deef 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-12-21 +date: 2023-12-22 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 a8145a03cb2165..70056b9b01ffd4 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-12-21 +date: 2023-12-22 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 0355b61632ed9d..6f7ec16cd0bdf3 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-12-21 +date: 2023-12-22 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 ca4811c5b7480f..5f6b58b96d2119 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-12-21 +date: 2023-12-22 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 7700de2fe347a1..35bf5267837ba4 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-12-21 +date: 2023-12-22 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 d217285af03b66..a11db9463ac0e3 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-12-21 +date: 2023-12-22 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 0795f1f3e7f2fa..cac2ac365d7192 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-12-21 +date: 2023-12-22 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 e354828fa73608..fdcb4c8d8bcf09 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-12-21 +date: 2023-12-22 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 54bbba1608ee52..87dc30d4380448 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-12-21 +date: 2023-12-22 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 99f394604f8443..2c1802606a6001 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-12-21 +date: 2023-12-22 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 f1397d08f3774e..bd301cf9f8d34c 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-12-21 +date: 2023-12-22 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 c27b5a2dbab324..3d80a2af2d473d 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-12-21 +date: 2023-12-22 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 82cc2e49381ae4..5934d52927063c 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-12-21 +date: 2023-12-22 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 a21e7b3b2317f6..fa4c8939f85ff4 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-12-21 +date: 2023-12-22 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 90492ffa341061..5bd87964f6fe56 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-12-21 +date: 2023-12-22 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 d9168065f45fd5..4af2533056b50c 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-12-21 +date: 2023-12-22 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 96ee0e109ece5b..69e5398f04e388 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-12-21 +date: 2023-12-22 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 71faad7c2dad5f..43ab98c7f847f9 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-12-21 +date: 2023-12-22 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 6f6eb2244bdce9..ff8bff54153cae 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-12-21 +date: 2023-12-22 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 71206e094e36fe..7b199a36b52fd8 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-12-21 +date: 2023-12-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/dev_docs/contributing/code_walkthrough.mdx b/dev_docs/contributing/code_walkthrough.mdx index 139ac4df930701..b3144bf0f5e7a4 100644 --- a/dev_docs/contributing/code_walkthrough.mdx +++ b/dev_docs/contributing/code_walkthrough.mdx @@ -15,9 +15,6 @@ Tip: Look for a `README.md` in a folder to learn about its contents. Managed by the operations team to set up a new buildkite ci system. Can be ignored by folks outside the Operations team. -## [.ci](https://github.com/elastic/kibana/tree/main/.ci) - -Managed by the operations team to contain Jenkins settings. Can be ignored by folks outside the Operations team. ## [.github](https://github.com/elastic/kibana/tree/main/.github) diff --git a/docs/developer/contributing/development-functional-tests.asciidoc b/docs/developer/contributing/development-functional-tests.asciidoc index d149372f0f5720..9dcb9785cf045d 100644 --- a/docs/developer/contributing/development-functional-tests.asciidoc +++ b/docs/developer/contributing/development-functional-tests.asciidoc @@ -81,11 +81,12 @@ export TEST_BROWSER_HEADLESS=1 export TEST_THROTTLE_NETWORK=1 ---------- -** When running against a Cloud deployment, some tests are not applicable. To skip tests that do not apply, use --exclude-tag. An example shell file can be found at: {kibana-blob}test/scripts/jenkins_cloud.sh[test/scripts/jenkins_cloud.sh] +** When running against a Cloud deployment, some tests are not applicable. To skip tests that do not apply, use --exclude-tag. + ["source", "shell"] ---------- node scripts/functional_test_runner --exclude-tag skipCloud +node scripts/functional_test_runner --exclude-tag skipMKI ---------- [discrete] diff --git a/docs/developer/contributing/pr-review.asciidoc b/docs/developer/contributing/pr-review.asciidoc index 95f012d569c3a5..7f47af51ef51a0 100644 --- a/docs/developer/contributing/pr-review.asciidoc +++ b/docs/developer/contributing/pr-review.asciidoc @@ -118,7 +118,7 @@ Inflammatory feedback such as "this is crap" isn't feedback at all. It's both me Establishing a comprehensive checklist for all of the things that should happen in all possible pull requests is impractical, but that doesn't mean we lack a concrete set of minimum requirements that we can enumerate. The following items should be double checked for any pull request: * CLA check passes -* Jenkins job runs and passes +* CI job runs and passes * Adheres to the spirit of our various styleguides * Has thorough unit test coverage * Automated tests provide high confidence the change continues to work without manual verification diff --git a/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc b/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc index 9e457ee409f4b0..d62ccebb05657f 100644 --- a/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc +++ b/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc @@ -11,7 +11,7 @@ This guide introduces you to three of {kib}'s security features: spaces, roles, [float] === Spaces -Do you have multiple teams or tenants using {kib}? Do you want a “playground” to experiment with new visualizations or rules? If so, then <> can help. +Do you have multiple teams using {kib}? Do you want a “playground” to experiment with new visualizations or rules? If so, then <> can help. Think of a space as another instance of {kib}. A space allows you to organize your <>, <>, <>, and much more into their own categories. For example, you might have a Marketing space for your marketeers to track the results of their campaigns, and an Engineering space for your developers to {apm-guide-ref}/apm-overview.html[monitor application performance]. diff --git a/kbn_pm/src/lib/bazel.mjs b/kbn_pm/src/lib/bazel.mjs index 022447ded129c1..2ec27b359f1533 100644 --- a/kbn_pm/src/lib/bazel.mjs +++ b/kbn_pm/src/lib/bazel.mjs @@ -150,6 +150,8 @@ export async function installYarnDeps(log, opts = undefined) { offline: opts?.offline, quiet: opts?.quiet, env: { + SASS_BINARY_SITE: + 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-sass', RE2_DOWNLOAD_MIRROR: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2', }, diff --git a/package.json b/package.json index 972f7df2bc0f7c..998d54ad9eb79a 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "@dnd-kit/utilities": "^2.0.0", "@elastic/apm-rum": "^5.15.0", "@elastic/apm-rum-react": "^2.0.1", - "@elastic/charts": "61.0.3", + "@elastic/charts": "61.2.0", "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.9.1-canary.1", "@elastic/ems-client": "8.5.1", @@ -1597,6 +1597,7 @@ "mutation-observer": "^1.0.3", "native-hdr-histogram": "^1.0.0", "nock": "12.0.3", + "node-sass": "^8.0.0", "null-loader": "^3.0.0", "nyc": "^15.1.0", "oboe": "^2.1.4", @@ -1624,8 +1625,7 @@ "regenerate": "^1.4.0", "resolve": "^1.22.0", "rxjs-marbles": "^7.0.1", - "sass-embedded": "^1.69.5", - "sass-loader": "^10.5.0", + "sass-loader": "^10.4.1", "selenium-webdriver": "^4.16.0", "simple-git": "^3.16.0", "sinon": "^7.4.2", diff --git a/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts b/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts index 5b79568cb485bf..1d141def7f5114 100644 --- a/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts +++ b/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts @@ -131,6 +131,7 @@ const SecurityAlertOptional = rt.partial({ 'kibana.alert.flapping_history': schemaBooleanArray, 'kibana.alert.group.id': schemaString, 'kibana.alert.group.index': schemaNumber, + 'kibana.alert.host.criticality_level': schemaString, 'kibana.alert.last_detected': schemaDate, 'kibana.alert.maintenance_window_ids': schemaStringArray, 'kibana.alert.new_terms': schemaStringArray, @@ -193,6 +194,7 @@ const SecurityAlertOptional = rt.partial({ ), 'kibana.alert.time_range': schemaDateRange, 'kibana.alert.url': schemaString, + 'kibana.alert.user.criticality_level': schemaString, 'kibana.alert.workflow_assignee_ids': schemaStringArray, 'kibana.alert.workflow_reason': schemaString, 'kibana.alert.workflow_status': schemaString, diff --git a/packages/kbn-dom-drag-drop/src/sass/drag_drop.scss b/packages/kbn-dom-drag-drop/src/sass/drag_drop.scss index c68ae0c0d6f1e0..c26bb6c49b6cff 100644 --- a/packages/kbn-dom-drag-drop/src/sass/drag_drop.scss +++ b/packages/kbn-dom-drag-drop/src/sass/drag_drop.scss @@ -99,7 +99,7 @@ $reorderItemMargin: $euiSizeS; position: absolute; width: 100%; top: 0; - height: calc(100% + #{calc($reorderItemMargin / 2)}); + height: calc(100% + #{$reorderItemMargin / 2}); } .domDragDrop-translatableDrop { 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 28314f7f08bf20..c5132cc1fd146d 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 @@ -69,6 +69,7 @@ export const GuideFilters = ({ @@ -82,6 +83,7 @@ export const GuideFilters = ({ @@ -95,6 +97,7 @@ export const GuideFilters = ({ diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_tokens_provider.ts b/packages/kbn-monaco/src/esql/lib/monaco/esql_tokens_provider.ts index aa0234c155c336..ce521d1c9dfac2 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_tokens_provider.ts +++ b/packages/kbn-monaco/src/esql/lib/monaco/esql_tokens_provider.ts @@ -57,7 +57,12 @@ export class ESQLTokensProvider implements monaco.languages.TokensProvider { const tokenTypeName = lexer.vocabulary.getSymbolicName(token.type); if (tokenTypeName) { - const myToken = new ESQLToken(tokenTypeName, token.startIndex, token.stopIndex); + const indexOffset = cleanedLine === line ? 0 : line.length - cleanedLine.length; + const myToken = new ESQLToken( + tokenTypeName, + token.startIndex + indexOffset, + token.stopIndex + indexOffset + ); myTokens.push(myToken); } } diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index 7b4a5b27b78c7a..189ca29072afe6 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -185,12 +185,12 @@ export function getWebpackConfig( ) )};\n${content}`; }, - implementation: require('sass-embedded'), + webpackImporter: false, + implementation: require('node-sass'), sassOptions: { - outputStyle: worker.dist ? 'compressed' : 'expanded', + outputStyle: worker.dist ? 'compressed' : 'nested', includePaths: [Path.resolve(worker.repoRoot, 'node_modules')], - sourceMap: true, - quietDeps: true, + sourceMapRoot: `/${bundle.type}:${bundle.id}`, }, }, }, diff --git a/packages/kbn-rule-data-utils/src/rule_types/index.ts b/packages/kbn-rule-data-utils/src/rule_types/index.ts index 6a716a5163dee2..e41ef872848159 100644 --- a/packages/kbn-rule-data-utils/src/rule_types/index.ts +++ b/packages/kbn-rule-data-utils/src/rule_types/index.ts @@ -15,4 +15,5 @@ export type RuleCreationValidConsumer = | typeof AlertConsumers.LOGS | typeof AlertConsumers.INFRASTRUCTURE | typeof AlertConsumers.OBSERVABILITY - | typeof STACK_ALERTS_FEATURE_ID; + | typeof STACK_ALERTS_FEATURE_ID + | 'alerts'; diff --git a/packages/kbn-rule-data-utils/src/rule_types/stack_rules.ts b/packages/kbn-rule-data-utils/src/rule_types/stack_rules.ts index ff426a9069537b..a2bf086d954a60 100644 --- a/packages/kbn-rule-data-utils/src/rule_types/stack_rules.ts +++ b/packages/kbn-rule-data-utils/src/rule_types/stack_rules.ts @@ -8,3 +8,4 @@ export const STACK_ALERTS_FEATURE_ID = 'stackAlerts'; export const ES_QUERY_ID = '.es-query'; +export const ML_ANOMALY_DETECTION_RULE_TYPE_ID = 'xpack.ml.anomaly_detection_alert'; diff --git a/packages/kbn-storybook/src/webpack.config.ts b/packages/kbn-storybook/src/webpack.config.ts index 282a41dcbd4532..35bda9718d7cb6 100644 --- a/packages/kbn-storybook/src/webpack.config.ts +++ b/packages/kbn-storybook/src/webpack.config.ts @@ -115,10 +115,9 @@ export default ({ config: storybookConfig }: { config: Configuration }) => { resolve(REPO_ROOT, 'src/core/public/styles/core_app/_globals_v8light.scss') )};\n${content}`; }, - implementation: require('sass-embedded'), + implementation: require('node-sass'), sassOptions: { includePaths: [resolve(REPO_ROOT, 'node_modules')], - quietDeps: true, }, }, }, diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss index 08402941bf74b5..48fb44f1663e37 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss @@ -53,7 +53,7 @@ .unifiedFieldListSidebar .unifiedFieldListItemButton { &.kbnFieldButton { - margin-bottom: calc($euiSizeXS / 2); + margin-bottom: $euiSizeXS / 2; } &.domDragDrop-isDraggable { diff --git a/renovate.json b/renovate.json index 7fb5b9020388c4..4a725ce80a5f5d 100644 --- a/renovate.json +++ b/renovate.json @@ -362,7 +362,7 @@ { "groupName": "scss", "packageNames": [ - "sass-embedded" + "node-sass" ], "reviewers": [ "team:kibana-operations" @@ -673,4 +673,4 @@ "enabled": true } ] -} +} \ No newline at end of file diff --git a/src/dev/build/tasks/install_dependencies_task.ts b/src/dev/build/tasks/install_dependencies_task.ts index 0eebadec5ca791..59c9e389112435 100644 --- a/src/dev/build/tasks/install_dependencies_task.ts +++ b/src/dev/build/tasks/install_dependencies_task.ts @@ -32,6 +32,8 @@ export const InstallDependencies: Task = { { cwd: build.resolvePath(), env: { + SASS_BINARY_SITE: + 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-sass', RE2_DOWNLOAD_MIRROR: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2', }, diff --git a/src/dev/ci_setup/checkout_sibling_es.sh b/src/dev/ci_setup/checkout_sibling_es.sh deleted file mode 100755 index 3832ec9b4076a7..00000000000000 --- a/src/dev/ci_setup/checkout_sibling_es.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash - -set -e - -function checkout_sibling { - project=$1 - targetDir=$2 - useExistingParamName=$3 - useExisting="$(eval "echo "\$$useExistingParamName"")" - repoAddress="https://github.com/" - - if [ -z ${useExisting:+x} ]; then - if [ -d "$targetDir" ]; then - echo "I expected a clean workspace but an '${project}' sibling directory already exists in [$WORKSPACE]!" - echo - echo "Either define '${useExistingParamName}' or remove the existing '${project}' sibling." - exit 1 - fi - - # read by clone_target_is_valid, and checkout_clone_target populated by pick_clone_target - cloneAuthor="" - cloneBranch="" - - function clone_target_is_valid { - - echo " -> checking for '${cloneBranch}' branch at ${cloneAuthor}/${project}" - if [[ -n "$(git ls-remote --heads "${repoAddress}${cloneAuthor}/${project}.git" ${cloneBranch} 2>/dev/null)" ]]; then - return 0 - else - return 1 - fi - } - - function pick_clone_target { - echo "To develop Kibana features against a specific branch of ${project} and being able to" - echo "test that feature also on CI, the CI is trying to find branches on ${project} with the same name as" - echo "the Kibana branch (first on your fork and then upstream) before building from master." - echo "picking which branch of ${project} to clone:" - if [[ -n "$PR_AUTHOR" && -n "$PR_SOURCE_BRANCH" ]]; then - cloneAuthor="$PR_AUTHOR" - cloneBranch="$PR_SOURCE_BRANCH" - if clone_target_is_valid ; then - return 0 - fi - fi - - cloneAuthor="elastic" - cloneBranch="$GIT_BRANCH" - if clone_target_is_valid ; then - return 0 - fi - - cloneBranch="${PR_TARGET_BRANCH:-$KIBANA_PKG_BRANCH}" - if clone_target_is_valid ; then - return 0 - fi - - cloneBranch="$KIBANA_PKG_BRANCH" - if clone_target_is_valid; then - return 0 - fi - - echo "failed to find a valid branch to clone" - return 1 - } - - function checkout_clone_target { - pick_clone_target - - if [[ "$cloneAuthor/$cloneBranch" != "elastic/$KIBANA_PKG_BRANCH" ]]; then - echo " -> Setting TEST_ES_FROM=source so that ES in tests will be built from $cloneAuthor/$cloneBranch" - export TEST_ES_FROM=source - fi - - echo " -> checking out '${cloneBranch}' branch from ${cloneAuthor}/${project}..." - git clone -b "$cloneBranch" "${repoAddress}${cloneAuthor}/${project}.git" "$targetDir" --depth=1 - echo " -> checked out ${project} revision: $(git -C "${targetDir}" rev-parse HEAD)" - echo - } - - checkout_clone_target - else - if [ -d "$targetDir" ]; then - echo "Using existing '${project}' checkout" - else - echo "You have defined '${useExistingParamName}' but no existing ${targetDir} directory exists!" - exit 2 - fi - fi -} - -checkout_sibling "elasticsearch" "${WORKSPACE}/elasticsearch" "USE_EXISTING_ES" -export TEST_ES_FROM=${TEST_ES_FROM:-snapshot} - -# Set the JAVA_HOME based on the Java property file in the ES repo -# This assumes the naming convention used on CI (ex: ~/.java/java10) -ES_DIR="$WORKSPACE/elasticsearch" -ES_JAVA_PROP_PATH=$ES_DIR/.ci/java-versions.properties - - -if [ ! -f "$ES_JAVA_PROP_PATH" ]; then - echo "Unable to set JAVA_HOME, $ES_JAVA_PROP_PATH does not exist" - exit 1 -fi - -# While sourcing the property file would currently work, we want -# to support the case where whitespace surrounds the equals. -# This has the added benefit of explicitly exporting property values -ES_BUILD_JAVA="$(grep "^ES_BUILD_JAVA" "$ES_JAVA_PROP_PATH" | cut -d'=' -f2 | tr -d '[:space:]')" -export ES_BUILD_JAVA - -if [ -z "$ES_BUILD_JAVA" ]; then - echo "Unable to set JAVA_HOME, ES_BUILD_JAVA not present in $ES_JAVA_PROP_PATH" - exit 1 -fi - -echo "Setting JAVA_HOME=$HOME/.java/$ES_BUILD_JAVA" -export JAVA_HOME=$HOME/.java/$ES_BUILD_JAVA diff --git a/src/dev/ci_setup/extract_bootstrap_cache.sh b/src/dev/ci_setup/extract_bootstrap_cache.sh deleted file mode 100755 index fdd8bb6b904060..00000000000000 --- a/src/dev/ci_setup/extract_bootstrap_cache.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -set -e - -targetBranch="${PR_TARGET_BRANCH:-$GIT_BRANCH}" -bootstrapCache="$HOME/.kibana/bootstrap_cache/$targetBranch.tar" - -### -### Extract the bootstrap cache that we create in the packer_cache.sh script -### -if [ -f "$bootstrapCache" ]; then - echo "extracting bootstrap_cache from $bootstrapCache"; - tar -xf "$bootstrapCache"; -else - branchBootstrapCache="$HOME/.kibana/bootstrap_cache/$(jq -r .branch package.json).tar" - - if [ -f "$branchBootstrapCache" ]; then - echo "extracting bootstrap_cache from $branchBootstrapCache"; - tar -xf "$branchBootstrapCache"; - else - echo "" - echo "" - echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - echo " bootstrap_cache missing"; - echo " looked for '$bootstrapCache'"; - echo " and '$branchBootstrapCache'"; - echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - echo "" - echo "" - fi -fi diff --git a/src/dev/ci_setup/get_percy_env.js b/src/dev/ci_setup/get_percy_env.js deleted file mode 100644 index a4a247d2527c36..00000000000000 --- a/src/dev/ci_setup/get_percy_env.js +++ /dev/null @@ -1,45 +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 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -const execa = require('execa'); -const pkg = require('../../../package.json'); - -const { stdout: commit } = execa.sync('git', ['rev-parse', 'HEAD']); -const shortCommit = commit.slice(0, 8); - -const isPr = !!process.env.ghprbPullId; -if (isPr && !(process.env.PR_TARGET_BRANCH && process.env.PR_SOURCE_BRANCH)) { - throw new Error( - 'getPercyEnv: Unable to determine percy environment in prs without [PR_TARGET_BRANCH] and [PR_SOURCE_BRANCH] environment variables' - ); -} - -let branch; -if (isPr) { - branch = process.env.PR_SOURCE_BRANCH; -} else { - if (!process.env.branch_specifier) { - throw new Error('getPercyEnv: [branch_specifier] environment variable required'); - } - - branch = process.env.branch_specifier.split('refs/heads/')[1]; - - if (!branch) { - throw new Error( - `getPercyEnv: [branch_specifier=${process.env.branch_specifier}] must start with 'refs/heads/'` - ); - } -} - -console.log(`export PERCY_PARALLEL_TOTAL=2;`); -console.log( - `export PERCY_PARALLEL_NONCE="${shortCommit}/${isPr ? 'PR' : branch}/${process.env.BUILD_ID}";` -); -console.log(`export PERCY_BRANCH="${branch}";`); -// percy snapshots always target pkg.branch, so that feature branches can be based on master/7.x/etc. -console.log(`export PERCY_TARGET_BRANCH="${isPr ? process.env.PR_TARGET_BRANCH : pkg.branch}";`); diff --git a/src/dev/ci_setup/load_env_keys.sh b/src/dev/ci_setup/load_env_keys.sh deleted file mode 100644 index 62d29db232eae9..00000000000000 --- a/src/dev/ci_setup/load_env_keys.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [ -z "$VAULT_SECRET_ID" ]; then - if [ -n "$GITHUB_TOKEN" ] && [ -n "$KIBANA_CI_REPORTER_KEY" ] && [ -n "$PERCY_TOKEN" ]; then - echo " -- secrets already loaded from vault"; - else - echo "" - echo "" - echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - echo " VAULT_SECRET_ID not set, not loading tokens into env"; - echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - echo "" - echo "" - fi -else - # load shared helpers to get `retry` function - source /usr/local/bin/bash_standard_lib.sh - - set +x - - # export after define to avoid https://github.com/koalaman/shellcheck/wiki/SC2155 - VAULT_TOKEN=$(retry 5 vault write -field=token auth/approle/login role_id="$VAULT_ROLE_ID" secret_id="$VAULT_SECRET_ID") - export VAULT_TOKEN - - # Set GITHUB_TOKEN for reporting test failures - GITHUB_TOKEN=$(retry 5 vault read -field=github_token secret/kibana-issues/dev/kibanamachine) - export GITHUB_TOKEN - - KIBANA_CI_REPORTER_KEY=$(retry 5 vault read -field=value secret/kibana-issues/dev/kibanamachine-reporter) - export KIBANA_CI_REPORTER_KEY - - PERCY_TOKEN=$(retry 5 vault read -field=value secret/kibana-issues/dev/percy) - export PERCY_TOKEN - - # remove vault related secrets - unset VAULT_ROLE_ID VAULT_SECRET_ID VAULT_TOKEN VAULT_ADDR -fi diff --git a/src/dev/ci_setup/setup.sh b/src/dev/ci_setup/setup.sh deleted file mode 100755 index aeb0ba75a90522..00000000000000 --- a/src/dev/ci_setup/setup.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash - -set -e - -source src/dev/ci_setup/setup_env.sh true - -echo " -- KIBANA_DIR='$KIBANA_DIR'" -echo " -- XPACK_DIR='$XPACK_DIR'" -echo " -- PARENT_DIR='$PARENT_DIR'" -echo " -- KIBANA_PKG_BRANCH='$KIBANA_PKG_BRANCH'" -echo " -- TEST_ES_SNAPSHOT_VERSION='$TEST_ES_SNAPSHOT_VERSION'" - -### -### install dependencies -### -echo " -- installing node.js dependencies" -yarn kbn bootstrap --verbose - -### -### Download es snapshots -### -echo " -- downloading es snapshot" -node scripts/es snapshot --download-only; - -### -### verify no git modifications caused by bootstrap -### -if [[ "$DISABLE_BOOTSTRAP_VALIDATION" != "true" ]]; then - GIT_CHANGES="$(git ls-files --modified)" - if [ "$GIT_CHANGES" ]; then - echo -e "\n${RED}ERROR: 'yarn kbn bootstrap' caused changes to the following files:${C_RESET}\n" - echo -e "$GIT_CHANGES\n" - exit 1 - fi -fi diff --git a/src/dev/ci_setup/setup_env.sh b/src/dev/ci_setup/setup_env.sh deleted file mode 100644 index c1942775c88b54..00000000000000 --- a/src/dev/ci_setup/setup_env.sh +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [[ "$CI_ENV_SETUP" ]]; then - return 0 -fi - -installNode=$1 - -dir="$(pwd)" -cacheDir="$HOME/.kibana" - -RED='\033[0;31m' -C_RESET='\033[0m' # Reset color - -export NODE_OPTIONS="$NODE_OPTIONS --max-old-space-size=4096" - -### -### Since the Jenkins logging output collector doesn't look like a TTY -### Node/Chalk and other color libs disable their color output. But Jenkins -### can handle color fine, so this forces https://github.com/chalk/supports-color -### to enable color support in Chalk and other related modules. -### -export FORCE_COLOR=1 - -### APM tracking -### -export ELASTIC_APM_ENVIRONMENT=ci - -### -### check that we seem to be in a kibana project -### -if [ -f "$dir/package.json" ] && [ -f "$dir/.node-version" ]; then - echo "Setting up node.js and yarn in $dir" -else - echo "${RED}src/dev/ci_setup/setup.sh must be run within a kibana repo${C_RESET}" - exit 1 -fi - - -export KIBANA_DIR="$dir" -export XPACK_DIR="$KIBANA_DIR/x-pack" - -parentDir="$(cd "$KIBANA_DIR/.."; pwd)" -export PARENT_DIR="$parentDir" - -kbnBranch="$(jq -r .branch "$KIBANA_DIR/package.json")" -export KIBANA_PKG_BRANCH="$kbnBranch" - -export WORKSPACE="${WORKSPACE:-$PARENT_DIR}" - -### -### download node -### -nodeVersion="$(cat "$dir/.node-version")" -nodeDir="$cacheDir/node/$nodeVersion" -nodeBin="$nodeDir/bin" -hostArch="$(command uname -m)" -case "${hostArch}" in - x86_64 | amd64) nodeArch="x64" ;; - aarch64) nodeArch="arm64" ;; - *) nodeArch="${hostArch}" ;; -esac -classifier="$nodeArch.tar.gz" - -UNAME=$(uname) -OS="linux" -if [[ "$UNAME" = *"MINGW64_NT"* ]]; then - OS="win" - nodeBin="$HOME/node" - classifier="x64.zip" -elif [[ "$UNAME" == "Darwin" ]]; then - OS="darwin" -fi -echo " -- Running on OS: $OS" - -nodeUrl="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v$nodeVersion/node-v$nodeVersion-${OS}-${classifier}" - -if [[ "$installNode" == "true" ]]; then - echo " -- node: version=v${nodeVersion} dir=$nodeDir" - - echo " -- setting up node.js" - if [ -x "$nodeBin/node" ] && [ "$("$nodeBin/node" --version)" == "v$nodeVersion" ]; then - echo " -- reusing node.js install" - else - if [ -d "$nodeDir" ]; then - echo " -- clearing previous node.js install" - rm -rf "$nodeDir" - fi - - echo " -- downloading node.js from $nodeUrl" - mkdir -p "$nodeDir" - if [[ "$OS" == "win" ]]; then - nodePkg="$nodeDir/${nodeUrl##*/}" - curl --silent -L -o "$nodePkg" "$nodeUrl" - unzip -qo "$nodePkg" -d "$nodeDir" - mv "${nodePkg%.*}" "$nodeBin" - else - curl --silent -L "$nodeUrl" | tar -xz -C "$nodeDir" --strip-components=1 - fi - fi -fi - -### -### "install" node into this shell -### -export PATH="$nodeBin:$PATH" - -if [[ "$installNode" == "true" || ! $(which yarn) ]]; then - ### - ### downloading yarn - ### - yarnVersion="$(node -e "console.log(String(require('./package.json').engines.yarn || '').replace(/^[^\d]+/,''))")" - npm install -g "yarn@^${yarnVersion}" -fi - -### -### setup yarn offline cache -### -yarn config set yarn-offline-mirror "$cacheDir/yarn-offline-cache" - -### -### "install" yarn into this shell -### -yarnGlobalDir="$(yarn global bin)" -export PATH="$PATH:$yarnGlobalDir" - -# use a proxy to fetch chromedriver/geckodriver asset -export GECKODRIVER_CDNURL="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache" -export CHROMEDRIVER_CDNURL="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache" -export CHROMEDRIVER_CDNBINARIESURL="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache" -export RE2_DOWNLOAD_MIRROR="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache" -export SASS_BINARY_SITE="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-sass" -export CYPRESS_DOWNLOAD_MIRROR="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/cypress" - -export CHECKS_REPORTER_ACTIVE=false - -# This is mainly for release-manager builds, which run in an environment that doesn't have Chrome installed -if [[ "$(which google-chrome-stable)" || "$(which google-chrome)" ]]; then - echo "Chrome detected, setting DETECT_CHROMEDRIVER_VERSION=true" - export DETECT_CHROMEDRIVER_VERSION=true - export CHROMEDRIVER_FORCE_DOWNLOAD=true -else - echo "Chrome not detected, installing default chromedriver binary for the package version" -fi - -### only run on pr jobs for elastic/kibana, checks-reporter doesn't work for other repos -if [[ "$ghprbPullId" && "$ghprbGhRepository" == 'elastic/kibana' ]] ; then - export CHECKS_REPORTER_ACTIVE=true -fi - - -source "$KIBANA_DIR/src/dev/ci_setup/load_env_keys.sh" - -ES_DIR="$WORKSPACE/elasticsearch" -ES_JAVA_PROP_PATH=$ES_DIR/.ci/java-versions.properties - -if [[ -d "$ES_DIR" && -f "$ES_JAVA_PROP_PATH" ]]; then - ES_BUILD_JAVA="$(grep "^ES_BUILD_JAVA" "$ES_JAVA_PROP_PATH" | cut -d'=' -f2 | tr -d '[:space:]')" - export ES_BUILD_JAVA - - if [ -z "$ES_BUILD_JAVA" ]; then - echo "Unable to set JAVA_HOME, ES_BUILD_JAVA not present in $ES_JAVA_PROP_PATH" - exit 1 - fi - - echo "Setting JAVA_HOME=$HOME/.java/$ES_BUILD_JAVA" - export JAVA_HOME=$HOME/.java/$ES_BUILD_JAVA -fi - -export CI_ENV_SETUP=true diff --git a/src/dev/ci_setup/setup_percy.sh b/src/dev/ci_setup/setup_percy.sh deleted file mode 100755 index ed6a15d056fe5a..00000000000000 --- a/src/dev/ci_setup/setup_percy.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -set -e - -### -### skip chomium download, use the system chrome install -### -export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true -PUPPETEER_EXECUTABLE_PATH="$(command -v google-chrome-stable)" -export PUPPETEER_EXECUTABLE_PATH - -### -### Set Percy parallel build support environment vars -### -eval "$(node ./src/dev/ci_setup/get_percy_env)" -echo " -- PERCY_PARALLEL_NONCE='$PERCY_PARALLEL_NONCE'" -echo " -- PERCY_PARALLEL_TOTAL='$PERCY_PARALLEL_TOTAL'" -echo " -- PERCY_BRANCH='$PERCY_BRANCH'" -echo " -- PERCY_TARGET_BRANCH='$PERCY_TARGET_BRANCH'" diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 6ba5deb6408acc..b0919d0ab61415 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -88,5 +88,4 @@ export const LICENSE_OVERRIDES = { '@elastic/eui@91.0.0-backport.0': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary - '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) }; diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index acf4748055589a..d7376a81d4525b 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -37,7 +37,6 @@ export const IGNORE_FILE_GLOBS = [ 'packages/core/apps/core-apps-server-internal/assets/fonts/**/*', 'src/dev/code_coverage/ingest_coverage/integration_tests/mocks/**/*', 'packages/kbn-utility-types/test-d/**/*', - '**/Jenkinsfile*', 'Dockerfile*', 'vars/*', '.ci/pipeline-library/**/*', diff --git a/src/dev/storybook/aliases.ts b/src/dev/storybook/aliases.ts index 88d8c04b42337b..97990be32aa893 100644 --- a/src/dev/storybook/aliases.ts +++ b/src/dev/storybook/aliases.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -// Please also add new aliases to test/scripts/jenkins_storybook.sh +// Please also add new aliases to .buildkite/scripts/steps/storybooks/build_and_upload.ts // // If you wish for your Storybook to be built and included in CI, also add your // alias to .buildkite/scripts/steps/storybooks/build_and_upload.ts diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap index afd6ce21ad36f7..f797f9ba344e07 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap @@ -191,6 +191,19 @@ exports[`GaugeComponent renders the chart 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -510,7 +523,7 @@ exports[`GaugeComponent renders the chart 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap index 241e2ac6f4fafa..f7c57d6e765df0 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap @@ -421,6 +421,19 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -740,7 +753,7 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -1324,6 +1337,19 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -1643,7 +1669,7 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -2287,6 +2313,19 @@ exports[`PartitionVisComponent should render correct structure for multi-metric "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -2606,7 +2645,7 @@ exports[`PartitionVisComponent should render correct structure for multi-metric "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -3252,6 +3291,19 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -3571,7 +3623,7 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -4155,6 +4207,19 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -4474,7 +4539,7 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -5013,6 +5078,19 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -5332,7 +5410,7 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } diff --git a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap index 7f5aeab32335a7..267833cba170dd 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap @@ -763,6 +763,19 @@ exports[`XYChart component it renders area 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -1082,7 +1095,7 @@ exports[`XYChart component it renders area 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -2286,6 +2299,19 @@ exports[`XYChart component it renders bar 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -2605,7 +2631,7 @@ exports[`XYChart component it renders bar 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -3809,6 +3835,19 @@ exports[`XYChart component it renders horizontal bar 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -4128,7 +4167,7 @@ exports[`XYChart component it renders horizontal bar 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -5332,6 +5371,19 @@ exports[`XYChart component it renders line 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -5651,7 +5703,7 @@ exports[`XYChart component it renders line 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -6855,6 +6907,19 @@ exports[`XYChart component it renders stacked area 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -7174,7 +7239,7 @@ exports[`XYChart component it renders stacked area 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -8378,6 +8443,19 @@ exports[`XYChart component it renders stacked bar 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -8697,7 +8775,7 @@ exports[`XYChart component it renders stacked bar 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -9901,6 +9979,19 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -10220,7 +10311,7 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -11454,6 +11545,19 @@ exports[`XYChart component split chart should render split chart if both, splitR "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -11773,7 +11877,7 @@ exports[`XYChart component split chart should render split chart if both, splitR "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -13215,6 +13319,19 @@ exports[`XYChart component split chart should render split chart if splitColumnA "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -13534,7 +13651,7 @@ exports[`XYChart component split chart should render split chart if splitColumnA "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } @@ -14969,6 +15086,19 @@ exports[`XYChart component split chart should render split chart if splitRowAcce "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -15288,7 +15418,7 @@ exports[`XYChart component split chart should render split chart if splitRowAcce "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } diff --git a/src/plugins/console/public/styles/_app.scss b/src/plugins/console/public/styles/_app.scss index 2f4340f1de0ab1..9cbe6437220477 100644 --- a/src/plugins/console/public/styles/_app.scss +++ b/src/plugins/console/public/styles/_app.scss @@ -42,7 +42,7 @@ padding: 0 $euiSizeS; display: inline-block; text-decoration: none; - border-radius: calc($euiBorderRadius / 2); + border-radius: $euiBorderRadius / 2; white-space: nowrap; vertical-align: middle; cursor: default; diff --git a/src/plugins/controls/public/options_list/components/options_list.scss b/src/plugins/controls/public/options_list/components/options_list.scss index e0c749441ff6af..ff4014d0cc41d5 100644 --- a/src/plugins/controls/public/options_list/components/options_list.scss +++ b/src/plugins/controls/public/options_list/components/options_list.scss @@ -65,7 +65,7 @@ } .optionsList__actionsRow { - margin: calc($euiSizeS / 2) 0 !important; + margin: ($euiSizeS / 2) 0 !important; .optionsList__actionBarDivider { height: $euiSize; @@ -97,4 +97,4 @@ color: $euiTextSubduedColor; padding: $euiSizeM; } -} +} \ No newline at end of file diff --git a/src/plugins/discover/public/components/doc_table/_doc_table.scss b/src/plugins/discover/public/components/doc_table/_doc_table.scss index 67de9cfae42e1f..8a9b629a9694bc 100644 --- a/src/plugins/discover/public/components/doc_table/_doc_table.scss +++ b/src/plugins/discover/public/components/doc_table/_doc_table.scss @@ -69,7 +69,7 @@ dt { background-color: transparentize(shade($euiColorPrimary, 20%), .9); color: $euiTextColor; - padding: calc($euiSizeXS / 2) $euiSizeXS; + padding: ($euiSizeXS / 2) $euiSizeXS; margin-right: $euiSizeXS; word-break: normal; border-radius: $euiBorderRadius; diff --git a/src/plugins/home/public/application/components/home.tsx b/src/plugins/home/public/application/components/home.tsx index 176b620430a56b..a69f222c93e586 100644 --- a/src/plugins/home/public/application/components/home.tsx +++ b/src/plugins/home/public/application/components/home.tsx @@ -129,7 +129,7 @@ export class Home extends Component { private renderNormal() { const { addBasePath, solutions, isCloudEnabled } = this.props; const { application, trackUiMetric } = getServices(); - const isDarkMode = getServices().uiSettings?.get('theme:darkMode') || false; + const isDarkMode = getServices().theme?.getTheme().darkMode ?? false; const devTools = this.findDirectoryById('console'); const manageDataFeatures = this.getFeaturesByCategory('admin'); diff --git a/src/plugins/home/public/application/components/sample_data/index.tsx b/src/plugins/home/public/application/components/sample_data/index.tsx index 316ba615ce8188..c1ebf4178186ef 100644 --- a/src/plugins/home/public/application/components/sample_data/index.tsx +++ b/src/plugins/home/public/application/components/sample_data/index.tsx @@ -29,7 +29,7 @@ interface Props { } export function SampleDataCard({ urlBasePath, onDecline, onConfirm }: Props) { - const IS_DARK_THEME = getServices().uiSettings.get('theme:darkMode'); + const IS_DARK_THEME = getServices().theme.getTheme().darkMode; const cardGraphicFile = !IS_DARK_THEME ? 'illustration_integrations_lightmode.png' : 'illustration_integrations_darkmode.png'; diff --git a/src/plugins/home/public/application/components/tutorial/instruction.js b/src/plugins/home/public/application/components/tutorial/instruction.js index 68360c86d2edeb..e1aaeae274fe02 100644 --- a/src/plugins/home/public/application/components/tutorial/instruction.js +++ b/src/plugins/home/public/application/components/tutorial/instruction.js @@ -24,7 +24,7 @@ export function Instruction({ variantId, isCloudEnabled, }) { - const { tutorialService, http, uiSettings, getBasePath, kibanaVersion } = getServices(); + const { tutorialService, http, theme, getBasePath, kibanaVersion } = getServices(); let pre; if (textPre) { @@ -67,6 +67,8 @@ export function Instruction({ ); } + const darkTheme = theme?.getTheme().darkMode ?? false; + return (
{pre} @@ -78,7 +80,7 @@ export function Instruction({ { + let container: HTMLDivElement | null; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container!); + container = null; + }); + + const TestConsumer: React.FC = () => { + const darkMode = useDarkMode(); + return
{String(darkMode)}
; + }; + + const mock = (): [KibanaServices, BehaviorSubject] => { + const core = coreMock.createStart(); + const subject = new BehaviorSubject({ darkMode: false }); + core.theme.theme$ = subject.asObservable(); + + return [core, subject]; + }; + + test('returns the value from the theme', () => { + const [core] = mock(); + const { Provider } = createKibanaReactContext(core); + + ReactDOM.render( + + + , + container + ); + + const div = container!.querySelector('div'); + expect(div!.textContent).toBe('false'); + }); + + test('value changes if the theme changes', () => { + const [core, subject] = mock(); + const { Provider } = createKibanaReactContext(core); + + ReactDOM.render( + + + , + container + ); + + let div = container!.querySelector('div'); + expect(div!.textContent).toBe('false'); + + act(() => { + subject.next({ darkMode: true }); + }); + + div = container!.querySelector('div'); + expect(div!.textContent).toBe('true'); + }); +}); diff --git a/src/plugins/kibana_react/public/dark_mode/use_dark_mode.ts b/src/plugins/kibana_react/public/dark_mode/use_dark_mode.ts new file mode 100644 index 00000000000000..c53a7b8687aad6 --- /dev/null +++ b/src/plugins/kibana_react/public/dark_mode/use_dark_mode.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import useObservable from 'react-use/lib/useObservable'; +import { useKibana } from '../context'; + +export const useDarkMode = (defaultValue?: boolean): boolean => { + const { + services: { theme }, + } = useKibana(); + + if (!theme) { + if (defaultValue !== undefined) { + return defaultValue; + } + throw new TypeError('theme service not available in kibana-react context.'); + } + + const currentTheme = useObservable(theme.theme$, theme.getTheme()); + return currentTheme.darkMode; +}; diff --git a/src/plugins/kibana_react/public/index.ts b/src/plugins/kibana_react/public/index.ts index 05abdbd84e91c6..5b4e8a9bcbae0c 100644 --- a/src/plugins/kibana_react/public/index.ts +++ b/src/plugins/kibana_react/public/index.ts @@ -42,6 +42,8 @@ export { useGlobalUiSetting$, } from './ui_settings'; +export { useDarkMode } from './dark_mode'; + export { useExecutionContext } from './use_execution_context'; export { reactRouterNavigate, reactRouterOnClickHandler } from './react_router_navigate'; @@ -79,6 +81,7 @@ export { KibanaThemeProvider, wrapWithTheme, type KibanaThemeProviderProps } fro export function plugin() { return new (class KibanaReactPlugin { setup() {} + start() {} })(); } diff --git a/src/plugins/kibana_react/public/markdown/_markdown.scss b/src/plugins/kibana_react/public/markdown/_markdown.scss index a3bba38509bcdb..c11aefe1f4d97c 100644 --- a/src/plugins/kibana_react/public/markdown/_markdown.scss +++ b/src/plugins/kibana_react/public/markdown/_markdown.scss @@ -14,7 +14,7 @@ $kbnDefaultFontSize: 14px; @function canvasToEm($size) { - @return #{calc($size / $kbnDefaultFontSize)}em; + @return #{$size / $kbnDefaultFontSize}em; } .kbnMarkdown__body { diff --git a/src/plugins/share/common/url_service/locators/redirect/parse_search_params.ts b/src/plugins/share/common/url_service/locators/redirect/parse_search_params.ts index a4711c30db5d09..c66bf56b1858fc 100644 --- a/src/plugins/share/common/url_service/locators/redirect/parse_search_params.ts +++ b/src/plugins/share/common/url_service/locators/redirect/parse_search_params.ts @@ -22,7 +22,9 @@ import type { RedirectOptions } from './types'; * @param urlSearch Search part of URL path. * @returns Parsed out locator ID, version, and locator params. */ -export function parseSearchParams(urlSearch: string): RedirectOptions { +export function parseSearchParams

( + urlSearch: string +): RedirectOptions

{ const search = new URLSearchParams(urlSearch); const id = search.get('l'); @@ -66,7 +68,7 @@ export function parseSearchParams(urlSearch: string): RedirectOptions { throw new Error(message); } - let params: unknown & SerializableRecord; + let params: P; try { params = JSON.parse(paramsJson); } catch { diff --git a/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss b/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss index 362aec7264983e..1c16adbfc8c133 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss +++ b/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss @@ -8,8 +8,8 @@ line-height: $euiSize; border: none; color: $euiTextColor; - padding-top: calc($euiSizeM / 2) + 1px; - padding-bottom: calc($euiSizeM / 2) + 1px; + padding-top: $euiSizeM / 2 + 1px; + padding-bottom: $euiSizeM / 2 + 1px; white-space: normal; /* 1 */ &:not(.globalFilterItem-isDisabled) { @@ -54,8 +54,8 @@ left: 0; width: $euiSizeXS; background-color: $kbnGlobalFilterItemBorderColor; - border-top-left-radius: calc($euiBorderRadius / 2); - border-bottom-left-radius: calc($euiBorderRadius / 2); + border-top-left-radius: $euiBorderRadius / 2; + border-bottom-left-radius: $euiBorderRadius / 2; } } diff --git a/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss b/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss index 2e6f639ea792d7..7ce304310ae56a 100644 --- a/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss +++ b/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss @@ -5,7 +5,7 @@ } .kbnSavedQueryManagement__text { - padding: $euiSizeM $euiSizeM calc($euiSizeM / 2) $euiSizeM; + padding: $euiSizeM $euiSizeM ($euiSizeM / 2) $euiSizeM; } .kbnSavedQueryManagement__list { @@ -13,5 +13,5 @@ max-height: inherit; // Fixes overflow for applied max-height // Left/Right padding is calculated to match the left alignment of the // popover text and buttons - padding: calc($euiSizeM / 2) $euiSizeXS !important; // Override flush + padding: ($euiSizeM / 2) $euiSizeXS !important; // Override flush } diff --git a/src/plugins/vis_default_editor/public/_agg_params.scss b/src/plugins/vis_default_editor/public/_agg_params.scss index c56ef94c3a4baf..81faa06681c0d9 100644 --- a/src/plugins/vis_default_editor/public/_agg_params.scss +++ b/src/plugins/vis_default_editor/public/_agg_params.scss @@ -1,7 +1,7 @@ .visEditorAggParam--half { margin: $euiSize 0; display: inline-block; - width: calc(50% - #{calc($euiSizeS / 2)}); + width: calc(50% - #{$euiSizeS / 2}); } .visEditorAggParam--half-size { diff --git a/src/plugins/vis_types/timeseries/public/application/components/_vis_with_splits.scss b/src/plugins/vis_types/timeseries/public/application/components/_vis_with_splits.scss index 036cf3f6a8fbdc..9e09a6c3477f3c 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/_vis_with_splits.scss +++ b/src/plugins/vis_types/timeseries/public/application/components/_vis_with_splits.scss @@ -20,7 +20,7 @@ > .tvbVis { // Apply the minimum height on the vis itself so it doesn't interfere with flex calculations // Gauges are not completely square, so the height is just slightly less than the width - min-height: calc($euiSize * 12 / 1.25); + min-height: $euiSize * 12 / 1.25; } } diff --git a/src/plugins/vis_types/timeseries/public/application/visualizations/views/_metric.scss b/src/plugins/vis_types/timeseries/public/application/visualizations/views/_metric.scss index d5eb056dd172e4..bc2ce4f1a9e441 100644 --- a/src/plugins/vis_types/timeseries/public/application/visualizations/views/_metric.scss +++ b/src/plugins/vis_types/timeseries/public/application/visualizations/views/_metric.scss @@ -101,7 +101,7 @@ .tvbVisMetric__label--additional { @include euiTextTruncate; font-size: .25em; /* 1 */ - padding: calc($euiSizeXS / 2) 0 0; + padding: ($euiSizeXS / 2) 0 0; text-align: center; color: $tvbValueColor; line-height: 1.2; // Ensure the descenders don't get cut off diff --git a/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss b/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss index 8b92af5a4fdcf9..4612602d93f1cc 100644 --- a/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss +++ b/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss @@ -203,7 +203,7 @@ } .slice { - stroke-width: calc($euiSizeXS / 2); + stroke-width: $euiSizeXS / 2; stroke: $euiColorEmptyShade; &:hover { diff --git a/test/scripts/checks/baseline_plugin_public_api_docs.sh b/test/scripts/checks/baseline_plugin_public_api_docs.sh deleted file mode 100755 index 72de7c0980a5fc..00000000000000 --- a/test/scripts/checks/baseline_plugin_public_api_docs.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -### -### rebuild plugin api docs to ensure it's not out of date -### -echo " -- building api docs" -node --max-old-space-size=12000 scripts/build_api_docs diff --git a/test/scripts/checks/bundle_limits.sh b/test/scripts/checks/bundle_limits.sh deleted file mode 100755 index 10d9d9343fda4e..00000000000000 --- a/test/scripts/checks/bundle_limits.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/build_kibana_platform_plugins --validate-limits diff --git a/test/scripts/checks/commit/commit.sh b/test/scripts/checks/commit/commit.sh deleted file mode 100755 index 180f6dfb56e29b..00000000000000 --- a/test/scripts/checks/commit/commit.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -# Runs pre-commit hook script for the files touched in the last commit. -# That way we can ensure a set of quick commit checks earlier as we removed -# the pre-commit hook installation by default. -# If files are more than 200 we will skip it and just use -# the further ci steps that already check linting and file casing for the entire repo. -"$(dirname "${0}")/commit_check_runner.sh" diff --git a/test/scripts/checks/commit/commit_check_runner.sh b/test/scripts/checks/commit/commit_check_runner.sh deleted file mode 100755 index 65ca9a6ecef06e..00000000000000 --- a/test/scripts/checks/commit/commit_check_runner.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -run_quick_commit_checks() { - echo "!!!!!!!! ATTENTION !!!!!!!! -That check is intended to provide earlier CI feedback after we remove the automatic install for the local pre-commit hook. -If you want, you can still manually install the pre-commit hook locally by running 'node scripts/register_git_hook locally' -!!!!!!!!!!!!!!!!!!!!!!!!!!! -" - - node scripts/precommit_hook.js --ref HEAD~1..HEAD --max-files 200 -} - -run_quick_commit_checks diff --git a/test/scripts/checks/file_casing.sh b/test/scripts/checks/file_casing.sh deleted file mode 100755 index 1a2240d0562ff2..00000000000000 --- a/test/scripts/checks/file_casing.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/check_file_casing --quiet diff --git a/test/scripts/checks/i18n.sh b/test/scripts/checks/i18n.sh deleted file mode 100755 index 468b8394081e1b..00000000000000 --- a/test/scripts/checks/i18n.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/i18n_check --ignore-missing diff --git a/test/scripts/checks/jest_configs.sh b/test/scripts/checks/jest_configs.sh deleted file mode 100755 index cebcbc63bb3961..00000000000000 --- a/test/scripts/checks/jest_configs.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/check_jest_configs diff --git a/test/scripts/checks/licenses.sh b/test/scripts/checks/licenses.sh deleted file mode 100755 index 8a19cdc2fc126e..00000000000000 --- a/test/scripts/checks/licenses.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/check_licenses --dev diff --git a/test/scripts/checks/plugin_list_docs.sh b/test/scripts/checks/plugin_list_docs.sh deleted file mode 100644 index b0f49d78458410..00000000000000 --- a/test/scripts/checks/plugin_list_docs.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -### -### rebuild plugin list to ensure it's not out of date -### -echo " -- building plugin list docs" -node scripts/build_plugin_list_docs - -### -### verify no git modifications -### -GIT_CHANGES="$(git ls-files --modified)" -if [ "$GIT_CHANGES" ]; then - echo -e "\n${RED}ERROR: 'node scripts/build_plugin_list_docs' caused changes to the following files:${C_RESET}\n" - echo -e "$GIT_CHANGES\n" - exit 1 -fi diff --git a/test/scripts/checks/telemetry.sh b/test/scripts/checks/telemetry.sh deleted file mode 100755 index 09b2305f9d607b..00000000000000 --- a/test/scripts/checks/telemetry.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/telemetry_check diff --git a/test/scripts/checks/test_hardening.sh b/test/scripts/checks/test_hardening.sh deleted file mode 100755 index 332edb0fcde685..00000000000000 --- a/test/scripts/checks/test_hardening.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/test_hardening diff --git a/test/scripts/checks/test_projects.sh b/test/scripts/checks/test_projects.sh deleted file mode 100755 index 6a1a8b958c4aac..00000000000000 --- a/test/scripts/checks/test_projects.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -yarn kbn run-in-packages test diff --git a/test/scripts/checks/ts_projects.sh b/test/scripts/checks/ts_projects.sh deleted file mode 100755 index 9963d10792f948..00000000000000 --- a/test/scripts/checks/ts_projects.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/check_ts_projects diff --git a/test/scripts/checks/type_check_plugin_public_api_docs.sh b/test/scripts/checks/type_check_plugin_public_api_docs.sh deleted file mode 100755 index b5fed38e192d28..00000000000000 --- a/test/scripts/checks/type_check_plugin_public_api_docs.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/build_ts_refs \ - --clean \ - --no-cache \ - --force - -node scripts/type_check - -echo " -- building api docs" -node --max-old-space-size=12000 scripts/build_api_docs diff --git a/test/scripts/checks/verify_notice.sh b/test/scripts/checks/verify_notice.sh deleted file mode 100755 index 55dd1c04aaf8a1..00000000000000 --- a/test/scripts/checks/verify_notice.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/notice --validate diff --git a/test/scripts/jenkins_accessibility.sh b/test/scripts/jenkins_accessibility.sh deleted file mode 100755 index fa582cf2d97d0a..00000000000000 --- a/test/scripts/jenkins_accessibility.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --config test/accessibility/config.ts; diff --git a/test/scripts/jenkins_apm_cypress.sh b/test/scripts/jenkins_apm_cypress.sh deleted file mode 100755 index 2ccd7d760fba52..00000000000000 --- a/test/scripts/jenkins_apm_cypress.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -echo " -> Running APM cypress tests" -cd "$XPACK_DIR" - -node plugins/apm/scripts/test/e2e.js - -echo "" -echo "" diff --git a/test/scripts/jenkins_build_kbn_sample_panel_action.sh b/test/scripts/jenkins_build_kbn_sample_panel_action.sh deleted file mode 100755 index 67c3da246ed7cf..00000000000000 --- a/test/scripts/jenkins_build_kbn_sample_panel_action.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -cd test/plugin_functional/plugins/kbn_sample_panel_action; -if [[ ! -d "target" ]]; then - yarn build; -fi -cd -; diff --git a/test/scripts/jenkins_build_kibana.sh b/test/scripts/jenkins_build_kibana.sh deleted file mode 100755 index 28d4feef3a4b90..00000000000000 --- a/test/scripts/jenkins_build_kibana.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash - -cd "$KIBANA_DIR" -source src/dev/ci_setup/setup_env.sh - -if [[ ! "$TASK_QUEUE_PROCESS_ID" ]]; then - ./test/scripts/jenkins_build_plugins.sh -fi - -# doesn't persist, also set in kibanaPipeline.groovy -export KBN_NP_PLUGINS_BUILT=true - -# Do not build kibana for code coverage run -if [[ -z "$CODE_COVERAGE" ]] ; then - echo " -> building and extracting default Kibana distributable for use in functional tests" - node scripts/build --debug - - echo " -> shipping metrics from build to ci-stats" - node scripts/ship_ci_stats \ - --metrics target/optimizer_bundle_metrics.json \ - --metrics build/kibana/node_modules/@kbn/ui-shared-deps-src/shared_built_assets/metrics.json - - linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" - installDir="$KIBANA_DIR/install/kibana" - mkdir -p "$installDir" - tar -xzf "$linuxBuild" -C "$installDir" --strip=1 - cp "$linuxBuild" "$WORKSPACE/kibana-default.tar.gz" - - mkdir -p "$WORKSPACE/kibana-build" - cp -pR install/kibana/. $WORKSPACE/kibana-build/ - - echo " -> Archive built plugins" - shopt -s globstar - tar -zcf \ - "$WORKSPACE/kibana-default-plugins.tar.gz" \ - x-pack/plugins/**/target/public \ - x-pack/test/**/target/public \ - examples/**/target/public \ - x-pack/examples/**/target/public \ - test/**/target/public - shopt -u globstar -fi diff --git a/test/scripts/jenkins_build_load_testing.sh b/test/scripts/jenkins_build_load_testing.sh deleted file mode 100755 index f64caa3c02cabb..00000000000000 --- a/test/scripts/jenkins_build_load_testing.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env bash - -while getopts s: flag -do - case "${flag}" in - s) simulations=${OPTARG};; - esac -done -echo "Simulation classes: $simulations"; - -cd "$KIBANA_DIR" -source src/dev/ci_setup/setup_env.sh - -if [[ ! "$TASK_QUEUE_PROCESS_ID" ]]; then - ./test/scripts/jenkins_xpack_build_plugins.sh -fi - -echo " -> Configure Metricbeat monitoring" -# Configure Metricbeat monitoring for Kibana and ElasticSearch, ingest monitoring data into Kibana Stats cluster -# Getting the URL -TOP="$(curl -L http://snapshots.elastic.co/latest/master.json)" -MB_BUILD=$(echo $TOP | sed 's/.*"version" : "\(.*\)", "build_id.*/\1/') -echo $MB_BUILD -MB_BUILD_ID=$(echo $TOP | sed 's/.*"build_id" : "\(.*\)", "manifest_url.*/\1/') - -URL=https://snapshots.elastic.co/${MB_BUILD_ID}/downloads/beats/metricbeat/metricbeat-${MB_BUILD}-linux-x86_64.tar.gz -URL=https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.0-linux-x86_64.tar.gz -echo $URL -# Downloading the Metricbeat package -while [ 1 ]; do - wget -q --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -t 0 --continue --no-check-certificate --tries=3 $URL - if [ $? = 0 ]; then break; fi; # check return value, break if successful (0) - sleep 1s; -done; - -# Install Metricbeat -echo "untar metricbeat and config" -#tar -xzf metricbeat-${MB_BUILD}-linux-x86_64.tar.gz -tar -xzf metricbeat-7.11.0-linux-x86_64.tar.gz -#mv metricbeat-${MB_BUILD}-linux-x86_64 metricbeat-install -mv metricbeat-7.11.0-linux-x86_64 metricbeat-install - -# Configure Metricbeat -echo " -> Changing metricbeat config" -pushd ../kibana-load-testing -cp cfg/metricbeat/elasticsearch-xpack.yml $KIBANA_DIR/metricbeat-install/modules.d/elasticsearch-xpack.yml -cp cfg/metricbeat/kibana-xpack.yml $KIBANA_DIR/metricbeat-install/modules.d/kibana-xpack.yml -echo "fields.build: ${BUILD_ID}" >> cfg/metricbeat/metricbeat.yml -echo "path.config: ${KIBANA_DIR}/metricbeat-install" >> cfg/metricbeat/metricbeat.yml -echo "cloud.auth: ${USER_FROM_VAULT}:${PASS_FROM_VAULT}" >> cfg/metricbeat/metricbeat.yml -cp cfg/metricbeat/metricbeat.yml $KIBANA_DIR/metricbeat-install/metricbeat.yml -# Disable system monitoring: enabled for now to have more data -#mv $KIBANA_DIR/metricbeat-install/modules.d/system.yml $KIBANA_DIR/metricbeat-install/modules.d/system.yml.disabled -echo " -> Building puppeteer project" -cd puppeteer -yarn install && yarn build -popd - -# doesn't persist, also set in kibanaPipeline.groovy -export KBN_NP_PLUGINS_BUILT=true - -echo " -> Building and extracting default Kibana distributable for use in functional tests" -cd "$KIBANA_DIR" -node scripts/build --debug -linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" -installDir="$KIBANA_DIR/install/kibana" -mkdir -p "$installDir" -tar -xzf "$linuxBuild" -C "$installDir" --strip=1 - -mkdir -p "$WORKSPACE/kibana-build" -cp -pR install/kibana/. $WORKSPACE/kibana-build/ - -echo " -> Setup env for tests" -source test/scripts/jenkins_test_setup_xpack.sh - -# Start Metricbeat -echo " -> Starting metricbeat" -pushd $KIBANA_DIR/metricbeat-install -nohup ./metricbeat > metricbeat.log 2>&1 & -popd - -echo " -> Running gatling load testing" -export GATLING_SIMULATIONS="$simulations" -node scripts/functional_tests \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --config test/load/config.ts; - - -echo " -> Simulations run is finished" - -# Show output of Metricbeat. Disabled. Enable for debug purposes -#echo "output of metricbeat.log" -#cat $KIBANA_DIR/metricbeat-install/metricbeat.log diff --git a/test/scripts/jenkins_build_plugins.sh b/test/scripts/jenkins_build_plugins.sh deleted file mode 100755 index dd1715065e7996..00000000000000 --- a/test/scripts/jenkins_build_plugins.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -echo " -> building kibana platform plugins" -node scripts/build_kibana_platform_plugins \ - --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ - --scan-dir "$KIBANA_DIR/test/health_gateway/plugins" \ - --scan-dir "$KIBANA_DIR/test/interpreter_functional/plugins" \ - --scan-dir "$KIBANA_DIR/test/common/plugins" \ - --scan-dir "$KIBANA_DIR/examples" \ - --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ - --scan-dir "$KIBANA_DIR/test/common/plugins" \ - --scan-dir "$XPACK_DIR/test/plugin_functional/plugins" \ - --scan-dir "$XPACK_DIR/test/functional_with_es_ssl/plugins" \ - --scan-dir "$XPACK_DIR/test/alerting_api_integration/plugins" \ - --scan-dir "$XPACK_DIR/test/plugin_api_integration/plugins" \ - --scan-dir "$XPACK_DIR/test/plugin_api_perf/plugins" \ - --scan-dir "$XPACK_DIR/test/licensing_plugin/plugins" \ - --scan-dir "$XPACK_DIR/test/usage_collection/plugins" \ - --scan-dir "$XPACK_DIR/test/security_functional/fixtures/common" \ - --scan-dir "$XPACK_DIR/examples" \ - --workers 12 diff --git a/test/scripts/jenkins_ci_group.sh b/test/scripts/jenkins_ci_group.sh deleted file mode 100755 index dde224823789b3..00000000000000 --- a/test/scripts/jenkins_ci_group.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -if [[ -z "$CODE_COVERAGE" ]]; then - echo " -> Running functional and api tests" - - node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --include-tag "ciGroup$CI_GROUP" - - if [[ ! "$TASK_QUEUE_PROCESS_ID" && "$CI_GROUP" == "1" ]]; then - source test/scripts/jenkins_build_kbn_sample_panel_action.sh - ./test/scripts/test/plugin_functional.sh - ./test/scripts/test/health_gateway.sh - ./test/scripts/test/interpreter_functional.sh - fi -else - echo " -> Running Functional tests with code coverage" - export NODE_OPTIONS=--max_old_space_size=8192 - - echo " -> making hard link clones" - cd .. - cp -RlP kibana "kibana${CI_GROUP}" - cd "kibana${CI_GROUP}" - - echo " -> running tests from the clone folder" - node scripts/functional_tests --debug --include-tag "ciGroup$CI_GROUP" --exclude-tag "skipCoverage" || true; - - echo " -> moving junit output, silently fail in case of no report" - mkdir -p ../kibana/target/junit - mv target/junit/* ../kibana/target/junit/ || echo "copying junit failed" - - echo " -> copying screenshots and html for failures" - cp -r test/functional/screenshots/* ../kibana/test/functional/screenshots/ || echo "copying screenshots failed" - cp -r test/functional/failure_debug ../kibana/test/functional/ || echo "copying html failed" -fi diff --git a/test/scripts/jenkins_cloud.sh b/test/scripts/jenkins_cloud.sh deleted file mode 100755 index 57798a9afcac17..00000000000000 --- a/test/scripts/jenkins_cloud.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# This script runs kibana tests compatible with cloud. -# -# The cloud instance setup is done in the elastic/elastic-stack-testing framework, -# where the following environment variables are set pointing to the cloud instance. -# -# export TEST_KIBANA_HOSTNAME -# export TEST_KIBANA_PROTOCOL= -# export TEST_KIBANA_PORT= -# export TEST_KIBANA_USER= -# export TEST_KIBANA_PASS= -# -# export TEST_ES_HOSTNAME= -# export TEST_ES_PROTOCOL= -# export TEST_ES_PORT= -# export TEST_ES_USER= -# export TEST_ES_PASS= -# - -set -e - -source "$(dirname $0)/../../src/dev/ci_setup/setup.sh" - -export TEST_BROWSER_HEADLESS=1 -node scripts/functional_test_runner --debug --exclude-tag skipCloud $@ diff --git a/test/scripts/jenkins_firefox_smoke.sh b/test/scripts/jenkins_firefox_smoke.sh deleted file mode 100755 index 4566b11822bf58..00000000000000 --- a/test/scripts/jenkins_firefox_smoke.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -node scripts/functional_tests \ - --bail --debug \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --include-tag "includeFirefox" \ - --config test/functional/config.firefox.js; diff --git a/test/scripts/jenkins_fleet_cypress.sh b/test/scripts/jenkins_fleet_cypress.sh deleted file mode 100755 index e43259c1c1c3f6..00000000000000 --- a/test/scripts/jenkins_fleet_cypress.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -echo " -> Running fleet cypress tests" -cd "$XPACK_DIR" - -cd x-pack/plugins/fleet -yarn --cwd x-pack/plugins/fleet cypress:run - -echo "" -echo "" diff --git a/test/scripts/jenkins_osquery_cypress.sh b/test/scripts/jenkins_osquery_cypress.sh deleted file mode 100755 index b4a9420ff94402..00000000000000 --- a/test/scripts/jenkins_osquery_cypress.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -echo " -> Running osquery cypress tests" -cd "$XPACK_DIR" - -node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --config test/osquery_cypress/cli_config.ts - -echo "" -echo "" diff --git a/test/scripts/jenkins_plugin_functional.sh b/test/scripts/jenkins_plugin_functional.sh deleted file mode 100755 index 984e648bf6b848..00000000000000 --- a/test/scripts/jenkins_plugin_functional.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -cd test/plugin_functional/plugins/kbn_sample_panel_action; -if [[ ! -d "target" ]]; then - yarn build; -fi -cd -; - -pwd - -./test/scripts/test/plugin_functional.sh -./test/scripts/test/health_gateway.sh -./test/scripts/test/interpreter_functional.sh diff --git a/test/scripts/jenkins_runbld_junit.sh b/test/scripts/jenkins_runbld_junit.sh deleted file mode 100755 index bcb6accd5f8cd4..00000000000000 --- a/test/scripts/jenkins_runbld_junit.sh +++ /dev/null @@ -1,2 +0,0 @@ -# This file just exists to give runbld something to invoke before processing junit reports -echo 'Processing junit reports with runbld...' diff --git a/test/scripts/jenkins_security_solution_cypress_chrome.sh b/test/scripts/jenkins_security_solution_cypress_chrome.sh deleted file mode 100755 index 0605a319896ce7..00000000000000 --- a/test/scripts/jenkins_security_solution_cypress_chrome.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -echo " -> Running security solution cypress tests" -cd "$XPACK_DIR" - -node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --config test/security_solution_cypress/cli_config.ts - -echo "" -echo "" diff --git a/test/scripts/jenkins_setup.sh b/test/scripts/jenkins_setup.sh deleted file mode 100755 index 8c8492d10e6026..00000000000000 --- a/test/scripts/jenkins_setup.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/load_env_keys.sh -source src/dev/ci_setup/extract_bootstrap_cache.sh -source src/dev/ci_setup/setup.sh -source src/dev/ci_setup/checkout_sibling_es.sh \ No newline at end of file diff --git a/test/scripts/jenkins_setup_parallel_workspace.sh b/test/scripts/jenkins_setup_parallel_workspace.sh deleted file mode 100755 index 5274d05572e713..00000000000000 --- a/test/scripts/jenkins_setup_parallel_workspace.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash -set -e - -CURRENT_DIR=$(pwd) - -# Copy everything except node_modules into the current workspace -rsync -a ${WORKSPACE}/kibana/* . --exclude node_modules -rsync -a ${WORKSPACE}/kibana/.??* . - -# Symlink all non-root, non-fixture node_modules into our new workspace -cd ${WORKSPACE}/kibana -find . -type d -name node_modules -not -path '*__fixtures__*' -not -path './node_modules*' -prune -print0 | xargs -0I % ln -s "${WORKSPACE}/kibana/%" "${CURRENT_DIR}/%" -find . -type d -wholename '*__fixtures__*node_modules' -not -path './node_modules*' -prune -print0 | xargs -0I % cp -R "${WORKSPACE}/kibana/%" "${CURRENT_DIR}/%" -cd "${CURRENT_DIR}" - -# Symlink all of the individual root-level node_modules into the node_modules/ directory -mkdir -p node_modules -ln -s ${WORKSPACE}/kibana/node_modules/* node_modules/ -ln -s ${WORKSPACE}/kibana/node_modules/.??* node_modules/ - -# Copy a few node_modules instead of symlinking them. They don't work correctly if symlinked -unlink node_modules/@kbn -unlink node_modules/css-loader -unlink node_modules/style-loader - -# packages/kbn-optimizer/src/integration_tests/basic_optimization.test.ts will fail if this is a symlink -unlink node_modules/val-loader - -cp -R ${WORKSPACE}/kibana/node_modules/@kbn node_modules/ -cp -R ${WORKSPACE}/kibana/node_modules/css-loader node_modules/ -cp -R ${WORKSPACE}/kibana/node_modules/style-loader node_modules/ -cp -R ${WORKSPACE}/kibana/node_modules/val-loader node_modules/ diff --git a/test/scripts/jenkins_storybook.sh b/test/scripts/jenkins_storybook.sh deleted file mode 100755 index 058c58ed922eba..00000000000000 --- a/test/scripts/jenkins_storybook.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -cd "$KIBANA_DIR" - -yarn storybook --site apm -yarn storybook --site canvas -yarn storybook --site cell_actions -yarn storybook --site ci_composite -yarn storybook --site content_management -yarn storybook --site custom_integrations -yarn storybook --site dashboard -yarn storybook --site dashboard_enhanced -yarn storybook --site data -yarn storybook --site embeddable -yarn storybook --site expression_error -yarn storybook --site expression_image -yarn storybook --site expression_metric -yarn storybook --site expression_repeat_image -yarn storybook --site expression_reveal_image -yarn storybook --site expression_shape -yarn storybook --site expression_tagcloud -yarn storybook --site fleet -yarn storybook --site infra -yarn storybook --site kibana_react -yarn storybook --site lists -yarn storybook --site observability -yarn storybook --site presentation -yarn storybook --site security_solution -yarn storybook --site solution_side_nav -yarn storybook --site shared_ux -yarn storybook --site ui_actions_enhanced diff --git a/test/scripts/jenkins_test_setup.sh b/test/scripts/jenkins_test_setup.sh deleted file mode 100755 index 05b88aa2dd0a20..00000000000000 --- a/test/scripts/jenkins_test_setup.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -e - -function post_work() { - set +e - if [[ -z "$REMOVE_KIBANA_INSTALL_DIR" && -z "$KIBANA_INSTALL_DIR" && -d "$KIBANA_INSTALL_DIR" ]]; then - rm -rf "$REMOVE_KIBANA_INSTALL_DIR" - fi -} - -trap 'post_work' EXIT - -export TEST_BROWSER_HEADLESS=1 - -source src/dev/ci_setup/setup_env.sh - -# For parallel workspaces, we should copy the .es directory from the root, because it should already have downloaded snapshots in it -# This isn't part of jenkins_setup_parallel_workspace.sh just because not all tasks require ES -if [[ ! -d .es && -d "$WORKSPACE/kibana/.es" ]]; then - cp -R $WORKSPACE/kibana/.es ./ -fi diff --git a/test/scripts/jenkins_test_setup_oss.sh b/test/scripts/jenkins_test_setup_oss.sh deleted file mode 100755 index 29d396667c465a..00000000000000 --- a/test/scripts/jenkins_test_setup_oss.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup.sh - -if [[ -z "$CODE_COVERAGE" ]]; then - destDir="$WORKSPACE/kibana-build-${TASK_QUEUE_PROCESS_ID:-$CI_PARALLEL_PROCESS_NUMBER}" - - if [[ ! -d $destDir ]]; then - mkdir -p $destDir - cp -pR "$WORKSPACE/kibana-build/." $destDir/ - fi - - export KIBANA_INSTALL_DIR="$destDir" -fi diff --git a/test/scripts/jenkins_test_setup_xpack.sh b/test/scripts/jenkins_test_setup_xpack.sh deleted file mode 100755 index 31acc4f4865e2e..00000000000000 --- a/test/scripts/jenkins_test_setup_xpack.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup.sh - -if [[ -z "$CODE_COVERAGE" ]]; then - destDir="$WORKSPACE/kibana-build-${TASK_QUEUE_PROCESS_ID:-$CI_PARALLEL_PROCESS_NUMBER}" - - if [[ ! -d $destDir ]]; then - mkdir -p $destDir - cp -pR "$WORKSPACE/kibana-build/." $destDir/ - fi - - export KIBANA_INSTALL_DIR="$(realpath $destDir)" - - cd "$XPACK_DIR" -fi diff --git a/test/scripts/jenkins_uptime_playwright.sh b/test/scripts/jenkins_uptime_playwright.sh deleted file mode 100755 index 5bea30a223cd41..00000000000000 --- a/test/scripts/jenkins_uptime_playwright.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -echo " -> Running synthetics @elastic/synthetics tests" -cd "$XPACK_DIR" - -node plugins/synthetics/scripts/e2e.js - -echo "" -echo "" diff --git a/test/scripts/jenkins_ux_synthetics.sh b/test/scripts/jenkins_ux_synthetics.sh deleted file mode 100755 index acf2611e36b948..00000000000000 --- a/test/scripts/jenkins_ux_synthetics.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -echo " -> Running User Experience plugin @elastic/synthetics tests" -cd "$XPACK_DIR" - -node plugins/ux/scripts/e2e.js - -echo "" -echo "" diff --git a/test/scripts/jenkins_xpack_accessibility.sh b/test/scripts/jenkins_xpack_accessibility.sh deleted file mode 100755 index b1daa0ada1d50e..00000000000000 --- a/test/scripts/jenkins_xpack_accessibility.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --config test/accessibility/config.ts; diff --git a/test/scripts/jenkins_xpack_baseline.sh b/test/scripts/jenkins_xpack_baseline.sh deleted file mode 100755 index a0a98ccd5a5e7b..00000000000000 --- a/test/scripts/jenkins_xpack_baseline.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh -source "$KIBANA_DIR/src/dev/ci_setup/setup_percy.sh" - -echo " -> building and extracting default Kibana distributable" -cd "$KIBANA_DIR" -node scripts/build --debug - -echo " -> shipping metrics from build to ci-stats" -node scripts/ship_ci_stats \ - --metrics target/optimizer_bundle_metrics.json \ - --metrics build/kibana/node_modules/@kbn/ui-shared-deps-src/shared_built_assets/metrics.json - -linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" -installDir="$KIBANA_DIR/install/kibana" -mkdir -p "$installDir" -tar -xzf "$linuxBuild" -C "$installDir" --strip=1 - -mkdir -p "$WORKSPACE/kibana-build" -cp -pR install/kibana/. $WORKSPACE/kibana-build/ - -cd "$KIBANA_DIR" -source "test/scripts/jenkins_xpack_saved_objects_field_metrics.sh" diff --git a/test/scripts/jenkins_xpack_build_plugins.sh b/test/scripts/jenkins_xpack_build_plugins.sh deleted file mode 100755 index bdf6ee24555270..00000000000000 --- a/test/scripts/jenkins_xpack_build_plugins.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -echo " -> building kibana platform plugins" -node scripts/build_kibana_platform_plugins \ - --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ - --scan-dir "$KIBANA_DIR/test/common/plugins" \ - --scan-dir "$XPACK_DIR/test/plugin_functional/plugins" \ - --scan-dir "$XPACK_DIR/test/functional_with_es_ssl/plugins" \ - --scan-dir "$XPACK_DIR/test/alerting_api_integration/plugins" \ - --scan-dir "$XPACK_DIR/test/plugin_api_integration/plugins" \ - --scan-dir "$XPACK_DIR/test/plugin_api_perf/plugins" \ - --scan-dir "$XPACK_DIR/test/licensing_plugin/plugins" \ - --scan-dir "$XPACK_DIR/test/usage_collection/plugins" \ - --scan-dir "$XPACK_DIR/test/security_functional/fixtures/common" \ - --scan-dir "$KIBANA_DIR/examples" \ - --scan-dir "$XPACK_DIR/examples" \ - --workers 12 diff --git a/test/scripts/jenkins_xpack_ci_group.sh b/test/scripts/jenkins_xpack_ci_group.sh deleted file mode 100755 index 59bcf45a2089f8..00000000000000 --- a/test/scripts/jenkins_xpack_ci_group.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -if [[ -z "$CODE_COVERAGE" ]]; then - echo " -> Running functional and api tests" - - node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --include-tag "ciGroup$CI_GROUP" - - echo "" - echo "" -else - echo " -> Running X-Pack functional tests with code coverage" - export NODE_OPTIONS=--max_old_space_size=8192 - - echo " -> making hard link clones" - cd .. - cp -RlP kibana "kibana${CI_GROUP}" - cd "kibana${CI_GROUP}/x-pack" - - echo " -> running tests from the clone folder" - node scripts/functional_tests --debug --include-tag "ciGroup$CI_GROUP" --exclude-tag "skipCoverage" || true; - - echo " -> moving junit output, silently fail in case of no report" - mkdir -p ../../kibana/target/junit - mv ../target/junit/* ../../kibana/target/junit/ || echo "copying junit failed" - - echo " -> copying screenshots and html for failures" - cp -r test/functional/screenshots/* ../../kibana/x-pack/test/functional/screenshots/ || echo "copying screenshots failed" - cp -r test/functional/failure_debug ../../kibana/x-pack/test/functional/ || echo "copying html failed" -fi diff --git a/test/scripts/jenkins_xpack_firefox_smoke.sh b/test/scripts/jenkins_xpack_firefox_smoke.sh deleted file mode 100755 index de19d3867520d5..00000000000000 --- a/test/scripts/jenkins_xpack_firefox_smoke.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --include-tag "includeFirefox" \ - --config test/functional/config.firefox.js \ - --config test/functional_embedded/config.firefox.ts; diff --git a/test/scripts/jenkins_xpack_saved_objects_field_metrics.sh b/test/scripts/jenkins_xpack_saved_objects_field_metrics.sh deleted file mode 100755 index fc3a7db06a43bd..00000000000000 --- a/test/scripts/jenkins_xpack_saved_objects_field_metrics.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_xpack.sh - -node scripts/functional_tests \ - --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --config test/saved_objects_field_count/config.ts; diff --git a/test/scripts/lint/eslint.sh b/test/scripts/lint/eslint.sh deleted file mode 100755 index 8395df85c5d309..00000000000000 --- a/test/scripts/lint/eslint.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/eslint --no-cache diff --git a/test/scripts/lint/stylelint.sh b/test/scripts/lint/stylelint.sh deleted file mode 100755 index 2f500c7e14aaa0..00000000000000 --- a/test/scripts/lint/stylelint.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/stylelint diff --git a/test/scripts/test/api_integration.sh b/test/scripts/test/api_integration.sh deleted file mode 100755 index 06263c38b07283..00000000000000 --- a/test/scripts/test/api_integration.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/functional_tests \ - --config test/api_integration/config.js \ - --bail \ - --debug diff --git a/test/scripts/test/health_gateway.sh b/test/scripts/test/health_gateway.sh deleted file mode 100755 index 18a9b81b083de5..00000000000000 --- a/test/scripts/test/health_gateway.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -node scripts/functional_tests \ - --config test/health_gateway/config.ts \ - --bail \ - --debug \ - --kibana-install-dir $KIBANA_INSTALL_DIR diff --git a/test/scripts/test/interpreter_functional.sh b/test/scripts/test/interpreter_functional.sh deleted file mode 100755 index 2a40c81c34ad02..00000000000000 --- a/test/scripts/test/interpreter_functional.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -node scripts/functional_tests \ - --config test/interpreter_functional/config.ts \ - --bail \ - --debug \ - --kibana-install-dir $KIBANA_INSTALL_DIR diff --git a/test/scripts/test/jest_integration.sh b/test/scripts/test/jest_integration.sh deleted file mode 100755 index 3b27ba06842bec..00000000000000 --- a/test/scripts/test/jest_integration.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node --max-old-space-size=5120 scripts/jest_integration --ci diff --git a/test/scripts/test/jest_unit.sh b/test/scripts/test/jest_unit.sh deleted file mode 100755 index f368554e357608..00000000000000 --- a/test/scripts/test/jest_unit.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -source src/dev/ci_setup/setup_env.sh - -node scripts/jest --ci --maxWorkers=6 diff --git a/test/scripts/test/plugin_functional.sh b/test/scripts/test/plugin_functional.sh deleted file mode 100755 index 115ddb81d3e45e..00000000000000 --- a/test/scripts/test/plugin_functional.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -node scripts/functional_tests \ - --config test/plugin_functional/config.ts \ - --bail \ - --debug diff --git a/test/scripts/test/server_integration.sh b/test/scripts/test/server_integration.sh deleted file mode 100755 index fa4c4c6ce2c356..00000000000000 --- a/test/scripts/test/server_integration.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -source test/scripts/jenkins_test_setup_oss.sh - -node scripts/functional_tests \ - --config test/server_integration/http/ssl/config.js \ - --config test/server_integration/http/ssl_redirect/config.js \ - --config test/server_integration/http/platform/config.ts \ - --config test/server_integration/http/ssl_with_p12/config.js \ - --config test/server_integration/http/ssl_with_p12_intermediate/config.js \ - --bail \ - --debug \ - --kibana-install-dir $KIBANA_INSTALL_DIR - -# Tests that must be run against source in order to build test plugins -node scripts/functional_tests \ - --config test/server_integration/http/platform/config.status.ts \ - --bail \ - --debug diff --git a/vars/agentInfo.groovy b/vars/agentInfo.groovy deleted file mode 100644 index 166a86c1692616..00000000000000 --- a/vars/agentInfo.groovy +++ /dev/null @@ -1,40 +0,0 @@ -def print() { - catchError(catchInterruptions: false, buildResult: null) { - def startTime = sh(script: "date -d '-3 minutes' -Iseconds | sed s/+/%2B/", returnStdout: true).trim() - def endTime = sh(script: "date -d '+1 hour 30 minutes' -Iseconds | sed s/+/%2B/", returnStdout: true).trim() - - def resourcesUrl = - ( - "https://infra-stats.elastic.co/app/kibana#/visualize/edit/8bd92360-1b92-11ea-b719-aba04518cc34" + - "?_g=(time:(from:'${startTime}',to:'${endTime}'))" + - "&_a=(query:'host.name:${env.NODE_NAME}')" - ) - .replaceAll("'", '%27') // Need to escape ' because of the shell echo below, but can't really replace "'" with "\'" because of groovy sandbox - .replaceAll(/\)$/, '%29') // This is just here because the URL parsing in the Jenkins console doesn't work right - - def logsStartTime = sh(script: "date -d '-3 minutes' +%s", returnStdout: true).trim() - def logsUrl = - ( - "https://infra-stats.elastic.co/app/infra#/logs" + - "?_g=()&flyoutOptions=(flyoutId:!n,flyoutVisibility:hidden,surroundingLogsId:!n)" + - "&logFilter=(expression:'host.name:${env.NODE_NAME}',kind:kuery)" + - "&logPosition=(position:(time:${logsStartTime}000),streamLive:!f)" - ) - .replaceAll("'", '%27') - .replaceAll('\\)', '%29') - - sh script: """ - set +x - echo 'Resource Graph:' - echo '${resourcesUrl}' - echo '' - echo 'Agent Logs:' - echo '${logsUrl}' - echo '' - echo 'SSH Command:' - echo "ssh -F ssh_config \$(hostname --ip-address)" - """, label: "Worker/Agent/Node debug links" - } -} - -return this diff --git a/vars/buildState.groovy b/vars/buildState.groovy deleted file mode 100644 index 365705661350ce..00000000000000 --- a/vars/buildState.groovy +++ /dev/null @@ -1,30 +0,0 @@ -import groovy.transform.Field - -public static @Field JENKINS_BUILD_STATE = [:] - -def add(key, value) { - if (!buildState.JENKINS_BUILD_STATE.containsKey(key)) { - buildState.JENKINS_BUILD_STATE[key] = value - return true - } - - return false -} - -def set(key, value) { - buildState.JENKINS_BUILD_STATE[key] = value -} - -def get(key) { - return buildState.JENKINS_BUILD_STATE[key] -} - -def has(key) { - return buildState.JENKINS_BUILD_STATE.containsKey(key) -} - -def get() { - return buildState.JENKINS_BUILD_STATE -} - -return this diff --git a/vars/catchErrors.groovy b/vars/catchErrors.groovy deleted file mode 100644 index 2a1b55d832606c..00000000000000 --- a/vars/catchErrors.groovy +++ /dev/null @@ -1,15 +0,0 @@ -// Basically, this is a shortcut for catchError(catchInterruptions: false) {} -// By default, catchError will swallow aborts/timeouts, which we almost never want -// Also, by wrapping it in an additional try/catch, we cut down on spam in Pipeline Steps -def call(Map params = [:], Closure closure) { - try { - closure() - } catch (ex) { - params.catchInterruptions = false - catchError(params) { - throw ex - } - } -} - -return this diff --git a/vars/esSnapshots.groovy b/vars/esSnapshots.groovy deleted file mode 100644 index 884fbcdb17aebb..00000000000000 --- a/vars/esSnapshots.groovy +++ /dev/null @@ -1,50 +0,0 @@ -def promote(snapshotVersion, snapshotId) { - def snapshotDestination = "${snapshotVersion}/archives/${snapshotId}" - def MANIFEST_URL = "https://storage.googleapis.com/kibana-ci-es-snapshots-daily/${snapshotDestination}/manifest.json" - - dir('verified-manifest') { - def verifiedSnapshotFilename = 'manifest-latest-verified.json' - - sh """ - curl -O '${MANIFEST_URL}' - mv manifest.json ${verifiedSnapshotFilename} - """ - - googleStorageUpload( - credentialsId: 'kibana-ci-gcs-plugin', - bucket: "gs://kibana-ci-es-snapshots-daily/${snapshotVersion}", - pattern: verifiedSnapshotFilename, - sharedPublicly: false, - showInline: false, - ) - } - - // This would probably be more efficient if we could just copy using gsutil and specifying buckets for src and dest - // But we don't currently have access to the GCS credentials in a way that can be consumed easily from here... - dir('transfer-to-permanent') { - googleStorageDownload( - credentialsId: 'kibana-ci-gcs-plugin', - bucketUri: "gs://kibana-ci-es-snapshots-daily/${snapshotDestination}/*", - localDirectory: '.', - pathPrefix: snapshotDestination, - ) - - def manifestJson = readFile file: 'manifest.json' - writeFile( - file: 'manifest.json', - text: manifestJson.replace("kibana-ci-es-snapshots-daily/${snapshotDestination}", "kibana-ci-es-snapshots-permanent/${snapshotVersion}") - ) - - // Ideally we would have some delete logic here before uploading, - // But we don't currently have access to the GCS credentials in a way that can be consumed easily from here... - googleStorageUpload( - credentialsId: 'kibana-ci-gcs-plugin', - bucket: "gs://kibana-ci-es-snapshots-permanent/${snapshotVersion}", - pattern: '*.*', - sharedPublicly: false, - showInline: false, - ) - } -} - -return this diff --git a/vars/getCheckoutInfo.groovy b/vars/getCheckoutInfo.groovy deleted file mode 100644 index f9d797f8127c7a..00000000000000 --- a/vars/getCheckoutInfo.groovy +++ /dev/null @@ -1,50 +0,0 @@ -def call(branchOverride) { - def repoInfo = [ - branch: branchOverride ?: env.ghprbSourceBranch, - targetBranch: env.ghprbTargetBranch, - targetsTrackedBranch: true - ] - - if (repoInfo.branch == null) { - if (!(params.branch_specifier instanceof String)) { - throw new Exception( - "Unable to determine branch automatically, either pass a branch name to getCheckoutInfo() or use the branch_specifier param." - ) - } - - // strip prefix from the branch specifier to make it consistent with ghprbSourceBranch - repoInfo.branch = params.branch_specifier.replaceFirst(/^(refs\/heads\/|origin\/)/, "") - } - - repoInfo.commit = sh( - script: "git rev-parse HEAD", - label: "determining checked out sha", - returnStdout: true - ).trim() - - if (repoInfo.targetBranch) { - // Try to clone fetch from Github up to 8 times, waiting 15 secs between attempts - retryWithDelay(8, 15) { - sh( - script: "git fetch origin ${repoInfo.targetBranch}", - label: "fetch latest from '${repoInfo.targetBranch}' at origin" - ) - } - - repoInfo.mergeBase = sh( - script: "git merge-base HEAD FETCH_HEAD", - label: "determining merge point with '${repoInfo.targetBranch}' at origin", - returnStdout: true - ).trim() - - def pkgJson = readFile("package.json") - def releaseBranch = toJSON(pkgJson).branch - repoInfo.targetsTrackedBranch = releaseBranch == repoInfo.targetBranch - } - - print "repoInfo: ${repoInfo}" - - return repoInfo -} - -return this diff --git a/vars/githubCommitStatus.groovy b/vars/githubCommitStatus.groovy deleted file mode 100644 index 175dbe0c90542f..00000000000000 --- a/vars/githubCommitStatus.groovy +++ /dev/null @@ -1,57 +0,0 @@ -def defaultCommit() { - if (buildState.has('checkoutInfo')) { - return buildState.get('checkoutInfo').commit - } -} - -def onStart(commit = defaultCommit(), context = 'kibana-ci') { - catchError { - if (githubPr.isPr() || !commit) { - return - } - - create(commit, 'pending', 'Build started.', context) - } -} - -def onFinish(commit = defaultCommit(), context = 'kibana-ci') { - catchError { - if (githubPr.isPr() || !commit) { - return - } - - def status = buildUtils.getBuildStatus() - - if (status == 'SUCCESS' || status == 'UNSTABLE') { - create(commit, 'success', 'Build completed successfully.', context) - } else if(status == 'ABORTED') { - create(commit, 'error', 'Build aborted or timed out.', context) - } else { - create(commit, 'error', 'Build failed.', context) - } - } -} - -def trackBuild(commit, context, Closure closure) { - onStart(commit, context) - catchError { - closure() - } - onFinish(commit, context) -} - -// state: error|failure|pending|success -def create(sha, state, description, context, targetUrl = null) { - targetUrl = targetUrl ?: env.BUILD_URL - - withGithubCredentials { - return githubApi.post("repos/elastic/kibana/statuses/${sha}", [ - state: state, - description: description, - context: context, - target_url: targetUrl.toString() - ]) - } -} - -return this diff --git a/vars/githubPr.groovy b/vars/githubPr.groovy deleted file mode 100644 index 594d54f2c5b5e6..00000000000000 --- a/vars/githubPr.groovy +++ /dev/null @@ -1,369 +0,0 @@ -/** - Wraps the main/important part of a job, executes it, and then publishes a comment to GitHub with the status. - - It will check for the existence of GHPRB env variables before doing any actual PR work, - so it can be used to wrap code that is executed in both PR and non-PR contexts. - - Inside the comment, it will hide a JSON blob containing build data (status, etc). - - Then, the next time it posts a comment, it will: - 1. Read the previous comment and parse the json - 2. Create a new comment, add a summary of up to 5 previous builds to it, and append this build's data to the hidden JSON - 3. Delete the old comment - - So, there is only ever one build status comment on a PR at any given time, the most recent one. -*/ -def withDefaultPrComments(closure) { - catchErrors { - // kibanaPipeline.notifyOnError() needs to know if comments are enabled, so lets track it with a global - // isPr() just ensures this functionality is skipped for non-PR builds - buildState.set('PR_COMMENTS_ENABLED', isPr()) - catchErrors { - closure() - } - sendComment(true) - } -} - -def sendComment(isFinal = false) { - if (!buildState.get('PR_COMMENTS_ENABLED')) { - return - } - - def status = buildUtils.getBuildStatus() - if (status == "ABORTED") { - return - } - - def lastComment = getLatestBuildComment() - def info = getLatestBuildInfo(lastComment) ?: [:] - info.builds = (info.builds ?: []).takeRight(5) // Rotate out old builds - - // If two builds are running at the same time, the first one should not post a comment after the second one - if (info.number && info.number.toInteger() > env.BUILD_NUMBER.toInteger()) { - return - } - - def shouldUpdateComment = !!info.builds.find { it.number == env.BUILD_NUMBER } - - def message = getNextCommentMessage(info, isFinal) - - if (shouldUpdateComment) { - updateComment(lastComment.id, message) - } else { - createComment(message) - - if (lastComment && lastComment.user.login == 'kibanamachine') { - deleteComment(lastComment.id) - } - } -} - -// Checks whether or not this currently executing build was triggered via a PR in the elastic/kibana repo -def isPr() { - return !!(env.ghprbPullId && env.ghprbPullLink && env.ghprbPullLink =~ /\/elastic\/kibana\//) -} - -def isTrackedBranchPr() { - return isPr() && (env.ghprbTargetBranch == 'master' || env.ghprbTargetBranch == '6.8' || env.ghprbTargetBranch =~ /[7-8]\.[x0-9]+/) -} - -def getLatestBuildComment() { - return getComments() - .reverse() - .find { (it.user.login == 'elasticmachine' || it.user.login == 'kibanamachine') && it.body =~ // - if (!matches || !matches[0]) { - return null - } - - return toJSON(matches[0][1].trim()) -} - -def getLatestBuildInfo() { - return getLatestBuildInfo(getLatestBuildComment()) -} - -def getLatestBuildInfo(comment) { - return comment ? getBuildInfoFromComment(comment.body) : null -} - -def getHistoryText(builds) { - if (!builds || builds.size() < 1) { - return "" - } - - def list = builds - .reverse() - .collect { build -> - if (build.status == "SUCCESS") { - return "* :green_heart: [Build #${build.number}](${build.url}) succeeded ${build.commit}" - } else if(build.status == "UNSTABLE") { - return "* :yellow_heart: [Build #${build.number}](${build.url}) was flaky ${build.commit}" - } else { - return "* :broken_heart: [Build #${build.number}](${build.url}) failed ${build.commit}" - } - } - .join("\n") - - return "### History\n${list}" -} - -def getTestFailuresMessage() { - def failures = testUtils.getFailures() - if (!failures) { - return "" - } - - def messages = [] - messages << "---\n\n### [Test Failures](${env.BUILD_URL}testReport)" - - failures.take(3).each { failure -> - messages << """ -

${failure.fullDisplayName} - -[Link to Jenkins](${failure.url}) -""" - - if (failure.stdOut) { - messages << "\n#### Standard Out\n```\n${failure.stdOut}\n```" - } - - if (failure.stdErr) { - messages << "\n#### Standard Error\n```\n${failure.stdErr}\n```" - } - - if (failure.stacktrace) { - messages << "\n#### Stack Trace\n```\n${failure.stacktrace}\n```" - } - - messages << "
\n\n---" - } - - if (failures.size() > 3) { - messages << "and ${failures.size() - 3} more failures, only showing the first 3." - } - - return messages.join("\n") -} - -def getBuildStatusIncludingMetrics() { - def status = buildUtils.getBuildStatus() - - if (status == 'SUCCESS' && shouldCheckCiMetricSuccess() && !ciStats.getMetricsSuccess()) { - return 'FAILURE' - } - - return status -} - -def getNextCommentMessage(previousCommentInfo = [:], isFinal = false) { - def info = previousCommentInfo ?: [:] - info.builds = previousCommentInfo.builds ?: [] - - // When we update an in-progress comment, we need to remove the old version from the history - info.builds = info.builds.findAll { it.number != env.BUILD_NUMBER } - - def messages = [] - - def status = isFinal - ? getBuildStatusIncludingMetrics() - : buildUtils.getBuildStatus() - - def storybooksUrl = buildState.get('storybooksUrl') - def storybooksMessage = storybooksUrl ? "* [Storybooks Preview](${storybooksUrl})" : "* Storybooks not built" - - if (!isFinal) { - storybooksMessage = storybooksUrl ? storybooksMessage : "* Storybooks not built yet" - - def failuresPart = status != 'SUCCESS' ? ', with failures' : '' - messages << """ - ## :hourglass_flowing_sand: Build in-progress${failuresPart} - * [continuous-integration/kibana-ci/pull-request](${env.BUILD_URL}) - * Commit: ${getCommitHash()} - ${storybooksMessage} - * This comment will update when the build is complete - """ - } else if (status == 'SUCCESS') { - messages << """ - ## :green_heart: Build Succeeded - * [continuous-integration/kibana-ci/pull-request](${env.BUILD_URL}) - * Commit: ${getCommitHash()} - ${storybooksMessage} - ${getDocsChangesLink()} - """ - } else if(status == 'UNSTABLE') { - def message = """ - ## :yellow_heart: Build succeeded, but was flaky - * [continuous-integration/kibana-ci/pull-request](${env.BUILD_URL}) - * Commit: ${getCommitHash()} - ${storybooksMessage} - ${getDocsChangesLink()} - """.stripIndent() - - def failures = retryable.getFlakyFailures() - if (failures && failures.size() > 0) { - def list = failures.collect { " * ${it.label}" }.join("\n") - message += "* Flaky suites:\n${list}" - } - - messages << message - } else { - messages << """ - ## :broken_heart: Build Failed - * [continuous-integration/kibana-ci/pull-request](${env.BUILD_URL}) - * Commit: ${getCommitHash()} - ${storybooksMessage} - * [Pipeline Steps](${env.BUILD_URL}flowGraphTable) (look for red circles / failed steps) - * [Interpreting CI Failures](https://www.elastic.co/guide/en/kibana/current/interpreting-ci-failures.html) - ${getDocsChangesLink()} - """ - } - - if (status != 'SUCCESS' && status != 'UNSTABLE') { - try { - def steps = getFailedSteps() - if (steps?.size() > 0) { - def list = steps.collect { "* [${it.displayName}](${it.logs})" }.join("\n") - messages << "### Failed CI Steps\n${list}" - } - } catch (ex) { - buildUtils.printStacktrace(ex) - print "Error retrieving failed pipeline steps for PR comment, will skip this section" - } - } - - messages << getTestFailuresMessage() - - catchErrors { - if (isFinal && isTrackedBranchPr()) { - messages << ciStats.getMetricsReport() - } - } - - if (info.builds && info.builds.size() > 0) { - messages << getHistoryText(info.builds) - } - - messages << "To update your PR or re-run it, just comment with:\n`@elasticmachine merge upstream`" - - catchErrors { - def assignees = getAssignees() - if (assignees) { - messages << "cc " + assignees.collect { "@${it}"}.join(" ") - } - } - - info.builds << [ - status: status, - url: env.BUILD_URL, - number: env.BUILD_NUMBER, - commit: getCommitHash() - ] - - messages << """ - - """ - - return messages - .findAll { !!it } // No blank strings - .collect { it.stripIndent().trim() } // This just allows us to indent various strings above, but leaves them un-indented in the comment - .join("\n\n") -} - -def createComment(message) { - if (!isPr()) { - error "Trying to post a GitHub PR comment on a non-PR or non-elastic PR build" - } - - withGithubCredentials { - return githubApi.post("repos/elastic/kibana/issues/${env.ghprbPullId}/comments", [ body: message ]) - } -} - -def getComments() { - withGithubCredentials { - return githubIssues.getComments(env.ghprbPullId) - } -} - -def updateComment(commentId, message) { - if (!isPr()) { - error "Trying to post a GitHub PR comment on a non-PR or non-elastic PR build" - } - - withGithubCredentials { - def path = "repos/elastic/kibana/issues/comments/${commentId}" - def json = toJSON([ body: message ]).toString() - - def resp = githubApi([ path: path ], [ method: "POST", data: json, headers: [ "X-HTTP-Method-Override": "PATCH" ] ]) - return toJSON(resp) - } -} - -def deleteComment(commentId) { - withGithubCredentials { - def path = "repos/elastic/kibana/issues/comments/${commentId}" - return githubApi([ path: path ], [ method: "DELETE" ]) - } -} - -def getCommitHash() { - return env.ghprbActualCommit -} - -def getDocsChangesLink() { - def url = "https://kibana_${env.ghprbPullId}.docs-preview.app.elstc.co/diff" - - try { - // httpRequest throws on status codes >400 and failures - def resp = httpRequest([ method: "GET", url: url ]) - - if (resp.contains("There aren't any differences!")) { - return "" - } - - return "* [Documentation Changes](${url})" - } catch (ex) { - print "Failed to reach ${url}" - buildUtils.printStacktrace(ex) - } - - return "" -} - -def getFailedSteps() { - return jenkinsApi.getFailedSteps()?.findAll { step -> - step.displayName != 'Check out from version control' - } -} - -def shouldCheckCiMetricSuccess() { - // disable ciMetrics success check when a PR is targetting a non-tracked branch - if (buildState.has('checkoutInfo') && !buildState.get('checkoutInfo').targetsTrackedBranch) { - return false - } - - return true -} - -def getPR() { - withGithubCredentials { - def path = "repos/elastic/kibana/pulls/${env.ghprbPullId}" - return githubApi.get(path) - } -} - -def getAssignees() { - def pr = getPR() - if (!pr) { - return [] - } - - return pr.assignees.collect { it.login } -} diff --git a/vars/jenkinsApi.groovy b/vars/jenkinsApi.groovy deleted file mode 100644 index 57818593ffeb23..00000000000000 --- a/vars/jenkinsApi.groovy +++ /dev/null @@ -1,21 +0,0 @@ -def getSteps() { - def url = "${env.BUILD_URL}api/json?tree=actions[nodes[iconColor,running,displayName,id,parents]]" - def responseRaw = httpRequest([ method: "GET", url: url ]) - def response = toJSON(responseRaw) - - def graphAction = response?.actions?.find { it._class == "org.jenkinsci.plugins.workflow.job.views.FlowGraphAction" } - - return graphAction?.nodes -} - -def getFailedSteps() { - def steps = getSteps() - def failedSteps = steps?.findAll { (it.iconColor == "red" || it.iconColor == "red_anime") && it._class == "org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode" } - failedSteps.each { step -> - step.logs = "${env.BUILD_URL}execution/node/${step.id}/log".toString() - } - - return failedSteps -} - -return this diff --git a/vars/kibanaPipeline.groovy b/vars/kibanaPipeline.groovy deleted file mode 100644 index 374219d8006000..00000000000000 --- a/vars/kibanaPipeline.groovy +++ /dev/null @@ -1,496 +0,0 @@ -def withPostBuildReporting(Map params, Closure closure) { - try { - closure() - } finally { - def parallelWorkspaces = [] - try { - parallelWorkspaces = getParallelWorkspaces() - } catch(ex) { - print ex - } - - if (params.runErrorReporter) { - catchErrors { - runErrorReporter([pwd()] + parallelWorkspaces) - } - } - - catchErrors { - publishJunit() - } - - catchErrors { - def parallelWorkspace = "${env.WORKSPACE}/parallel" - if (fileExists(parallelWorkspace)) { - dir(parallelWorkspace) { - def workspaceTasks = [:] - - parallelWorkspaces.each { workspaceDir -> - workspaceTasks[workspaceDir] = { - dir(workspaceDir) { - catchErrors { - runbld.junit() - } - } - } - } - - if (workspaceTasks) { - parallel(workspaceTasks) - } - } - } - } - } -} - -def getParallelWorkspaces() { - def workspaces = [] - def parallelWorkspace = "${env.WORKSPACE}/parallel" - if (fileExists(parallelWorkspace)) { - dir(parallelWorkspace) { - // findFiles only returns files if you use glob, so look for a file that should be in every valid workspace - workspaces = findFiles(glob: '*/kibana/package.json') - .collect { - // get the paths to the kibana directories for the parallel workspaces - return parallelWorkspace + '/' + it.path.tokenize('/').dropRight(1).join('/') - } - } - } - - return workspaces -} - -def notifyOnError(Closure closure) { - try { - closure() - } catch (ex) { - // If this is the first failed step, it's likely that the error hasn't propagated up far enough to mark the build as a failure - currentBuild.result = 'FAILURE' - catchErrors { - githubPr.sendComment(false) - } - catchErrors { - // an empty map is a valid config, but is falsey, so let's use .has() - if (buildState.has('SLACK_NOTIFICATION_CONFIG')) { - slackNotifications.sendFailedBuild(buildState.get('SLACK_NOTIFICATION_CONFIG')) - } - } - throw ex - } -} - -def withFunctionalTestEnv(List additionalEnvs = [], Closure closure) { - // This can go away once everything that uses the deprecated workers.parallelProcesses() is moved to task queue - def parallelId = env.TASK_QUEUE_PROCESS_ID ?: env.CI_PARALLEL_PROCESS_NUMBER - - def kibanaPort = "61${parallelId}1" - def esPort = "62${parallelId}1" - // Ports 62x2-62x9 kept open for ES nodes - def esTransportPort = "63${parallelId}1-63${parallelId}9" - def fleetPackageRegistryPort = "64${parallelId}1" - def alertingProxyPort = "64${parallelId}2" - def corsTestServerPort = "64${parallelId}3" - // needed for https://github.com/elastic/kibana/issues/107246 - def proxyTestServerPort = "64${parallelId}4" - def contextPropagationOnly = githubPr.isPr() ? "true" : "false" - - withEnv([ - "CI_GROUP=${parallelId}", - "REMOVE_KIBANA_INSTALL_DIR=1", - "CI_PARALLEL_PROCESS_NUMBER=${parallelId}", - "TEST_KIBANA_HOST=localhost", - "TEST_KIBANA_PORT=${kibanaPort}", - "TEST_KIBANA_URL=http://elastic:changeme@localhost:${kibanaPort}", - "TEST_ES_URL=http://elastic:changeme@localhost:${esPort}", - "TEST_ES_TRANSPORT_PORT=${esTransportPort}", - "TEST_CORS_SERVER_PORT=${corsTestServerPort}", - "TEST_PROXY_SERVER_PORT=${proxyTestServerPort}", - "KBN_NP_PLUGINS_BUILT=true", - "FLEET_PACKAGE_REGISTRY_PORT=${fleetPackageRegistryPort}", - "ALERTING_PROXY_PORT=${alertingProxyPort}", - "ELASTIC_APM_ACTIVE=true", - "ELASTIC_APM_CONTEXT_PROPAGATION_ONLY=${contextPropagationOnly}", - "ELASTIC_APM_TRANSACTION_SAMPLE_RATE=0.1", - ] + additionalEnvs) { - closure() - } -} - -def functionalTestProcess(String name, Closure closure) { - return { - notifyOnError { - withFunctionalTestEnv(["JOB=${name}"], closure) - } - } -} - -def functionalTestProcess(String name, String script) { - return functionalTestProcess(name) { - retryable(name) { - runbld(script, "Execute ${name}") - } - } -} - -def ossCiGroupProcess(ciGroup, withDelay = false) { - return functionalTestProcess("ciGroup" + ciGroup) { - if (withDelay && !(ciGroup instanceof String) && !(ciGroup instanceof GString)) { - sleep((ciGroup-1)*30) // smooth out CPU spikes from ES startup - } - - withEnv([ - "CI_GROUP=${ciGroup}", - "JOB=kibana-ciGroup${ciGroup}", - ]) { - retryable("kibana-ciGroup${ciGroup}") { - runbld("./test/scripts/jenkins_ci_group.sh", "Execute kibana-ciGroup${ciGroup}") - } - } - } -} - -def xpackCiGroupProcess(ciGroup, withDelay = false) { - return functionalTestProcess("xpack-ciGroup" + ciGroup) { - if (withDelay && !(ciGroup instanceof String) && !(ciGroup instanceof GString)) { - sleep((ciGroup-1)*30) // smooth out CPU spikes from ES startup - } - withEnv([ - "CI_GROUP=${ciGroup}", - "JOB=xpack-kibana-ciGroup${ciGroup}", - ]) { - retryable("xpack-kibana-ciGroup${ciGroup}") { - runbld("./test/scripts/jenkins_xpack_ci_group.sh", "Execute xpack-kibana-ciGroup${ciGroup}") - } - } - } -} - -def uploadGcsArtifact(uploadPrefix, pattern) { - googleStorageUpload( - credentialsId: 'kibana-ci-gcs-plugin', - bucket: "gs://${uploadPrefix}", - pattern: pattern, - sharedPublicly: true, - showInline: true, - ) -} - -def withGcsArtifactUpload(workerName, closure) { - def uploadPrefix = "kibana-ci-artifacts/jobs/${env.JOB_NAME}/${BUILD_NUMBER}/${workerName}" - def ARTIFACT_PATTERNS = [ - 'target/junit/**/*', - 'target/kibana-*', - 'target/kibana-coverage/jest/**/*', - 'target/kibana-security-solution/**/*.png', - 'target/kibana-fleet/**/*.png', - 'target/test-metrics/*', - 'target/test-suites-ci-plan.json', - 'test/**/screenshots/diff/*.png', - 'test/**/screenshots/failure/*.png', - 'test/**/screenshots/session/*.png', - 'test/functional/failure_debug/html/*.html', - 'x-pack/test/**/screenshots/diff/*.png', - 'x-pack/test/**/screenshots/failure/*.png', - 'x-pack/test/**/screenshots/session/*.png', - 'x-pack/test/functional/failure_debug/html/*.html', - '.es/**/*.hprof' - ] - - withEnv([ - "GCS_UPLOAD_PREFIX=${uploadPrefix}" - ], { - try { - closure() - } finally { - catchErrors { - ARTIFACT_PATTERNS.each { pattern -> - uploadGcsArtifact(uploadPrefix, pattern) - } - - dir(env.WORKSPACE) { - ARTIFACT_PATTERNS.each { pattern -> - uploadGcsArtifact(uploadPrefix, "parallel/*/kibana/${pattern}") - } - } - } - } - }) -} - -def publishJunit() { - junit(testResults: 'target/junit/**/*.xml', allowEmptyResults: true, keepLongStdio: true) - - dir(env.WORKSPACE) { - junit(testResults: 'parallel/*/kibana/target/junit/**/*.xml', allowEmptyResults: true, keepLongStdio: true) - } -} - -def sendMail(Map params = [:]) { - // If the build doesn't have a result set by this point, there haven't been any errors and it can be marked as a success - // The e-mail plugin for the infra e-mail depends upon this being set - currentBuild.result = currentBuild.result ?: 'SUCCESS' - - def buildStatus = buildUtils.getBuildStatus() - if (buildStatus != 'SUCCESS' && buildStatus != 'ABORTED') { - node('flyweight') { - sendInfraMail() - sendKibanaMail(params) - } - } -} - -def sendInfraMail() { - catchErrors { - step([ - $class: 'Mailer', - notifyEveryUnstableBuild: true, - recipients: 'infra-root+build@elastic.co', - sendToIndividuals: false - ]) - } -} - -def sendKibanaMail(Map params = [:]) { - def config = [to: 'build-kibana@elastic.co'] + params - - catchErrors { - def buildStatus = buildUtils.getBuildStatus() - if(params.NOTIFY_ON_FAILURE && buildStatus != 'SUCCESS' && buildStatus != 'ABORTED') { - emailext( - config.to, - subject: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - ${buildStatus}", - body: '${SCRIPT,template="groovy-html.template"}', - mimeType: 'text/html', - ) - } - } -} - -def bash(script, label) { - sh( - script: "#!/bin/bash\n${script}", - label: label - ) -} - -def doSetup() { - notifyOnError { - retryWithDelay(2, 15) { - try { - runbld("./test/scripts/jenkins_setup.sh", "Setup Build Environment and Dependencies") - } catch (ex) { - try { - // Setup expects this directory to be missing, so we need to remove it before we do a retry - bash("rm -rf ../elasticsearch", "Remove elasticsearch sibling directory, if it exists") - } finally { - throw ex - } - } - } - } -} - -def getBuildArtifactBucket() { - def dir = env.ghprbPullId ? "pr-${env.ghprbPullId}" : buildState.get('checkoutInfo').branch.replace("/", "__") - return "gs://ci-artifacts.kibana.dev/default-build/${dir}/${buildState.get('checkoutInfo').commit}" -} - -def buildKibana(maxWorkers = '') { - notifyOnError { - withEnv(["KBN_OPTIMIZER_MAX_WORKERS=${maxWorkers}"]) { - runbld("./test/scripts/jenkins_build_kibana.sh", "Build Kibana") - } - - withGcpServiceAccount.fromVaultSecret('secret/kibana-issues/dev/ci-artifacts-key', 'value') { - bash(""" - cd "${env.WORKSPACE}" - gsutil -q -m cp 'kibana-default.tar.gz' '${getBuildArtifactBucket()}/' - gsutil -q -m cp 'kibana-default-plugins.tar.gz' '${getBuildArtifactBucket()}/' - """, "Upload Default Build artifacts to GCS") - } - } -} - -def downloadDefaultBuildArtifacts() { - withGcpServiceAccount.fromVaultSecret('secret/kibana-issues/dev/ci-artifacts-key', 'value') { - bash(""" - cd "${env.WORKSPACE}" - gsutil -q -m cp '${getBuildArtifactBucket()}/kibana-default.tar.gz' ./ - gsutil -q -m cp '${getBuildArtifactBucket()}/kibana-default-plugins.tar.gz' ./ - """, "Download Default Build artifacts from GCS") - } -} - -def runErrorReporter() { - return runErrorReporter([pwd()]) -} - -def runErrorReporter(workspaces) { - def status = buildUtils.getBuildStatus() - def dryRun = status != "ABORTED" ? "" : "--no-github-update" - - def globs = workspaces.collect { "'${it}/target/junit/**/*.xml'" }.join(" ") - - bash( - """ - source src/dev/ci_setup/setup_env.sh - node scripts/report_failed_tests --no-index-errors ${dryRun} ${globs} - """, - "Report failed tests, if necessary" - ) -} - -def call(Map params = [:], Closure closure) { - def config = [timeoutMinutes: 135, checkPrChanges: false, setCommitStatus: false] + params - - stage("Kibana Pipeline") { - timeout(time: config.timeoutMinutes, unit: 'MINUTES') { - timestamps { - ansiColor('xterm') { - if (config.setCommitStatus) { - buildState.set('shouldSetCommitStatus', true) - } - if (config.checkPrChanges && githubPr.isPr()) { - pipelineLibraryTests() - - print "Checking PR for changes to determine if CI needs to be run..." - - if (prChanges.areChangesSkippable()) { - print "No changes requiring CI found in PR, skipping." - return - } - } - try { - closure() - } finally { - if (config.setCommitStatus) { - githubCommitStatus.onFinish() - } - } - } - } - } - } -} - -// Creates a task queue using withTaskQueue, and copies the bootstrapped kibana repo into each process's workspace -// Note that node_modules are mostly symlinked to save time/space. See test/scripts/jenkins_setup_parallel_workspace.sh -def withCiTaskQueue(Map options = [:], Closure closure) { - def setupClosure = { - // This can't use runbld, because it expects the source to be there, which isn't yet - bash("${env.WORKSPACE}/kibana/test/scripts/jenkins_setup_parallel_workspace.sh", "Set up duplicate workspace for parallel process") - } - - def config = [parallel: 24, setup: setupClosure] + options - - withTaskQueue(config) { - closure.call() - } -} - -def scriptTask(description, script) { - return { - withFunctionalTestEnv { - notifyOnError { - runbld(script, description) - } - } - } -} - -def scriptTaskDocker(description, script) { - return { - withDocker(scriptTask(description, script)) - } -} - -def buildDocker() { - sh( - script: "./.ci/build_docker.sh", - label: 'Build CI Docker image' - ) -} - -def withDocker(Closure closure) { - docker - .image('kibana-ci') - .inside( - "-v /etc/runbld:/etc/runbld:ro -v '${env.JENKINS_HOME}:${env.JENKINS_HOME}' -v '/dev/shm/workspace:/dev/shm/workspace' --shm-size 2GB --cpus 4", - closure - ) -} - -def buildPlugins() { - runbld('./test/scripts/jenkins_build_plugins.sh', 'Build OSS Plugins') -} - -def withTasks(Map params = [:], Closure closure) { - catchErrors { - def config = [setupWork: {}, worker: [:], parallel: 24] + params - def workerConfig = [name: 'ci-worker', size: 'xxl', ramDisk: true] + config.worker - - workers.ci(workerConfig) { - withCiTaskQueue([parallel: config.parallel]) { - parallel([ - docker: { - retry(2) { - buildDocker() - } - }, - - // There are integration tests etc that require the plugins to be built first, so let's go ahead and build them before set up the parallel workspaces - plugins: { buildPlugins() }, - ]) - - config.setupWork() - - catchErrors { - closure() - } - } - } - } -} - -def allCiTasks() { - parallel([ - general: { - withTasks { - tasks.check() - tasks.lint() - tasks.test() - task { - buildKibana(16) - tasks.functionalOss() - tasks.functionalXpack() - } - tasks.storybooksCi() - } - }, - jest: { - workers.ci(name: 'jest', size: 'n2-standard-16', ramDisk: false) { - catchErrors { - scriptTask('Jest Unit Tests', 'test/scripts/test/jest_unit.sh')() - } - - catchErrors { - runbld.junit() - } - } - }, - ]) -} - -def pipelineLibraryTests() { - return - whenChanged(['vars/', '.ci/pipeline-library/']) { - workers.base(size: 'flyweight', bootstrapped: false, ramDisk: false) { - dir('.ci/pipeline-library') { - sh './gradlew test' - } - } - } -} - -return this diff --git a/vars/prChanges.groovy b/vars/prChanges.groovy deleted file mode 100644 index a8a81cade844c6..00000000000000 --- a/vars/prChanges.groovy +++ /dev/null @@ -1,82 +0,0 @@ -import groovy.transform.Field - -public static @Field PR_CHANGES_CACHE = [] - -// if all the changed files in a PR match one of these regular -// expressions then CI will be skipped for that PR -def getSkippablePaths() { - return [ - /^docs\//, - /^rfcs\//, - /^.ci\/.+\.yml$/, - /^.ci\/es-snapshots\//, - /^.ci\/pipeline-library\//, - /^.ci\/Jenkinsfile_[^\/]+$/, - /^\.github\//, - /\.md$/, - /^\.backportrc\.json$/, - /^\.buildkite\//, - ] -} - -// exclusion regular expressions that will invalidate paths that -// match one of the skippable path regular expressions -def getNotSkippablePaths() { - return [ - // this file is auto-generated and changes to it need to be validated with CI - /^docs\/developer\/plugin-list.asciidoc$/, - // don't skip CI on prs with changes to plugin readme files (?i) is for case-insensitive matching - /(?i)\/plugins\/[^\/]+\/readme\.(md|asciidoc)$/, - ] -} - -def areChangesSkippable() { - if (!githubPr.isPr()) { - return false - } - - try { - def skippablePaths = getSkippablePaths() - def notSkippablePaths = getNotSkippablePaths() - def files = getChangedFiles() - - // 3000 is the max files GH API will return - if (files.size() >= 3000) { - return false - } - - files = files.findAll { file -> - def skippable = skippablePaths.find { regex -> file =~ regex} && !notSkippablePaths.find { regex -> file =~ regex } - return !skippable - } - - return files.size() < 1 - } catch (ex) { - buildUtils.printStacktrace(ex) - print "Error while checking to see if CI is skippable based on changes. Will run CI." - return false - } -} - -def getChanges() { - if (!PR_CHANGES_CACHE && env.ghprbPullId) { - withGithubCredentials { - def changes = githubPrs.getChanges(env.ghprbPullId) - if (changes) { - PR_CHANGES_CACHE.addAll(changes) - } - } - } - - return PR_CHANGES_CACHE -} - -def getChangedFiles() { - def changes = getChanges() - def changedFiles = changes.collect { it.filename } - def renamedFiles = changes.collect { it.previousFilename }.findAll { it } - - return changedFiles + renamedFiles -} - -return this diff --git a/vars/retryWithDelay.groovy b/vars/retryWithDelay.groovy deleted file mode 100644 index 83fd94c6f2b1ec..00000000000000 --- a/vars/retryWithDelay.groovy +++ /dev/null @@ -1,18 +0,0 @@ -def call(retryTimes, delaySecs, closure) { - retry(retryTimes) { - try { - closure() - } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException ex) { - throw ex // Immediately re-throw build abort exceptions, don't sleep first - } catch (Exception ex) { - sleep delaySecs - throw ex - } - } -} - -def call(retryTimes, Closure closure) { - call(retryTimes, 15, closure) -} - -return this diff --git a/vars/retryable.groovy b/vars/retryable.groovy deleted file mode 100644 index bfd021ddd8167b..00000000000000 --- a/vars/retryable.groovy +++ /dev/null @@ -1,78 +0,0 @@ -import groovy.transform.Field - -public static @Field GLOBAL_RETRIES_ENABLED = false -public static @Field MAX_GLOBAL_RETRIES = 1 -public static @Field CURRENT_GLOBAL_RETRIES = 0 -public static @Field FLAKY_FAILURES = [] - -def setMax(max) { - retryable.MAX_GLOBAL_RETRIES = max -} - -def enable() { - retryable.GLOBAL_RETRIES_ENABLED = true -} - -def enable(max) { - enable() - setMax(max) -} - -def haveReachedMaxRetries() { - return retryable.CURRENT_GLOBAL_RETRIES >= retryable.MAX_GLOBAL_RETRIES -} - -def getFlakyFailures() { - return retryable.FLAKY_FAILURES -} - -def printFlakyFailures() { - catchErrors { - def failures = getFlakyFailures() - - if (failures && failures.size() > 0) { - print "This build had the following flaky failures:" - failures.each { - print "\n${it.label}" - buildUtils.printStacktrace(it.exception) - } - } - } -} - -def call(label, Closure closure) { - if (!retryable.GLOBAL_RETRIES_ENABLED) { - closure() - return - } - - try { - closure() - } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException ex) { - // If the build was aborted, don't retry the step - throw ex - } catch (Exception ex) { - if (haveReachedMaxRetries()) { - print "Couldn't retry '${label}', have already reached the max number of retries for this build." - throw ex - } - - retryable.CURRENT_GLOBAL_RETRIES++ - buildUtils.printStacktrace(ex) - unstable "${label} failed but is retryable, trying a second time..." - - def JOB = env.JOB ? "${env.JOB}-retry" : "" - withEnv([ - "JOB=${JOB}", - ]) { - closure() - } - - retryable.FLAKY_FAILURES << [ - label: label, - exception: ex, - ] - - unstable "${label} failed on the first attempt, but succeeded on the second. Marking it as flaky." - } -} diff --git a/vars/runbld.groovy b/vars/runbld.groovy deleted file mode 100644 index 80416d4fa9a412..00000000000000 --- a/vars/runbld.groovy +++ /dev/null @@ -1,17 +0,0 @@ -def call(script, label, enableJunitProcessing = false) { - // def extraConfig = enableJunitProcessing ? "" : "--config ${env.WORKSPACE}/kibana/.ci/runbld_no_junit.yml" - - sh( - script: "bash ${script}", - label: label ?: script - ) -} - -def junit() { - sh( - script: "/usr/local/bin/runbld -d '${pwd()}' ${env.WORKSPACE}/kibana/test/scripts/jenkins_runbld_junit.sh", - label: "Process JUnit reports with runbld" - ) -} - -return this diff --git a/vars/slackNotifications.groovy b/vars/slackNotifications.groovy deleted file mode 100644 index 02aad14d8ba3fb..00000000000000 --- a/vars/slackNotifications.groovy +++ /dev/null @@ -1,228 +0,0 @@ -def getFailedBuildBlocks() { - def messages = [ - getFailedSteps(), - getTestFailures(), - ] - - return messages - .findAll { !!it } // No blank strings - .collect { markdownBlock(it) } -} - -def dividerBlock() { - return [ type: "divider" ] -} - -// If a message is longer than the limit, split it up by '\n' into parts, and return as many parts as will fit within the limit -def shortenMessage(message, sizeLimit = 3000) { - if (message.size() <= sizeLimit) { - return message - } - - def truncatedMessage = "[...truncated...]" - - def parts = message.split("\n") - message = "" - - for(def part in parts) { - if ((message.size() + part.size() + truncatedMessage.size() + 1) > sizeLimit) { - break; - } - message += part+"\n" - } - - message += truncatedMessage - - return message.size() <= sizeLimit ? message : truncatedMessage -} - -def markdownBlock(message) { - return [ - type: "section", - text: [ - type: "mrkdwn", - text: shortenMessage(message, 3000), // 3000 is max text length for `section`s only - ], - ] -} - -def contextBlock(message) { - return [ - type: "context", - elements: [ - [ - type: 'mrkdwn', - text: message, // Not sure what the size limit is here, I tried 10000s of characters and it still worked - ] - ] - ] -} - -def getFailedSteps() { - try { - def steps = jenkinsApi.getFailedSteps()?.findAll { step -> - step.displayName != 'Check out from version control' - } - - if (steps?.size() > 0) { - def list = steps.collect { "• <${it.logs}|${it.displayName}>" }.join("\n") - return "*Failed Steps*\n${list}" - } - } catch (ex) { - buildUtils.printStacktrace(ex) - print "Error retrieving failed pipeline steps for PR comment, will skip this section" - } - - return "" -} - -def getTestFailures() { - def failures = testUtils.getFailures() - if (!failures) { - return "" - } - - def messages = [] - messages << "*Test Failures*" - - def list = failures.take(10).collect { - def name = it - .fullDisplayName - .split(/\./, 2)[-1] - // Only the following three characters need to be escaped for link text, per Slack's docs - .replaceAll('&', '&') - .replaceAll('<', '<') - .replaceAll('>', '>') - - return "• <${it.url}|${name}>" - }.join("\n") - - def moreText = failures.size() > 10 ? "\n• ...and ${failures.size()-10} more" : "" - return "*Test Failures*\n${list}${moreText}" -} - -def getDefaultDisplayName() { - return "${env.JOB_NAME} ${env.BUILD_DISPLAY_NAME}" -} - -def getDefaultContext(config = [:]) { - def progressMessage = "" - if (config && !config.isFinal) { - progressMessage = "In-progress" - } else { - def duration = currentBuild.durationString.replace(' and counting', '') - progressMessage = "${buildUtils.getBuildStatus().toLowerCase().capitalize()} after ${duration}" - } - - return contextBlock([ - progressMessage, - "", - ].join(' · ')) -} - -def getStatusIcon(config = [:]) { - if (config && !config.isFinal) { - return ':hourglass_flowing_sand:' - } - - def status = buildUtils.getBuildStatus() - if (status == 'UNSTABLE') { - return ':yellow_heart:' - } - - return ':broken_heart:' -} - -def getBackupMessage(config) { - return "${getStatusIcon(config)} ${config.title}\n\nFirst attempt at sending this notification failed. Please check the build." -} - -def sendFailedBuild(Map params = [:]) { - def config = [ - channel: '#kibana-operations-alerts', - title: "*<${env.BUILD_URL}|${getDefaultDisplayName()}>*", - message: getDefaultDisplayName(), - color: 'danger', - icon: ':jenkins:', - username: 'Kibana Operations', - isFinal: false, - ] + params - - config.context = config.context ?: getDefaultContext(config) - - def title = "${getStatusIcon(config)} ${config.title}" - def message = "${getStatusIcon(config)} ${config.message}" - - def blocks = [markdownBlock(title)] - getFailedBuildBlocks().each { blocks << it } - blocks << dividerBlock() - blocks << config.context - - def channel = config.channel - def timestamp = null - - def previousResp = buildState.get('SLACK_NOTIFICATION_RESPONSE') - if (previousResp) { - // When using `timestamp` to update a previous message, you have to use the channel ID from the previous response - channel = previousResp.channelId - timestamp = previousResp.ts - } - - def resp = slackSend( - channel: channel, - timestamp: timestamp, - username: config.username, - iconEmoji: config.icon, - color: config.color, - message: message, - blocks: blocks - ) - - if (!resp) { - resp = slackSend( - channel: config.channel, - username: config.username, - iconEmoji: config.icon, - color: config.color, - message: message, - blocks: [markdownBlock(getBackupMessage(config))] - ) - } - - if (resp) { - buildState.set('SLACK_NOTIFICATION_RESPONSE', resp) - } -} - -def onFailure(Map options = [:]) { - catchError { - def status = buildUtils.getBuildStatus() - if (status != "SUCCESS") { - catchErrors { - options.isFinal = true - sendFailedBuild(options) - } - } - } -} - -def onFailure(Map options = [:], Closure closure) { - if (options.disabled) { - catchError { - closure() - } - - return - } - - buildState.set('SLACK_NOTIFICATION_CONFIG', options) - - // try/finally will NOT work here, because the build status will not have been changed to ERROR when the finally{} block executes - catchError { - closure() - } - - onFailure(options) -} - -return this diff --git a/vars/storybooks.groovy b/vars/storybooks.groovy deleted file mode 100644 index f3c4a97a7d4364..00000000000000 --- a/vars/storybooks.groovy +++ /dev/null @@ -1,83 +0,0 @@ -def getStorybooksBucket() { - return "ci-artifacts.kibana.dev/storybooks" -} - -def getDestinationDir() { - return env.ghprbPullId ? "pr-${env.ghprbPullId}" : buildState.get('checkoutInfo').branch.replace("/", "__") -} - -def getUrl() { - return "https://${getStorybooksBucket()}/${getDestinationDir()}" -} - -def getUrlLatest() { - return "${getUrl()}/latest" -} - -def getUrlForCommit() { - return "${getUrl()}/${buildState.get('checkoutInfo').commit}" -} - -def upload() { - dir("built_assets/storybook") { - sh "mv ci_composite composite" - - def storybooks = sh( - script: 'ls -1d */', - returnStdout: true - ).trim() - .split('\n') - .collect { it.replace('/', '') } - .findAll { it != 'composite' } - - def listHtml = storybooks.collect { """
  • ${it}
  • """ }.join("\n") - - def html = """ - - -

    Storybooks

    -

    Composite Storybook

    -

    All

    -
      - ${listHtml} -
    - - - """ - - writeFile(file: 'index.html', text: html) - - withGcpServiceAccount.fromVaultSecret('secret/kibana-issues/dev/ci-artifacts-key', 'value') { - kibanaPipeline.bash(""" - gsutil -q -m cp -r -z js,css,html,json,map,txt,svg '*' 'gs://${getStorybooksBucket()}/${getDestinationDir()}/${buildState.get('checkoutInfo').commit}/' - gsutil -h "Cache-Control:no-cache, max-age=0, no-transform" cp -z html 'index.html' 'gs://${getStorybooksBucket()}/${getDestinationDir()}/latest/' - """, "Upload Storybooks to GCS") - } - - buildState.set('storybooksUrl', getUrlForCommit()) - } -} - -def build() { - withEnv(["STORYBOOK_BASE_URL=${getUrlForCommit()}"]) { - kibanaPipeline.bash('test/scripts/jenkins_storybook.sh', 'Build Storybooks') - } -} - -def buildAndUpload() { - def sha = buildState.get('checkoutInfo').commit - def context = 'Build and Publish Storybooks' - - githubCommitStatus.create(sha, 'pending', 'Building Storybooks', context) - - try { - build() - upload() - githubCommitStatus.create(sha, 'success', 'Storybooks built', context, getUrlForCommit()) - } catch(ex) { - githubCommitStatus.create(sha, 'error', 'Building Storybooks failed', context) - throw ex - } -} - -return this diff --git a/vars/task.groovy b/vars/task.groovy deleted file mode 100644 index 0c07b519b6fefc..00000000000000 --- a/vars/task.groovy +++ /dev/null @@ -1,5 +0,0 @@ -def call(Closure closure) { - withTaskQueue.addTask(closure) -} - -return this diff --git a/vars/tasks.groovy b/vars/tasks.groovy deleted file mode 100644 index 9a1ea053e9c496..00000000000000 --- a/vars/tasks.groovy +++ /dev/null @@ -1,201 +0,0 @@ -def call(List closures) { - withTaskQueue.addTasks(closures) -} - -def check() { - tasks([ - kibanaPipeline.scriptTask('Quick Commit Checks', 'test/scripts/checks/commit/commit.sh'), - kibanaPipeline.scriptTask('Check Telemetry Schema', 'test/scripts/checks/telemetry.sh'), - kibanaPipeline.scriptTask('Check TypeScript Projects', 'test/scripts/checks/ts_projects.sh'), - kibanaPipeline.scriptTask('Check Jest Configs', 'test/scripts/checks/jest_configs.sh'), - kibanaPipeline.scriptTask('Check @kbn/pm Distributable', 'test/scripts/checks/kbn_pm_dist.sh'), - kibanaPipeline.scriptTask('Check Plugin List Docs', 'test/scripts/checks/plugin_list_docs.sh'), - kibanaPipeline.scriptTask('Check Types and Public API Docs', 'test/scripts/checks/type_check_plugin_public_api_docs.sh'), - kibanaPipeline.scriptTask('Check Bundle Limits', 'test/scripts/checks/bundle_limits.sh'), - kibanaPipeline.scriptTask('Check i18n', 'test/scripts/checks/i18n.sh'), - kibanaPipeline.scriptTask('Check File Casing', 'test/scripts/checks/file_casing.sh'), - kibanaPipeline.scriptTask('Check Licenses', 'test/scripts/checks/licenses.sh'), - kibanaPipeline.scriptTask('Check Plugins With Circular Dependencies', 'test/scripts/checks/plugins_with_circular_deps.sh'), - kibanaPipeline.scriptTask('Verify NOTICE', 'test/scripts/checks/verify_notice.sh'), - kibanaPipeline.scriptTask('Test Projects', 'test/scripts/checks/test_projects.sh'), - kibanaPipeline.scriptTask('Test Hardening', 'test/scripts/checks/test_hardening.sh'), - ]) -} - -def lint() { - tasks([ - kibanaPipeline.scriptTask('Lint: eslint', 'test/scripts/lint/eslint.sh'), - kibanaPipeline.scriptTask('Lint: stylelint', 'test/scripts/lint/stylelint.sh'), - ]) -} - -def test() { - tasks([ - // This task requires isolation because of hard-coded, conflicting ports and such, so let's use Docker here - kibanaPipeline.scriptTaskDocker('Jest Integration Tests', 'test/scripts/test/jest_integration.sh'), - kibanaPipeline.scriptTask('API Integration Tests', 'test/scripts/test/api_integration.sh'), - ]) -} - -def ossCiGroups() { - def ciGroups = 1..11 - tasks(ciGroups.collect { kibanaPipeline.ossCiGroupProcess(it, true) }) -} - -def xpackCiGroups() { - def ciGroups = 1..13 - tasks(ciGroups.collect { kibanaPipeline.xpackCiGroupProcess(it, true) }) -} - -def xpackCiGroupDocker() { - task { - workers.ci(name: 'xpack-cigroups-docker', size: 'm', ramDisk: true) { - kibanaPipeline.downloadDefaultBuildArtifacts() - kibanaPipeline.bash(""" - cd '${env.WORKSPACE}' - mkdir -p kibana-build - tar -xzf kibana-default.tar.gz -C kibana-build --strip=1 - tar -xzf kibana-default-plugins.tar.gz -C kibana - """, "Extract Default Build artifacts") - kibanaPipeline.xpackCiGroupProcess('Docker', true)() - } - } -} - -def functionalOss(Map params = [:]) { - def config = params ?: [ - serverIntegration: true, - ciGroups: true, - firefox: true, - accessibility: true, - pluginFunctional: true, - visualRegression: false, - ] - - task { - if (config.ciGroups) { - ossCiGroups() - } - - if (config.firefox) { - task(kibanaPipeline.functionalTestProcess('oss-firefox', './test/scripts/jenkins_firefox_smoke.sh')) - } - - if (config.accessibility) { - task(kibanaPipeline.functionalTestProcess('oss-accessibility', './test/scripts/jenkins_accessibility.sh')) - } - - if (config.pluginFunctional) { - task(kibanaPipeline.functionalTestProcess('oss-pluginFunctional', './test/scripts/jenkins_plugin_functional.sh')) - } - - if (config.visualRegression) { - task(kibanaPipeline.functionalTestProcess('oss-visualRegression', './test/scripts/jenkins_visual_regression.sh')) - } - - if (config.serverIntegration) { - task(kibanaPipeline.scriptTaskDocker('serverIntegration', './test/scripts/test/server_integration.sh')) - } - } -} - -def functionalXpack(Map params = [:]) { - def config = params ?: [ - ciGroups: true, - firefox: true, - accessibility: true, - pluginFunctional: true, - savedObjectsFieldMetrics:true, - pageLoadMetrics: false, - visualRegression: false, - ] - - task { - if (config.ciGroups) { - xpackCiGroups() - xpackCiGroupDocker() - } - - if (config.firefox) { - task(kibanaPipeline.functionalTestProcess('xpack-firefox', './test/scripts/jenkins_xpack_firefox_smoke.sh')) - } - - if (config.accessibility) { - task(kibanaPipeline.functionalTestProcess('xpack-accessibility', './test/scripts/jenkins_xpack_accessibility.sh')) - } - - if (config.visualRegression) { - task(kibanaPipeline.functionalTestProcess('xpack-visualRegression', './test/scripts/jenkins_xpack_visual_regression.sh')) - } - - if (config.savedObjectsFieldMetrics) { - task(kibanaPipeline.functionalTestProcess('xpack-savedObjectsFieldMetrics', './test/scripts/jenkins_xpack_saved_objects_field_metrics.sh')) - } - - whenChanged([ - 'x-pack/plugins/security_solution/', - 'x-pack/plugins/cases/', - 'x-pack/plugins/timelines/', - 'x-pack/plugins/lists/', - 'x-pack/test/security_solution_cypress/', - 'x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/', - 'x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx', - 'x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/', - ]) { - if (githubPr.isPr()) { - task(kibanaPipeline.functionalTestProcess('xpack-securitySolutionCypressChrome', './test/scripts/jenkins_security_solution_cypress_chrome.sh')) - // Temporarily disabled to figure out test flake - // task(kibanaPipeline.functionalTestProcess('xpack-securitySolutionCypressFirefox', './test/scripts/jenkins_security_solution_cypress_firefox.sh')) - } - } - - whenChanged([ - 'x-pack/plugins/apm/', - ]) { - if (githubPr.isPr()) { - task(kibanaPipeline.functionalTestProcess('xpack-APMCypress', './test/scripts/jenkins_apm_cypress.sh')) - } - } - - whenChanged([ - 'x-pack/plugins/synthetics/', - ]) { - if (githubPr.isPr()) { - task(kibanaPipeline.functionalTestProcess('xpack-UptimePlaywright', './test/scripts/jenkins_uptime_playwright.sh')) - } - } - - whenChanged([ - 'x-pack/plugins/ux/', - ]) { - if (githubPr.isPr()) { - task(kibanaPipeline.functionalTestProcess('xpack-uxPluginSynthetics', './test/scripts/jenkins_ux_synthetics.sh')) - } - } - - whenChanged([ - 'x-pack/plugins/fleet/', - ]) { - if (githubPr.isPr()) { - task(kibanaPipeline.functionalTestProcess('xpack-FleetCypress', './test/scripts/jenkins_fleet_cypress.sh')) - } - } - - whenChanged([ - 'x-pack/plugins/osquery/', - ]) { - if (githubPr.isPr()) { - task(kibanaPipeline.functionalTestProcess('xpack-osqueryCypress', './test/scripts/jenkins_osquery_cypress.sh')) - } - } - - } -} - -def storybooksCi() { - task { - storybooks.buildAndUpload() - } -} - -return this diff --git a/vars/whenChanged.groovy b/vars/whenChanged.groovy deleted file mode 100644 index c58ec83f2b051e..00000000000000 --- a/vars/whenChanged.groovy +++ /dev/null @@ -1,57 +0,0 @@ -/* - whenChanged('some/path') { yourCode() } can be used to execute pipeline code in PRs only when changes are detected on paths that you specify. - The specified code blocks will also always be executed during the non-PR jobs for tracked branches. - - You have the option of passing in path prefixes, or regexes. Single or multiple. - Path specifications are NOT globby, they are only prefixes. - Specifying multiple will treat them as ORs. - - Example Usages: - whenChanged('a/path/prefix/') { someCode() } - whenChanged(startsWith: 'a/path/prefix/') { someCode() } // Same as above - whenChanged(['prefix1/', 'prefix2/']) { someCode() } - whenChanged(regex: /\.test\.js$/) { someCode() } - whenChanged(regex: [/abc/, /xyz/]) { someCode() } -*/ - -def call(String startsWithString, Closure closure) { - return whenChanged([ startsWith: startsWithString ], closure) -} - -def call(List startsWithStrings, Closure closure) { - return whenChanged([ startsWith: startsWithStrings ], closure) -} - -def call(Map params, Closure closure) { - if (!githubPr.isPr()) { - return closure() - } - - def files = prChanges.getChangedFiles() - def hasMatch = false - - if (params.regex) { - params.regex = [] + params.regex - print "Checking PR for changes that match: ${params.regex.join(', ')}" - hasMatch = !!files.find { file -> - params.regex.find { regex -> file =~ regex } - } - } - - if (!hasMatch && params.startsWith) { - params.startsWith = [] + params.startsWith - print "Checking PR for changes that start with: ${params.startsWith.join(', ')}" - hasMatch = !!files.find { file -> - params.startsWith.find { str -> file.startsWith(str) } - } - } - - if (hasMatch) { - print "Changes found, executing pipeline." - closure() - } else { - print "No changes found, skipping." - } -} - -return this diff --git a/vars/withGithubCredentials.groovy b/vars/withGithubCredentials.groovy deleted file mode 100644 index 224e49af1bd6f2..00000000000000 --- a/vars/withGithubCredentials.groovy +++ /dev/null @@ -1,9 +0,0 @@ -def call(closure) { - withCredentials([ - string(credentialsId: '2a9602aa-ab9f-4e52-baf3-b71ca88469c7', variable: 'GITHUB_TOKEN'), - ]) { - closure() - } -} - -return this diff --git a/vars/withTaskQueue.groovy b/vars/withTaskQueue.groovy deleted file mode 100644 index 8132d6264744f2..00000000000000 --- a/vars/withTaskQueue.groovy +++ /dev/null @@ -1,154 +0,0 @@ -import groovy.transform.Field - -public static @Field TASK_QUEUES = [:] -public static @Field TASK_QUEUES_COUNTER = 0 - -/** - withTaskQueue creates a queue of "tasks" (just plain closures to execute), and executes them with your desired level of concurrency. - This way, you can define, for example, 40 things that need to execute, then only allow 10 of them to execute at once. - - Each "process" will execute in a separate, unique, empty directory. - If you want each process to have a bootstrapped kibana repo, check out kibanaPipeline.withCiTaskQueue - - Using the queue currently requires an agent/worker. - - Usage: - - withTaskQueue(parallel: 10) { - task { print "This is a task" } - - // This is the same as calling task() multiple times - tasks([ { print "Another task" }, { print "And another task" } ]) - - // Tasks can queue up subsequent tasks - task { - buildThing() - task { print "I depend on buildThing()" } - } - } - - You can also define a setup task that each process should execute one time before executing tasks: - withTaskQueue(parallel: 10, setup: { sh "my-setup-scrupt.sh" }) { - ... - } - -*/ -def call(Map options = [:], Closure closure) { - def config = [ parallel: 10 ] + options - def counter = ++TASK_QUEUES_COUNTER - - // We're basically abusing withEnv() to create a "scope" for all steps inside of a withTaskQueue block - // This way, we could have multiple task queue instances in the same pipeline - withEnv(["TASK_QUEUE_ID=${counter}"]) { - withTaskQueue.TASK_QUEUES[env.TASK_QUEUE_ID] = [ - tasks: [], - tmpFile: sh(script: 'mktemp', returnStdout: true).trim() - ] - - closure.call() - - def processesExecuting = 0 - def processes = [:] - def iterationId = 0 - - for(def i = 1; i <= config.parallel; i++) { - def j = i - processes["task-queue-process-${j}"] = { - catchErrors { - withEnv([ - "TASK_QUEUE_PROCESS_ID=${j}", - "TASK_QUEUE_ITERATION_ID=${++iterationId}" - ]) { - dir("${WORKSPACE}/parallel/${j}/kibana") { - if (config.setup) { - config.setup.call(j) - } - - def isDone = false - while(!isDone) { // TODO some kind of timeout? - catchErrors { - if (!getTasks().isEmpty()) { - processesExecuting++ - catchErrors { - def task - try { - task = getTasks().pop() - } catch (java.util.NoSuchElementException ex) { - return - } - - task.call() - } - processesExecuting-- - // If a task finishes, and no new tasks were queued up, and nothing else is executing - // Then all of the processes should wake up and exit - if (processesExecuting < 1 && getTasks().isEmpty()) { - taskNotify() - } - return - } - - if (processesExecuting > 0) { - taskSleep() - return - } - - // Queue is empty, no processes are executing - isDone = true - } - } - } - } - } - } - } - parallel(processes) - } -} - -// If we sleep in a loop using Groovy code, Pipeline Steps is flooded with Sleep steps -// So, instead, we just watch a file and `touch` it whenever something happens that could modify the queue -// There's a 20 minute timeout just in case something goes wrong, -// in which case this method will get called again if the process is actually supposed to be waiting. -def taskSleep() { - sh(script: """#!/bin/bash - TIMESTAMP=\$(date '+%s' -d "0 seconds ago") - for (( i=1; i<=240; i++ )) - do - if [ "\$(stat -c %Y '${getTmpFile()}')" -ge "\$TIMESTAMP" ] - then - break - else - sleep 5 - if [[ \$i == 240 ]]; then - echo "Waited for new tasks for 20 minutes, exiting in case something went wrong" - fi - fi - done - """, label: "Waiting for new tasks...") -} - -// Used to let the task queue processes know that either a new task has been queued up, or work is complete -def taskNotify() { - sh "touch '${getTmpFile()}'" -} - -def getTasks() { - return withTaskQueue.TASK_QUEUES[env.TASK_QUEUE_ID].tasks -} - -def getTmpFile() { - return withTaskQueue.TASK_QUEUES[env.TASK_QUEUE_ID].tmpFile -} - -def addTask(Closure closure) { - getTasks() << closure - taskNotify() -} - -def addTasks(List closures) { - closures.reverse().each { - getTasks() << it - } - taskNotify() -} diff --git a/vars/workers.groovy b/vars/workers.groovy deleted file mode 100644 index ea67ce415738f2..00000000000000 --- a/vars/workers.groovy +++ /dev/null @@ -1,206 +0,0 @@ -// "Workers" in this file will spin up an instance, do some setup etc depending on the configuration, and then execute some work that you define -// e.g. workers.base(name: 'my-worker') { sh "echo 'ready to execute some kibana scripts'" } - -def label(size) { - switch(size) { - case 'flyweight': - return 'flyweight' - case 's': - return 'docker && linux && immutable' - case 's-highmem': - return 'docker && tests-s' - case 'm': - return 'docker && linux && immutable && gobld/machineType:n2-standard-8' - case 'm-highmem': - return 'docker && linux && immutable && gobld/machineType:n1-highmem-8' - case 'l': - return 'docker && tests-l' - case 'xl': - return 'docker && tests-xl' - case 'xl-highmem': - return 'docker && tests-xl-highmem' - case 'xxl': - return 'docker && tests-xxl && gobld/machineType:custom-64-327680' - case 'n2-standard-16': - return 'docker && linux && immutable && gobld/machineType:n2-standard-16' - } - - error "unknown size '${size}'" -} - -/* - The base worker that all of the others use. Will clone the scm (assumed to be kibana), and run kibana bootstrap processes by default. - - Parameters: - size - size of worker label to use, e.g. 's' or 'xl' - ramDisk - Should the workspace be mounted in memory? Default: true - bootstrapped - If true, download kibana dependencies, run kbn bootstrap, etc. Default: true - name - Name of the worker for display purposes, filenames, etc. - scm - Jenkins scm configuration for checking out code. Use `null` to disable checkout. Default: inherited from job -*/ -def base(Map params, Closure closure) { - def config = [size: '', ramDisk: true, bootstrapped: true, name: 'unnamed-worker', scm: scm] + params - if (!config.size) { - error "You must specify an agent size, such as 'xl' or 's', when using workers.base()" - } - - node(label(config.size)) { - agentInfo.print() - - if (config.ramDisk) { - // Move to a temporary workspace, so that we can symlink the real workspace into /dev/shm - def originalWorkspace = env.WORKSPACE - ws('/tmp/workspace') { - sh( - script: """ - mkdir -p /dev/shm/workspace - mkdir -p '${originalWorkspace}' # create all of the directories leading up to the workspace, if they don't exist - rm --preserve-root -rf '${originalWorkspace}' # then remove just the workspace, just in case there's stuff in it - ln -s /dev/shm/workspace '${originalWorkspace}' - """, - label: "Move workspace to RAM - /dev/shm/workspace" - ) - } - } - - sh( - script: "mkdir -p ${env.WORKSPACE}/tmp", - label: "Create custom temp directory" - ) - - def checkoutInfo = [:] - - if (config.scm) { - // Try to clone from Github up to 8 times, waiting 15 secs between attempts - retryWithDelay(8, 15) { - kibanaCheckout() - } - - dir("kibana") { - checkoutInfo = getCheckoutInfo() - - if (!buildState.has('checkoutInfo')) { - buildState.set('checkoutInfo', checkoutInfo) - - if (buildState.get('shouldSetCommitStatus')) { - githubCommitStatus.onStart() - } - } - } - - ciStats.reportGitInfo( - checkoutInfo.branch, - checkoutInfo.commit, - checkoutInfo.targetBranch, - checkoutInfo.mergeBase - ) - } - - withEnv([ - "CI=true", - "HOME=${env.JENKINS_HOME}", - "PR_NUMBER=${env.ghprbPullId ?: ''}", - "PR_SOURCE_BRANCH=${env.ghprbSourceBranch ?: ''}", - "PR_TARGET_BRANCH=${env.ghprbTargetBranch ?: ''}", - "PR_MERGE_BASE=${checkoutInfo.mergeBase ?: ''}", - "PR_AUTHOR=${env.ghprbPullAuthorLogin ?: ''}", - "TEST_BROWSER_HEADLESS=1", - "GIT_COMMIT=${checkoutInfo.commit}", - "GIT_BRANCH=${checkoutInfo.branch}", - "TMPDIR=${env.WORKSPACE}/tmp", // For Chrome and anything else that respects it - ]) { - withCredentials([ - string(credentialsId: 'vault-addr', variable: 'VAULT_ADDR'), - string(credentialsId: 'vault-role-id', variable: 'VAULT_ROLE_ID'), - string(credentialsId: 'vault-secret-id', variable: 'VAULT_SECRET_ID'), - ]) { - // scm is configured to check out to the ./kibana directory - dir('kibana') { - if (config.bootstrapped) { - kibanaPipeline.doSetup() - } - - closure() - } - } - } - } -} - -// Worker for ci processes. Extends the base worker and adds GCS artifact upload, error reporting, junit processing -def ci(Map params, Closure closure) { - def config = [ramDisk: true, bootstrapped: true, runErrorReporter: true] + params - - return base(config) { - kibanaPipeline.withGcsArtifactUpload(config.name) { - kibanaPipeline.withPostBuildReporting(config) { - closure() - } - } - } -} - -// Worker for running the current intake jobs. Just runs a single script after bootstrap. -def intake(jobName, String script) { - return { - ci(name: jobName, size: 'm-highmem', ramDisk: true) { - withEnv(["JOB=${jobName}"]) { - kibanaPipeline.notifyOnError { - runbld(script, "Execute ${jobName}") - } - } - } - } -} - -// Worker for running functional tests. Runs a setup process (e.g. the kibana build) then executes a map of closures in parallel (e.g. one for each ciGroup) -def functional(name, Closure setup, Map processes) { - return { - parallelProcesses(name: name, setup: setup, processes: processes, delayBetweenProcesses: 20, size: 'xl') - } -} - -/* - Creates a ci worker that can run a setup process, followed by a group of processes in parallel. - - Parameters: - name: Name of the worker for display purposes, filenames, etc. - setup: Closure to execute after the agent is bootstrapped, before starting the parallel work - processes: Map of closures that will execute in parallel after setup. Each closure is passed a unique number. - delayBetweenProcesses: Number of seconds to wait between starting the parallel processes. Useful to spread the load of heavy init processes, e.g. Elasticsearch starting up. Default: 0 - size: size of worker label to use, e.g. 's' or 'xl' -*/ -def parallelProcesses(Map params) { - def config = [name: 'parallel-worker', setup: {}, processes: [:], delayBetweenProcesses: 0, size: 'xl'] + params - - ci(size: config.size, name: config.name) { - config.setup() - - def nextProcessNumber = 1 - def process = { processName, processClosure -> - def processNumber = nextProcessNumber - nextProcessNumber++ - - return { - if (config.delayBetweenProcesses && config.delayBetweenProcesses > 0) { - // This delay helps smooth out CPU load caused by ES/Kibana instances starting up at the same time - def delay = (processNumber-1)*config.delayBetweenProcesses - sleep(delay) - } - - withEnv(["CI_PARALLEL_PROCESS_NUMBER=${processNumber}"]) { - processClosure() - } - } - } - - def processes = [:] - config.processes.each { processName, processClosure -> - processes[processName] = process(processName, processClosure) - } - - parallel(processes) - } -} - -return this diff --git a/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx b/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx index f23470bbbe7a7c..4e9bf8d2726ea2 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/alerts/settings/alerts_settings.tsx @@ -70,12 +70,6 @@ const AlertsSettingsComponent = ({ knowledgeBase, setUpdatedKnowledgeBaseSetting - - - {i18n.ASK_QUESTIONS_ABOUT} - - - - {i18n.LATEST_AND_RISKIEST_OPEN_ALERTS} + {i18n.LATEST_AND_RISKIEST_OPEN_ALERTS(knowledgeBase.latestAlerts)} diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx index ebb5afe2f12a1e..9119e024adcb29 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx @@ -42,7 +42,6 @@ const fetchConnectorArgs: FetchConnectorExecuteAction = { http: mockHttp, messages, onNewReplacements: jest.fn(), - ragOnAlerts: false, }; describe('API tests', () => { beforeEach(() => { @@ -91,7 +90,6 @@ describe('API tests', () => { alertsIndexPattern: '.alerts-security.alerts-default', allow: ['a', 'b', 'c'], allowReplacement: ['b', 'c'], - ragOnAlerts: true, replacements: { auuid: 'real.hostname' }, size: 30, }; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx index c2bdd4806a99ac..f186dab22f668f 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx @@ -29,7 +29,6 @@ export interface FetchConnectorExecuteAction { http: HttpSetup; messages: Message[]; onNewReplacements: (newReplacements: Record) => void; - ragOnAlerts: boolean; replacements?: Record; signal?: AbortSignal | undefined; size?: number; @@ -55,7 +54,6 @@ export const fetchConnectorExecuteAction = async ({ http, messages, onNewReplacements, - ragOnAlerts, replacements, apiConfig, signal, @@ -90,7 +88,6 @@ export const fetchConnectorExecuteAction = async ({ alertsIndexPattern, allow, allowReplacement, - ragOnAlerts, replacements, size, }); @@ -192,7 +189,6 @@ export const fetchConnectorExecuteAction = async ({ response: hasParsableResponse({ alerts, assistantLangChain, - ragOnAlerts, }) ? getFormattedMessageContent(response.data) : response.data, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx index ac72fc27dd891d..e866cad765456b 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx @@ -33,8 +33,7 @@ export const AssistantOverlay = React.memo(() => { WELCOME_CONVERSATION_TITLE ); const [promptContextId, setPromptContextId] = useState(); - const { assistantTelemetry, setShowAssistantOverlay, localStorageLastConversationId } = - useAssistantContext(); + const { assistantTelemetry, setShowAssistantOverlay, getConversationId } = useAssistantContext(); // Bind `showAssistantOverlay` in SecurityAssistantContext to this modal instance const showOverlay = useCallback( @@ -44,16 +43,18 @@ export const AssistantOverlay = React.memo(() => { promptContextId: pid, conversationId: cid, }: ShowAssistantOverlayProps) => { + const newConversationId = getConversationId(cid); if (so) assistantTelemetry?.reportAssistantInvoked({ - conversationId: cid ?? 'unknown', + conversationId: newConversationId, invokedBy: 'click', }); + setIsModalVisible(so); setPromptContextId(pid); - setConversationId(cid); + setConversationId(newConversationId); }, - [assistantTelemetry] + [assistantTelemetry, getConversationId] ); useEffect(() => { setShowAssistantOverlay(showOverlay); @@ -63,15 +64,15 @@ export const AssistantOverlay = React.memo(() => { const handleShortcutPress = useCallback(() => { // Try to restore the last conversation on shortcut pressed if (!isModalVisible) { - setConversationId(localStorageLastConversationId ?? WELCOME_CONVERSATION_TITLE); + setConversationId(getConversationId()); assistantTelemetry?.reportAssistantInvoked({ invokedBy: 'shortcut', - conversationId: localStorageLastConversationId ?? WELCOME_CONVERSATION_TITLE, + conversationId: getConversationId(), }); } setIsModalVisible(!isModalVisible); - }, [assistantTelemetry, isModalVisible, localStorageLastConversationId]); + }, [assistantTelemetry, isModalVisible, getConversationId]); // Register keyboard listener to show the modal when cmd + ; is pressed const onKeyDown = useCallback( diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.test.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.test.ts index 0c3c5a579d2748..8cd3c1479b46b5 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.test.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.test.ts @@ -235,29 +235,12 @@ describe('getBlockBotConversation', () => { }); describe('getOptionalRequestParams', () => { - it('should return an empty object when ragOnAlerts is false', () => { - const params = { - alerts: true, - alertsIndexPattern: 'indexPattern', - allow: ['a', 'b', 'c'], - allowReplacement: ['b', 'c'], - ragOnAlerts: false, // <-- false - replacements: { key: 'value' }, - size: 10, - }; - - const result = getOptionalRequestParams(params); - - expect(result).toEqual({}); - }); - it('should return an empty object when alerts is false', () => { const params = { alerts: false, // <-- false alertsIndexPattern: 'indexPattern', allow: ['a', 'b', 'c'], allowReplacement: ['b', 'c'], - ragOnAlerts: true, replacements: { key: 'value' }, size: 10, }; @@ -267,13 +250,12 @@ describe('getBlockBotConversation', () => { expect(result).toEqual({}); }); - it('should return the optional request params when ragOnAlerts is true and alerts is true', () => { + it('should return the optional request params when alerts is true', () => { const params = { alerts: true, alertsIndexPattern: 'indexPattern', allow: ['a', 'b', 'c'], allowReplacement: ['b', 'c'], - ragOnAlerts: true, replacements: { key: 'value' }, size: 10, }; @@ -292,7 +274,6 @@ describe('getBlockBotConversation', () => { it('should return (only) the optional request params that are defined when some optional params are not provided', () => { const params = { alerts: true, - ragOnAlerts: true, allow: ['a', 'b', 'c'], // all the others are undefined }; @@ -305,31 +286,37 @@ describe('getBlockBotConversation', () => { }); describe('hasParsableResponse', () => { - it('returns true when assistantLangChain is true', () => { + it('returns true when just assistantLangChain is true', () => { const result = hasParsableResponse({ alerts: false, assistantLangChain: true, - ragOnAlerts: false, }); expect(result).toBe(true); }); - it('returns true when ragOnAlerts is true and alerts is true', () => { + it('returns true when just alerts is true', () => { const result = hasParsableResponse({ alerts: true, assistantLangChain: false, - ragOnAlerts: true, }); expect(result).toBe(true); }); - it('returns false when assistantLangChain, ragOnAlerts, and alerts are all false', () => { + it('returns true when both assistantLangChain and alerts are true', () => { + const result = hasParsableResponse({ + alerts: true, + assistantLangChain: true, + }); + + expect(result).toBe(true); + }); + + it('returns false when both assistantLangChain and alerts are false', () => { const result = hasParsableResponse({ alerts: false, assistantLangChain: false, - ragOnAlerts: false, }); expect(result).toBe(false); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts index 688416d2e738cb..9149d4c84ca42b 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts @@ -101,7 +101,6 @@ export const getOptionalRequestParams = ({ alertsIndexPattern, allow, allowReplacement, - ragOnAlerts, replacements, size, }: { @@ -109,7 +108,6 @@ export const getOptionalRequestParams = ({ alertsIndexPattern?: string; allow?: string[]; allowReplacement?: string[]; - ragOnAlerts: boolean; replacements?: Record; size?: number; }): OptionalRequestParams => { @@ -119,10 +117,8 @@ export const getOptionalRequestParams = ({ const optionalReplacements = replacements ? { replacements } : undefined; const optionalSize = size ? { size } : undefined; - if ( - !ragOnAlerts || // the feature flag must be enabled - !alerts // the settings toggle must also be enabled - ) { + // the settings toggle must be enabled: + if (!alerts) { return {}; // don't send any optional params } @@ -138,9 +134,7 @@ export const getOptionalRequestParams = ({ export const hasParsableResponse = ({ alerts, assistantLangChain, - ragOnAlerts, }: { alerts: boolean; assistantLangChain: boolean; - ragOnAlerts: boolean; -}): boolean => assistantLangChain || (ragOnAlerts && alerts); +}): boolean => assistantLangChain || alerts; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx index 86e0f3a460055d..190eee654bc67e 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx @@ -83,7 +83,7 @@ const AssistantComponent: React.FC = ({ http, promptContexts, setLastConversationId, - localStorageLastConversationId, + getConversationId, title, allSystemPrompts, } = useAssistantContext(); @@ -113,12 +113,7 @@ const AssistantComponent: React.FC = ({ ); const [selectedConversationId, setSelectedConversationId] = useState( - isAssistantEnabled - ? // if a conversationId has been provided, use that - // if not, check local storage - // last resort, go to welcome conversation - conversationId ?? localStorageLastConversationId ?? WELCOME_CONVERSATION_TITLE - : WELCOME_CONVERSATION_TITLE + isAssistantEnabled ? getConversationId(conversationId) : WELCOME_CONVERSATION_TITLE ); useEffect(() => { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_send_messages/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_send_messages/index.tsx index fcfbadb574bbdb..fb973d492a6517 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_send_messages/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_send_messages/index.tsx @@ -37,7 +37,6 @@ export const useSendMessages = (): UseSendMessages => { assistantStreamingEnabled, defaultAllow, defaultAllowReplacement, - ragOnAlerts, knowledgeBase, } = useAssistantContext(); const [isLoading, setIsLoading] = useState(false); @@ -56,7 +55,6 @@ export const useSendMessages = (): UseSendMessages => { assistantLangChain: knowledgeBase.assistantLangChain, assistantStreamingEnabled, http, - ragOnAlerts, // feature flag replacements, messages, size: knowledgeBase.latestAlerts, @@ -74,7 +72,6 @@ export const useSendMessages = (): UseSendMessages => { knowledgeBase.alerts, knowledgeBase.assistantLangChain, knowledgeBase.latestAlerts, - ragOnAlerts, ] ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx index 61f8352e0d3257..84a2ac40a6f248 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx @@ -12,7 +12,11 @@ import { AssistantProvider, useAssistantContext } from '.'; import { httpServiceMock } from '@kbn/core-http-browser-mocks'; import { actionTypeRegistryMock } from '@kbn/triggers-actions-ui-plugin/public/application/action_type_registry.mock'; import { AssistantAvailability } from '../..'; +import { useLocalStorage } from 'react-use'; +jest.mock('react-use', () => ({ + useLocalStorage: jest.fn().mockReturnValue(['456', jest.fn()]), +})); const actionTypeRegistry = actionTypeRegistryMock.create(); const mockGetInitialConversations = jest.fn(() => ({})); const mockGetComments = jest.fn(() => []); @@ -70,4 +74,23 @@ describe('AssistantContext', () => { expect(mockHttp.fetch).toBeCalledWith(path); }); + + test('getConversationId defaults to provided id', async () => { + const { result } = renderHook(useAssistantContext, { wrapper: ContextWrapper }); + const id = result.current.getConversationId('123'); + expect(id).toEqual('123'); + }); + + test('getConversationId uses local storage id when no id is provided ', async () => { + const { result } = renderHook(useAssistantContext, { wrapper: ContextWrapper }); + const id = result.current.getConversationId(); + expect(id).toEqual('456'); + }); + + test('getConversationId defaults to Welcome when no local storage id and no id is provided ', async () => { + (useLocalStorage as jest.Mock).mockReturnValue([undefined, jest.fn()]); + const { result } = renderHook(useAssistantContext, { wrapper: ContextWrapper }); + const id = result.current.getConversationId(); + expect(id).toEqual('Welcome'); + }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx index 4d0eec97f2639e..024a06fd7b314b 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx @@ -13,6 +13,7 @@ import type { IToasts } from '@kbn/core-notifications-browser'; import { ActionTypeRegistryContract } from '@kbn/triggers-actions-ui-plugin/public'; import { useLocalStorage } from 'react-use'; import type { DocLinksStart } from '@kbn/core-doc-links-browser'; +import { WELCOME_CONVERSATION_TITLE } from '../assistant/use_conversation/translations'; import { updatePromptContexts } from './helpers'; import type { PromptContext, @@ -88,7 +89,6 @@ export interface AssistantProviderProps { getInitialConversations: () => Record; modelEvaluatorEnabled?: boolean; nameSpace?: string; - ragOnAlerts?: boolean; setConversations: React.Dispatch>>; setDefaultAllow: React.Dispatch>; setDefaultAllowReplacement: React.Dispatch>; @@ -136,11 +136,10 @@ export interface UseAssistantContext { }) => EuiCommentProps[]; http: HttpSetup; knowledgeBase: KnowledgeBaseConfig; - localStorageLastConversationId: string | undefined; + getConversationId: (id?: string) => string; promptContexts: Record; modelEvaluatorEnabled: boolean; nameSpace: string; - ragOnAlerts: boolean; registerPromptContext: RegisterPromptContext; selectedSettingsTab: SettingsTabs; setAllQuickPrompts: React.Dispatch>; @@ -182,7 +181,6 @@ export const AssistantProvider: React.FC = ({ getInitialConversations, modelEvaluatorEnabled = false, nameSpace = DEFAULT_ASSISTANT_NAMESPACE, - ragOnAlerts = false, setConversations, setDefaultAllow, setDefaultAllowReplacement, @@ -292,6 +290,14 @@ export const AssistantProvider: React.FC = ({ [setConversations] ); + const getConversationId = useCallback( + // if a conversationId has been provided, use that + // if not, check local storage + // last resort, go to welcome conversation + (id?: string) => id ?? localStorageLastConversationId ?? WELCOME_CONVERSATION_TITLE, + [localStorageLastConversationId] + ); + const value = useMemo( () => ({ actionTypeRegistry, @@ -319,7 +325,6 @@ export const AssistantProvider: React.FC = ({ modelEvaluatorEnabled, promptContexts, nameSpace, - ragOnAlerts, registerPromptContext, selectedSettingsTab, setAllQuickPrompts: setLocalStorageQuickPrompts, @@ -334,7 +339,7 @@ export const AssistantProvider: React.FC = ({ title, toasts, unRegisterPromptContext, - localStorageLastConversationId, + getConversationId, setLastConversationId: setLocalStorageLastConversationId, }), [ @@ -358,14 +363,13 @@ export const AssistantProvider: React.FC = ({ getComments, http, localStorageKnowledgeBase, - localStorageLastConversationId, + getConversationId, localStorageQuickPrompts, localStorageSystemPrompts, modelEvaluatorEnabled, nameSpace, onConversationsUpdated, promptContexts, - ragOnAlerts, registerPromptContext, selectedSettingsTab, setDefaultAllow, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.test.tsx index 06c1b33bfda850..6e5d7e7b1b174b 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.test.tsx @@ -22,7 +22,6 @@ const mockUseAssistantContext = { prepend: jest.fn(), }, }, - ragOnAlerts: true, setAllSystemPrompts: jest.fn(), setConversations: jest.fn(), }; @@ -210,7 +209,7 @@ describe('Knowledge base settings', () => { expect(queryByTestId('knowledgeBaseActionButton')).not.toBeInTheDocument(); }); - it('renders the alerts settings when ragOnAlerts is true', () => { + it('renders the alerts settings', () => { const { getByTestId } = render( diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.tsx index bd41f5b888c931..5974bae6e5ab08 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings.tsx @@ -47,7 +47,7 @@ interface Props { */ export const KnowledgeBaseSettings: React.FC = React.memo( ({ knowledgeBase, setUpdatedKnowledgeBaseSettings }) => { - const { http, ragOnAlerts } = useAssistantContext(); + const { http } = useAssistantContext(); const { data: kbStatus, isLoading, @@ -303,12 +303,10 @@ export const KnowledgeBaseSettings: React.FC = React.memo( - {ragOnAlerts && ( - - )} + ); } diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts index 03e989ab6a0558..e1b176e9dcaa76 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/translations.ts @@ -21,25 +21,27 @@ export const ASK_QUESTIONS_ABOUT = i18n.translate( } ); -export const LATEST_AND_RISKIEST_OPEN_ALERTS = i18n.translate( - 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettings.latestAndRiskiestOpenAlertsLabel', - { - defaultMessage: 'latest and riskiest open and acknowledged alerts in your environment.', - } -); +export const LATEST_AND_RISKIEST_OPEN_ALERTS = (alertsCount: number) => + i18n.translate( + 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettings.latestAndRiskiestOpenAlertsLabel', + { + defaultMessage: + 'Send AI Assistant information about your {alertsCount} newest and riskiest open or acknowledged alerts.', + values: { alertsCount }, + } + ); export const YOUR_ANONYMIZATION_SETTINGS = i18n.translate( 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettings.yourAnonymizationSettingsLabel', { - defaultMessage: 'Your Anonymization settings will be applied to the alerts.', + defaultMessage: 'Your anonymization settings will apply to these alerts.', } ); export const SELECT_FEWER_ALERTS = i18n.translate( 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettings.selectFewerAlertsLabel', { - defaultMessage: - "Select fewer alerts if the model's maximum context length is frequently exceeded.", + defaultMessage: "Send fewer alerts if the model's context window is too small.", } ); diff --git a/x-pack/plugins/alerting/public/application/maintenance_windows.tsx b/x-pack/plugins/alerting/public/application/maintenance_windows.tsx index 6bbe3a080943e7..bb2ba1847abac3 100644 --- a/x-pack/plugins/alerting/public/application/maintenance_windows.tsx +++ b/x-pack/plugins/alerting/public/application/maintenance_windows.tsx @@ -78,7 +78,7 @@ export const renderApp = ({ }) => { const { element, history, theme$ } = mountParams; const i18nCore = core.i18n; - const isDarkMode = core.uiSettings.get('theme:darkMode'); + const isDarkMode = core.theme.getTheme().darkMode; const queryClient = new QueryClient(); diff --git a/x-pack/plugins/apm/public/components/routing/app_root/index.tsx b/x-pack/plugins/apm/public/components/routing/app_root/index.tsx index 85df672363ce16..ea1440c91706c3 100644 --- a/x-pack/plugins/apm/public/components/routing/app_root/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/app_root/index.tsx @@ -8,7 +8,7 @@ import { APP_WRAPPER_CLASS } from '@kbn/core/public'; import { KibanaContextProvider, - useUiSetting$, + useDarkMode, } from '@kbn/kibana-react-plugin/public'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { Storage } from '@kbn/kibana-utils-plugin/public'; @@ -132,7 +132,7 @@ function MountApmHeaderActionMenu() { } export function ApmThemeProvider({ children }: { children: React.ReactNode }) { - const [darkMode] = useUiSetting$('theme:darkMode'); + const darkMode = useDarkMode(false); return ( ; export type CspSettings = TypeOf; + +export interface BulkActionBenchmarkRulesResponse { + newCspSettings: SavedObjectsUpdateResponse; + disabledRulesCounter: number; +} diff --git a/x-pack/plugins/cloud_security_posture/common/types_old.ts b/x-pack/plugins/cloud_security_posture/common/types_old.ts index d3706c51469f81..617f9dce122e80 100644 --- a/x-pack/plugins/cloud_security_posture/common/types_old.ts +++ b/x-pack/plugins/cloud_security_posture/common/types_old.ts @@ -181,7 +181,7 @@ export interface CnvmStatistics { highCount: number | undefined; mediumCount: number | undefined; resourcesScanned: number | undefined; - cloudRegions: number | undefined; + cloudAccounts: number | undefined; } export interface CnvmDashboardData { diff --git a/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts b/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts new file mode 100644 index 00000000000000..f2a35944f0825f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CspBenchmarkRuleMetadata } from '../types'; +import { + convertRuleTagsToKQL, + generateBenchmarkRuleTags, + getFindingsDetectionRuleSearchTags, +} from './detection_rules'; + +describe('Detection rules utils', () => { + it('should convert tags to KQL format', () => { + const inputTags = ['tag1', 'tag2', 'tag3']; + + const result = convertRuleTagsToKQL(inputTags); + + const expectedKQL = 'alert.attributes.tags:("tag1" AND "tag2" AND "tag3")'; + expect(result).toBe(expectedKQL); + }); + + it('Should convert tags to KQL format', () => { + const inputTags = [] as string[]; + + const result = convertRuleTagsToKQL(inputTags); + + const expectedKQL = 'alert.attributes.tags:()'; + expect(result).toBe(expectedKQL); + }); + + it('Should generate search tags for a CSP benchmark rule', () => { + const cspBenchmarkRule = { + benchmark: { + id: 'cis_gcp', + rule_number: '1.1', + }, + } as unknown as CspBenchmarkRuleMetadata; + + const result = getFindingsDetectionRuleSearchTags(cspBenchmarkRule); + + const expectedTags = ['CIS', 'GCP', 'CIS GCP 1.1']; + expect(result).toEqual(expectedTags); + }); + + it('Should handle undefined benchmark object gracefully', () => { + const cspBenchmarkRule = { benchmark: {} } as any; + const expectedTags: string[] = []; + const result = getFindingsDetectionRuleSearchTags(cspBenchmarkRule); + expect(result).toEqual(expectedTags); + }); + + it('Should handle undefined rule number gracefully', () => { + const cspBenchmarkRule = { + benchmark: { + id: 'cis_gcp', + }, + } as unknown as CspBenchmarkRuleMetadata; + const result = getFindingsDetectionRuleSearchTags(cspBenchmarkRule); + const expectedTags = ['CIS', 'GCP', 'CIS GCP']; + expect(result).toEqual(expectedTags); + }); + + it('Should generate tags for a CSPM benchmark rule', () => { + const cspBenchmarkRule = { + benchmark: { + id: 'cis_gcp', + rule_number: '1.1', + posture_type: 'cspm', + }, + } as unknown as CspBenchmarkRuleMetadata; + + const result = generateBenchmarkRuleTags(cspBenchmarkRule); + + const expectedTags = [ + 'Cloud Security', + 'Use Case: Configuration Audit', + 'CIS', + 'GCP', + 'CIS GCP 1.1', + 'CSPM', + 'Data Source: CSPM', + 'Domain: Cloud', + ]; + expect(result).toEqual(expectedTags); + }); + + it('Should generate tags for a KSPM benchmark rule', () => { + const cspBenchmarkRule = { + benchmark: { + id: 'cis_gcp', + rule_number: '1.1', + posture_type: 'kspm', + }, + } as unknown as CspBenchmarkRuleMetadata; + + const result = generateBenchmarkRuleTags(cspBenchmarkRule); + + const expectedTags = [ + 'Cloud Security', + 'Use Case: Configuration Audit', + 'CIS', + 'GCP', + 'CIS GCP 1.1', + 'KSPM', + 'Data Source: KSPM', + 'Domain: Container', + ]; + expect(result).toEqual(expectedTags); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.ts b/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.ts new file mode 100644 index 00000000000000..42ea7561286c16 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.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 { CspBenchmarkRuleMetadata } from '../types/latest'; + +const CSP_RULE_TAG = 'Cloud Security'; +const CSP_RULE_TAG_USE_CASE = 'Use Case: Configuration Audit'; +const CSP_RULE_TAG_DATA_SOURCE_PREFIX = 'Data Source: '; + +const STATIC_RULE_TAGS = [CSP_RULE_TAG, CSP_RULE_TAG_USE_CASE]; + +export const convertRuleTagsToKQL = (tags: string[]): string => { + const TAGS_FIELD = 'alert.attributes.tags'; + return `${TAGS_FIELD}:(${tags.map((tag) => `"${tag}"`).join(' AND ')})`; +}; + +/* + * Returns an array of CspFinding tags that can be used to search and filter a detection rule + */ +export const getFindingsDetectionRuleSearchTags = ( + cspBenchmarkRule: CspBenchmarkRuleMetadata +): string[] => { + if (!cspBenchmarkRule.benchmark || !cspBenchmarkRule.benchmark.id) { + // Return an empty array if benchmark ID is undefined + return []; + } + + // ex: cis_gcp to ['CIS', 'GCP'] + const benchmarkIdTags = cspBenchmarkRule.benchmark.id.split('_').map((tag) => tag.toUpperCase()); + + // ex: 'CIS GCP 1.1' + const benchmarkRuleNumberTag = cspBenchmarkRule.benchmark.rule_number + ? `${cspBenchmarkRule.benchmark.id.replace('_', ' ').toUpperCase()} ${ + cspBenchmarkRule.benchmark.rule_number + }` + : cspBenchmarkRule.benchmark.id.replace('_', ' ').toUpperCase(); + + return benchmarkIdTags.concat([benchmarkRuleNumberTag]); +}; + +export const generateBenchmarkRuleTags = (rule: CspBenchmarkRuleMetadata) => { + return [STATIC_RULE_TAGS] + .concat(getFindingsDetectionRuleSearchTags(rule)) + .concat( + rule.benchmark.posture_type + ? [ + rule.benchmark.posture_type.toUpperCase(), + `${CSP_RULE_TAG_DATA_SOURCE_PREFIX}${rule.benchmark.posture_type.toUpperCase()}`, + ] + : [] + ) + .concat(rule.benchmark.posture_type === 'cspm' ? ['Domain: Cloud'] : ['Domain: Container']) + .flat(); +}; diff --git a/x-pack/plugins/cloud_security_posture/kibana.jsonc b/x-pack/plugins/cloud_security_posture/kibana.jsonc index 9237ed70104ad2..56ea8549629acb 100644 --- a/x-pack/plugins/cloud_security_posture/kibana.jsonc +++ b/x-pack/plugins/cloud_security_posture/kibana.jsonc @@ -21,7 +21,8 @@ "cloud", "licensing", "share", - "kibanaUtils" + "kibanaUtils", + "alerting" ], "optionalPlugins": ["usageCollection"], "requiredBundles": ["kibanaReact", "usageCollection"] diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts b/x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts index 309698f4219d98..dfd6f13e386921 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts @@ -11,6 +11,7 @@ import { useQuery } from '@tanstack/react-query'; import { DETECTION_RULE_RULES_API_CURRENT_VERSION } from '../../../common/constants'; import { RuleResponse } from '../types'; import { DETECTION_ENGINE_RULES_KEY } from '../constants'; +import { convertRuleTagsToKQL } from '../../../common/utils/detection_rules'; /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one @@ -26,16 +27,10 @@ export interface FetchRulesResponse { data: RuleResponse[]; } -export const TAGS_FIELD = 'alert.attributes.tags'; - const DETECTION_ENGINE_URL = '/api/detection_engine' as const; const DETECTION_ENGINE_RULES_URL = `${DETECTION_ENGINE_URL}/rules` as const; export const DETECTION_ENGINE_RULES_URL_FIND = `${DETECTION_ENGINE_RULES_URL}/_find` as const; -export function convertRuleTagsToKQL(tags: string[]): string { - return `${TAGS_FIELD}:(${tags.map((tag) => `"${tag}"`).join(' AND ')})`; -} - export const useFetchDetectionRulesByTags = (tags: string[]) => { const { http } = useKibana().services; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx index f39379f8c4ddd8..24ef238cf57748 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx @@ -9,10 +9,8 @@ import type { HttpSetup } from '@kbn/core/public'; import React from 'react'; import { CspFinding } from '../../../../common/schemas/csp_finding'; import { DetectionRuleCounter } from '../../../components/detection_rule_counter'; -import { - createDetectionRuleFromFinding, - getFindingsDetectionRuleSearchTags, -} from '../utils/create_detection_rule_from_finding'; +import { createDetectionRuleFromFinding } from '../utils/create_detection_rule_from_finding'; +import { getFindingsDetectionRuleSearchTags } from '../../../../common/utils/detection_rules'; export const FindingsDetectionRuleCounter = ({ finding }: { finding: CspFinding }) => { const createMisconfigurationRuleFn = async (http: HttpSetup) => @@ -20,7 +18,7 @@ export const FindingsDetectionRuleCounter = ({ finding }: { finding: CspFinding return ( ); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_finding.ts b/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_finding.ts index b06246e6605e9b..ca0e03460c3406 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_finding.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_finding.ts @@ -12,6 +12,7 @@ import { LATEST_FINDINGS_RETENTION_POLICY, } from '../../../../common/constants'; import { createDetectionRule } from '../../../common/api/create_detection_rule'; +import { generateBenchmarkRuleTags } from '../../../../common/utils/detection_rules'; const DEFAULT_RULE_RISK_SCORE = 0; const DEFAULT_RULE_SEVERITY = 'low'; @@ -47,43 +48,6 @@ const convertReferencesLinksToArray = (input: string | undefined) => { return matches.map((link) => link.replace(/^\d+\. /, '').replace(/\n/g, '')); }; -const CSP_RULE_TAG = 'Cloud Security'; -const CSP_RULE_TAG_USE_CASE = 'Use Case: Configuration Audit'; -const CSP_RULE_TAG_DATA_SOURCE_PREFIX = 'Data Source: '; - -const STATIC_RULE_TAGS = [CSP_RULE_TAG, CSP_RULE_TAG_USE_CASE]; - -/* - * Returns an array of CspFinding tags that can be used to search and filter a detection rule - */ -export const getFindingsDetectionRuleSearchTags = ({ rule }: CspFinding) => { - // ex: cis_gcp to ['CIS', 'GCP'] - const benchmarkIdTags = rule.benchmark.id.split('_').map((tag) => tag.toUpperCase()); - // ex: 'CIS GCP 1.1' - const benchmarkRuleNumberTag = `${rule.benchmark.id.replace('_', ' ').toUpperCase()} ${ - rule.benchmark.rule_number - }`; - - return benchmarkIdTags.concat([benchmarkRuleNumberTag]); -}; - -const generateFindingsTags = (finding: CspFinding) => { - return [STATIC_RULE_TAGS] - .concat(getFindingsDetectionRuleSearchTags(finding)) - .concat( - finding.rule.benchmark.posture_type - ? [ - finding.rule.benchmark.posture_type.toUpperCase(), - `${CSP_RULE_TAG_DATA_SOURCE_PREFIX}${finding.rule.benchmark.posture_type.toUpperCase()}`, - ] - : [] - ) - .concat( - finding.rule.benchmark.posture_type === 'cspm' ? ['Domain: Cloud'] : ['Domain: Container'] - ) - .flat(); -}; - const generateFindingsRuleQuery = (finding: CspFinding) => { const currentTimestamp = new Date().toISOString(); @@ -128,7 +92,7 @@ export const createDetectionRuleFromFinding = async (http: HttpSetup, finding: C references: convertReferencesLinksToArray(finding.rule.references), name: finding.rule.name, description: finding.rule.rationale, - tags: generateFindingsTags(finding), + tags: generateBenchmarkRuleTags(finding.rule), investigation_fields: DEFAULT_INVESTIGATION_FIELDS, note: finding.rule.remediation, }, diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts index 0148105bbc83a5..7811f2c29892be 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts @@ -13,7 +13,7 @@ export const mockCnvmDashboardData: CnvmDashboardData = { highCount: 4715, mediumCount: 10537, resourcesScanned: 81, - cloudRegions: 1, + cloudAccounts: 1, }, vulnTrends: [ { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx index 1552ed2821bb85..adfca7f2f02052 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx @@ -84,11 +84,11 @@ export const VulnerabilityStatistics = () => { id: 'cloud-regions-stat', title: ( ), description: i18n.translate('xpack.csp.cnvmDashboard.statistics.cloudRegionTitle', { - defaultMessage: 'Cloud Regions', + defaultMessage: 'Cloud Accounts', }), }, { diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.test.ts deleted file mode 100644 index 1bb2232d2834d1..00000000000000 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.test.ts +++ /dev/null @@ -1,36 +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 'expect'; -import { setRulesStates, buildRuleKey } from './utils'; - -describe('CSP Rule State Management', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should set rules states correctly', () => { - const ruleIds = ['rule1', 'rule3']; - const newState = true; - - const updatedRulesStates = setRulesStates(ruleIds, newState); - - expect(updatedRulesStates).toEqual({ - rule1: { muted: true }, - rule3: { muted: true }, - }); - }); - - it('should build a rule key with the provided benchmarkId, benchmarkVersion, and ruleNumber', () => { - const benchmarkId = 'randomId'; - const benchmarkVersion = 'v1'; - const ruleNumber = '001'; - - const result = buildRuleKey(benchmarkId, benchmarkVersion, ruleNumber); - - expect(result).toBe(`${benchmarkId};${benchmarkVersion};${ruleNumber}`); - }); -}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts index a87df39341741b..1b033867c03fd6 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts @@ -16,6 +16,26 @@ import { CspRouter } from '../../../types'; import { CSP_BENCHMARK_RULES_BULK_ACTION_ROUTE_PATH } from '../../../../common/constants'; import { bulkActionBenchmarkRulesHandler } from './v1'; +/** + This API allows bulk actions (mute or unmute) on CSP benchmark rules. + Request: + { + action: 'mute' | 'unmute'; // Specify the bulk action type (mute or unmute) + rules: [ + { + rule_id: string; // Unique identifier for the rule + }, + // ... (additional benchmark rules) + ]; + } + + Response: + { + updated_benchmark_rules: CspBenchmarkRulesStates; Benchmark rules object that were affected + detection_rules: string; // Status message indicating the number of detection rules affected + message: string; // Success message + } + */ export const defineBulkActionCspBenchmarkRulesRoute = (router: CspRouter) => router.versioned .post({ @@ -42,16 +62,24 @@ export const defineBulkActionCspBenchmarkRulesRoute = (router: CspRouter) => const benchmarkRulesToUpdate = requestBody.rules; + const detectionRulesClient = (await context.alerting).getRulesClient(); + const handlerResponse = await bulkActionBenchmarkRulesHandler( + cspContext.soClient, cspContext.encryptedSavedObjects, + detectionRulesClient, benchmarkRulesToUpdate, - requestBody.action + requestBody.action, + cspContext.logger ); - const updatedBenchmarkRules: CspBenchmarkRulesStates = handlerResponse; + const updatedBenchmarkRules: CspBenchmarkRulesStates = + handlerResponse.newCspSettings.attributes.rules!; + return response.ok({ body: { updated_benchmark_rules: updatedBenchmarkRules, + detection_rules: `disabled ${handlerResponse.disabledRulesCounter} detections rules.`, message: 'The bulk operation has been executed successfully.', }, }); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts index 3442b3f050b90c..2f03af30c58b5e 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts @@ -9,13 +9,99 @@ import type { SavedObjectsClientContract, SavedObjectsUpdateResponse, } from '@kbn/core-saved-objects-api-server'; -import { CspBenchmarkRulesStates, CspSettings } from '../../../../common/types/rules/v3'; +import type { FindResult, RulesClient } from '@kbn/alerting-plugin/server'; +import type { RuleParams } from '@kbn/alerting-plugin/server/application/rule/types'; +import type { + CspBenchmarkRule, + CspBenchmarkRulesStates, + CspSettings, +} from '../../../../common/types/rules/v3'; +import { + convertRuleTagsToKQL, + generateBenchmarkRuleTags, +} from '../../../../common/utils/detection_rules'; import { + CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, INTERNAL_CSP_SETTINGS_SAVED_OBJECT_ID, INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE, } from '../../../../common/constants'; +export const getRuleIdsToDisable = async (detectionRules: Array>) => { + const idsToDisable = detectionRules + .map((detectionRule) => { + return detectionRule.data.map((data) => data.id); + }) + .flat(); + return idsToDisable; +}; + +const disableDetectionRules = async ( + detectionRulesClient: RulesClient, + detectionRules: Array> +) => { + const idsToDisable = await getRuleIdsToDisable(detectionRules); + if (!idsToDisable.length) return; + return await detectionRulesClient.bulkDisableRules({ ids: idsToDisable }); +}; + +export const getDetectionRules = async ( + detectionRulesClient: RulesClient, + rulesTags: string[][] +): Promise>> => { + const detectionRules = Promise.all( + rulesTags.map(async (ruleTags) => { + return detectionRulesClient.find({ + excludeFromPublicApi: false, + options: { + filter: convertRuleTagsToKQL(ruleTags), + searchFields: ['tags'], + page: 1, + per_page: 1, + }, + }); + }) + ); + + return detectionRules; +}; + +export const getBenchmarkRules = async ( + soClient: SavedObjectsClientContract, + ruleIds: string[] +): Promise> => { + const bulkGetObject = ruleIds.map((ruleId) => ({ + id: ruleId, + type: CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, + })); + const cspBenchmarkRulesSo = await soClient.bulkGet(bulkGetObject); + + const benchmarkRules = cspBenchmarkRulesSo.saved_objects.map( + (cspBenchmarkRule) => cspBenchmarkRule.attributes + ); + return benchmarkRules; +}; + +export const muteDetectionRules = async ( + soClient: SavedObjectsClientContract, + detectionRulesClient: RulesClient, + rulesIds: string[] +): Promise => { + const benchmarkRules = await getBenchmarkRules(soClient, rulesIds); + if (benchmarkRules.includes(undefined)) { + throw new Error('At least one of the provided benchmark rule IDs does not exist'); + } + const benchmarkRulesTags = benchmarkRules.map((benchmarkRule) => + generateBenchmarkRuleTags(benchmarkRule!.metadata) + ); + + const detectionRules = await getDetectionRules(detectionRulesClient, benchmarkRulesTags); + + const disabledDetectionRules = await disableDetectionRules(detectionRulesClient, detectionRules); + + return disabledDetectionRules ? disabledDetectionRules.rules.length : 0; +}; + export const updateRulesStates = async ( encryptedSoClient: SavedObjectsClientContract, newRulesStates: CspBenchmarkRulesStates @@ -29,14 +115,26 @@ export const updateRulesStates = async ( ); }; -export const setRulesStates = (ruleIds: string[], state: boolean): CspBenchmarkRulesStates => { +export const setRulesStates = ( + ruleIds: string[], + state: boolean, + benchmarkRules: CspBenchmarkRule[] +): CspBenchmarkRulesStates => { const rulesStates: CspBenchmarkRulesStates = {}; - ruleIds.forEach((ruleId) => { - rulesStates[ruleId] = { muted: state }; + ruleIds.forEach((ruleId, index) => { + const benchmarkRule = benchmarkRules[index]; + rulesStates[ruleId] = { + muted: state, + benchmark_id: benchmarkRule.metadata.benchmark.id, + benchmark_version: benchmarkRule.metadata.benchmark.version, + rule_number: benchmarkRule.metadata.benchmark.rule_number || '', + rule_id: benchmarkRule.metadata.id, + }; }); return rulesStates; }; -export const buildRuleKey = (benchmarkId: string, benchmarkVersion: string, ruleNumber: string) => { - return `${benchmarkId};${benchmarkVersion};${ruleNumber}`; +export const buildRuleKey = (benchmarkRule: CspBenchmarkRule) => { + const ruleNumber = benchmarkRule.metadata.benchmark.rule_number; + return `${benchmarkRule.metadata.benchmark.id};${benchmarkRule.metadata.benchmark.version};${ruleNumber}`; }; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts index 42895b5eb694d1..907b8cea3d73ce 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts @@ -5,8 +5,20 @@ * 2.0. */ import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; -import { CspBenchmarkRules, CspBenchmarkRulesStates } from '../../../../common/types/rules/v3'; -import { buildRuleKey, setRulesStates, updateRulesStates } from './utils'; +import { Logger } from '@kbn/core/server'; +import type { RulesClient } from '@kbn/alerting-plugin/server'; +import { + buildRuleKey, + getBenchmarkRules, + muteDetectionRules, + setRulesStates, + updateRulesStates, +} from './utils'; +import type { + BulkActionBenchmarkRulesResponse, + CspBenchmarkRule, + CspBenchmarkRules, +} from '../../../../common/types/rules/v3'; const muteStatesMap = { mute: true, @@ -14,17 +26,29 @@ const muteStatesMap = { }; export const bulkActionBenchmarkRulesHandler = async ( + soClient: SavedObjectsClientContract, encryptedSoClient: SavedObjectsClientContract, + detectionRulesClient: RulesClient, rulesToUpdate: CspBenchmarkRules, - action: 'mute' | 'unmute' -): Promise => { - const ruleKeys = rulesToUpdate.map((rule) => - buildRuleKey(rule.benchmark_id, rule.benchmark_version, rule.rule_number) - ); + action: 'mute' | 'unmute', + logger: Logger +): Promise => { + const rulesIds = rulesToUpdate.map((rule) => rule.rule_id); + + const benchmarkRules = await getBenchmarkRules(soClient, rulesIds); + if (benchmarkRules.includes(undefined)) + throw new Error('At least one of the provided benchmark rule IDs does not exist'); - const newRulesStates = setRulesStates(ruleKeys, muteStatesMap[action]); + const rulesKeys = benchmarkRules.map((benchmarkRule) => buildRuleKey(benchmarkRule!)); + const newRulesStates = setRulesStates( + rulesKeys, + muteStatesMap[action], + benchmarkRules as CspBenchmarkRule[] + ); const newCspSettings = await updateRulesStates(encryptedSoClient, newRulesStates); + const disabledRulesCounter = + action === 'mute' ? await muteDetectionRules(soClient, detectionRulesClient, rulesIds) : 0; - return newCspSettings.attributes.rules!; + return { newCspSettings, disabledRulesCounter }; }; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts b/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts index 8458d66817f82d..530090c326766c 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts @@ -25,7 +25,7 @@ export interface VulnerabilitiesStatisticsQueryResult { resources_scanned: { value: number; }; - cloud_regions: { + cloud_accounts: { value: number; }; } @@ -51,9 +51,9 @@ export const getVulnerabilitiesStatisticsQuery = (): SearchRequest => ({ field: 'resource.id', }, }, - cloud_regions: { + cloud_accounts: { cardinality: { - field: 'cloud.region', + field: 'cloud.account.id', }, }, }, @@ -69,6 +69,6 @@ export const getVulnerabilitiesStatistics = async (esClient: ElasticsearchClient highCount: queryResult.aggregations?.high.doc_count, mediumCount: queryResult.aggregations?.medium.doc_count, resourcesScanned: queryResult.aggregations?.resources_scanned.value, - cloudRegions: queryResult.aggregations?.cloud_regions.value, + cloudAccounts: queryResult.aggregations?.cloud_accounts.value, }; }; diff --git a/x-pack/plugins/cloud_security_posture/server/types.ts b/x-pack/plugins/cloud_security_posture/server/types.ts index b6e83939b6ca74..15dee7c9941d0c 100644 --- a/x-pack/plugins/cloud_security_posture/server/types.ts +++ b/x-pack/plugins/cloud_security_posture/server/types.ts @@ -34,6 +34,8 @@ import type { import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import type { FleetStartContract, FleetRequestHandlerContext } from '@kbn/fleet-plugin/server'; import { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/server'; +import type { AlertingApiRequestHandlerContext } from '@kbn/alerting-plugin/server'; +import type { AlertingPluginSetup } from '@kbn/alerting-plugin/public/plugin'; import { CspStatusCode, IndexDetails } from '../common/types_old'; // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -47,6 +49,7 @@ export interface CspServerPluginSetupDeps { taskManager: TaskManagerSetupContract; security: SecurityPluginSetup; cloud: CloudSetup; + alerting: AlertingPluginSetup; // optional usageCollection?: UsageCollectionSetup; } @@ -80,6 +83,7 @@ export interface CspApiRequestHandlerContext { export type CspRequestHandlerContext = CustomRequestHandlerContext<{ csp: CspApiRequestHandlerContext; fleet: FleetRequestHandlerContext['fleet']; + alerting: AlertingApiRequestHandlerContext; }>; /** diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/plugins/cloud_security_posture/tsconfig.json index ad1a97748967f9..e6e0879f774190 100755 --- a/x-pack/plugins/cloud_security_posture/tsconfig.json +++ b/x-pack/plugins/cloud_security_posture/tsconfig.json @@ -61,6 +61,7 @@ "@kbn/field-formats-plugin", "@kbn/data-view-field-editor-plugin", "@kbn/securitysolution-grouping", + "@kbn/alerting-plugin" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/column_chart.scss b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/column_chart.scss index a98eb200f022e7..8a0b9cc992c3ec 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/column_chart.scss +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/column_chart.scss @@ -16,7 +16,7 @@ font-weight: normal; text-align: left; line-height: 1.1; - font-size: #{calc($euiFontSizeL / 2)}; // 10px + font-size: #{$euiFontSizeL / 2}; // 10px } .dataGridChart__legend--numeric { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.test.ts index 7412d861d7136a..e12366f42f3ef0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.test.ts @@ -573,6 +573,32 @@ describe('MlInferenceLogic', () => { }); describe('listeners', () => { + describe('clearModelPlaceholderFlag', () => { + it('sets placeholder flag false for selected model', () => { + MLInferenceLogic.actions.setInferencePipelineConfiguration({ + ...MLInferenceLogic.values.addInferencePipelineModal.configuration, + modelID: 'unit-test-model', + isModelPlaceholderSelected: true, + }); + MLInferenceLogic.actions.clearModelPlaceholderFlag('unit-test-model'); + + expect( + MLInferenceLogic.values.addInferencePipelineModal.configuration.isModelPlaceholderSelected + ).toBe(false); + }); + it('leaves placeholder flag unmodified if another model was selected', () => { + MLInferenceLogic.actions.setInferencePipelineConfiguration({ + ...MLInferenceLogic.values.addInferencePipelineModal.configuration, + modelID: 'unit-test-model', + isModelPlaceholderSelected: true, + }); + MLInferenceLogic.actions.clearModelPlaceholderFlag('some-other-model-id'); + + expect( + MLInferenceLogic.values.addInferencePipelineModal.configuration.isModelPlaceholderSelected + ).toBe(true); + }); + }); describe('createPipeline', () => { const mockModelConfiguration = { ...DEFAULT_VALUES.addInferencePipelineModal, @@ -639,7 +665,7 @@ describe('MlInferenceLogic', () => { AddInferencePipelineSteps.Fields ); }); - it('triggers pipeline fetch when moving from configuration step', () => { + it('triggers pipeline and model fetch when moving from configuration step', () => { MLInferenceLogic.actions.setInferencePipelineConfiguration({ ...MLInferenceLogic.values.addInferencePipelineModal.configuration, pipelineName: 'unit-test-pipeline', @@ -647,12 +673,14 @@ describe('MlInferenceLogic', () => { existingPipeline: false, }); jest.spyOn(MLInferenceLogic.actions, 'fetchPipelineByName'); + jest.spyOn(MLInferenceLogic.actions, 'makeMLModelsRequest'); MLInferenceLogic.actions.onAddInferencePipelineStepChange(AddInferencePipelineSteps.Fields); expect(MLInferenceLogic.actions.fetchPipelineByName).toHaveBeenCalledWith({ pipelineName: 'ml-inference-unit-test-pipeline', }); + expect(MLInferenceLogic.actions.makeMLModelsRequest).toHaveBeenCalledWith(undefined); }); - it('does not trigger pipeline fetch existing pipeline is selected', () => { + it('does not trigger pipeline and model fetch existing pipeline is selected', () => { MLInferenceLogic.actions.setInferencePipelineConfiguration({ ...MLInferenceLogic.values.addInferencePipelineModal.configuration, pipelineName: 'unit-test-pipeline', @@ -660,8 +688,10 @@ describe('MlInferenceLogic', () => { existingPipeline: true, }); jest.spyOn(MLInferenceLogic.actions, 'fetchPipelineByName'); + jest.spyOn(MLInferenceLogic.actions, 'makeMLModelsRequest'); MLInferenceLogic.actions.onAddInferencePipelineStepChange(AddInferencePipelineSteps.Fields); expect(MLInferenceLogic.actions.fetchPipelineByName).not.toHaveBeenCalled(); + expect(MLInferenceLogic.actions.makeMLModelsRequest).not.toHaveBeenCalled(); }); }); describe('fetchPipelineSuccess', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.ts index 407f33eb1e2d0e..bdcf23d71a743d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/ml_inference_logic.ts @@ -133,6 +133,7 @@ export interface MLInferenceProcessorsActions { >['apiSuccess']; attachPipeline: () => void; clearFetchedPipeline: FetchPipelineApiLogicActions['apiReset']; + clearModelPlaceholderFlag: (modelId: string) => { modelId: string }; createApiError: Actions< CreateMlInferencePipelineApiLogicArgs, CreateMlInferencePipelineResponse @@ -222,13 +223,13 @@ export const MLInferenceLogic = kea< }), attachPipeline: true, clearFormErrors: true, + clearModelPlaceholderFlag: (modelId: string) => ({ modelId }), createPipeline: true, onAddInferencePipelineStepChange: (step: AddInferencePipelineSteps) => ({ step }), removeFieldFromMapping: (fieldName: string) => ({ fieldName }), selectExistingPipeline: (pipelineName: string) => ({ pipelineName }), selectFields: (fieldNames: string[]) => ({ fieldNames }), setAddInferencePipelineStep: (step: AddInferencePipelineSteps) => ({ step }), - setFormErrors: (inputErrors: AddInferencePipelineFormErrors) => ({ inputErrors }), setIndexName: (indexName: string) => ({ indexName }), setInferencePipelineConfiguration: (configuration: InferencePipelineConfiguration) => ({ configuration, @@ -299,6 +300,19 @@ export const MLInferenceLogic = kea< pipelineName, }); }, + clearModelPlaceholderFlag: ({ modelId }) => { + const { + addInferencePipelineModal: { configuration }, + } = values; + + // Don't change the flag if the user clicked away from the selected model + if (modelId !== configuration.modelID) return; + + actions.setInferencePipelineConfiguration({ + ...configuration, + isModelPlaceholderSelected: false, + }); + }, createPipeline: () => { const { addInferencePipelineModal: { configuration, indexName }, @@ -361,6 +375,9 @@ export const MLInferenceLogic = kea< }); // Continue to the next step so we don't have to save it to state, we will change // back to the Configuration step if we find a pipeline with the same name + + // Re-fetch ML model list to include those that were deployed in this step + actions.makeMLModelsRequest(undefined); } actions.setAddInferencePipelineStep(step); }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.test.ts index 1252d77bb776aa..b0c26aaf8be8c1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.test.ts @@ -71,6 +71,15 @@ describe('ModelSelectLogic', () => { expect(ModelSelectLogic.actions.startPollingModels).toHaveBeenCalled(); }); + it('sets selected model as non-placeholder', () => { + jest.spyOn(ModelSelectLogic.actions, 'clearModelPlaceholderFlagFromMLInferenceLogic'); + + ModelSelectLogic.actions.createModelSuccess(CREATE_MODEL_API_RESPONSE); + + expect( + ModelSelectLogic.actions.clearModelPlaceholderFlagFromMLInferenceLogic + ).toHaveBeenCalledWith(CREATE_MODEL_API_RESPONSE.modelId); + }); }); describe('fetchModels', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.ts index 6fe25cd3c8b5f8..4074ffac92f6b4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_logic.ts @@ -32,24 +32,22 @@ import { } from './ml_inference_logic'; export interface ModelSelectActions { + clearModelPlaceholderFlagFromMLInferenceLogic: MLInferenceProcessorsActions['clearModelPlaceholderFlag']; createModel: (modelId: string) => { modelId: string }; createModelError: CreateModelApiLogicActions['apiError']; createModelMakeRequest: CreateModelApiLogicActions['makeRequest']; createModelSuccess: CreateModelApiLogicActions['apiSuccess']; - fetchModels: () => void; fetchModelsError: CachedFetchModlesApiLogicActions['apiError']; fetchModelsMakeRequest: CachedFetchModlesApiLogicActions['makeRequest']; fetchModelsSuccess: CachedFetchModlesApiLogicActions['apiSuccess']; - startPollingModels: CachedFetchModlesApiLogicActions['startPolling']; - + setInferencePipelineConfiguration: MLInferenceProcessorsActions['setInferencePipelineConfiguration']; + setInferencePipelineConfigurationFromMLInferenceLogic: MLInferenceProcessorsActions['setInferencePipelineConfiguration']; startModel: (modelId: string) => { modelId: string }; startModelError: CreateModelApiLogicActions['apiError']; startModelMakeRequest: StartModelApiLogicActions['makeRequest']; startModelSuccess: StartModelApiLogicActions['apiSuccess']; - - setInferencePipelineConfiguration: MLInferenceProcessorsActions['setInferencePipelineConfiguration']; - setInferencePipelineConfigurationFromMLInferenceLogic: MLInferenceProcessorsActions['setInferencePipelineConfiguration']; + startPollingModels: CachedFetchModlesApiLogicActions['startPolling']; } export interface ModelSelectValues { @@ -96,6 +94,7 @@ export const ModelSelectLogic = kea { actions.createModelMakeRequest({ modelId }); }, - createModelSuccess: () => { + createModelSuccess: (response) => { actions.startPollingModels(); + // The create action succeeded, so the model is no longer a placeholder + actions.clearModelPlaceholderFlagFromMLInferenceLogic(response.modelId); }, fetchModels: () => { actions.fetchModelsMakeRequest({}); }, - startModel: ({ modelId }) => { - actions.startModelMakeRequest({ modelId }); - }, setInferencePipelineConfiguration: ({ configuration }) => { actions.setInferencePipelineConfigurationFromMLInferenceLogic(configuration); }, + startModel: ({ modelId }) => { + actions.startModelMakeRequest({ modelId }); + }, startModelSuccess: () => { actions.startPollingModels(); }, diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts index 2262879657ec4e..abdac9fb57e0fd 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts @@ -54,9 +54,19 @@ export function registerApiKeysRoutes( const { client } = (await context.core).elasticsearch; const user = security.authc.getCurrentUser(request); if (user) { - const apiKeys = await client.asCurrentUser.security.getApiKey({ username: user.username }); - const validKeys = apiKeys.api_keys.filter(({ invalidated }) => !invalidated); - return response.ok({ body: { api_keys: validKeys } }); + try { + const apiKeys = await client.asCurrentUser.security.getApiKey({ + username: user.username, + }); + const validKeys = apiKeys.api_keys.filter(({ invalidated }) => !invalidated); + return response.ok({ body: { api_keys: validKeys } }); + } catch { + // Ideally we check the error response here for unauthorized user + // Unfortunately the error response is not structured enough for us to filter those + // Always returning an empty array should also be fine, and deals with transient errors + + return response.ok({ body: { api_keys: [] } }); + } } return response.customError({ body: 'Could not retrieve current user, security plugin is not ready', diff --git a/x-pack/plugins/exploratory_view/public/application/index.tsx b/x-pack/plugins/exploratory_view/public/application/index.tsx index f3189e7cf660b4..d496af2b23fb95 100644 --- a/x-pack/plugins/exploratory_view/public/application/index.tsx +++ b/x-pack/plugins/exploratory_view/public/application/index.tsx @@ -52,7 +52,7 @@ export const renderApp = ({ }) => { const { element, history, theme$ } = appMountParameters; const i18nCore = core.i18n; - const isDarkMode = core.uiSettings.get('theme:darkMode'); + const isDarkMode = core.theme.getTheme().darkMode; core.chrome.setHelpExtension({ appName: i18n.translate('xpack.exploratoryView.feedbackMenu.appName', { diff --git a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/embeddable/index.tsx b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/embeddable/index.tsx index d5cb78b84f6428..8fe530c0b5bdf3 100644 --- a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/embeddable/index.tsx +++ b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/embeddable/index.tsx @@ -33,7 +33,7 @@ function ExploratoryViewEmbeddable(props: ExploratoryEmbeddableComponentProps) { export function getExploratoryViewEmbeddable( services: CoreStart & ExploratoryViewPublicPluginsStart ) { - const { lens, dataViews: dataViewsService, uiSettings } = services; + const { lens, dataViews: dataViewsService, theme } = services; const dataViewCache: Record = {}; @@ -70,7 +70,7 @@ export function getExploratoryViewEmbeddable( const series = attributes[0]; - const isDarkMode = uiSettings?.get('theme:darkMode'); + const isDarkMode = theme?.getTheme().darkMode ?? false; const { data: lensHelper, loading: lensLoading } = useFetcher(async () => { if (lenStateHelperPromise) { diff --git a/x-pack/plugins/graph/public/components/guidance_panel/_guidance_panel.scss b/x-pack/plugins/graph/public/components/guidance_panel/_guidance_panel.scss index 28e05afe0c7816..add1d0bdf8aa33 100644 --- a/x-pack/plugins/graph/public/components/guidance_panel/_guidance_panel.scss +++ b/x-pack/plugins/graph/public/components/guidance_panel/_guidance_panel.scss @@ -28,7 +28,7 @@ .gphGuidancePanel__itemIcon { position: absolute; left: 0; - top: -(calc($euiSizeXS / 2)); + top: -($euiSizeXS / 2); width: $euiSizeL; height: $euiSizeL; padding: $euiSizeXS; diff --git a/x-pack/plugins/infra/server/features.ts b/x-pack/plugins/infra/server/features.ts index 5e6f809645ac1b..68fe2503ace143 100644 --- a/x-pack/plugins/infra/server/features.ts +++ b/x-pack/plugins/infra/server/features.ts @@ -8,7 +8,10 @@ import { i18n } from '@kbn/i18n'; import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { logViewSavedObjectName } from '@kbn/logs-shared-plugin/server'; -import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; +import { + ML_ANOMALY_DETECTION_RULE_TYPE_ID, + OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, +} from '@kbn/rule-data-utils'; import { ES_QUERY_ID } from '@kbn/rule-data-utils'; import { metricsDataSourceSavedObjectName } from '@kbn/metrics-data-access-plugin/server'; import { LOG_DOCUMENT_COUNT_RULE_TYPE_ID } from '../common/alerting/logs/log_threshold/types'; @@ -24,6 +27,7 @@ const metricRuleTypes = [ METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID, ES_QUERY_ID, OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, ]; export const METRICS_FEATURE = { @@ -89,6 +93,7 @@ const logsRuleTypes = [ LOG_DOCUMENT_COUNT_RULE_TYPE_ID, ES_QUERY_ID, OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, ]; export const LOGS_FEATURE = { diff --git a/x-pack/plugins/kubernetes_security/public/test/index.tsx b/x-pack/plugins/kubernetes_security/public/test/index.tsx index 1ca31c8e0baf00..a267169e6cf18a 100644 --- a/x-pack/plugins/kubernetes_security/public/test/index.tsx +++ b/x-pack/plugins/kubernetes_security/public/test/index.tsx @@ -11,7 +11,6 @@ import { render as reactRender, RenderOptions, RenderResult } from '@testing-lib import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { Router } from '@kbn/shared-ux-router'; import { History } from 'history'; -import useObservable from 'react-use/lib/useObservable'; import { I18nProvider } from '@kbn/i18n-react'; import { CoreStart } from '@kbn/core/public'; import { coreMock } from '@kbn/core/public/mocks'; @@ -65,8 +64,8 @@ const AppRootProvider = memo<{ history: History; coreStart: CoreStart; children: ReactNode | ReactNode[]; -}>(({ history, coreStart: { http, notifications, uiSettings, application }, children }) => { - const isDarkMode = useObservable(uiSettings.get$('theme:darkMode')); +}>(({ history, coreStart: { http, notifications, theme, application }, children }) => { + const isDarkMode = useMemo(() => theme.getTheme().darkMode, [theme]); const services = useMemo( () => ({ http, notifications, application }), [application, http, notifications] diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss index 35606c67382d58..cd2ee706c1e18e 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss @@ -25,8 +25,8 @@ flex: 0 0 auto; height: $lnsSuggestionHeight; margin-right: $euiSizeS; - margin-left: calc($euiSizeXS / 2); - margin-bottom: calc($euiSizeXS / 2); + margin-left: $euiSizeXS / 2; + margin-bottom: $euiSizeXS / 2; padding: 0 $euiSizeS; box-shadow: none !important; // sass-lint:disable-line no-important diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss index 7f1c61801a4f3c..c88f343f7dbfa1 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss @@ -128,7 +128,7 @@ background-color: $euiColorEmptyShade; border: $euiBorderThin; color: $euiTextColor; - border-radius: calc($euiBorderRadius / 2); + border-radius: $euiBorderRadius / 2; height: $euiSize; width: $euiSizeXL; line-height: $euiSize; diff --git a/x-pack/plugins/ml/common/constants/alerts.ts b/x-pack/plugins/ml/common/constants/alerts.ts index 4582f06b214b6b..81081cd79306af 100644 --- a/x-pack/plugins/ml/common/constants/alerts.ts +++ b/x-pack/plugins/ml/common/constants/alerts.ts @@ -12,11 +12,12 @@ import { ALERT_RULE_NAME, ALERT_START, ALERT_STATUS, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, } from '@kbn/rule-data-utils'; import { JobsHealthTests } from '../types/alerts'; export const ML_ALERT_TYPES = { - ANOMALY_DETECTION: 'xpack.ml.anomaly_detection_alert', + ANOMALY_DETECTION: ML_ANOMALY_DETECTION_RULE_TYPE_ID, AD_JOBS_HEALTH: 'xpack.ml.anomaly_detection_jobs_health', } as const; diff --git a/x-pack/plugins/ml/common/index.ts b/x-pack/plugins/ml/common/index.ts index 1aed6088b79d85..f994ae95682cc8 100644 --- a/x-pack/plugins/ml/common/index.ts +++ b/x-pack/plugins/ml/common/index.ts @@ -9,3 +9,4 @@ export { composeValidators, patternValidator } from './util/validators'; export { getDefaultCapabilities as getDefaultMlCapabilities } from './types/capabilities'; export { DATAFEED_STATE, JOB_STATE } from './constants/states'; export type { MlSummaryJob, SummaryJobState } from './types/anomaly_detection_jobs'; +export { ML_ALERT_TYPES } from './constants/alerts'; 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 index 1b091e4046c502..e33811aa9a8ccc 100644 --- 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 @@ -28,7 +28,7 @@ } .progress-bar { - height: calc($euiSizeXS / 2); + height: $euiSizeXS / 2; margin-top: $euiSizeM; text-align: right; line-height: 18px; // SASSTODO: Calc proper value @@ -96,7 +96,7 @@ font-size: 11px; line-height: 14px; border-radius: $euiBorderRadius; - padding: calc($euiSizeXS / 2); + padding: $euiSizeXS / 2; margin-top: $euiSizeXS; display: inline-block; border: $euiBorderThin; diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss b/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss index 09605c4016565d..03eca2842c3002 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss +++ b/x-pack/plugins/ml/public/application/components/rule_editor/_rule_editor.scss @@ -41,7 +41,7 @@ // SASSTODO: Dangerous EUI overwrite .scope-field-checkbox { - margin-right: calc($euiSizeXS / 2); + margin-right: $euiSizeXS / 2; .euiCheckbox { margin-top: $euiSizeXS; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/_explorer_chart.scss b/x-pack/plugins/ml/public/application/explorer/explorer_charts/_explorer_chart.scss index 29967e8db9b3f0..55ebfe8ab3edb9 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/_explorer_chart.scss +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/_explorer_chart.scss @@ -15,7 +15,7 @@ rect.selected-interval { fill: rgba(200, 200, 200, .1); stroke: $euiColorDarkShade; - stroke-width: calc($euiSizeXS / 2); + stroke-width: $euiSizeXS / 2; stroke-opacity: .8; } diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer_annotations.scss b/x-pack/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer_annotations.scss index 656f38590d3a5e..a7186597b41356 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer_annotations.scss +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer_annotations.scss @@ -40,10 +40,10 @@ $mlAnnotationRectDefaultFillOpacity: .05; } .mlAnnotationRect-isBlur { - stroke-opacity: calc($mlAnnotationRectDefaultStrokeOpacity / 2); + stroke-opacity: $mlAnnotationRectDefaultStrokeOpacity / 2; transition: stroke-opacity $euiAnimSpeedFast; - fill-opacity: calc($mlAnnotationRectDefaultFillOpacity / 2); + fill-opacity: $mlAnnotationRectDefaultFillOpacity / 2; transition: fill-opacity $euiAnimSpeedFast; } @@ -95,9 +95,9 @@ $mlAnnotationRectDefaultFillOpacity: .05; } .mlContextAnnotationRect-isBlur { - stroke-opacity: calc($mlAnnotationRectDefaultStrokeOpacity / 2); + stroke-opacity: $mlAnnotationRectDefaultStrokeOpacity / 2; transition: stroke-opacity $euiAnimSpeedFast; - fill-opacity: calc($mlAnnotationRectDefaultFillOpacity / 2); + fill-opacity: $mlAnnotationRectDefaultFillOpacity / 2; transition: fill-opacity $euiAnimSpeedFast; } diff --git a/x-pack/plugins/monitoring/public/application/index.tsx b/x-pack/plugins/monitoring/public/application/index.tsx index f34cde08370500..b9fd25f60c3675 100644 --- a/x-pack/plugins/monitoring/public/application/index.tsx +++ b/x-pack/plugins/monitoring/public/application/index.tsx @@ -8,11 +8,10 @@ import { AppMountParameters, CoreStart, CoreTheme, MountPoint } from '@kbn/core/public'; import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; -import React, { useMemo } from 'react'; +import React from 'react'; import ReactDOM from 'react-dom'; import { Redirect } from 'react-router-dom'; import { Router, Routes, Route } from '@kbn/shared-ux-router'; -import useObservable from 'react-use/lib/useObservable'; import { Observable } from 'rxjs'; import { CODE_PATH_APM, @@ -100,12 +99,7 @@ const MonitoringApp: React.FC<{ theme$: Observable; }> = ({ core, plugins, externalConfig, setHeaderActionMenu, theme$ }) => { const history = createPreserveQueryHistory(); - - const darkModeObservable: Observable = useMemo( - () => core.uiSettings!.get$('theme:darkMode'), - [core.uiSettings] - ); - const darkMode = useObservable(darkModeObservable, core.uiSettings!.get('theme:darkMode')); + const darkMode = core.theme.getTheme().darkMode; return ( diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.scss b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.scss index 961e0350ccc85f..c46d7a048b93ba 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.scss +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.scss @@ -22,7 +22,7 @@ margin: $euiSizeS; border: 1px solid $euiColorMediumShade; border-radius: $euiSizeXS; - padding: calc($euiSizeXS / 2) 0; + padding: $euiSizeXS / 2 0; &.monChild--index { border-left: $euiSizeXS solid $euiColorSuccess; diff --git a/x-pack/plugins/monitoring/public/components/status_icon/_status_icon.scss b/x-pack/plugins/monitoring/public/components/status_icon/_status_icon.scss index 50c705f80650ef..2d36e7fc90f225 100644 --- a/x-pack/plugins/monitoring/public/components/status_icon/_status_icon.scss +++ b/x-pack/plugins/monitoring/public/components/status_icon/_status_icon.scss @@ -1,7 +1,7 @@ .monStatusIcon { display: inline-block; margin-left: $euiSizeXS; - padding: calc($euiSizeXS / 2) $euiSizeS; + padding: ($euiSizeXS / 2) $euiSizeS; border-radius: $euiBorderRadius; color: $euiColorGhost; min-width: 1.9em; diff --git a/x-pack/plugins/observability/common/custom_threshold_rule/get_view_in_app_url.test.ts b/x-pack/plugins/observability/common/custom_threshold_rule/get_view_in_app_url.test.ts new file mode 100644 index 00000000000000..6971ff2d33c2db --- /dev/null +++ b/x-pack/plugins/observability/common/custom_threshold_rule/get_view_in_app_url.test.ts @@ -0,0 +1,157 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { DiscoverAppLocatorParams } from '@kbn/discover-plugin/common'; +import { Aggregators } from './types'; +import { LocatorPublic } from '@kbn/share-plugin/common'; +import { getViewInAppUrl, GetViewInAppUrlArgs } from './get_view_in_app_url'; + +describe('getViewInAppUrl', () => { + const logExplorerLocator = { + getRedirectUrl: jest.fn(() => 'mockedGetRedirectUrl'), + } as unknown as LocatorPublic; + const startedAt = '2023-12-07T16:30:15.403Z'; + const endedAt = '2023-12-07T20:30:15.403Z'; + const returnedTimeRange = { + // Duration 4 hour, time range will be extended it with 30 minutes from each side + from: '2023-12-07T16:00:15.403Z', + to: '2023-12-07T21:00:15.403Z', + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('Should return empty string if logExplorerLocator is not provided', () => { + const args: GetViewInAppUrlArgs = { + metrics: [], + startedAt, + endedAt, + }; + + expect(getViewInAppUrl(args)).toBe(''); + }); + + it('should call getRedirectUrl with data view, time range and filters', () => { + const args: GetViewInAppUrlArgs = { + metrics: [ + { + name: 'A', + aggType: Aggregators.COUNT, + filter: 'mockedCountFilter', + }, + ], + logExplorerLocator, + startedAt, + endedAt, + filter: 'mockedFilter', + dataViewId: 'mockedDataViewId', + }; + + expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); + expect(logExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ + dataset: args.dataViewId, + timeRange: returnedTimeRange, + query: { + query: 'mockedFilter and mockedCountFilter', + language: 'kuery', + }, + }); + }); + + it('should call getRedirectUrl with only count filter', () => { + const args: GetViewInAppUrlArgs = { + metrics: [ + { + name: 'A', + aggType: Aggregators.COUNT, + filter: 'mockedCountFilter', + }, + ], + logExplorerLocator, + startedAt, + endedAt, + }; + + expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); + expect(logExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ + dataset: undefined, + timeRange: returnedTimeRange, + query: { + query: 'mockedCountFilter', + language: 'kuery', + }, + }); + }); + + it('should call getRedirectUrl with only filter', () => { + const args: GetViewInAppUrlArgs = { + logExplorerLocator, + startedAt, + endedAt, + filter: 'mockedFilter', + }; + + expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); + expect(logExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ + dataset: undefined, + timeRange: returnedTimeRange, + query: { + query: 'mockedFilter', + language: 'kuery', + }, + }); + }); + + it('should call getRedirectUrl with empty query if metrics and filter are not not provided', () => { + const args: GetViewInAppUrlArgs = { + logExplorerLocator, + startedAt, + endedAt, + }; + + expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); + expect(logExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ + dataset: undefined, + timeRange: returnedTimeRange, + query: { + query: '', + language: 'kuery', + }, + }); + }); + + it('should call getRedirectUrl with empty if there are multiple metrics', () => { + const args: GetViewInAppUrlArgs = { + metrics: [ + { + name: 'A', + aggType: Aggregators.COUNT, + filter: 'mockedCountFilter', + }, + { + name: 'A', + aggType: Aggregators.AVERAGE, + field: 'mockedAvgField', + }, + ], + logExplorerLocator, + startedAt, + endedAt, + }; + + expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); + expect(logExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ + dataset: undefined, + timeRange: returnedTimeRange, + query: { + query: '', + language: 'kuery', + }, + }); + }); +}); diff --git a/x-pack/plugins/observability/common/custom_threshold_rule/get_view_in_app_url.ts b/x-pack/plugins/observability/common/custom_threshold_rule/get_view_in_app_url.ts index 658d1debe0a94b..27efa730dccb77 100644 --- a/x-pack/plugins/observability/common/custom_threshold_rule/get_view_in_app_url.ts +++ b/x-pack/plugins/observability/common/custom_threshold_rule/get_view_in_app_url.ts @@ -11,21 +11,27 @@ import type { TimeRange } from '@kbn/es-query'; import type { LocatorPublic } from '@kbn/share-plugin/common'; import type { CustomThresholdExpressionMetric } from './types'; -export const getViewInAppUrl = ( - metrics: CustomThresholdExpressionMetric[], - startedAt?: string, - logExplorerLocator?: LocatorPublic, - filter?: string, - dataViewId?: string, - endedAt?: string -) => { +export interface GetViewInAppUrlArgs { + dataViewId?: string; + endedAt?: string; + startedAt?: string; + filter?: string; + logExplorerLocator?: LocatorPublic; + metrics?: CustomThresholdExpressionMetric[]; +} + +export const getViewInAppUrl = ({ + dataViewId, + endedAt, + startedAt = new Date().toISOString(), + filter, + logExplorerLocator, + metrics = [], +}: GetViewInAppUrlArgs) => { if (!logExplorerLocator) return ''; - let timeRange: TimeRange | undefined; - if (startedAt) { - timeRange = getPaddedAlertTimeRange(startedAt, endedAt); - timeRange.to = endedAt ? timeRange.to : 'now'; - } + const timeRange: TimeRange | undefined = getPaddedAlertTimeRange(startedAt, endedAt); + timeRange.to = endedAt ? timeRange.to : 'now'; const query = { query: '', diff --git a/x-pack/plugins/observability/public/application/index.tsx b/x-pack/plugins/observability/public/application/index.tsx index 7b01bc1f8eeb1d..23a0952ed91db4 100644 --- a/x-pack/plugins/observability/public/application/index.tsx +++ b/x-pack/plugins/observability/public/application/index.tsx @@ -67,7 +67,7 @@ export const renderApp = ({ }) => { const { element, history, theme$ } = appMountParameters; const i18nCore = core.i18n; - const isDarkMode = core.uiSettings.get('theme:darkMode'); + const isDarkMode = core.theme.getTheme().darkMode; core.chrome.setHelpExtension({ appName: i18n.translate('xpack.observability.feedbackMenu.appName', { diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx index 010642acdf551f..fb90056b5193e6 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx @@ -67,7 +67,7 @@ export function ExpressionChart({ timeRange, timeFieldName, }: Props) { - const { charts, uiSettings } = useKibana().services; + const { charts, uiSettings, theme } = useKibana().services; const { isLoading, data } = useExpressionChartData( expression, derivedIndexPattern, @@ -90,7 +90,7 @@ export function ExpressionChart({ return ; } - const isDarkMode = uiSettings?.get('theme:darkMode') || false; + const isDarkMode = theme?.getTheme().darkMode ?? false; const firstSeries = first(first(data.pages)!.series); // Creating a custom series where the ID is changed to 0 // so that we can get a proper domain diff --git a/x-pack/plugins/observability/public/hooks/use_get_filtered_rule_types.ts b/x-pack/plugins/observability/public/hooks/use_get_filtered_rule_types.ts index 24e8a0fc107fb9..99a448a36405d1 100644 --- a/x-pack/plugins/observability/public/hooks/use_get_filtered_rule_types.ts +++ b/x-pack/plugins/observability/public/hooks/use_get_filtered_rule_types.ts @@ -6,13 +6,17 @@ */ import { useMemo } from 'react'; -import { ES_QUERY_ID } from '@kbn/rule-data-utils'; +import { ES_QUERY_ID, ML_ANOMALY_DETECTION_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { usePluginContext } from './use_plugin_context'; export function useGetFilteredRuleTypes() { const { observabilityRuleTypeRegistry } = usePluginContext(); return useMemo(() => { - return [ES_QUERY_ID, ...observabilityRuleTypeRegistry.list()]; + return [ + ES_QUERY_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, + ...observabilityRuleTypeRegistry.list(), + ]; }, [observabilityRuleTypeRegistry]); } diff --git a/x-pack/plugins/observability/public/pages/alerts/helpers/parse_alert.ts b/x-pack/plugins/observability/public/pages/alerts/helpers/parse_alert.ts index 33cff33c663a17..2ffea657998676 100644 --- a/x-pack/plugins/observability/public/pages/alerts/helpers/parse_alert.ts +++ b/x-pack/plugins/observability/public/pages/alerts/helpers/parse_alert.ts @@ -38,10 +38,17 @@ export const parseAlert = }; const formatter = observabilityRuleTypeRegistry.getFormatter(parsedFields[ALERT_RULE_TYPE_ID]!); + let formattedFields = {}; + try { + formattedFields = + formatter?.({ fields: parsedFields, formatters: { asDuration, asPercent } }) ?? {}; + } catch (error) { + // Ignore formatted fields if there is a formatting error + } const formatted = { link: undefined, reason: parsedFields[ALERT_REASON] ?? parsedFields[ALERT_RULE_NAME] ?? '', - ...(formatter?.({ fields: parsedFields, formatters: { asDuration, asPercent } }) ?? {}), + ...formattedFields, }; return { diff --git a/x-pack/plugins/observability/public/pages/overview/components/sections/ux/core_web_vitals/palette_legends.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/core_web_vitals/palette_legends.tsx index 1887f203200854..20f7d47e08d23c 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/sections/ux/core_web_vitals/palette_legends.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/core_web_vitals/palette_legends.tsx @@ -17,7 +17,7 @@ import { import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n-react'; import { euiLightVars, euiDarkVars } from '@kbn/ui-theme'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +import { useDarkMode } from '@kbn/kibana-react-plugin/public'; import { getCoreVitalTooltipMessage, Thresholds } from './core_vital_item'; import { LEGEND_NEEDS_IMPROVEMENT_LABEL, @@ -50,8 +50,7 @@ interface Props { } export function PaletteLegends({ ranks, title, onItemHover, thresholds, isCls }: Props) { - const [darkMode] = useUiSetting$('theme:darkMode'); - + const darkMode = useDarkMode(false); const palette = euiPaletteForStatus(3); const labels = [LEGEND_GOOD_LABEL, LEGEND_NEEDS_IMPROVEMENT_LABEL, LEGEND_POOR_LABEL]; diff --git a/x-pack/plugins/observability/public/pages/rules/rules_tab.tsx b/x-pack/plugins/observability/public/pages/rules/rules_tab.tsx index a2939bb4876e9e..ae896b66d990fd 100644 --- a/x-pack/plugins/observability/public/pages/rules/rules_tab.tsx +++ b/x-pack/plugins/observability/public/pages/rules/rules_tab.tsx @@ -9,6 +9,7 @@ import React, { useState } from 'react'; import { useHistory } from 'react-router-dom'; import { createKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; import { RuleStatus } from '@kbn/triggers-actions-ui-plugin/public'; +import { AlertConsumers } from '@kbn/rule-data-utils'; import { useKibana } from '../../utils/kibana_react'; import { useGetFilteredRuleTypes } from '../../hooks/use_get_filtered_rule_types'; import { observabilityAlertFeatureIds } from '../../../common/constants'; @@ -97,6 +98,7 @@ export function RulesTab({ setRefresh, stateRefresh }: RulesTabProps) { onSearchFilterChange={handleSearchFilterChange} onStatusFilterChange={handleStatusFilterChange} onTypeFilterChange={handleTypeFilterChange} + initialSelectedConsumer={AlertConsumers.LOGS} /> ); } diff --git a/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts b/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts index 643d5ffd4f337d..c9079991bdf4d3 100644 --- a/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts +++ b/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts @@ -145,13 +145,13 @@ export const registerObservabilityRuleTypes = async ( const dataViewId = getDataViewId(searchConfiguration); return { reason: fields[ALERT_REASON] ?? '-', - link: getViewInAppUrl( + link: getViewInAppUrl({ metrics, - fields[ALERT_START], + startedAt: fields[ALERT_START], logExplorerLocator, - (searchConfiguration?.query as { query: string }).query, - dataViewId - ), + filter: (searchConfiguration?.query as { query: string }).query, + dataViewId, + }), hasBasePath: true, }; }, diff --git a/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts index b769f5f32b73bb..f581236e229250 100644 --- a/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts +++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts @@ -27,10 +27,11 @@ import { CustomMetricExpressionParams, CustomThresholdExpressionMetric, } from '../../../../common/custom_threshold_rule/types'; +import { getViewInAppUrl } from '../../../../common/custom_threshold_rule/get_view_in_app_url'; jest.mock('./lib/evaluate_rule', () => ({ evaluateRule: jest.fn() })); jest.mock('../../../../common/custom_threshold_rule/get_view_in_app_url', () => ({ - getViewInAppUrl: () => 'mockedViewInApp', + getViewInAppUrl: jest.fn().mockReturnValue('mockedViewInApp'), })); interface AlertTestInstance { @@ -67,6 +68,7 @@ const logger = { const STARTED_AT_MOCK_DATE = new Date(); +const mockQuery = 'mockQuery'; const mockOptions = { executionId: '', startedAt: STARTED_AT_MOCK_DATE, @@ -74,7 +76,7 @@ const mockOptions = { params: { searchConfiguration: { query: { - query: '', + query: mockQuery, language: 'kuery', }, }, @@ -1058,6 +1060,7 @@ describe('The custom threshold alert type', () => { ); }); }); + describe('querying with the count aggregator', () => { afterAll(() => clearInstances()); const instanceID = '*'; @@ -1196,6 +1199,63 @@ describe('The custom threshold alert type', () => { }); }); }); + + describe('querying recovered alert with a count aggregator', () => { + afterAll(() => clearInstances()); + const execute = (comparator: Comparator, threshold: number[], sourceId: string = 'default') => + executor({ + ...mockOptions, + services, + params: { + ...mockOptions.params, + sourceId, + criteria: [ + { + ...customThresholdCountCriterion, + comparator, + threshold, + }, + ], + }, + }); + test('alerts based on the doc_count value instead of the aggregatedValue', async () => { + setEvaluationResults([ + { + '*': { + ...customThresholdCountCriterion, + comparator: Comparator.GT, + threshold: [0.9], + currentValue: 1, + timestamp: new Date().toISOString(), + shouldFire: true, + isNoData: false, + bucketKey: { groupBy0: 'a' }, + }, + }, + ]); + const mockedSetContext = jest.fn(); + services.alertFactory.done.mockImplementation(() => { + return { + getRecoveredAlerts: jest.fn().mockReturnValue([ + { + setContext: mockedSetContext, + getId: jest.fn().mockReturnValue('mockedId'), + }, + ]), + }; + }); + await execute(Comparator.GT, [0.9]); + const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/; + expect(getViewInAppUrl).toBeCalledWith({ + dataViewId: 'c34a7c79-a88b-4b4a-ad19-72f6d24104e4', + filter: mockQuery, + logExplorerLocator: undefined, + metrics: customThresholdCountCriterion.metrics, + startedAt: expect.stringMatching(ISO_DATE_REGEX), + }); + }); + }); + describe("querying a metric that hasn't reported data", () => { afterAll(() => clearInstances()); const instanceID = '*'; @@ -1901,12 +1961,14 @@ const customThresholdNonCountCriterion: CustomMetricExpressionParams = { threshold: [0], }; +const mockedCountFilter = 'mockedCountFilter'; const customThresholdCountCriterion: CustomMetricExpressionParams = { comparator: Comparator.GT, metrics: [ { aggType: Aggregators.COUNT, name: 'A', + filter: mockedCountFilter, }, ], timeSize: 1, diff --git a/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts index 2aa9ee09a073db..1be464f0fbbc39 100644 --- a/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts +++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts @@ -295,13 +295,13 @@ export const createCustomThresholdExecutor = ({ } return formatAlertResult(evaluation).currentValue; }), - viewInAppUrl: getViewInAppUrl( - alertResults.length === 1 ? alertResults[0][group].metrics : [], - indexedStartedAt, + viewInAppUrl: getViewInAppUrl({ + dataViewId: params.searchConfiguration?.index?.title ?? dataViewId, + filter: params.searchConfiguration.query.query, logExplorerLocator, - params.searchConfiguration.query.query, - params.searchConfiguration?.index?.title ?? dataViewId - ), + metrics: alertResults.length === 1 ? alertResults[0][group].metrics : [], + startedAt: indexedStartedAt, + }), ...additionalContext, }); } @@ -321,6 +321,7 @@ export const createCustomThresholdExecutor = ({ const alertUuid = getAlertUuid(recoveredAlertId); const timestamp = startedAt.toISOString(); const indexedStartedAt = getAlertStartedDate(recoveredAlertId) ?? timestamp; + const group = groupByKeysObjectForRecovered[recoveredAlertId]; const alertHits = alertUuid ? await getAlertByAlertUuid(alertUuid) : undefined; const additionalContext = getContextForRecoveredAlerts(alertHits); @@ -333,8 +334,15 @@ export const createCustomThresholdExecutor = ({ alertsLocator, basePath.publicBaseUrl ), - group: groupByKeysObjectForRecovered[recoveredAlertId], + group, timestamp: startedAt.toISOString(), + viewInAppUrl: getViewInAppUrl({ + dataViewId: params.searchConfiguration?.index?.title ?? dataViewId, + filter: params.searchConfiguration.query.query, + logExplorerLocator, + metrics: params.criteria[0]?.metrics, + startedAt: indexedStartedAt, + }), ...additionalContext, }); } diff --git a/x-pack/plugins/observability/server/plugin.ts b/x-pack/plugins/observability/server/plugin.ts index 791ddc8108312f..b5be8fb9f622ec 100644 --- a/x-pack/plugins/observability/server/plugin.ts +++ b/x-pack/plugins/observability/server/plugin.ts @@ -28,6 +28,7 @@ import { i18n } from '@kbn/i18n'; import { ApmRuleType, ES_QUERY_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID, OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, } from '@kbn/rule-data-utils'; @@ -89,6 +90,7 @@ const o11yRuleTypes = [ SLO_BURN_RATE_RULE_TYPE_ID, OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, ES_QUERY_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID, ...Object.values(ApmRuleType), ]; diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/home.cy.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/home.cy.ts index 8c7d433f48a4da..3c1e123b494526 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/home.cy.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/home.cy.ts @@ -13,6 +13,7 @@ describe('[Observability onboarding] Landing page', () => { describe('Entry point', () => { it('when clicking on the logs card the user is navigated to the observability onboarding page', () => { cy.getByTestSubj('guideButtonRedirect').click(); + cy.getByTestSubj('guide-filter-observability').click(); cy.getByTestSubj('onboarding--observability--logs').click(); cy.url().should('include', '/app/observabilityOnboarding'); diff --git a/x-pack/plugins/observability_onboarding/public/application/app.tsx b/x-pack/plugins/observability_onboarding/public/application/app.tsx index 6142f7acd45cb3..7a6143c9954cb1 100644 --- a/x-pack/plugins/observability_onboarding/public/application/app.tsx +++ b/x-pack/plugins/observability_onboarding/public/application/app.tsx @@ -16,7 +16,7 @@ import { i18n } from '@kbn/i18n'; import { KibanaContextProvider, KibanaThemeProvider, - useUiSetting$, + useDarkMode, } from '@kbn/kibana-react-plugin/public'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { HeaderMenuPortal } from '@kbn/observability-shared-plugin/public'; @@ -112,8 +112,7 @@ function App() { } function ObservabilityOnboardingApp() { - const [darkMode] = useUiSetting$('theme:darkMode'); - + const darkMode = useDarkMode(false); return ( ({ diff --git a/x-pack/plugins/security/server/routes/api_keys/has_active.test.ts b/x-pack/plugins/security/server/routes/api_keys/has_active.test.ts new file mode 100644 index 00000000000000..d2c38651f4397a --- /dev/null +++ b/x-pack/plugins/security/server/routes/api_keys/has_active.test.ts @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { kibanaResponseFactory } from '@kbn/core/server'; +import type { RequestHandler } from '@kbn/core/server'; +import type { CustomRequestHandlerMock, ScopedClusterClientMock } from '@kbn/core/server/mocks'; +import { coreMock, httpServerMock } from '@kbn/core/server/mocks'; +import { licensingMock } from '@kbn/licensing-plugin/server/mocks'; +import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; + +import { defineHasApiKeysRoutes } from './has_active'; +import type { InternalAuthenticationServiceStart } from '../../authentication'; +import { authenticationServiceMock } from '../../authentication/authentication_service.mock'; +import { routeDefinitionParamsMock } from '../index.mock'; + +describe('Has API Keys route', () => { + let routeHandler: RequestHandler; + let authc: DeeplyMockedKeys; + let esClientMock: ScopedClusterClientMock; + let mockContext: CustomRequestHandlerMock; + + beforeEach(async () => { + const mockRouteDefinitionParams = routeDefinitionParamsMock.create(); + authc = authenticationServiceMock.createStart(); + mockRouteDefinitionParams.getAuthenticationService.mockReturnValue(authc); + defineHasApiKeysRoutes(mockRouteDefinitionParams); + [[, routeHandler]] = mockRouteDefinitionParams.router.get.mock.calls; + mockContext = coreMock.createCustomRequestHandlerContext({ + core: coreMock.createRequestHandlerContext(), + licensing: licensingMock.createRequestHandlerContext(), + }); + + esClientMock = (await mockContext.core).elasticsearch.client; + + authc.apiKeys.areAPIKeysEnabled.mockResolvedValue(true); + authc.apiKeys.areCrossClusterAPIKeysEnabled.mockResolvedValue(true); + + esClientMock.asCurrentUser.security.getApiKey.mockResponse({ + api_keys: [ + { id: '123', invalidated: false }, + { id: '456', invalidated: true }, + ], + } as any); + }); + + it('should calculate when user has API keys', async () => { + const response = await routeHandler( + mockContext, + httpServerMock.createKibanaRequest(), + kibanaResponseFactory + ); + + expect(response.payload).toEqual( + expect.objectContaining({ + hasApiKeys: true, + }) + ); + expect(esClientMock.asCurrentUser.security.getApiKey).toHaveBeenCalledTimes(1); + expect(esClientMock.asCurrentUser.security.getApiKey).toHaveBeenCalledWith({ + owner: true, + active_only: true, + }); + }); + + it('should calculate when user does not have API keys', async () => { + esClientMock.asCurrentUser.security.getApiKey.mockResponse({ + api_keys: [], + }); + + const response = await routeHandler( + mockContext, + httpServerMock.createKibanaRequest(), + kibanaResponseFactory + ); + + expect(response.payload).toEqual( + expect.objectContaining({ + hasApiKeys: false, + }) + ); + }); + + it('should filter out invalidated API keys', async () => { + const response = await routeHandler( + mockContext, + httpServerMock.createKibanaRequest(), + kibanaResponseFactory + ); + + expect(response.status).toBe(200); + expect(response.payload?.hasApiKeys).toBe(true); + }); + + it('should return `404` if API keys are disabled', async () => { + authc.apiKeys.areAPIKeysEnabled.mockResolvedValue(false); + + const response = await routeHandler( + mockContext, + httpServerMock.createKibanaRequest(), + kibanaResponseFactory + ); + + expect(response.status).toBe(404); + expect(response.payload).toEqual({ + message: + "API keys are disabled in Elasticsearch. To use API keys enable 'xpack.security.authc.api_key.enabled' setting.", + }); + }); +}); diff --git a/x-pack/plugins/security/server/routes/api_keys/has_active.ts b/x-pack/plugins/security/server/routes/api_keys/has_active.ts new file mode 100644 index 00000000000000..eea5ac71e53a07 --- /dev/null +++ b/x-pack/plugins/security/server/routes/api_keys/has_active.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RouteDefinitionParams } from '..'; +import { createLicensedRouteHandler } from '../licensed_route_handler'; + +/** + * Response of Kibana Has API keys endpoint. + */ +export interface HasAPIKeysResult { + hasApiKeys: boolean; +} + +export function defineHasApiKeysRoutes({ + router, + getAuthenticationService, +}: RouteDefinitionParams) { + router.get( + { + path: '/internal/security/api_key/_has_active', + validate: false, + options: { + access: 'internal', + }, + }, + createLicensedRouteHandler(async (context, _request, response) => { + const esClient = (await context.core).elasticsearch.client; + const authenticationService = getAuthenticationService(); + + const areApiKeysEnabled = await authenticationService.apiKeys.areAPIKeysEnabled(); + + if (!areApiKeysEnabled) { + return response.notFound({ + body: { + message: + "API keys are disabled in Elasticsearch. To use API keys enable 'xpack.security.authc.api_key.enabled' setting.", + }, + }); + } + + const { api_keys: apiKeys } = await esClient.asCurrentUser.security.getApiKey({ + owner: true, + // @ts-expect-error @elastic/elasticsearch SecurityGetApiKeyRequest.active_only: boolean | undefined + active_only: true, + }); + + // simply return true if the result array is non-empty + return response.ok({ + body: { + hasApiKeys: apiKeys.length > 0, + }, + }); + }) + ); +} diff --git a/x-pack/plugins/security/server/routes/api_keys/index.ts b/x-pack/plugins/security/server/routes/api_keys/index.ts index 9855d94923c33b..3b71eb7e1104d7 100644 --- a/x-pack/plugins/security/server/routes/api_keys/index.ts +++ b/x-pack/plugins/security/server/routes/api_keys/index.ts @@ -8,6 +8,7 @@ import { defineCreateApiKeyRoutes } from './create'; import { defineEnabledApiKeysRoutes } from './enabled'; import { defineGetApiKeysRoutes } from './get'; +import { defineHasApiKeysRoutes } from './has_active'; import { defineInvalidateApiKeysRoutes } from './invalidate'; import { defineUpdateApiKeyRoutes } from './update'; import type { RouteDefinitionParams } from '..'; @@ -24,6 +25,7 @@ export type { GetAPIKeysResult } from './get'; export function defineApiKeysRoutes(params: RouteDefinitionParams) { defineEnabledApiKeysRoutes(params); defineGetApiKeysRoutes(params); + defineHasApiKeysRoutes(params); defineCreateApiKeyRoutes(params); defineUpdateApiKeyRoutes(params); defineInvalidateApiKeysRoutes(params); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/alerts/8.13.0/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/alerts/8.13.0/index.ts new file mode 100644 index 00000000000000..594dc685097db6 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/alerts/8.13.0/index.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { AlertWithCommonFields800 } from '@kbn/rule-registry-plugin/common/schemas/8.0.0'; +import type { + ALERT_HOST_CRITICALITY, + ALERT_USER_CRITICALITY, +} from '../../../../../field_maps/field_names'; +import type { + Ancestor8120, + BaseFields8120, + EqlBuildingBlockFields8120, + EqlShellFields8120, + NewTermsFields8120, +} from '../8.12.0'; + +/* DO NOT MODIFY THIS SCHEMA TO ADD NEW FIELDS. These types represent the alerts that shipped in 8.13.0. +Any changes to these types should be bug fixes so the types more accurately represent the alerts from 8.13.0. +If you are adding new fields for a new release of Kibana, create a new sibling folder to this one +for the version to be released and add the field(s) to the schema in that folder. +Then, update `../index.ts` to import from the new folder that has the latest schemas, add the +new schemas to the union of all alert schemas, and re-export the new schemas as the `*Latest` schemas. +*/ + +export type { Ancestor8120 as Ancestor8130 }; + +export interface BaseFields8130 extends BaseFields8120 { + [ALERT_HOST_CRITICALITY]: string | undefined; + [ALERT_USER_CRITICALITY]: string | undefined; +} + +export interface WrappedFields8130 { + _id: string; + _index: string; + _source: T; +} + +export type GenericAlert8130 = AlertWithCommonFields800; + +export type EqlShellFields8130 = EqlShellFields8120 & BaseFields8130; + +export type EqlBuildingBlockFields8130 = EqlBuildingBlockFields8120 & BaseFields8130; + +export type NewTermsFields8130 = NewTermsFields8120 & BaseFields8130; + +export type NewTermsAlert8130 = NewTermsFields8120 & BaseFields8130; + +export type EqlBuildingBlockAlert8130 = AlertWithCommonFields800; + +export type EqlShellAlert8130 = AlertWithCommonFields800; + +export type DetectionAlert8130 = + | GenericAlert8130 + | EqlShellAlert8130 + | EqlBuildingBlockAlert8130 + | NewTermsAlert8130; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/alerts/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/alerts/index.ts index 742e5fd4ecfc1c..6bf7b1d5dfd7e0 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/alerts/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/alerts/index.ts @@ -12,15 +12,16 @@ import type { DetectionAlert860 } from './8.6.0'; import type { DetectionAlert870 } from './8.7.0'; import type { DetectionAlert880 } from './8.8.0'; import type { DetectionAlert890 } from './8.9.0'; +import type { DetectionAlert8120 } from './8.12.0'; import type { - Ancestor8120, - BaseFields8120, - DetectionAlert8120, - EqlBuildingBlockFields8120, - EqlShellFields8120, - NewTermsFields8120, - WrappedFields8120, -} from './8.12.0'; + Ancestor8130, + BaseFields8130, + DetectionAlert8130, + EqlBuildingBlockFields8130, + EqlShellFields8130, + NewTermsFields8130, + WrappedFields8130, +} from './8.13.0'; // When new Alert schemas are created for new Kibana versions, add the DetectionAlert type from the new version // here, e.g. `export type DetectionAlert = DetectionAlert800 | DetectionAlert820` if a new schema is created in 8.2.0 @@ -31,14 +32,15 @@ export type DetectionAlert = | DetectionAlert870 | DetectionAlert880 | DetectionAlert890 - | DetectionAlert8120; + | DetectionAlert8120 + | DetectionAlert8130; export type { - Ancestor8120 as AncestorLatest, - BaseFields8120 as BaseFieldsLatest, - DetectionAlert8120 as DetectionAlertLatest, - WrappedFields8120 as WrappedFieldsLatest, - EqlBuildingBlockFields8120 as EqlBuildingBlockFieldsLatest, - EqlShellFields8120 as EqlShellFieldsLatest, - NewTermsFields8120 as NewTermsFieldsLatest, + Ancestor8130 as AncestorLatest, + BaseFields8130 as BaseFieldsLatest, + DetectionAlert8130 as DetectionAlertLatest, + WrappedFields8130 as WrappedFieldsLatest, + EqlBuildingBlockFields8130 as EqlBuildingBlockFieldsLatest, + EqlShellFields8130 as EqlShellFieldsLatest, + NewTermsFields8130 as NewTermsFieldsLatest, }; diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/common/base.ts b/x-pack/plugins/security_solution/common/api/endpoint/actions/common/base.ts index 9adc5f7289dc5a..755361902eaa1d 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/common/base.ts +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/common/base.ts @@ -7,6 +7,7 @@ import type { TypeOf } from '@kbn/config-schema'; import { schema } from '@kbn/config-schema'; +import { RESPONSE_ACTION_AGENT_TYPE } from '../../../../endpoint/service/response_actions/constants'; export const BaseActionRequestSchema = { /** A list of endpoint IDs whose hosts will be isolated (Fleet Agent IDs will be retrieved for these) */ @@ -42,6 +43,13 @@ export const BaseActionRequestSchema = { ), comment: schema.maybe(schema.string()), parameters: schema.maybe(schema.object({})), + agent_type: schema.maybe( + schema.oneOf( + // @ts-expect-error TS2769: No overload matches this call + RESPONSE_ACTION_AGENT_TYPE.map((agentType) => schema.literal(agentType)), + { defaultValue: 'endpoint' } + ) + ), }; export const NoParametersRequestSchema = { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts index 558d0a2fa6a503..d122daf52627b4 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts @@ -22,17 +22,23 @@ import { API_VERSIONS, } from '@kbn/fleet-plugin/common'; import { memoize } from 'lodash'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { catchAxiosErrorFormatAndThrow } from '../format_axios_error'; import { usageTracker } from './usage_tracker'; import { getEndpointPackageInfo } from '../utils/package'; import type { PolicyData } from '../types'; import { policyFactory as policyConfigFactory } from '../models/policy_config'; -import { wrapErrorAndRejectPromise } from './utils'; +import { RETRYABLE_TRANSIENT_ERRORS, retryOnError, wrapErrorAndRejectPromise } from './utils'; export interface IndexedFleetEndpointPolicyResponse { integrationPolicies: PolicyData[]; agentPolicies: AgentPolicy[]; } +enum TimeoutsInMS { + TEN_SECONDS = 10 * 1000, + FIVE_MINUTES = 5 * 60 * 1000, +} /** * Create an endpoint Integration Policy (and associated Agent Policy) via Fleet * (NOTE: ensure that fleet is setup first before calling this loading function) @@ -43,7 +49,8 @@ export const indexFleetEndpointPolicy = usageTracker.track( kbnClient: KbnClient, policyName: string, endpointPackageVersion?: string, - agentPolicyName?: string + agentPolicyName?: string, + log?: ToolingLog ): Promise => { const response: IndexedFleetEndpointPolicyResponse = { integrationPolicies: [], @@ -84,6 +91,7 @@ export const indexFleetEndpointPolicy = usageTracker.track( // Create integration (package) policy const newPackagePolicyData: CreatePackagePolicyRequest['body'] = { name: policyName, + // skip_ensure_installed: true, description: 'Protect the worlds data', policy_id: agentPolicy.data.item.id, enabled: true, @@ -106,18 +114,48 @@ export const indexFleetEndpointPolicy = usageTracker.track( version: packageVersion, }, }; - const packagePolicy = (await kbnClient - .request({ - path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, - method: 'POST', - body: newPackagePolicyData, - headers: { - 'elastic-api-version': API_VERSIONS.public.v1, - }, - }) - .catch(wrapErrorAndRejectPromise)) as AxiosResponse; - response.integrationPolicies.push(packagePolicy.data.item as PolicyData); + const createPackagePolicy = async (): Promise => + kbnClient + .request({ + path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, + method: 'POST', + body: newPackagePolicyData, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + }) + .catch(catchAxiosErrorFormatAndThrow) + .then((res) => res.data); + + const started = new Date(); + const hasTimedOut = (): boolean => { + const elapsedTime = Date.now() - started.getTime(); + return elapsedTime > TimeoutsInMS.FIVE_MINUTES; + }; + + let packagePolicy: CreatePackagePolicyResponse | undefined; + log?.debug(`Creating integration policy with name: ${policyName}`); + + while (!packagePolicy && !hasTimedOut()) { + packagePolicy = await retryOnError( + async () => createPackagePolicy(), + [...RETRYABLE_TRANSIENT_ERRORS, 'resource_not_found_exception'], + log + ); + + if (!packagePolicy) { + await new Promise((resolve) => setTimeout(resolve, TimeoutsInMS.TEN_SECONDS)); + } + } + + if (!packagePolicy) { + throw new Error(`Create package policy failed`); + } + + log?.verbose(`Integration policy created:`, JSON.stringify(packagePolicy, null, 2)); + + response.integrationPolicies.push(packagePolicy.item as PolicyData); return response; } diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/format_axios_error.ts b/x-pack/plugins/security_solution/common/endpoint/format_axios_error.ts similarity index 100% rename from x-pack/plugins/security_solution/scripts/endpoint/common/format_axios_error.ts rename to x-pack/plugins/security_solution/common/endpoint/format_axios_error.ts diff --git a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts index 14d1272add26ba..67a29b7a185a21 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts @@ -11,6 +11,10 @@ export type ResponseActionStatus = typeof RESPONSE_ACTION_STATUS[number]; export const RESPONSE_ACTION_TYPE = ['automated', 'manual'] as const; export type ResponseActionType = typeof RESPONSE_ACTION_TYPE[number]; + +export const RESPONSE_ACTION_AGENT_TYPE = ['endpoint', 'sentinel_one'] as const; +export type ResponseActionAgentType = typeof RESPONSE_ACTION_AGENT_TYPE[number]; + /** * The Command names that are used in the API payload for the `{ command: '' }` attribute */ diff --git a/x-pack/plugins/security_solution/common/endpoint/types/actions.ts b/x-pack/plugins/security_solution/common/endpoint/types/actions.ts index 98fb9b0f16b0c1..f2393c02c3b41d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/actions.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/actions.ts @@ -17,6 +17,7 @@ import type { import type { ResponseActionStatus, ResponseActionsApiCommandNames, + ResponseActionAgentType, } from '../service/response_actions/constants'; export type ISOLATION_ACTIONS = 'isolate' | 'unisolate'; @@ -104,7 +105,7 @@ interface EndpointActionFields< interface ActionRequestFields { expiration: string; type: 'INPUT_ACTION'; - input_type: 'endpoint'; + input_type: ResponseActionAgentType; } interface ActionResponseFields { diff --git a/x-pack/plugins/security_solution/common/endpoint/types/utility_types.ts b/x-pack/plugins/security_solution/common/endpoint/types/utility_types.ts index 92880d93221914..a70c8e124eb842 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/utility_types.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/utility_types.ts @@ -10,3 +10,10 @@ export type PromiseResolvedValue> = T extends Promise ? Value : never; + +/** + * Deeply convert a immutable type (those with `readonly` properties) to a mutable type + */ +export type DeepMutable = T extends Record + ? { -readonly [K in keyof T]: DeepMutable } + : T; diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 8c16307ab5b8c5..805192aed8a9f0 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -71,6 +71,11 @@ export const allowedExperimentalValues = Object.freeze({ */ responseActionUploadEnabled: true, + /** + * Enables the ability to send Response actions to SentinelOne + */ + responseActionsSentinelOneV1Enabled: false, + /** * Enables top charts on Alerts Page */ @@ -94,11 +99,6 @@ export const allowedExperimentalValues = Object.freeze({ */ assistantModelEvaluation: false, - /** - * Enables Retrieval Augmented Generation (RAG) on Alerts in the assistant - */ - assistantRagOnAlerts: false, - /* * Enables the new user details flyout displayed on the Alerts page and timeline. * @@ -125,11 +125,6 @@ export const allowedExperimentalValues = Object.freeze({ */ protectionUpdatesEnabled: true, - /** - * Enables alerts suppression for threshold rules - */ - alertSuppressionForThresholdRuleEnabled: false, - /** * Disables the timeline save tour. * This flag is used to disable the tour in cypress tests. diff --git a/x-pack/plugins/security_solution/common/field_maps/8.13.0/alerts.ts b/x-pack/plugins/security_solution/common/field_maps/8.13.0/alerts.ts new file mode 100644 index 00000000000000..86c84092891b80 --- /dev/null +++ b/x-pack/plugins/security_solution/common/field_maps/8.13.0/alerts.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 { alertsFieldMap840 } from '../8.4.0'; +import { ALERT_HOST_CRITICALITY, ALERT_USER_CRITICALITY } from '../field_names'; + +export const alertsFieldMap8130 = { + ...alertsFieldMap840, + /** + * Stores the criticality level for the host, as determined by analysts, in relation to the alert. + * The Criticality level is copied from the asset criticality index. + */ + [ALERT_HOST_CRITICALITY]: { + type: 'keyword', + array: false, + required: false, + }, + /** + * Stores the criticality level for the user, as determined by analysts, in relation to the alert. + * The Criticality level is copied from the asset criticality index. + */ + [ALERT_USER_CRITICALITY]: { + type: 'keyword', + array: false, + required: false, + }, +} as const; + +export type AlertsFieldMap8130 = typeof alertsFieldMap8130; diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/kpi/translations.ts b/x-pack/plugins/security_solution/common/field_maps/8.13.0/index.ts similarity index 54% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/kpi/translations.ts rename to x-pack/plugins/security_solution/common/field_maps/8.13.0/index.ts index 83b402220f3d45..291ca7f8dff822 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/kpi/translations.ts +++ b/x-pack/plugins/security_solution/common/field_maps/8.13.0/index.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; - -export const FAIL_RISK_SCORE = i18n.translate( - 'xpack.securitySolution.riskScore.kpi.failSearchDescription', - { - defaultMessage: `Failed to run search on risk score`, - } -); +import type { AlertsFieldMap8130 } from './alerts'; +import { alertsFieldMap8130 } from './alerts'; +export type { AlertsFieldMap8130 }; +export { alertsFieldMap8130 }; diff --git a/x-pack/plugins/security_solution/common/field_maps/field_names.ts b/x-pack/plugins/security_solution/common/field_maps/field_names.ts index 53ebfc5c188d10..6124cc08ebd2bb 100644 --- a/x-pack/plugins/security_solution/common/field_maps/field_names.ts +++ b/x-pack/plugins/security_solution/common/field_maps/field_names.ts @@ -17,6 +17,8 @@ export const ALERT_THRESHOLD_RESULT = `${ALERT_NAMESPACE}.threshold_result` as c export const ALERT_THRESHOLD_RESULT_COUNT = `${ALERT_THRESHOLD_RESULT}.count` as const; export const ALERT_NEW_TERMS = `${ALERT_NAMESPACE}.new_terms` as const; export const ALERT_NEW_TERMS_FIELDS = `${ALERT_RULE_PARAMETERS}.new_terms_fields` as const; +export const ALERT_HOST_CRITICALITY = `${ALERT_NAMESPACE}.host.criticality_level` as const; +export const ALERT_USER_CRITICALITY = `${ALERT_NAMESPACE}.user.criticality_level` as const; export const ALERT_ORIGINAL_EVENT = `${ALERT_NAMESPACE}.original_event` as const; export const ALERT_ORIGINAL_EVENT_ACTION = `${ALERT_ORIGINAL_EVENT}.action` as const; diff --git a/x-pack/plugins/security_solution/common/field_maps/index.ts b/x-pack/plugins/security_solution/common/field_maps/index.ts index c6780a33fc64ff..fe903776d1dd43 100644 --- a/x-pack/plugins/security_solution/common/field_maps/index.ts +++ b/x-pack/plugins/security_solution/common/field_maps/index.ts @@ -5,9 +5,9 @@ * 2.0. */ -import type { AlertsFieldMap840 } from './8.4.0'; -import { alertsFieldMap840 } from './8.4.0'; +import type { AlertsFieldMap8130 } from './8.13.0'; +import { alertsFieldMap8130 } from './8.13.0'; import type { RulesFieldMap } from './8.0.0/rules'; import { rulesFieldMap } from './8.0.0/rules'; -export type { AlertsFieldMap840 as AlertsFieldMap, RulesFieldMap }; -export { alertsFieldMap840 as alertsFieldMap, rulesFieldMap }; +export type { AlertsFieldMap8130 as AlertsFieldMap, RulesFieldMap }; +export { alertsFieldMap8130 as alertsFieldMap, rulesFieldMap }; diff --git a/x-pack/plugins/security_solution/public/assistant/provider.tsx b/x-pack/plugins/security_solution/public/assistant/provider.tsx index 7a17a98bc0d6e3..a9f9e14a8d3e0b 100644 --- a/x-pack/plugins/security_solution/public/assistant/provider.tsx +++ b/x-pack/plugins/security_solution/public/assistant/provider.tsx @@ -57,7 +57,6 @@ export const AssistantProvider: React.FC = ({ children }) => { const { signalIndexName } = useSignalIndex(); const alertsIndexPattern = signalIndexName ?? undefined; - const ragOnAlerts = useIsExperimentalFeatureEnabled('assistantRagOnAlerts'); const toasts = useAppToasts() as unknown as IToasts; // useAppToasts is the current, non-deprecated method of getting the toasts service in the Security Solution, but it doesn't return the IToasts interface (defined by core) return ( @@ -82,7 +81,6 @@ export const AssistantProvider: React.FC = ({ children }) => { assistantStreamingEnabled={assistantStreamingEnabled} modelEvaluatorEnabled={isModelEvaluationEnabled} nameSpace={nameSpace} - ragOnAlerts={ragOnAlerts} setConversations={setConversations} setDefaultAllow={setDefaultAllow} setDefaultAllowReplacement={setDefaultAllowReplacement} diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx index 4f5e1f847ad83d..ce22e6e09b4336 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx @@ -8,6 +8,7 @@ import styled from 'styled-components'; import React from 'react'; import { EuiTitle, EuiHorizontalRule, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; +import type { HostRisk, UserRisk } from '../../../../entity_analytics/api/types'; import * as i18n from './translations'; import type { CtiEnrichment } from '../../../../../common/search_strategy/security_solution/cti'; @@ -16,9 +17,8 @@ import type { TimelineEventsDetailsItem, RiskSeverity, } from '../../../../../common/search_strategy'; -import { RiskSummary } from './risk_summary'; +import { RiskSummary } from '../../../../entity_analytics/components/risk_summary'; import { EnrichmentSummary } from './enrichment_summary'; -import type { HostRisk, UserRisk } from '../../../../explore/containers/risk_score'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { useHasSecurityCapability } from '../../../../helper_hooks'; import { RiskScoreInfoTooltip } from '../../../../overview/components/common'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/translations.ts b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/translations.ts index 0ba5a464dc9d5a..973b438c866c34 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/translations.ts @@ -6,9 +6,9 @@ */ import { i18n } from '@kbn/i18n'; -import { getRiskEntityTranslation } from '../../../../explore/components/risk_score/translations'; +import { getRiskEntityTranslation } from '../../../../entity_analytics/components/risk_score/translations'; import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -export * from '../../../../explore/components/risk_score/translations'; +export * from '../../../../entity_analytics/components/risk_score/translations'; export const FEED_NAME_PREPOSITION = i18n.translate( 'xpack.securitySolution.eventDetails.ctiSummary.feedNamePreposition', diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx index 2273389e537331..6c1dd9bce910a0 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx @@ -55,7 +55,7 @@ import { EnrichmentRangePicker } from './cti_details/enrichment_range_picker'; import { InvestigationGuideView } from './investigation_guide_view'; import { Overview } from './overview'; import { Insights } from './insights/insights'; -import { useRiskScoreData } from './use_risk_score_data'; +import { useRiskScoreData } from '../../../entity_analytics/api/hooks/use_risk_score_data'; import { getRowRenderer } from '../../../timelines/components/timeline/body/renderers/get_row_renderer'; import { DETAILS_CLASS_NAME } from '../../../timelines/components/timeline/body/renderers/helpers'; import { defaultRowRenderers } from '../../../timelines/components/timeline/body/renderers'; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_search.ts b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_search.ts index d21e7a8087cbc2..88b03516e5aa82 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_search.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_search.ts @@ -8,12 +8,12 @@ import { useState, useEffect, useMemo } from 'react'; import { has, sortBy } from 'lodash/fp'; +import { getAggregatedAnomaliesQuery } from '../../../../entity_analytics/components/entity_analytics_anomalies/query'; import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants'; import * as i18n from './translations'; import { useUiSetting$ } from '../../../lib/kibana'; import { useAppToasts } from '../../../hooks/use_app_toasts'; import { anomaliesSearch } from '../api/anomalies_search'; -import { getAggregatedAnomaliesQuery } from '../../../../overview/components/entity_analytics/anomalies/query'; import type { inputsModel } from '../../../store'; import { useSecurityJobs } from '../../ml_popover/hooks/use_security_jobs'; import type { SecurityJob } from '../../ml_popover/types'; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/visualization_embeddable.test.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/visualization_embeddable.test.tsx index ee77776e60a91b..8d5ef1a3b6e84c 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/visualization_embeddable.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/visualization_embeddable.test.tsx @@ -22,8 +22,7 @@ import { import { createStore } from '../../store'; import type { State } from '../../store'; import { useRefetchByRestartingSession } from '../page/use_refetch_by_session'; -import { getRiskScoreDonutAttributes } from './lens_attributes/common/risk_scores/risk_score_donut'; -import { TOTAL_LABEL } from '../../../overview/components/entity_analytics/common/translations'; +import { getRiskScoreDonutAttributes } from '../../../entity_analytics/lens_attributes/risk_score_donut'; jest.mock('./lens_embeddable'); jest.mock('../page/use_refetch_by_session', () => ({ @@ -183,7 +182,7 @@ describe('VisualizationEmbeddable', () => { getLensAttributes={getRiskScoreDonutAttributes} id="testId" isDonut={true} - label={TOTAL_LABEL} + label={'Total'} timerange={{ from: '2022-10-27T23:00:00.000Z', to: '2022-11-04T10:46:16.204Z' }} /> diff --git a/x-pack/plugins/security_solution/public/common/images/cloud_security_posture_dashboard_page.png b/x-pack/plugins/security_solution/public/common/images/cloud_security_posture_dashboard_page.png index fe27c2ca951206..cc2b52693edffd 100644 Binary files a/x-pack/plugins/security_solution/public/common/images/cloud_security_posture_dashboard_page.png and b/x-pack/plugins/security_solution/public/common/images/cloud_security_posture_dashboard_page.png differ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx index c2c85fca93f031..cb37caa661fdac 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx @@ -54,7 +54,6 @@ import { TechnicalPreviewBadge } from '../../../../detections/components/rules/t import { BadgeList } from './badge_list'; import { DEFAULT_DESCRIPTION_LIST_COLUMN_WIDTHS } from './constants'; import * as i18n from './translations'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import type { ExperimentalFeatures } from '../../../../../common/experimental_features'; interface SavedQueryNameProps { @@ -427,7 +426,7 @@ const prepareDefinitionSectionListItems = ( rule: Partial, isInteractive: boolean, savedQuery: SavedQuery | undefined, - { alertSuppressionForThresholdRuleEnabled }: Partial + experimentalFeatures?: Partial ): EuiDescriptionListProps['listItems'] => { const definitionSectionListItems: EuiDescriptionListProps['listItems'] = []; @@ -669,16 +668,14 @@ const prepareDefinitionSectionListItems = ( }); } - if (rule.type !== 'threshold' || alertSuppressionForThresholdRuleEnabled) { - definitionSectionListItems.push({ - title: ( - - - - ), - description: , - }); - } + definitionSectionListItems.push({ + title: ( + + + + ), + description: , + }); if ('missing_fields_strategy' in rule.alert_suppression) { definitionSectionListItems.push({ @@ -741,15 +738,10 @@ export const RuleDefinitionSection = ({ ruleType: rule.type, }); - const alertSuppressionForThresholdRuleEnabled = useIsExperimentalFeatureEnabled( - 'alertSuppressionForThresholdRuleEnabled' - ); - const definitionSectionListItems = prepareDefinitionSectionListItems( rule, isInteractive, - savedQuery, - { alertSuppressionForThresholdRuleEnabled } + savedQuery ); return ( diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx index 2d6234f225b3ac..809fb97eb260c3 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx @@ -83,7 +83,6 @@ import { useLicense } from '../../../../common/hooks/use_license'; import { AlertSuppressionMissingFieldsStrategyEnum } from '../../../../../common/api/detection_engine/model/rule_schema'; import { DurationInput } from '../duration_input'; import { MINIMUM_LICENSE_FOR_SUPPRESSION } from '../../../../../common/detection_engine/constants'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useUpsellingMessage } from '../../../../common/hooks/use_upselling'; const CommonUseField = getUseField({ component: Field }); @@ -182,9 +181,6 @@ const StepDefineRuleComponent: FC = ({ const esqlQueryRef = useRef(undefined); - const isAlertSuppressionForThresholdRuleFeatureEnabled = useIsExperimentalFeatureEnabled( - 'alertSuppressionForThresholdRuleEnabled' - ); const isAlertSuppressionLicenseValid = license.isAtLeast(MINIMUM_LICENSE_FOR_SUPPRESSION); const isThresholdRule = getIsThresholdRule(ruleType); @@ -808,8 +804,7 @@ const StepDefineRuleComponent: FC = ({ [isUpdateView, mlCapabilities] ); - const isAlertSuppressionEnabled = - isQueryRule(ruleType) || (isThresholdRule && isAlertSuppressionForThresholdRuleFeatureEnabled); + const isAlertSuppressionEnabled = isQueryRule(ruleType) || isThresholdRule; return ( <> diff --git a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts index bfce8420964486..384c6bf955e51f 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts +++ b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts @@ -6,6 +6,10 @@ */ import type { EuiDataGridColumn } from '@elastic/eui'; +import { + ALERT_HOST_CRITICALITY, + ALERT_USER_CRITICALITY, +} from '../../../../common/field_maps/field_names'; import type { LicenseService } from '../../../../common/license'; import type { ColumnHeaderOptions } from '../../../../common/types'; @@ -72,6 +76,18 @@ const getBaseColumns = ( id: 'user.risk.calculated_level', } : null, + isPlatinumPlus + ? { + columnHeaderType: defaultColumnHeaderType, + id: ALERT_HOST_CRITICALITY, + } + : null, + isPlatinumPlus + ? { + columnHeaderType: defaultColumnHeaderType, + id: ALERT_USER_CRITICALITY, + } + : null, { columnHeaderType: defaultColumnHeaderType, id: 'process.name', diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts index 73cb1cbd57ff09..9f2b7bb319f7d4 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type { RiskScoreEntity } from '../../../common/search_strategy'; import { RISK_ENGINE_STATUS_URL, RISK_SCORE_PREVIEW_URL, @@ -13,6 +14,7 @@ import { RISK_ENGINE_INIT_URL, RISK_ENGINE_PRIVILEGES_URL, ASSET_CRITICALITY_PRIVILEGES_URL, + RISK_SCORE_INDEX_STATUS_API_URL, } from '../../../common/constants'; import type { @@ -101,6 +103,27 @@ export const useEntityAnalyticsRoutes = () => { method: 'GET', }); + const getRiskScoreIndexStatus = ({ + query, + signal, + }: { + query: { + indexName: string; + entity: RiskScoreEntity; + }; + signal?: AbortSignal; + }): Promise<{ + isDeprecated: boolean; + isEnabled: boolean; + }> => + http.fetch<{ isDeprecated: boolean; isEnabled: boolean }>(RISK_SCORE_INDEX_STATUS_API_URL, { + version: '1', + method: 'GET', + query, + asSystemRequest: true, + signal, + }); + return { fetchRiskScorePreview, fetchRiskEngineStatus, @@ -109,5 +132,6 @@ export const useEntityAnalyticsRoutes = () => { disableRiskEngine, fetchRiskEnginePrivileges, fetchAssetCriticalityPrivileges, + getRiskScoreIndexStatus, }; }; diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/all/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score.test.tsx similarity index 88% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/all/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score.test.tsx index dfbba68e25c97b..8f61796f0861b7 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/all/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score.test.tsx @@ -5,25 +5,25 @@ * 2.0. */ import { renderHook } from '@testing-library/react-hooks'; -import { useRiskScore } from '.'; -import { TestProviders } from '../../../../common/mock'; +import { useRiskScore } from './use_risk_score'; +import { TestProviders } from '../../../common/mock'; -import { useSearchStrategy } from '../../../../common/containers/use_search_strategy'; -import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; -import { useAppToastsMock } from '../../../../common/hooks/use_app_toasts.mock'; -import { useRiskScoreFeatureStatus } from '../feature_status'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; +import { useSearchStrategy } from '../../../common/containers/use_search_strategy'; +import { useAppToasts } from '../../../common/hooks/use_app_toasts'; +import { useAppToastsMock } from '../../../common/hooks/use_app_toasts.mock'; +import { useRiskScoreFeatureStatus } from './use_risk_score_feature_status'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; -jest.mock('../../../../common/containers/use_search_strategy', () => ({ +jest.mock('../../../common/containers/use_search_strategy', () => ({ useSearchStrategy: jest.fn(), })); -jest.mock('../../../../common/hooks/use_space_id', () => ({ +jest.mock('../../../common/hooks/use_space_id', () => ({ useSpaceId: jest.fn().mockReturnValue('default'), })); -jest.mock('../../../../common/hooks/use_app_toasts'); -jest.mock('../feature_status'); +jest.mock('../../../common/hooks/use_app_toasts'); +jest.mock('./use_risk_score_feature_status'); const mockUseRiskScoreFeatureStatus = useRiskScoreFeatureStatus as jest.Mock; const mockUseSearchStrategy = useSearchStrategy as jest.Mock; diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/all/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score.tsx similarity index 81% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/all/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score.tsx index b2be80f74ab713..3038e33d4bfab3 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/all/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score.tsx @@ -7,28 +7,25 @@ import { useCallback, useEffect, useMemo } from 'react'; -import { useRiskScoreFeatureStatus } from '../feature_status'; -import { createFilter } from '../../../../common/containers/helpers'; -import type { - RiskScoreSortField, - StrategyResponseType, -} from '../../../../../common/search_strategy'; +import { i18n } from '@kbn/i18n'; +import { useRiskScoreFeatureStatus } from './use_risk_score_feature_status'; +import { createFilter } from '../../../common/containers/helpers'; +import type { RiskScoreSortField, StrategyResponseType } from '../../../../common/search_strategy'; import { RiskQueries, getUserRiskIndex, RiskScoreEntity, getHostRiskIndex, -} from '../../../../../common/search_strategy'; -import type { ESQuery } from '../../../../../common/typed_json'; - -import * as i18n from './translations'; -import type { InspectResponse } from '../../../../types'; -import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; -import { isIndexNotFoundError } from '../../../../common/utils/exceptions'; -import type { inputsModel } from '../../../../common/store'; -import { useSpaceId } from '../../../../common/hooks/use_space_id'; -import { useSearchStrategy } from '../../../../common/containers/use_search_strategy'; -import { useIsNewRiskScoreModuleInstalled } from '../../../../entity_analytics/api/hooks/use_risk_engine_status'; +} from '../../../../common/search_strategy'; +import type { ESQuery } from '../../../../common/typed_json'; + +import type { InspectResponse } from '../../../types'; +import { useAppToasts } from '../../../common/hooks/use_app_toasts'; +import { isIndexNotFoundError } from '../../../common/utils/exceptions'; +import type { inputsModel } from '../../../common/store'; +import { useSpaceId } from '../../../common/hooks/use_space_id'; +import { useSearchStrategy } from '../../../common/containers/use_search_strategy'; +import { useIsNewRiskScoreModuleInstalled } from './use_risk_engine_status'; export interface RiskScoreState { data: @@ -181,7 +178,11 @@ export const useRiskScore = { if (error) { if (!isIndexNotFoundError(error)) { - addError(error, { title: i18n.FAIL_RISK_SCORE }); + addError(error, { + title: i18n.translate('xpack.securitySolution.riskScore.failSearchDescription', { + defaultMessage: `Failed to run search on risk score`, + }), + }); } } }, [addError, error]); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/use_risk_score_data.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_data.test.ts similarity index 94% rename from x-pack/plugins/security_solution/public/common/components/event_details/use_risk_score_data.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_data.test.ts index 656c13b22d8560..123d4662768c19 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/use_risk_score_data.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_data.test.ts @@ -6,13 +6,13 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { TestProviders } from '../../mock'; +import { TestProviders } from '../../../common/mock'; import { ONLY_FIRST_ITEM_PAGINATION, useRiskScoreData } from './use_risk_score_data'; -import { useRiskScore } from '../../../explore/containers/risk_score'; import { useBasicDataFromDetailsData } from '../../../timelines/components/side_panel/event_details/helpers'; import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useRiskScore } from './use_risk_score'; -jest.mock('../../../explore/containers/risk_score'); +jest.mock('./use_risk_score'); jest.mock('../../../timelines/components/side_panel/event_details/helpers'); const mockUseRiskScore = useRiskScore as jest.Mock; const mockUseBasicDataFromDetailsData = useBasicDataFromDetailsData as jest.Mock; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/use_risk_score_data.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_data.ts similarity index 93% rename from x-pack/plugins/security_solution/public/common/components/event_details/use_risk_score_data.ts rename to x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_data.ts index 8ac02b1ce47e43..545d12d0851f7d 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/use_risk_score_data.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_data.ts @@ -12,8 +12,8 @@ import { buildUserNamesFilter, RiskScoreEntity, } from '../../../../common/search_strategy'; -import type { HostRisk, UserRisk } from '../../../explore/containers/risk_score'; -import { useRiskScore } from '../../../explore/containers/risk_score'; +import { useRiskScore } from './use_risk_score'; +import type { HostRisk, UserRisk } from '../types'; export const ONLY_FIRST_ITEM_PAGINATION = { cursorStart: 0, diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/index.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_feature_status.test.ts similarity index 85% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/index.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_feature_status.test.ts index 9464ecb9d8380b..30719d1559f54d 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/index.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_feature_status.test.ts @@ -5,17 +5,17 @@ * 2.0. */ import { act, renderHook } from '@testing-library/react-hooks'; -import { TestProviders } from '../../../../common/mock'; +import { TestProviders } from '../../../common/mock'; -import { useRiskScoreFeatureStatus } from '.'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { useFetch } from '../../../../common/hooks/use_fetch'; -import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; -import { useHasSecurityCapability } from '../../../../helper_hooks'; +import { useRiskScoreFeatureStatus } from './use_risk_score_feature_status'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useFetch } from '../../../common/hooks/use_fetch'; +import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; +import { useHasSecurityCapability } from '../../../helper_hooks'; -jest.mock('../../../../common/hooks/use_fetch'); -jest.mock('../../../../common/components/ml/hooks/use_ml_capabilities'); -jest.mock('../../../../helper_hooks'); +jest.mock('../../../common/hooks/use_fetch'); +jest.mock('../../../common/components/ml/hooks/use_ml_capabilities'); +jest.mock('../../../helper_hooks'); const mockFetch = jest.fn(); const mockUseMlCapabilities = useMlCapabilities as jest.Mock; diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/index.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_feature_status.ts similarity index 83% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/index.ts rename to x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_feature_status.ts index 97994f58295c16..03fb48f56559a8 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/index.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_feature_status.ts @@ -6,11 +6,11 @@ */ import { useCallback, useEffect, useMemo } from 'react'; -import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; -import { REQUEST_NAMES, useFetch } from '../../../../common/hooks/use_fetch'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { getRiskScoreIndexStatus } from './api'; -import { useHasSecurityCapability } from '../../../../helper_hooks'; +import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; +import { REQUEST_NAMES, useFetch } from '../../../common/hooks/use_fetch'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useHasSecurityCapability } from '../../../helper_hooks'; +import { useEntityAnalyticsRoutes } from '../api'; interface RiskScoresFeatureStatus { error: unknown; @@ -31,6 +31,7 @@ export const useRiskScoreFeatureStatus = ( const { isPlatinumOrTrialLicense, capabilitiesFetched } = useMlCapabilities(); const hasEntityAnalyticsCapability = useHasSecurityCapability('entity-analytics'); const isAuthorized = isPlatinumOrTrialLicense && hasEntityAnalyticsCapability; + const { getRiskScoreIndexStatus } = useEntityAnalyticsRoutes(); const { fetch, data, isLoading, error } = useFetch( REQUEST_NAMES.GET_RISK_SCORE_DEPRECATED, diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/kpi/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_kpi.tsx similarity index 78% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/kpi/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_kpi.tsx index 2197d5553c4319..4105dfc28d83d6 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/kpi/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_risk_score_kpi.tsx @@ -7,6 +7,7 @@ import { useCallback, useEffect, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; import { getHostRiskIndex, getUserRiskIndex, @@ -14,18 +15,17 @@ import { RiskSeverity, RiskScoreEntity, EMPTY_SEVERITY_COUNT, -} from '../../../../../common/search_strategy'; -import * as i18n from './translations'; -import { isIndexNotFoundError } from '../../../../common/utils/exceptions'; -import type { ESQuery } from '../../../../../common/typed_json'; -import type { SeverityCount } from '../../../components/risk_score/severity/types'; -import { useSpaceId } from '../../../../common/hooks/use_space_id'; -import { useSearchStrategy } from '../../../../common/containers/use_search_strategy'; -import type { InspectResponse } from '../../../../types'; -import type { inputsModel } from '../../../../common/store'; -import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; -import { useIsNewRiskScoreModuleInstalled } from '../../../../entity_analytics/api/hooks/use_risk_engine_status'; -import { useRiskScoreFeatureStatus } from '../feature_status'; +} from '../../../../common/search_strategy'; +import { isIndexNotFoundError } from '../../../common/utils/exceptions'; +import type { ESQuery } from '../../../../common/typed_json'; +import type { SeverityCount } from '../../components/severity/types'; +import { useSpaceId } from '../../../common/hooks/use_space_id'; +import { useSearchStrategy } from '../../../common/containers/use_search_strategy'; +import type { InspectResponse } from '../../../types'; +import type { inputsModel } from '../../../common/store'; +import { useAppToasts } from '../../../common/hooks/use_app_toasts'; +import { useIsNewRiskScoreModuleInstalled } from './use_risk_engine_status'; +import { useRiskScoreFeatureStatus } from './use_risk_score_feature_status'; interface RiskScoreKpi { error: unknown; @@ -123,7 +123,11 @@ export const useRiskScoreKpi = ({ useEffect(() => { if (error) { if (!isIndexNotFoundError(error)) { - addError(error, { title: i18n.FAIL_RISK_SCORE }); + addError(error, { + title: i18n.translate('xpack.securitySolution.riskScore.kpi.failSearchDescription', { + defaultMessage: `Failed to run search on risk score`, + }), + }); } } }, [addError, error]); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/types.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/types.ts new file mode 100644 index 00000000000000..419ebc60c4923d --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/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 type { HostRiskScore, UserRiskScore } from '../../../common/search_strategy'; + +export interface HostRisk { + loading: boolean; + isModuleEnabled: boolean; + result?: HostRiskScore[]; +} + +export interface UserRisk { + loading: boolean; + isModuleEnabled: boolean; + result?: UserRiskScore[]; +} diff --git a/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts b/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts index 361d6d133a93d5..ee343526ea2b09 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts @@ -32,3 +32,15 @@ export const RISK_SCORE_RANGES = { [RiskSeverity.high]: { start: 70, stop: 90 }, [RiskSeverity.critical]: { start: 90, stop: 100 }, }; + +export enum UserRiskScoreQueryId { + USERS_BY_RISK = 'UsersByRisk', + USER_DETAILS_RISK_SCORE = 'UserDetailsRiskScore', +} + +export enum HostRiskScoreQueryId { + DEFAULT = 'HostRiskScore', + HOST_DETAILS_RISK_SCORE = 'HostDetailsRiskScore', + OVERVIEW_RISKY_HOSTS = 'OverviewRiskyHosts', + HOSTS_BY_RISK = 'HostsByRisk', +} diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/enable_risk_score/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/enable_risk_score/index.tsx similarity index 86% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/enable_risk_score/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/enable_risk_score/index.tsx index ac064feb35f047..994158104df5b0 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/enable_risk_score/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/enable_risk_score/index.tsx @@ -6,11 +6,11 @@ */ import { EuiEmptyPrompt, EuiPanel, EuiToolTip } from '@elastic/eui'; import React from 'react'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { useCheckSignalIndex } from '../../../../detections/containers/detection_engine/alerts/use_check_signal_index'; -import type { inputsModel } from '../../../../common/store'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useCheckSignalIndex } from '../../../detections/containers/detection_engine/alerts/use_check_signal_index'; +import type { inputsModel } from '../../../common/store'; import { RiskScoreHeaderTitle } from '../risk_score_onboarding/risk_score_header_title'; -import { HeaderSection } from '../../../../common/components/header_section'; +import { HeaderSection } from '../../../common/components/header_section'; import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link'; import { RiskScoreEnableButton } from '../risk_score_onboarding/risk_score_enable_button'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/enable_risk_score/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/enable_risk_score/translations.ts similarity index 92% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/enable_risk_score/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/enable_risk_score/translations.ts index 4c4d7073ed1dbd..c109c403a091ee 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/enable_risk_score/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/enable_risk_score/translations.ts @@ -5,8 +5,8 @@ * 2.0. */ import { i18n } from '@kbn/i18n'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { getRiskEntityTranslation } from '../translations'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +import { getRiskEntityTranslation } from '../risk_score/translations'; export const ENABLE_RISK_SCORE_POPOVER = i18n.translate( 'xpack.securitySolution.enableRiskScore.enableRiskScorePopoverTitle', diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/anomalies_count_link.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/anomalies_count_link.test.tsx similarity index 73% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/anomalies_count_link.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/anomalies_count_link.test.tsx index 4ce4b6810ec981..8400578b85c4f8 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/anomalies_count_link.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/anomalies_count_link.test.tsx @@ -6,14 +6,14 @@ */ import { fireEvent, render } from '@testing-library/react'; import React from 'react'; -import { AnomalyEntity } from '../../../../common/components/ml/anomaly/use_anomalies_search'; -import { createTelemetryServiceMock } from '../../../../common/lib/telemetry/telemetry_service.mock'; -import { TestProviders } from '../../../../common/mock'; +import { AnomalyEntity } from '../../../common/components/ml/anomaly/use_anomalies_search'; +import { createTelemetryServiceMock } from '../../../common/lib/telemetry/telemetry_service.mock'; +import { TestProviders } from '../../../common/mock'; import { AnomaliesCountLink } from './anomalies_count_link'; const mockedTelemetry = createTelemetryServiceMock(); -jest.mock('../../../../common/lib/kibana', () => { - const original = jest.requireActual('../../../../common/lib/kibana'); +jest.mock('../../../common/lib/kibana', () => { + const original = jest.requireActual('../../../common/lib/kibana'); return { ...original, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/anomalies_count_link.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/anomalies_count_link.tsx similarity index 75% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/anomalies_count_link.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/anomalies_count_link.tsx index 529f197c62e440..bb32564acb1b94 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/anomalies_count_link.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/anomalies_count_link.tsx @@ -6,15 +6,15 @@ */ import { useDispatch } from 'react-redux'; import React, { useCallback } from 'react'; -import { AnomalyEntity } from '../../../../common/components/ml/anomaly/use_anomalies_search'; -import { SecuritySolutionLinkAnchor } from '../../../../common/components/links'; -import { SecurityPageName } from '../../../../app/types'; -import { usersActions } from '../../../../explore/users/store'; -import { hostsActions } from '../../../../explore/hosts/store'; -import { HostsType } from '../../../../explore/hosts/store/model'; -import { UsersType } from '../../../../explore/users/store/model'; +import { AnomalyEntity } from '../../../common/components/ml/anomaly/use_anomalies_search'; +import { SecuritySolutionLinkAnchor } from '../../../common/components/links'; +import { SecurityPageName } from '../../../app/types'; +import { usersActions } from '../../../explore/users/store'; +import { hostsActions } from '../../../explore/hosts/store'; +import { HostsType } from '../../../explore/hosts/store/model'; +import { UsersType } from '../../../explore/users/store/model'; -import { useKibana } from '../../../../common/lib/kibana'; +import { useKibana } from '../../../common/lib/kibana'; export const AnomaliesCountLink = ({ count, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/columns.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/columns.test.tsx similarity index 90% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/columns.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/columns.test.tsx index f4349df20dc51a..6083c18dfb38d7 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/columns.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/columns.test.tsx @@ -6,8 +6,8 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { AnomalyEntity } from '../../../../common/components/ml/anomaly/use_anomalies_search'; -import type { SecurityJob } from '../../../../common/components/ml_popover/types'; +import { AnomalyEntity } from '../../../common/components/ml/anomaly/use_anomalies_search'; +import type { SecurityJob } from '../../../common/components/ml_popover/types'; import { useAnomaliesColumns } from './columns'; describe('useAnomaliesColumns', () => { diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/columns.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/columns.tsx similarity index 90% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/columns.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/columns.tsx index 9faabf8d43f1c8..6574f6a566b155 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/columns.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/columns.tsx @@ -8,11 +8,11 @@ import React, { useMemo } from 'react'; import styled from 'styled-components'; import type { EuiTableFieldDataColumnType } from '@elastic/eui'; import * as i18n from './translations'; -import type { SecurityJob } from '../../../../common/components/ml_popover/types'; -import { isJobStarted } from '../../../../../common/machine_learning/helpers'; +import type { SecurityJob } from '../../../common/components/ml_popover/types'; +import { isJobStarted } from '../../../../common/machine_learning/helpers'; import { TotalAnomalies } from './components/total_anomalies'; -import type { AnomaliesCount } from '../../../../common/components/ml/anomaly/use_anomalies_search'; +import type { AnomaliesCount } from '../../../common/components/ml/anomaly/use_anomalies_search'; type AnomaliesColumns = Array>; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/anomalies_tab_link.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/anomalies_tab_link.tsx similarity index 75% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/anomalies_tab_link.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/anomalies_tab_link.tsx index 80f78ee50331ef..9f515d8439a668 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/anomalies_tab_link.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/anomalies_tab_link.tsx @@ -7,13 +7,13 @@ import React, { useCallback } from 'react'; import { useDispatch } from 'react-redux'; -import { SecuritySolutionLinkAnchor } from '../../../../../common/components/links'; -import { SecurityPageName } from '../../../../../app/types'; -import { usersActions } from '../../../../../explore/users/store'; -import { hostsActions } from '../../../../../explore/hosts/store'; -import { HostsType } from '../../../../../explore/hosts/store/model'; -import { UsersType } from '../../../../../explore/users/store/model'; -import { AnomalyEntity } from '../../../../../common/components/ml/anomaly/use_anomalies_search'; +import { SecuritySolutionLinkAnchor } from '../../../../common/components/links'; +import { SecurityPageName } from '../../../../app/types'; +import { usersActions } from '../../../../explore/users/store'; +import { hostsActions } from '../../../../explore/hosts/store'; +import { HostsType } from '../../../../explore/hosts/store/model'; +import { UsersType } from '../../../../explore/users/store/model'; +import { AnomalyEntity } from '../../../../common/components/ml/anomaly/use_anomalies_search'; export const AnomaliesTabLink = ({ count, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/enable_job.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/enable_job.test.tsx similarity index 88% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/enable_job.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/enable_job.test.tsx index c5c199b79df095..1fe70e558cbdcd 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/enable_job.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/enable_job.test.tsx @@ -7,11 +7,11 @@ import React from 'react'; import { render, fireEvent, waitFor } from '@testing-library/react'; -import { useEnableDataFeed } from '../../../../../common/components/ml_popover/hooks/use_enable_data_feed'; -import type { SecurityJob } from '../../../../../common/components/ml_popover/types'; +import { useEnableDataFeed } from '../../../../common/components/ml_popover/hooks/use_enable_data_feed'; +import type { SecurityJob } from '../../../../common/components/ml_popover/types'; import { EnableJob } from './enable_job'; -jest.mock('../../../../../common/components/ml_popover/hooks/use_enable_data_feed', () => ({ +jest.mock('../../../../common/components/ml_popover/hooks/use_enable_data_feed', () => ({ useEnableDataFeed: jest.fn(() => ({ enableDatafeed: jest.fn(), isLoading: false })), })); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/enable_job.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/enable_job.tsx similarity index 80% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/enable_job.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/enable_job.tsx index 533a0eddcbc1a8..b98933a34e09cc 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/enable_job.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/enable_job.tsx @@ -7,10 +7,10 @@ import React, { useCallback } from 'react'; import { EuiLoadingSpinner } from '@elastic/eui'; -import type { SecurityJob } from '../../../../../common/components/ml_popover/types'; -import { LinkAnchor } from '../../../../../common/components/links'; +import type { SecurityJob } from '../../../../common/components/ml_popover/types'; +import { LinkAnchor } from '../../../../common/components/links'; import * as i18n from '../translations'; -import { useEnableDataFeed } from '../../../../../common/components/ml_popover/hooks/use_enable_data_feed'; +import { useEnableDataFeed } from '../../../../common/components/ml_popover/hooks/use_enable_data_feed'; export const EnableJob = ({ job, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/total_anomalies.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/total_anomalies.test.tsx similarity index 81% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/total_anomalies.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/total_anomalies.test.tsx index 3cd8e25869763c..4d064682f5c8d9 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/total_anomalies.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/total_anomalies.test.tsx @@ -6,11 +6,11 @@ */ import React from 'react'; -import { AnomalyEntity } from '../../../../../common/components/ml/anomaly/use_anomalies_search'; -import type { SecurityJob } from '../../../../../common/components/ml_popover/types'; +import { AnomalyEntity } from '../../../../common/components/ml/anomaly/use_anomalies_search'; +import type { SecurityJob } from '../../../../common/components/ml_popover/types'; import { render } from '@testing-library/react'; import { TotalAnomalies } from './total_anomalies'; -import { TestProviders } from '../../../../../common/mock'; +import { TestProviders } from '../../../../common/mock'; const defaultProps = { count: 0, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/total_anomalies.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/total_anomalies.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/total_anomalies.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/total_anomalies.tsx index 8311b28177a08a..b72f1ef8879bb5 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/components/total_anomalies.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/components/total_anomalies.tsx @@ -11,9 +11,9 @@ import { isJobFailed, isJobLoading, isJobStarted, -} from '../../../../../../common/machine_learning/helpers'; -import type { AnomalyEntity } from '../../../../../common/components/ml/anomaly/use_anomalies_search'; -import type { SecurityJob } from '../../../../../common/components/ml_popover/types'; +} from '../../../../../common/machine_learning/helpers'; +import type { AnomalyEntity } from '../../../../common/components/ml/anomaly/use_anomalies_search'; +import type { SecurityJob } from '../../../../common/components/ml_popover/types'; import * as i18n from '../translations'; import { AnomaliesTabLink } from './anomalies_tab_link'; import { EnableJob } from './enable_job'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/index.test.tsx similarity index 92% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/index.test.tsx index 3e6b85d7beca9f..ee3c4cfd022d89 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/index.test.tsx @@ -8,13 +8,13 @@ import { act, fireEvent, render, waitFor } from '@testing-library/react'; import React from 'react'; import { EntityAnalyticsAnomalies } from '.'; -import type { AnomaliesCount } from '../../../../common/components/ml/anomaly/use_anomalies_search'; -import { AnomalyEntity } from '../../../../common/components/ml/anomaly/use_anomalies_search'; +import type { AnomaliesCount } from '../../../common/components/ml/anomaly/use_anomalies_search'; +import { AnomalyEntity } from '../../../common/components/ml/anomaly/use_anomalies_search'; -import { TestProviders } from '../../../../common/mock'; -import type { SecurityJob } from '../../../../common/components/ml_popover/types'; +import { TestProviders } from '../../../common/mock'; +import type { SecurityJob } from '../../../common/components/ml_popover/types'; -jest.mock('../../../../common/components/ml_popover/hooks/use_enable_data_feed', () => ({ +jest.mock('../../../common/components/ml_popover/hooks/use_enable_data_feed', () => ({ useEnableDataFeed: () => ({ loading: false, enableDatafeed: jest.fn().mockResolvedValue({ enabled: true }), @@ -22,7 +22,7 @@ jest.mock('../../../../common/components/ml_popover/hooks/use_enable_data_feed', })); // Query toggle only works if pageName.lenght > 0 -jest.mock('../../../../common/utils/route/use_route_spy', () => ({ +jest.mock('../../../common/utils/route/use_route_spy', () => ({ useRouteSpy: jest.fn().mockReturnValue([ { pageName: 'not_empty', @@ -45,10 +45,8 @@ jest.mock( } ); -jest.mock('../../../../common/components/ml/anomaly/use_anomalies_search', () => { - const original = jest.requireActual( - '../../../../common/components/ml/anomaly/use_anomalies_search' - ); +jest.mock('../../../common/components/ml/anomaly/use_anomalies_search', () => { + const original = jest.requireActual('../../../common/components/ml/anomaly/use_anomalies_search'); return { ...original, useAggregatedAnomaliesByJob: () => mockUseAggregatedAnomaliesByJob(), diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/index.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/index.tsx index 3e6f2e570cc22c..d841e59aeb67a8 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/index.tsx @@ -16,26 +16,26 @@ import { import { MLJobsAwaitingNodeWarning, ML_PAGES, useMlHref } from '@kbn/ml-plugin/public'; import { FormattedMessage } from '@kbn/i18n-react'; -import { HeaderSection } from '../../../../common/components/header_section'; -import { useQueryToggle } from '../../../../common/containers/query_toggle'; -import { LastUpdatedAt } from '../../../../common/components/last_updated_at'; +import { HeaderSection } from '../../../common/components/header_section'; +import { useQueryToggle } from '../../../common/containers/query_toggle'; +import { LastUpdatedAt } from '../../../common/components/last_updated_at'; import * as i18n from './translations'; -import { useAggregatedAnomaliesByJob } from '../../../../common/components/ml/anomaly/use_anomalies_search'; +import { useAggregatedAnomaliesByJob } from '../../../common/components/ml/anomaly/use_anomalies_search'; import { useAnomaliesColumns } from './columns'; -import { useQueryInspector } from '../../../../common/components/page/manage_query'; -import { useGlobalTime } from '../../../../common/containers/use_global_time'; +import { useQueryInspector } from '../../../common/components/page/manage_query'; +import { useGlobalTime } from '../../../common/containers/use_global_time'; import { LinkAnchor, LinkButton, useGetSecuritySolutionLinkProps, -} from '../../../../common/components/links'; -import { HostsTableType } from '../../../../explore/hosts/store/model'; -import { getTabsOnHostsUrl } from '../../../../common/components/link_to/redirect_to_hosts'; -import { SecurityPageName } from '../../../../app/types'; -import { getTabsOnUsersUrl } from '../../../../common/components/link_to/redirect_to_users'; -import { UsersTableType } from '../../../../explore/users/store/model'; -import { useKibana } from '../../../../common/lib/kibana'; -import type { SecurityJob } from '../../../../common/components/ml_popover/types'; +} from '../../../common/components/links'; +import { HostsTableType } from '../../../explore/hosts/store/model'; +import { getTabsOnHostsUrl } from '../../../common/components/link_to/redirect_to_hosts'; +import { SecurityPageName } from '../../../app/types'; +import { getTabsOnUsersUrl } from '../../../common/components/link_to/redirect_to_users'; +import { UsersTableType } from '../../../explore/users/store/model'; +import { useKibana } from '../../../common/lib/kibana'; +import type { SecurityJob } from '../../../common/components/ml_popover/types'; const TABLE_QUERY_ID = 'entityAnalyticsDashboardAnomaliesTable'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/query/index.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/query/index.ts similarity index 100% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/query/index.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/query/index.ts diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/anomalies/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_anomalies/translations.ts diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/index.test.tsx similarity index 84% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/index.test.tsx index 62820ee2c0de96..392656402c63eb 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/index.test.tsx @@ -8,13 +8,14 @@ import { act, fireEvent, render, waitFor } from '@testing-library/react'; import React from 'react'; import { EntityAnalyticsHeader } from '.'; -import { Direction, RiskScoreFields, RiskSeverity } from '../../../../../common/search_strategy'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; -import { TestProviders } from '../../../../common/mock'; -import { hostsActions } from '../../../../explore/hosts/store'; -import { HostsType } from '../../../../explore/hosts/store/model'; -import { usersActions } from '../../../../explore/users/store'; -import { UsersTableType } from '../../../../explore/users/store/model'; +import { Direction, RiskScoreFields, RiskSeverity } from '../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; +import { hostsActions } from '../../../explore/hosts/store'; +import { HostsType } from '../../../explore/hosts/store/model'; +import { usersActions } from '../../../explore/users/store'; +import { UsersTableType } from '../../../explore/users/store/model'; + +import type { SeverityCount } from '../severity/types'; const mockSeverityCount: SeverityCount = { [RiskSeverity.low]: 1, @@ -24,11 +25,11 @@ const mockSeverityCount: SeverityCount = { [RiskSeverity.critical]: 99, }; -jest.mock('../../../../common/components/ml/hooks/use_ml_capabilities', () => ({ +jest.mock('../../../common/components/ml/hooks/use_ml_capabilities', () => ({ useMlCapabilities: () => ({ isPlatinumOrTrialLicense: true, capabilities: {} }), })); -jest.mock('../../../../explore/containers/risk_score', () => { +jest.mock('../../api/hooks/use_risk_score_kpi', () => { return { useRiskScoreKpi: () => ({ severityCount: mockSeverityCount }), }; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/index.tsx similarity index 82% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/index.tsx index 3be1dd65f48eb4..8a814a1ee5a2e7 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/index.tsx @@ -9,34 +9,34 @@ import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiTitle, EuiLink } from '@elastic import styled from 'styled-components'; import { useDispatch } from 'react-redux'; import { sumBy } from 'lodash/fp'; -import { useRiskScoreKpi } from '../../../../explore/containers/risk_score'; -import { LinkAnchor, useGetSecuritySolutionLinkProps } from '../../../../common/components/links'; +import { SEVERITY_COLOR } from '../../../overview/components/detection_response/utils'; +import { LinkAnchor, useGetSecuritySolutionLinkProps } from '../../../common/components/links'; import { Direction, RiskScoreEntity, RiskScoreFields, RiskSeverity, -} from '../../../../../common/search_strategy'; +} from '../../../../common/search_strategy'; import * as i18n from './translations'; -import { getTabsOnHostsUrl } from '../../../../common/components/link_to/redirect_to_hosts'; -import { SecurityPageName } from '../../../../app/types'; -import { HostsTableType, HostsType } from '../../../../explore/hosts/store/model'; -import { hostsActions } from '../../../../explore/hosts/store'; -import { usersActions } from '../../../../explore/users/store'; -import { getTabsOnUsersUrl } from '../../../../common/components/link_to/redirect_to_users'; -import { UsersTableType } from '../../../../explore/users/store/model'; -import { useAggregatedAnomaliesByJob } from '../../../../common/components/ml/anomaly/use_anomalies_search'; -import { useGlobalTime } from '../../../../common/containers/use_global_time'; -import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; -import { useQueryInspector } from '../../../../common/components/page/manage_query'; -import { ENTITY_ANALYTICS_ANOMALIES_PANEL } from '../anomalies'; -import { isJobStarted } from '../../../../../common/machine_learning/helpers'; -import { FormattedCount } from '../../../../common/components/formatted_number'; -import { SEVERITY_COLOR } from '../../detection_response/utils'; -import { useGlobalFilterQuery } from '../../../../common/hooks/use_global_filter_query'; +import { getTabsOnHostsUrl } from '../../../common/components/link_to/redirect_to_hosts'; +import { SecurityPageName } from '../../../app/types'; +import { HostsTableType, HostsType } from '../../../explore/hosts/store/model'; +import { hostsActions } from '../../../explore/hosts/store'; +import { usersActions } from '../../../explore/users/store'; +import { getTabsOnUsersUrl } from '../../../common/components/link_to/redirect_to_users'; +import { UsersTableType } from '../../../explore/users/store/model'; +import { useAggregatedAnomaliesByJob } from '../../../common/components/ml/anomaly/use_anomalies_search'; +import { useGlobalTime } from '../../../common/containers/use_global_time'; +import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; +import { useQueryInspector } from '../../../common/components/page/manage_query'; +import { ENTITY_ANALYTICS_ANOMALIES_PANEL } from '../entity_analytics_anomalies'; +import { isJobStarted } from '../../../../common/machine_learning/helpers'; +import { FormattedCount } from '../../../common/components/formatted_number'; +import { useGlobalFilterQuery } from '../../../common/hooks/use_global_filter_query'; +import { useRiskScoreKpi } from '../../api/hooks/use_risk_score_kpi'; const StyledEuiTitle = styled(EuiTitle)` - color: ${({ theme: { eui } }) => SEVERITY_COLOR.critical}; + color: ${SEVERITY_COLOR.critical}; `; const HOST_RISK_QUERY_ID = 'hostRiskScoreKpiQuery'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_header/translations.ts diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/__mocks__/index.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/__mocks__/index.ts similarity index 82% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/__mocks__/index.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/__mocks__/index.ts index bf863d0011ad38..19f3a03e41c037 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/__mocks__/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { RiskSeverity } from '../../../../../../common/search_strategy/security_solution'; +import { RiskSeverity } from '../../../../../common/search_strategy/security_solution'; export const mockSeverityCount = { [RiskSeverity.unknown]: 1, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/chart_content.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/chart_content.test.tsx similarity index 79% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/chart_content.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/chart_content.test.tsx index 69816567f90cab..e346e999f8bd18 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/chart_content.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/chart_content.test.tsx @@ -7,20 +7,20 @@ import { render } from '@testing-library/react'; import React from 'react'; -import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; -import { VisualizationEmbeddable } from '../../../../common/components/visualization_actions/visualization_embeddable'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { useSpaceId } from '../../../../common/hooks/use_space_id'; -import { TestProviders } from '../../../../common/mock'; -import { generateSeverityFilter } from '../../../../explore/hosts/store/helpers'; +import { RiskScoreEntity, RiskSeverity } from '../../../../common/search_strategy'; +import { VisualizationEmbeddable } from '../../../common/components/visualization_actions/visualization_embeddable'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; +import { useSpaceId } from '../../../common/hooks/use_space_id'; +import { TestProviders } from '../../../common/mock'; +import { generateSeverityFilter } from '../../../explore/hosts/store/helpers'; import { ChartContent } from './chart_content'; import { mockSeverityCount } from './__mocks__'; -jest.mock('../../../../common/components/visualization_actions/visualization_embeddable'); -jest.mock('../../../../common/hooks/use_experimental_features', () => ({ +jest.mock('../../../common/components/visualization_actions/visualization_embeddable'); +jest.mock('../../../common/hooks/use_experimental_features', () => ({ useIsExperimentalFeatureEnabled: jest.fn(), })); -jest.mock('../../../../common/hooks/use_space_id', () => ({ +jest.mock('../../../common/hooks/use_space_id', () => ({ useSpaceId: jest.fn(), })); describe('ChartContent', () => { diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/chart_content.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/chart_content.tsx similarity index 66% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/chart_content.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/chart_content.tsx index 8f03cb08594aad..78828b1c769724 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/chart_content.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/chart_content.tsx @@ -6,16 +6,16 @@ */ import React, { useMemo } from 'react'; -import type { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; -import { EMPTY_SEVERITY_COUNT } from '../../../../../common/search_strategy'; -import { getRiskScoreDonutAttributes } from '../../../../common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_donut'; -import { VisualizationEmbeddable } from '../../../../common/components/visualization_actions/visualization_embeddable'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { useSpaceId } from '../../../../common/hooks/use_space_id'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; -import { generateSeverityFilter } from '../../../../explore/hosts/store/helpers'; -import { RiskScoreDonutChart } from '../common/risk_score_donut_chart'; -import { TOTAL_LABEL } from '../common/translations'; +import { i18n } from '@kbn/i18n'; +import type { RiskScoreEntity, RiskSeverity } from '../../../../common/search_strategy'; +import { EMPTY_SEVERITY_COUNT } from '../../../../common/search_strategy'; +import { VisualizationEmbeddable } from '../../../common/components/visualization_actions/visualization_embeddable'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; +import { useSpaceId } from '../../../common/hooks/use_space_id'; +import type { SeverityCount } from '../severity/types'; +import { generateSeverityFilter } from '../../../explore/hosts/store/helpers'; +import { RiskScoreDonutChart } from '../risk_score_donut_chart'; +import { getRiskScoreDonutAttributes } from '../../lens_attributes/risk_score_donut'; const CHART_HEIGHT = 180; const ChartContentComponent = ({ @@ -56,7 +56,12 @@ const ChartContentComponent = ({ height={CHART_HEIGHT} id={`${kpiQueryId}-donut`} isDonut={true} - label={TOTAL_LABEL} + label={i18n.translate( + 'xpack.securitySolution.entityAnalytics.riskScore.chart.totalLabel', + { + defaultMessage: 'Total', + } + )} stackByField={riskEntity} timerange={timerange} width="270px" diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/columns.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/columns.tsx index 120a4cf3d4c7f5..e5926c2df7b4f3 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/columns.tsx @@ -9,28 +9,28 @@ import React from 'react'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { EuiLink } from '@elastic/eui'; import styled from 'styled-components'; -import { UsersTableType } from '../../../../explore/users/store/model'; -import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { HostDetailsLink, UserDetailsLink } from '../../../../common/components/links'; -import { HostsTableType } from '../../../../explore/hosts/store/model'; -import { RiskScoreLevel } from '../../../../explore/components/risk_score/severity/common'; -import { CELL_ACTIONS_TELEMETRY } from '../../../../explore/components/risk_score/constants'; +import { UsersTableType } from '../../../explore/users/store/model'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { HostDetailsLink, UserDetailsLink } from '../../../common/components/links'; +import { HostsTableType } from '../../../explore/hosts/store/model'; +import { RiskScoreLevel } from '../severity/common'; +import { CELL_ACTIONS_TELEMETRY } from '../risk_score/constants'; import type { HostRiskScore, Maybe, RiskSeverity, UserRiskScore, -} from '../../../../../common/search_strategy'; -import { RiskScoreEntity, RiskScoreFields } from '../../../../../common/search_strategy'; +} from '../../../../common/search_strategy'; +import { RiskScoreEntity, RiskScoreFields } from '../../../../common/search_strategy'; import * as i18n from './translations'; -import { FormattedCount } from '../../../../common/components/formatted_number'; +import { FormattedCount } from '../../../common/components/formatted_number'; import { SecurityCellActions, CellActionsMode, SecurityCellActionsTrigger, SecurityCellActionType, -} from '../../../../common/components/cell_actions'; -import { FormattedRelativePreferenceDate } from '../../../../common/components/formatted_date'; +} from '../../../common/components/cell_actions'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; type HostRiskScoreColumns = Array>; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/header_content.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/header_content.test.tsx similarity index 86% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/header_content.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/header_content.test.tsx index d6e7c39b4fada4..b4f24e0d27d6f9 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/header_content.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/header_content.test.tsx @@ -7,14 +7,14 @@ import type { RenderResult } from '@testing-library/react'; import { render } from '@testing-library/react'; import React from 'react'; -import { SecurityPageName } from '../../../../../common/constants'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { useGetSecuritySolutionLinkProps } from '../../../../common/components/links'; +import { SecurityPageName } from '../../../../common/constants'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useGetSecuritySolutionLinkProps } from '../../../common/components/links'; import { RiskScoreHeaderContent } from './header_content'; import { mockSeverityCount } from './__mocks__'; -jest.mock('../../../../common/components/links', () => { - const actual = jest.requireActual('../../../../common/components/links'); +jest.mock('../../../common/components/links', () => { + const actual = jest.requireActual('../../../common/components/links'); return { ...actual, useGetSecuritySolutionLinkProps: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/header_content.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/header_content.tsx similarity index 80% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/header_content.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/header_content.tsx index e9b1f56c6e0ec0..10b94b95a886ff 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/header_content.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/header_content.tsx @@ -6,14 +6,14 @@ */ import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import type { RiskSeverity, RiskScoreEntity } from '../../../../../common/search_strategy'; -import { SeverityFilterGroup } from '../../../../explore/components/risk_score/severity/severity_filter_group'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; -import { EMPTY_SEVERITY_COUNT } from '../../../../../common/search_strategy'; -import { LinkButton, useGetSecuritySolutionLinkProps } from '../../../../common/components/links'; -import type { SecurityPageName } from '../../../../../common/constants'; +import type { RiskSeverity, RiskScoreEntity } from '../../../../common/search_strategy'; +import { SeverityFilterGroup } from '../severity/severity_filter_group'; +import type { SeverityCount } from '../severity/types'; +import { EMPTY_SEVERITY_COUNT } from '../../../../common/search_strategy'; +import { LinkButton, useGetSecuritySolutionLinkProps } from '../../../common/components/links'; +import type { SecurityPageName } from '../../../../common/constants'; import * as i18n from './translations'; -import { RiskInformationButtonEmpty } from '../../../../explore/components/risk_score/risk_information'; +import { RiskInformationButtonEmpty } from '../risk_information'; const RiskScoreHeaderContentComponent = ({ entityLinkProps, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/index.test.tsx similarity index 87% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/index.test.tsx index 8af9349d9bceac..d9a265e662a7ee 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/index.test.tsx @@ -7,18 +7,19 @@ import { render, fireEvent, waitFor } from '@testing-library/react'; import React from 'react'; -import { TestProviders } from '../../../../common/mock'; +import { TestProviders } from '../../../common/mock'; import { EntityAnalyticsRiskScores } from '.'; -import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; -import { useRiskScore, useRiskScoreKpi } from '../../../../explore/containers/risk_score'; -import { useKibana as mockUseKibana } from '../../../../common/lib/kibana/__mocks__'; -import { createTelemetryServiceMock } from '../../../../common/lib/telemetry/telemetry_service.mock'; +import { RiskScoreEntity, RiskSeverity } from '../../../../common/search_strategy'; +import type { SeverityCount } from '../severity/types'; +import { useKibana as mockUseKibana } from '../../../common/lib/kibana/__mocks__'; +import { createTelemetryServiceMock } from '../../../common/lib/telemetry/telemetry_service.mock'; +import { useRiskScore } from '../../api/hooks/use_risk_score'; +import { useRiskScoreKpi } from '../../api/hooks/use_risk_score_kpi'; const mockedTelemetry = createTelemetryServiceMock(); const mockedUseKibana = mockUseKibana(); -jest.mock('../../../../common/lib/kibana', () => { - const original = jest.requireActual('../../../../common/lib/kibana'); +jest.mock('../../../common/lib/kibana', () => { + const original = jest.requireActual('../../../common/lib/kibana'); return { ...original, @@ -43,7 +44,7 @@ const mockSeverityCount: SeverityCount = { const mockUseQueryToggle = jest .fn() .mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); -jest.mock('../../../../common/containers/query_toggle', () => { +jest.mock('../../../common/containers/query_toggle', () => { return { useQueryToggle: () => mockUseQueryToggle(), }; @@ -58,16 +59,17 @@ const defaultProps = { }; const mockUseRiskScore = useRiskScore as jest.Mock; const mockUseRiskScoreKpi = useRiskScoreKpi as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../api/hooks/use_risk_score'); +jest.mock('../../api/hooks/use_risk_score_kpi'); const mockOpenAlertsPageWithFilters = jest.fn(); -jest.mock('../../../../common/hooks/use_navigate_to_alerts_page_with_filters', () => { +jest.mock('../../../common/hooks/use_navigate_to_alerts_page_with_filters', () => { return { useNavigateToAlertsPageWithFilters: () => mockOpenAlertsPageWithFilters, }; }); -jest.mock('../../../../common/components/hover_actions', () => ({ HoverActions: () => null })); +jest.mock('../../../common/components/hover_actions', () => ({ HoverActions: () => null })); describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( 'EntityAnalyticsRiskScores entityType: %s', diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/index.tsx similarity index 77% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/index.tsx index 97cf4363f690da..ce695e75f58f16 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/index.tsx @@ -7,32 +7,32 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { EnableRiskScore } from '../../../../explore/components/risk_score/enable_risk_score'; +import { EnableRiskScore } from '../enable_risk_score'; import { getRiskScoreColumns } from './columns'; -import { LastUpdatedAt } from '../../../../common/components/last_updated_at'; -import { HeaderSection } from '../../../../common/components/header_section'; -import { useRiskScore, useRiskScoreKpi } from '../../../../explore/containers/risk_score'; - -import type { RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { generateSeverityFilter } from '../../../../explore/hosts/store/helpers'; -import { useQueryInspector } from '../../../../common/components/page/manage_query'; -import { useGlobalTime } from '../../../../common/containers/use_global_time'; -import { InspectButtonContainer } from '../../../../common/components/inspect'; -import { useQueryToggle } from '../../../../common/containers/query_toggle'; -import { StyledBasicTable } from '../common/styled_basic_table'; -import { RiskScoreHeaderTitle } from '../../../../explore/components/risk_score/risk_score_onboarding/risk_score_header_title'; -import { RiskScoresNoDataDetected } from '../../../../explore/components/risk_score/risk_score_onboarding/risk_score_no_data_detected'; -import { useRefetchQueries } from '../../../../common/hooks/use_refetch_queries'; -import { Loader } from '../../../../common/components/loader'; -import { Panel } from '../../../../common/components/panel'; +import { LastUpdatedAt } from '../../../common/components/last_updated_at'; +import { HeaderSection } from '../../../common/components/header_section'; +import type { RiskSeverity } from '../../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { generateSeverityFilter } from '../../../explore/hosts/store/helpers'; +import { useQueryInspector } from '../../../common/components/page/manage_query'; +import { useGlobalTime } from '../../../common/containers/use_global_time'; +import { InspectButtonContainer } from '../../../common/components/inspect'; +import { useQueryToggle } from '../../../common/containers/query_toggle'; +import { StyledBasicTable } from '../styled_basic_table'; +import { RiskScoreHeaderTitle } from '../risk_score_onboarding/risk_score_header_title'; +import { RiskScoresNoDataDetected } from '../risk_score_onboarding/risk_score_no_data_detected'; +import { useRefetchQueries } from '../../../common/hooks/use_refetch_queries'; +import { Loader } from '../../../common/components/loader'; +import { Panel } from '../../../common/components/panel'; import { useEntityInfo } from './use_entity'; import { RiskScoreHeaderContent } from './header_content'; import { ChartContent } from './chart_content'; -import { useNavigateToAlertsPageWithFilters } from '../../../../common/hooks/use_navigate_to_alerts_page_with_filters'; +import { useNavigateToAlertsPageWithFilters } from '../../../common/hooks/use_navigate_to_alerts_page_with_filters'; import { getRiskEntityTranslation } from './translations'; -import { useKibana } from '../../../../common/lib/kibana'; -import { useGlobalFilterQuery } from '../../../../common/hooks/use_global_filter_query'; +import { useKibana } from '../../../common/lib/kibana'; +import { useGlobalFilterQuery } from '../../../common/hooks/use_global_filter_query'; +import { useRiskScoreKpi } from '../../api/hooks/use_risk_score_kpi'; +import { useRiskScore } from '../../api/hooks/use_risk_score'; const EntityAnalyticsRiskScoresComponent = ({ riskEntity }: { riskEntity: RiskScoreEntity }) => { const { deleteQuery, setQuery, from, to } = useGlobalTime(); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/translations.ts similarity index 82% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/translations.ts index 22fe8a3d528236..5816accea220aa 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/translations.ts @@ -6,9 +6,9 @@ */ import { i18n } from '@kbn/i18n'; -import { getRiskEntityTranslation } from '../../../../explore/components/risk_score/translations'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -export * from '../../../../explore/components/risk_score/translations'; +import { getRiskEntityTranslation } from '../risk_score/translations'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +export * from '../risk_score/translations'; export const ENTITY_NAME = (riskEntity: RiskScoreEntity) => i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle', { diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/use_entity.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/use_entity.test.ts similarity index 93% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/use_entity.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/use_entity.test.ts index 3e0f475d47fa98..25d772c26762ce 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/use_entity.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/use_entity.test.ts @@ -6,7 +6,7 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { RiskScoreEntity } from '../../../../../common/search_strategy/security_solution/risk_score'; +import { RiskScoreEntity } from '../../../../common/search_strategy/security_solution/risk_score'; import { useEntityInfo } from './use_entity'; jest.mock('react-redux', () => { diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/use_entity.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/use_entity.ts similarity index 71% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/use_entity.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/use_entity.ts index dc5d947ad44954..3b3640a7cecae6 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/use_entity.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/use_entity.ts @@ -5,16 +5,16 @@ * 2.0. */ import { useDispatch } from 'react-redux'; -import { getTabsOnUsersUrl } from '../../../../common/components/link_to/redirect_to_users'; -import { UsersTableType } from '../../../../explore/users/store/model'; +import { getTabsOnUsersUrl } from '../../../common/components/link_to/redirect_to_users'; +import { UsersTableType } from '../../../explore/users/store/model'; -import { getTabsOnHostsUrl } from '../../../../common/components/link_to/redirect_to_hosts'; -import { HostsTableType, HostsType } from '../../../../explore/hosts/store/model'; +import { getTabsOnHostsUrl } from '../../../common/components/link_to/redirect_to_hosts'; +import { HostsTableType, HostsType } from '../../../explore/hosts/store/model'; -import { RiskScoreEntity } from '../../../../../common/search_strategy/security_solution/risk_score'; -import { usersActions } from '../../../../explore/users/store'; -import { hostsActions } from '../../../../explore/hosts/store'; -import { SecurityPageName } from '../../../../app/types'; +import { RiskScoreEntity } from '../../../../common/search_strategy/security_solution/risk_score'; +import { usersActions } from '../../../explore/users/store'; +import { hostsActions } from '../../../explore/hosts/store'; +import { SecurityPageName } from '../../../app/types'; const HOST_RISK_TABLE_QUERY_ID = 'hostRiskDashboardTable'; const HOST_RISK_KPI_QUERY_ID = 'headerHostRiskScoreKpiQuery'; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/action_column.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/action_column.test.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/action_column.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/action_column.test.tsx index 9df74c2d608460..d5ff5425ccaa6b 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/action_column.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/action_column.test.tsx @@ -8,8 +8,8 @@ import { fireEvent, render } from '@testing-library/react'; import React from 'react'; import { TestProviders } from '../../../../common/mock'; -import { ActionColumn } from './action_column'; import { alertDataMock } from '../mocks'; +import { ActionColumn } from './action_column'; describe('ActionColumn', () => { it('renders', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/action_column.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/action_column.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/action_column.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/action_column.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/utility_bar.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/utility_bar.test.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/utility_bar.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/utility_bar.test.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/utility_bar.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/utility_bar.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/components/utility_bar.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/components/utility_bar.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/hooks/use_risk_input_actions.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/hooks/use_risk_input_actions.ts similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/hooks/use_risk_input_actions.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/hooks/use_risk_input_actions.ts diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/hooks/use_risk_input_actions_panels.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/hooks/use_risk_input_actions_panels.test.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/hooks/use_risk_input_actions_panels.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/hooks/use_risk_input_actions_panels.test.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/hooks/use_risk_input_actions_panels.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/hooks/use_risk_input_actions_panels.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/hooks/use_risk_input_actions_panels.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/hooks/use_risk_input_actions_panels.tsx diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/index.tsx new file mode 100644 index 00000000000000..428f98530d55f8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/index.tsx @@ -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 React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { PREFIX } from '../../../flyout/shared/test_ids'; +import { UserDetailsLeftPanelTab } from '../../../flyout/entity_details/user_details_left/tabs'; +import { RiskInputsTab } from './tabs/risk_inputs'; + +export const RISK_INPUTS_TAB_TEST_ID = `${PREFIX}RiskInputsTab` as const; + +export const getRiskInputTab = (alertIds: string[]) => ({ + id: UserDetailsLeftPanelTab.RISK_INPUTS, + 'data-test-subj': RISK_INPUTS_TAB_TEST_ID, + name: ( + + ), + content: , +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/mocks/index.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/mocks/index.ts similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/mocks/index.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/mocks/index.ts diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/risk_inputs.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs.test.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/risk_inputs.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs.test.tsx index efd47e50009c97..038d6f7d622d41 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/risk_inputs.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs.test.tsx @@ -9,8 +9,8 @@ import { fireEvent, render } from '@testing-library/react'; import React from 'react'; import { TestProviders } from '../../../../common/mock'; import { times } from 'lodash/fp'; -import { alertDataMock } from '../mocks'; import { RiskInputsTab } from './risk_inputs'; +import { alertDataMock } from '../mocks'; const mockUseAlertsByIds = jest.fn().mockReturnValue({ loading: false, data: [] }); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/risk_inputs.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/risk_inputs.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs.tsx diff --git a/x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/columns.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/columns.test.tsx similarity index 94% rename from x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/columns.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/columns.test.tsx index 98cfa4895fbd40..d439c627365a09 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/columns.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/columns.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import { getHostRiskScoreColumns } from './columns'; -import { TestProviders } from '../../../../common/mock'; +import { TestProviders } from '../../../common/mock'; import type { HostRiskScoreColumns } from '.'; describe('getHostRiskScoreColumns', () => { diff --git a/x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/columns.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/columns.tsx similarity index 78% rename from x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/columns.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/columns.tsx index af6c0d502351e4..e1509a03a9a905 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/columns.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/columns.tsx @@ -11,18 +11,18 @@ import { SecurityCellActions, CellActionsMode, SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; -import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { HostDetailsLink } from '../../../../common/components/links'; +} from '../../../common/components/cell_actions'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { HostDetailsLink } from '../../../common/components/links'; import type { HostRiskScoreColumns } from '.'; import * as i18n from './translations'; -import { HostsTableType } from '../../store/model'; -import type { Maybe, RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreFields, RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RiskScoreLevel } from '../../../components/risk_score/severity/common'; -import { ENTITY_RISK_LEVEL } from '../../../components/risk_score/translations'; -import { CELL_ACTIONS_TELEMETRY } from '../../../components/risk_score/constants'; -import { FormattedRelativePreferenceDate } from '../../../../common/components/formatted_date'; +import { HostsTableType } from '../../../explore/hosts/store/model'; +import type { Maybe, RiskSeverity } from '../../../../common/search_strategy'; +import { RiskScoreFields, RiskScoreEntity } from '../../../../common/search_strategy'; +import { RiskScoreLevel } from '../severity/common'; +import { ENTITY_RISK_LEVEL } from '../risk_score/translations'; +import { CELL_ACTIONS_TELEMETRY } from '../risk_score/constants'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; export const getHostRiskScoreColumns = ({ dispatchSeverityUpdate, diff --git a/x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/index.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/index.tsx index 9c486c96fdece8..5dca054f013cd9 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/index.tsx @@ -9,10 +9,10 @@ import React, { useMemo, useCallback } from 'react'; import { useDispatch } from 'react-redux'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import type { Columns, Criteria, ItemsPerRow } from '../../../components/paginated_table'; -import { PaginatedTable } from '../../../components/paginated_table'; -import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; -import { hostsActions, hostsModel, hostsSelectors } from '../../store'; +import type { Columns, Criteria, ItemsPerRow } from '../../../explore/components/paginated_table'; +import { PaginatedTable } from '../../../explore/components/paginated_table'; +import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; +import { hostsActions, hostsModel, hostsSelectors } from '../../../explore/hosts/store'; import { getHostRiskScoreColumns } from './columns'; import type { HostRiskScore, @@ -20,18 +20,18 @@ import type { RiskScoreSortField, RiskSeverity, RiskScoreFields, -} from '../../../../../common/search_strategy'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import type { State } from '../../../../common/store'; -import * as i18n from '../hosts_table/translations'; +} from '../../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import type { State } from '../../../common/store'; +import * as i18n from '../../../explore/hosts/components/hosts_table/translations'; import * as i18nHosts from './translations'; -import { SeverityBadges } from '../../../components/risk_score/severity/severity_badges'; -import { SeverityBar } from '../../../components/risk_score/severity/severity_bar'; -import { SeverityFilterGroup } from '../../../components/risk_score/severity/severity_filter_group'; +import { SeverityBadges } from '../severity/severity_badges'; +import { SeverityBar } from '../severity/severity_bar'; +import { SeverityFilterGroup } from '../severity/severity_filter_group'; -import type { SeverityCount } from '../../../components/risk_score/severity/types'; -import { RiskInformationButtonEmpty } from '../../../components/risk_score/risk_information'; +import type { SeverityCount } from '../severity/types'; +import { RiskInformationButtonEmpty } from '../risk_information'; export const rowItems: ItemsPerRow[] = [ { diff --git a/x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/hosts/components/host_risk_score_table/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/host_risk_score_table/translations.ts diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.test.tsx similarity index 84% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.test.tsx index d446645a739daa..c521542f1f7b1a 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.test.tsx @@ -7,18 +7,17 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { TestProviders } from '../../../../common/mock'; -import { useQueryToggle } from '../../../../common/containers/query_toggle'; - -import { useRiskScore } from '../../../containers/risk_score'; +import { TestProviders } from '../../../common/mock'; +import { useQueryToggle } from '../../../common/containers/query_toggle'; import { RiskDetailsTabBody } from '.'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { HostsType } from '../../../hosts/store/model'; -import { UsersType } from '../../../users/store/model'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { HostsType } from '../../../explore/hosts/store/model'; +import { UsersType } from '../../../explore/users/store/model'; +import { useRiskScore } from '../../api/hooks/use_risk_score'; -jest.mock('../../../containers/risk_score'); -jest.mock('../../../../common/containers/query_toggle'); -jest.mock('../../../../common/lib/kibana'); +jest.mock('../../api/hooks/use_risk_score'); +jest.mock('../../../common/containers/query_toggle'); +jest.mock('../../../common/lib/kibana'); describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( 'Risk Tab Body entityType: %s', diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.tsx index 37b61a86fbea3c..ed132ade204dd5 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.tsx @@ -9,33 +9,30 @@ import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; -import { RISKY_HOSTS_DASHBOARD_TITLE, RISKY_USERS_DASHBOARD_TITLE } from '../constants'; +import { RISKY_HOSTS_DASHBOARD_TITLE, RISKY_USERS_DASHBOARD_TITLE } from '../risk_score/constants'; import { EnableRiskScore } from '../enable_risk_score'; -import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; -import type { State } from '../../../../common/store'; -import { hostsModel, hostsSelectors } from '../../../hosts/store'; -import { usersSelectors } from '../../../users/store'; +import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; +import type { State } from '../../../common/store'; +import { hostsModel, hostsSelectors } from '../../../explore/hosts/store'; +import { usersSelectors } from '../../../explore/users/store'; import { RiskInformationButtonEmpty } from '../risk_information'; import * as i18n from './translations'; -import { useQueryInspector } from '../../../../common/components/page/manage_query'; +import { useQueryInspector } from '../../../common/components/page/manage_query'; import { RiskScoreOverTime } from '../risk_score_over_time'; import { TopRiskScoreContributors } from '../top_risk_score_contributors'; import { TopRiskScoreContributorsAlerts } from '../top_risk_score_contributors_alerts'; -import { useQueryToggle } from '../../../../common/containers/query_toggle'; -import { - HostRiskScoreQueryId, - UserRiskScoreQueryId, - useRiskScore, -} from '../../../containers/risk_score'; -import type { HostRiskScore, UserRiskScore } from '../../../../../common/search_strategy'; -import { buildEntityNameFilter, RiskScoreEntity } from '../../../../../common/search_strategy'; -import type { UsersComponentsQueryProps } from '../../../users/pages/navigation/types'; -import type { HostsComponentsQueryProps } from '../../../hosts/pages/navigation/types'; -import { useDashboardHref } from '../../../../common/hooks/use_dashboard_href'; +import { useQueryToggle } from '../../../common/containers/query_toggle'; +import type { HostRiskScore, UserRiskScore } from '../../../../common/search_strategy'; +import { buildEntityNameFilter, RiskScoreEntity } from '../../../../common/search_strategy'; +import type { UsersComponentsQueryProps } from '../../../explore/users/pages/navigation/types'; +import type { HostsComponentsQueryProps } from '../../../explore/hosts/pages/navigation/types'; +import { useDashboardHref } from '../../../common/hooks/use_dashboard_href'; import { RiskScoresNoDataDetected } from '../risk_score_onboarding/risk_score_no_data_detected'; -import { useRiskEngineStatus } from '../../../../entity_analytics/api/hooks/use_risk_engine_status'; -import { RiskScoreUpdatePanel } from '../../../../entity_analytics/components/risk_score_update_panel'; +import { useRiskEngineStatus } from '../../api/hooks/use_risk_engine_status'; +import { RiskScoreUpdatePanel } from '../risk_score_update_panel'; +import { HostRiskScoreQueryId, UserRiskScoreQueryId } from '../../common/utils'; +import { useRiskScore } from '../../api/hooks/use_risk_score'; const StyledEuiFlexGroup = styled(EuiFlexGroup)` margin-top: ${({ theme }) => theme.eui.euiSizeL}; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/translations.ts similarity index 83% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/translations.ts index 4a98a8fc749d4e..f24f0716e4eb82 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/translations.ts @@ -6,8 +6,8 @@ */ import { i18n } from '@kbn/i18n'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { getRiskEntityTranslation } from '../translations'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +import { getRiskEntityTranslation } from '../risk_score/translations'; export const RISK_SCORE_OVER_TIME = (riskEntity: RiskScoreEntity) => i18n.translate('xpack.securitySolution.riskTabBody.scoreOverTimeTitle', { diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.test.tsx similarity index 92% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.test.tsx index 19e21a57e5559e..44aee022f2f537 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.test.tsx @@ -8,8 +8,8 @@ import { render, fireEvent } from '@testing-library/react'; import React from 'react'; import { RiskInformationButtonEmpty, RiskInformationButtonIcon } from '.'; -import { TestProviders } from '../../../../common/mock'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( 'Risk Information entityType: %s', diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.tsx similarity index 98% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.tsx index bd099341419f0b..888854cebeb51b 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.tsx @@ -30,9 +30,9 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; import * as i18n from './translations'; -import { useOnOpenCloseHandler } from '../../../../helper_hooks'; +import { useOnOpenCloseHandler } from '../../../helper_hooks'; import { RiskScoreLevel } from '../severity/common'; -import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; +import { RiskScoreEntity, RiskSeverity } from '../../../../common/search_strategy'; import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link'; import { BETA } from '../risk_score_onboarding/translations'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/translations.ts similarity index 91% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/translations.ts index 20fa22bbc26f51..114da512b99744 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/translations.ts @@ -6,8 +6,8 @@ */ import { i18n } from '@kbn/i18n'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { getRiskEntityTranslation } from '../translations'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +import { getRiskEntityTranslation } from '../risk_score/translations'; export const INFORMATION_LEVEL_HEADER = i18n.translate( 'xpack.securitySolution.riskInformation.levelHeader', diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/constants.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/constants.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/constants.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/constants.ts diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/translations.ts diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/index.test.tsx similarity index 78% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/index.test.tsx index 1b93d6545d8383..30a05bcfef1264 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/index.test.tsx @@ -5,12 +5,12 @@ * 2.0. */ -import { RiskSeverity } from '../../../../../common/search_strategy'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; +import { RiskSeverity } from '../../../../common/search_strategy'; +import type { SeverityCount } from '../severity/types'; import { render } from '@testing-library/react'; import React from 'react'; -import { RiskScoreDonutChart } from './risk_score_donut_chart'; -import { TestProviders } from '../../../../common/mock'; +import { RiskScoreDonutChart } from '.'; +import { TestProviders } from '../../../common/mock'; const severityCount: SeverityCount = { [RiskSeverity.low]: 1, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/index.tsx similarity index 67% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/index.tsx index 2bb850e0c312c7..92ae592368ba58 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/index.tsx @@ -8,16 +8,16 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; +import { i18n } from '@kbn/i18n'; +import { ChartLabel } from '../../../overview/components/detection_response/alerts_by_status/chart_label'; +import { RISK_SEVERITY_COLOUR } from '../../common/utils'; +import type { SeverityCount } from '../severity/types'; import { useRiskDonutChartData } from './use_risk_donut_chart_data'; -import type { FillColor } from '../../../../common/components/charts/donutchart'; -import { emptyDonutColor } from '../../../../common/components/charts/donutchart_empty'; -import { DonutChart } from '../../../../common/components/charts/donutchart'; -import { Legend } from '../../../../common/components/charts/legend'; -import { ChartLabel } from '../../detection_response/alerts_by_status/chart_label'; -import * as i18n from './translations'; -import type { RiskSeverity } from '../../../../../common/search_strategy'; +import type { FillColor } from '../../../common/components/charts/donutchart'; +import { emptyDonutColor } from '../../../common/components/charts/donutchart_empty'; +import { DonutChart } from '../../../common/components/charts/donutchart'; +import { Legend } from '../../../common/components/charts/legend'; +import type { RiskSeverity } from '../../../../common/search_strategy'; const DONUT_HEIGHT = 120; @@ -53,7 +53,10 @@ export const RiskScoreDonutChart = ({ severityCount }: RiskScoreDonutChartProps) data={donutChartData ?? null} fillColor={fillColor} height={DONUT_HEIGHT} - label={i18n.TOTAL_LABEL} + label={i18n.translate( + 'xpack.securitySolution.entityAnalytics.riskScore.donut_chart.totalLabel', + { defaultMessage: 'Total' } + )} title={} totalCount={total} /> diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/use_risk_donut_chart_data.test.ts similarity index 88% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/use_risk_donut_chart_data.test.ts index 2a7af3c2a28aae..933a9f98b5bea5 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/use_risk_donut_chart_data.test.ts @@ -6,9 +6,9 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { RiskSeverity } from '../../../../../common/search_strategy'; +import { RiskSeverity } from '../../../../common/search_strategy'; import { useRiskDonutChartData } from './use_risk_donut_chart_data'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; +import type { SeverityCount } from '../severity/types'; describe('useRiskDonutChartData', () => { it('returns the total', () => { diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/use_risk_donut_chart_data.ts similarity index 70% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/use_risk_donut_chart_data.ts index 4b31142aef3c92..8505f229d893f7 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_donut_chart/use_risk_donut_chart_data.ts @@ -6,11 +6,11 @@ */ import { sum } from 'lodash/fp'; import { useMemo } from 'react'; -import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; -import type { LegendItem } from '../../../../common/components/charts/legend_item'; -import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; -import type { DonutChartProps } from '../../../../common/components/charts/donutchart'; -import type { RiskSeverity } from '../../../../../common/search_strategy'; +import { RISK_SEVERITY_COLOUR } from '../../common/utils'; +import type { LegendItem } from '../../../common/components/charts/legend_item'; +import type { SeverityCount } from '../severity/types'; +import type { DonutChartProps } from '../../../common/components/charts/donutchart'; +import type { RiskSeverity } from '../../../../common/search_strategy'; const legendField = 'kibana.alert.severity'; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx index fa61a6c15b9e83..8e49e90c4cadd6 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx @@ -37,7 +37,7 @@ import { useEnableRiskEngineMutation } from '../api/hooks/use_enable_risk_engine import { useDisableRiskEngineMutation } from '../api/hooks/use_disable_risk_engine_mutation'; import { RiskEngineStatus, MAX_SPACES_COUNT } from '../../../common/entity_analytics/risk_engine'; -import { RiskInformationFlyout } from '../../explore/components/risk_score/risk_information'; +import { RiskInformationFlyout } from './risk_information'; import { useOnOpenCloseHandler } from '../../helper_hooks'; import type { RiskEngineMissingPrivilegesResponse } from '../hooks/use_missing_risk_engine_privileges'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_doc_link.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_doc_link.tsx index a54bb9e6276265..ca7b67134b29dc 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_doc_link.tsx @@ -7,9 +7,9 @@ import { EuiLink } from '@elastic/eui'; import React, { useMemo } from 'react'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { LEARN_MORE } from '../../../../overview/components/entity_analytics/risk_score/translations'; -import { useKibana } from '../../../../common/lib/kibana'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useKibana } from '../../../common/lib/kibana'; +import { LEARN_MORE } from '../entity_analytics_risk_score/translations'; const useLearnMoreLinkForEntity = (riskScoreEntity?: RiskScoreEntity) => { const { docLinks } = useKibana().services; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_enable_button.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.test.tsx similarity index 89% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_enable_button.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.test.tsx index a92496316c3ce3..92e022b55aeeb2 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_enable_button.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.test.tsx @@ -6,8 +6,8 @@ */ import { render, screen } from '@testing-library/react'; import React from 'react'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { TestProviders } from '../../../../common/mock'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; import { RiskScoreEnableButton } from './risk_score_enable_button'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_enable_button.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.tsx similarity index 81% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_enable_button.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.tsx index 6e84308911eddb..e6242e75677c13 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_enable_button.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.tsx @@ -9,16 +9,16 @@ import { EuiButton } from '@elastic/eui'; import React, { useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { useSpaceId } from '../../../../common/hooks/use_space_id'; -import { useKibana } from '../../../../common/lib/kibana'; -import type { inputsModel } from '../../../../common/store'; -import { REQUEST_NAMES, useFetch } from '../../../../common/hooks/use_fetch'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useSpaceId } from '../../../common/hooks/use_space_id'; +import { useKibana } from '../../../common/lib/kibana'; +import type { inputsModel } from '../../../common/store'; +import { REQUEST_NAMES, useFetch } from '../../../common/hooks/use_fetch'; import { useRiskScoreToastContent } from './use_risk_score_toast_content'; import { installRiskScoreModule } from './utils'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { SecuritySolutionLinkButton } from '../../../../common/components/links'; -import { SecurityPageName } from '../../../../../common/constants'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; +import { SecuritySolutionLinkButton } from '../../../common/components/links'; +import { SecurityPageName } from '../../../../common/constants'; const RiskScoreEnableButtonComponent = ({ refetch, diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_header_title.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_header_title.tsx similarity index 53% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_header_title.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_header_title.tsx index 741469833f92d0..1ec4edd65fe3b4 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_header_title.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_header_title.tsx @@ -4,10 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import * as i18n from '../../../../overview/components/entity_analytics/common/translations'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; const RiskScoreHeaderTitleComponent = ({ riskScoreEntity, @@ -18,7 +19,17 @@ const RiskScoreHeaderTitleComponent = ({ }) => ( <> {title ?? - (riskScoreEntity === RiskScoreEntity.user ? i18n.USER_RISK_TITLE : i18n.HOST_RISK_TITLE)} + (riskScoreEntity === RiskScoreEntity.user ? ( + + ) : ( + + ))} ); diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_no_data_detected.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_no_data_detected.tsx similarity index 84% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_no_data_detected.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_no_data_detected.tsx index 533a7d00729cd3..c7bd233c7030a3 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_no_data_detected.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_no_data_detected.tsx @@ -7,14 +7,14 @@ import { EuiEmptyPrompt, EuiPanel, EuiToolTip } from '@elastic/eui'; import React, { useMemo } from 'react'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; -import { HeaderSection } from '../../../../common/components/header_section'; +import { HeaderSection } from '../../../common/components/header_section'; import * as i18n from './translations'; import { RiskScoreHeaderTitle } from './risk_score_header_title'; import { RiskScoreRestartButton } from './risk_score_restart_button'; -import type { inputsModel } from '../../../../common/store'; -import { useIsNewRiskScoreModuleInstalled } from '../../../../entity_analytics/api/hooks/use_risk_engine_status'; +import type { inputsModel } from '../../../common/store'; +import { useIsNewRiskScoreModuleInstalled } from '../../api/hooks/use_risk_engine_status'; const RiskScoresNoDataDetectedComponent = ({ entityType, diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_restart_button.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.test.tsx similarity index 94% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_restart_button.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.test.tsx index d6785847cd833c..dbccdd9a0c0852 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_restart_button.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.test.tsx @@ -7,8 +7,8 @@ import { act, render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { TestProviders } from '../../../../common/mock'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; import { RiskScoreRestartButton } from './risk_score_restart_button'; import { restartRiskScoreTransforms } from './utils'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_restart_button.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.tsx similarity index 83% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_restart_button.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.tsx index be1f5b5d16621d..7f4316b77ee973 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_restart_button.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.tsx @@ -9,11 +9,11 @@ import { EuiButton } from '@elastic/eui'; import React, { useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { useSpaceId } from '../../../../common/hooks/use_space_id'; -import { useKibana } from '../../../../common/lib/kibana'; -import type { inputsModel } from '../../../../common/store'; -import { REQUEST_NAMES, useFetch } from '../../../../common/hooks/use_fetch'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useSpaceId } from '../../../common/hooks/use_space_id'; +import { useKibana } from '../../../common/lib/kibana'; +import type { inputsModel } from '../../../common/store'; +import { REQUEST_NAMES, useFetch } from '../../../common/hooks/use_fetch'; import { useRiskScoreToastContent } from './use_risk_score_toast_content'; import { restartRiskScoreTransforms } from './utils'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/translations.ts similarity index 93% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/translations.ts index 105036bd1be338..f8bcbf29725f9b 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/translations.ts @@ -5,8 +5,8 @@ * 2.0. */ import { i18n } from '@kbn/i18n'; -import type { RiskScoreEntity } from '../../../../../common/entity_analytics/risk_engine'; -import { getRiskEntityTranslation } from '../translations'; +import type { RiskScoreEntity } from '../../../../common/entity_analytics/risk_engine'; +import { getRiskEntityTranslation } from '../risk_score/translations'; export const BETA = i18n.translate('xpack.securitySolution.riskScore.technicalPreviewLabel', { defaultMessage: 'Beta', diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/use_risk_score_toast_content.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/use_risk_score_toast_content.tsx similarity index 94% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/use_risk_score_toast_content.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/use_risk_score_toast_content.tsx index 60c00ab9d8cb63..7df01d9f8bd86e 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/use_risk_score_toast_content.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/use_risk_score_toast_content.tsx @@ -10,7 +10,7 @@ import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; import { RiskScoreDocLink } from './risk_score_doc_link'; const StyledButton = styled(EuiButton)` diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/utils.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/utils.test.ts similarity index 94% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/utils.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/utils.test.ts index 770c5b8caf72d2..816ba871249d2c 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/utils.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/utils.test.ts @@ -5,26 +5,26 @@ * 2.0. */ import type { HttpSetup } from '@kbn/core/public'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; import { getIngestPipelineName, getLegacyIngestPipelineName, getRiskScoreLatestTransformId, getRiskScorePivotTransformId, -} from '../../../../../common/utils/risk_score_modules'; +} from '../../../../common/utils/risk_score_modules'; import { bulkDeletePrebuiltSavedObjects, bulkCreatePrebuiltSavedObjects, -} from '../../../containers/risk_score/onboarding/api'; +} from '../../deprecated_risk_engine/api'; -import * as api from '../../../containers/risk_score/onboarding/api'; +import * as api from '../../deprecated_risk_engine/api'; import { installRiskScoreModule, restartRiskScoreTransforms, uninstallRiskScoreModule, } from './utils'; -jest.mock('../../../containers/risk_score/onboarding/api'); +jest.mock('../../deprecated_risk_engine/api'); const mockHttp = { post: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/utils.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/utils.ts similarity index 96% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/utils.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/utils.ts index 65677900f979e2..f1e582e1ed847c 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/utils.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/utils.ts @@ -6,9 +6,9 @@ */ import type { HttpSetup, NotificationsStart, ThemeServiceStart } from '@kbn/core/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import * as utils from '../../../../../common/utils/risk_score_modules'; -import type { inputsModel } from '../../../../common/store'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import * as utils from '../../../../common/utils/risk_score_modules'; +import type { inputsModel } from '../../../common/store'; import { deleteStoredScripts, @@ -19,12 +19,12 @@ import { bulkCreatePrebuiltSavedObjects, stopTransforms, startTransforms, -} from '../../../containers/risk_score/onboarding/api'; +} from '../../deprecated_risk_engine/api'; import { INGEST_PIPELINE_DELETION_ERROR_MESSAGE, TRANSFORM_DELETION_ERROR_MESSAGE, UNINSTALLATION_ERROR, -} from '../../../containers/risk_score/onboarding/api/translations'; +} from '../../deprecated_risk_engine/api/translations'; interface InstallRiskScoreModule { dashboard?: DashboardStart; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/index.test.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/index.test.tsx index 109a51c1a829c1..22458a6d00fd11 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/index.test.tsx @@ -8,10 +8,10 @@ import { render } from '@testing-library/react'; import React from 'react'; import { RiskScoreOverTime, scoreFormatter } from '.'; -import { TestProviders } from '../../../../common/mock'; +import { TestProviders } from '../../../common/mock'; import { LineSeries } from '@elastic/charts'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; const mockLineSeries = LineSeries as jest.Mock; const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled as jest.Mock; @@ -23,11 +23,11 @@ jest.mock('@elastic/charts', () => { }; }); -jest.mock('../../../../common/hooks/use_experimental_features', () => ({ +jest.mock('../../../common/hooks/use_experimental_features', () => ({ useIsExperimentalFeatureEnabled: jest.fn(), })); -jest.mock('../../../../common/components/visualization_actions/visualization_embeddable'); -jest.mock('../../../../common/hooks/use_space_id', () => ({ +jest.mock('../../../common/components/visualization_actions/visualization_embeddable'); +jest.mock('../../../common/hooks/use_space_id', () => ({ useSpaceId: jest.fn().mockReturnValue('default'), })); diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/index.tsx similarity index 87% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/index.tsx index 96381b3681c8b6..210f578b36ad72 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/index.tsx @@ -22,23 +22,23 @@ import { EuiFlexGroup, EuiFlexItem, EuiLoadingChart, EuiText, EuiPanel } from '@ import styled from 'styled-components'; import { euiThemeVars } from '@kbn/ui-theme'; import { i18n } from '@kbn/i18n'; -import { chartDefaultSettings, useThemes } from '../../../../common/components/charts/common'; -import { useTimeZone } from '../../../../common/lib/kibana'; -import { histogramDateTimeFormatter } from '../../../../common/components/utils'; -import { HeaderSection } from '../../../../common/components/header_section'; -import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; +import { chartDefaultSettings, useThemes } from '../../../common/components/charts/common'; +import { useTimeZone } from '../../../common/lib/kibana'; +import { histogramDateTimeFormatter } from '../../../common/components/utils'; +import { HeaderSection } from '../../../common/components/header_section'; +import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect'; import * as translations from './translations'; -import { PreferenceFormattedDate } from '../../../../common/components/formatted_date'; +import { PreferenceFormattedDate } from '../../../common/components/formatted_date'; import type { HostRiskScore, RiskScoreEntity, UserRiskScore, -} from '../../../../../common/search_strategy'; -import { isUserRiskScore } from '../../../../../common/search_strategy'; -import { useSpaceId } from '../../../../common/hooks/use_space_id'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { VisualizationEmbeddable } from '../../../../common/components/visualization_actions/visualization_embeddable'; -import { getRiskScoreOverTimeAreaAttributes } from '../../../../common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_over_time_area'; +} from '../../../../common/search_strategy'; +import { isUserRiskScore } from '../../../../common/search_strategy'; +import { useSpaceId } from '../../../common/hooks/use_space_id'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; +import { VisualizationEmbeddable } from '../../../common/components/visualization_actions/visualization_embeddable'; +import { getRiskScoreOverTimeAreaAttributes } from '../../lens_attributes/risk_score_over_time_area'; export interface RiskScoreOverTimeProps { from: string; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_over_time/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_over_time/translations.ts diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_table.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_table.tsx index 05fa3c18809a6f..9b3a362e634953 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_table.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_table.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { EuiInMemoryTable } from '@elastic/eui'; import type { EuiBasicTableColumn } from '@elastic/eui'; import type { RiskSeverity } from '../../../common/search_strategy'; -import { RiskScoreLevel } from '../../explore/components/risk_score/severity/common'; +import { RiskScoreLevel } from './severity/common'; import { HostDetailsLink, UserDetailsLink } from '../../common/components/links'; import { diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.test.tsx similarity index 89% rename from x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.test.tsx index a02c7729f4e0ae..9bb495118385f0 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.test.tsx @@ -8,12 +8,12 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../common/mock'; import type { RiskEntity } from './risk_summary'; -import * as i18n from './translations'; +import * as i18n from '../../common/components/event_details/cti_details/translations'; import { RiskSummary } from './risk_summary'; -import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; -import { getEmptyValue } from '../../empty_value'; +import { RiskScoreEntity, RiskSeverity } from '../../../common/search_strategy'; +import { getEmptyValue } from '../../common/components/empty_value'; describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( 'RiskSummary entityType: %s', diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.tsx similarity index 80% rename from x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.tsx index e0bc4637ea54b8..df3933ae50e5b7 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.tsx @@ -8,15 +8,18 @@ import React from 'react'; import { EuiLoadingSpinner, EuiPanel } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import * as i18n from './translations'; -import { EnrichedDataRow, ThreatSummaryPanelHeader } from './threat_summary_view'; -import { RiskScoreLevel } from '../../../../explore/components/risk_score/severity/common'; -import type { RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import type { HostRisk, UserRisk } from '../../../../explore/containers/risk_score'; -import { getEmptyValue } from '../../empty_value'; -import { RiskScoreDocLink } from '../../../../explore/components/risk_score/risk_score_onboarding/risk_score_doc_link'; -import { RiskScoreHeaderTitle } from '../../../../explore/components/risk_score/risk_score_onboarding/risk_score_header_title'; +import * as i18n from '../../common/components/event_details/cti_details/translations'; +import { + EnrichedDataRow, + ThreatSummaryPanelHeader, +} from '../../common/components/event_details/cti_details/threat_summary_view'; +import { RiskScoreLevel } from './severity/common'; +import type { RiskSeverity } from '../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../common/search_strategy'; +import { getEmptyValue } from '../../common/components/empty_value'; +import { RiskScoreDocLink } from './risk_score_onboarding/risk_score_doc_link'; +import { RiskScoreHeaderTitle } from './risk_score_onboarding/risk_score_header_title'; +import type { HostRisk, UserRisk } from '../api/types'; interface HostRiskEntity { originalRisk?: RiskSeverity | undefined; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.stories.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx similarity index 86% rename from x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.stories.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx index 06828be073f32f..0f00959845ff3e 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.stories.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx @@ -9,8 +9,8 @@ import React from 'react'; import type { Story } from '@storybook/react'; import type { ExpandableFlyoutContextValue } from '@kbn/expandable-flyout/src/context'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; -import { StorybookProviders } from '../../../../common/mock/storybook_providers'; -import { mockRiskScoreState } from '../../../../timelines/components/side_panel/new_user_detail/__mocks__'; +import { StorybookProviders } from '../../../common/mock/storybook_providers'; +import { mockRiskScoreState } from '../../../timelines/components/side_panel/new_user_detail/__mocks__'; import { RiskSummary } from './risk_summary'; export default { diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx similarity index 90% rename from x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx index fb89ef61ad79f6..5862ac7cd94640 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx @@ -7,11 +7,11 @@ import { render } from '@testing-library/react'; import React from 'react'; -import { TestProviders } from '../../../../common/mock'; -import { mockRiskScoreState } from '../../user_right/mocks'; +import { TestProviders } from '../../../common/mock'; +import { mockRiskScoreState } from '../../../flyout/entity_details/user_right/mocks'; import { RiskSummary } from './risk_summary'; -jest.mock('../../../../common/components/visualization_actions/visualization_embeddable'); +jest.mock('../../../common/components/visualization_actions/visualization_embeddable'); describe('RiskSummary', () => { it('renders risk summary table', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx similarity index 90% rename from x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx index 09c57cc61e02b5..50259cd6ca1340 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx @@ -21,15 +21,15 @@ import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; import { euiThemeVars } from '@kbn/ui-theme'; import { i18n } from '@kbn/i18n'; -import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; -import { ONE_WEEK_IN_HOURS } from '../../../../timelines/components/side_panel/new_user_detail/constants'; -import { FormattedRelativePreferenceDate } from '../../../../common/components/formatted_date'; -import { RiskScoreEntity } from '../../../../../common/entity_analytics/risk_engine'; -import type { RiskScoreState } from '../../../../explore/containers/risk_score'; -import { VisualizationEmbeddable } from '../../../../common/components/visualization_actions/visualization_embeddable'; -import { getRiskScoreSummaryAttributes } from '../../../../common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary'; -import { ExpandablePanel } from '../../../shared/components/expandable_panel'; -import { UserDetailsLeftPanelTab } from '../../user_detais_left/tabs'; +import { UserDetailsLeftPanelTab } from '../../../flyout/entity_details/user_details_left/tabs'; +import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect'; +import { ONE_WEEK_IN_HOURS } from '../../../timelines/components/side_panel/new_user_detail/constants'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; +import { RiskScoreEntity } from '../../../../common/entity_analytics/risk_engine'; +import { VisualizationEmbeddable } from '../../../common/components/visualization_actions/visualization_embeddable'; +import { ExpandablePanel } from '../../../flyout/shared/components/expandable_panel'; +import type { RiskScoreState } from '../../api/hooks/use_risk_score'; +import { getRiskScoreSummaryAttributes } from '../../lens_attributes/risk_score_summary'; export interface RiskSummaryProps { riskScoreData: RiskScoreState; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/common/index.test.tsx similarity index 93% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/severity/common/index.test.tsx index 9068c01a760ca3..c9b75129bb0a27 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/common/index.test.tsx @@ -8,15 +8,15 @@ import { render } from '@testing-library/react'; import React from 'react'; -import { TestProviders } from '../../../../../common/mock'; +import { TestProviders } from '../../../../common/mock'; import type { EuiHealthProps } from '@elastic/eui'; import { EuiHealth } from '@elastic/eui'; import { euiThemeVars } from '@kbn/ui-theme'; -import { RiskSeverity } from '../../../../../../common/search_strategy'; +import { RiskSeverity } from '../../../../../common/search_strategy'; import { RiskScoreLevel } from '.'; -import { SEVERITY_COLOR } from '../../../../../overview/components/detection_response/utils'; +import { SEVERITY_COLOR } from '../../../../overview/components/detection_response/utils'; jest.mock('@elastic/eui', () => { const original = jest.requireActual('@elastic/eui'); diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/common/index.tsx similarity index 87% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/severity/common/index.tsx index 9430690394b49d..0706eb117c5d74 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/common/index.tsx @@ -12,9 +12,9 @@ import { EuiHealth, transparentize } from '@elastic/eui'; import styled, { css } from 'styled-components'; import { euiLightVars } from '@kbn/ui-theme'; -import { RISK_SEVERITY_COLOUR } from '../../../../../entity_analytics/common/utils'; -import { WithHoverActions } from '../../../../../common/components/with_hover_actions'; -import type { RiskSeverity } from '../../../../../../common/search_strategy'; +import { RISK_SEVERITY_COLOUR } from '../../../common/utils'; +import { WithHoverActions } from '../../../../common/components/with_hover_actions'; +import type { RiskSeverity } from '../../../../../common/search_strategy'; const RiskBadge = styled.div<{ $severity: RiskSeverity; $hideBackgroundColor: boolean }>` ${({ theme, $severity, $hideBackgroundColor }) => css` diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_badges.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_badges.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_badges.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_badges.tsx index 53c7e270f2e314..373a8dd5a56932 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_badges.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_badges.tsx @@ -7,8 +7,8 @@ import { EuiFlexGroup, EuiNotificationBadge, EuiFlexItem } from '@elastic/eui'; import React from 'react'; -import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; -import type { RiskSeverity } from '../../../../../common/search_strategy'; +import { RISK_SEVERITY_COLOUR } from '../../common/utils'; +import type { RiskSeverity } from '../../../../common/search_strategy'; import { RiskScoreLevel } from './common'; import type { SeverityCount } from './types'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_bar.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_bar.tsx similarity index 90% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_bar.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_bar.tsx index 847488869bcd3b..149d8f2cf74b94 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_bar.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_bar.tsx @@ -9,8 +9,8 @@ import styled from 'styled-components'; import { EuiColorPaletteDisplay } from '@elastic/eui'; import React, { useMemo } from 'react'; -import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; -import type { RiskSeverity } from '../../../../../common/search_strategy'; +import { RISK_SEVERITY_COLOUR } from '../../common/utils'; +import type { RiskSeverity } from '../../../../common/search_strategy'; import type { SeverityCount } from './types'; const StyledEuiColorPaletteDisplay = styled(EuiColorPaletteDisplay)` diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_filter_group.test.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_filter_group.test.tsx index 07297f9af4042e..ef978fdf80546b 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_filter_group.test.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import { SeverityFilterGroup } from './severity_filter_group'; -import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; -import { TestProviders } from '../../../../common/mock'; -import { createTelemetryServiceMock } from '../../../../common/lib/telemetry/telemetry_service.mock'; +import { RiskScoreEntity, RiskSeverity } from '../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; +import { createTelemetryServiceMock } from '../../../common/lib/telemetry/telemetry_service.mock'; const mockedTelemetry = createTelemetryServiceMock(); -jest.mock('../../../../common/lib/kibana', () => { +jest.mock('../../../common/lib/kibana', () => { return { useKibana: () => ({ services: { diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_filter_group.tsx similarity index 94% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_filter_group.tsx index 1ca7020bc818df..c5373199192a4d 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/severity_filter_group.tsx @@ -16,12 +16,12 @@ import { useEuiTheme, } from '@elastic/eui'; -import { SEVERITY_UI_SORT_ORDER } from '../../../../entity_analytics/common/utils'; -import type { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; +import { SEVERITY_UI_SORT_ORDER } from '../../common/utils'; +import type { RiskScoreEntity, RiskSeverity } from '../../../../common/search_strategy'; import type { SeverityCount } from './types'; import { RiskScoreLevel } from './common'; -import { ENTITY_RISK_LEVEL } from '../translations'; -import { useKibana } from '../../../../common/lib/kibana'; +import { ENTITY_RISK_LEVEL } from '../risk_score/translations'; +import { useKibana } from '../../../common/lib/kibana'; interface SeverityItems { risk: RiskSeverity; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/types.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/types.ts similarity index 80% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/severity/types.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/severity/types.ts index c4760b55b6a838..0c161ddd814702 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/types.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/severity/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { RiskSeverity } from '../../../../../common/search_strategy'; +import type { RiskSeverity } from '../../../../common/search_strategy'; export type SeverityCount = { [k in RiskSeverity]: number; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/styled_basic_table.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/styled_basic_table.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/styled_basic_table.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/styled_basic_table.tsx diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/index.test.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/index.test.tsx index 8b1f3e7cfffff7..710b5427a7479d 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/index.test.tsx @@ -8,11 +8,10 @@ import { render } from '@testing-library/react'; import React from 'react'; import { TopRiskScoreContributors } from '.'; -import { TestProviders } from '../../../../common/mock'; -import type { RuleRisk } from '../../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; +import type { RuleRisk } from '../../../../common/search_strategy'; -jest.mock('../../../../common/containers/query_toggle'); -jest.mock('../../../containers/risk_score'); +jest.mock('../../../common/containers/query_toggle'); const testProps = { riskScore: [], setQuery: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/index.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/index.tsx index 9f33fc9b7bc278..587f3a60824691 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/index.tsx @@ -10,13 +10,13 @@ import React, { useMemo } from 'react'; import type { EuiTableFieldDataColumnType } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiInMemoryTable } from '@elastic/eui'; -import { HeaderSection } from '../../../../common/components/header_section'; -import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; +import { HeaderSection } from '../../../common/components/header_section'; +import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect'; import * as i18n from './translations'; -import type { RuleRisk } from '../../../../../common/search_strategy'; +import type { RuleRisk } from '../../../../common/search_strategy'; -import { RuleLink } from '../../../../detection_engine/rule_management_ui/components/rules_table/use_columns'; +import { RuleLink } from '../../../detection_engine/rule_management_ui/components/rules_table/use_columns'; export interface TopRiskScoreContributorsProps { loading: boolean; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors/translations.ts diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors_alerts/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/index.tsx similarity index 78% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors_alerts/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/index.tsx index 4223acb1f44d4a..eac4de0fecf1c2 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors_alerts/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/index.tsx @@ -10,21 +10,21 @@ import { TableId } from '@kbn/securitysolution-data-table'; import { EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import type { Filter } from '@kbn/es-query'; -import { HeaderSection } from '../../../../common/components/header_section'; +import { HeaderSection } from '../../../common/components/header_section'; import * as i18n from './translations'; -import type { RiskInputs } from '../../../../../common/entity_analytics/risk_engine'; -import { RiskScoreEntity } from '../../../../../common/entity_analytics/risk_engine'; -import type { HostRiskScore, UserRiskScore } from '../../../../../common/search_strategy'; -import { ALERTS_TABLE_REGISTRY_CONFIG_IDS } from '../../../../../common/constants'; -import { AlertsTableComponent } from '../../../../detections/components/alerts_table'; -import { GroupedAlertsTable } from '../../../../detections/components/alerts_table/alerts_grouping'; -import { useGlobalTime } from '../../../../common/containers/use_global_time'; -import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; -import { inputsSelectors } from '../../../../common/store/inputs'; -import { useUserData } from '../../../../detections/components/user_info'; -import { useSourcererDataView } from '../../../../common/containers/sourcerer'; -import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; +import type { RiskInputs } from '../../../../common/entity_analytics/risk_engine'; +import { RiskScoreEntity } from '../../../../common/entity_analytics/risk_engine'; +import type { HostRiskScore, UserRiskScore } from '../../../../common/search_strategy'; +import { ALERTS_TABLE_REGISTRY_CONFIG_IDS } from '../../../../common/constants'; +import { AlertsTableComponent } from '../../../detections/components/alerts_table'; +import { GroupedAlertsTable } from '../../../detections/components/alerts_table/alerts_grouping'; +import { useGlobalTime } from '../../../common/containers/use_global_time'; +import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; +import { inputsSelectors } from '../../../common/store/inputs'; +import { useUserData } from '../../../detections/components/user_info'; +import { useSourcererDataView } from '../../../common/containers/sourcerer'; +import { SourcererScopeName } from '../../../common/store/sourcerer/model'; import { RiskInformationButtonEmpty } from '../risk_information'; export interface TopRiskScoreContributorsAlertsProps { diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors_alerts/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/components/risk_score/top_risk_score_contributors_alerts/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/translations.ts diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/navigation/user_risk_score_tab_body.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.test.tsx similarity index 81% rename from x-pack/plugins/security_solution/public/explore/users/pages/navigation/user_risk_score_tab_body.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.test.tsx index 78406353fb477a..3103a8437f384c 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/navigation/user_risk_score_tab_body.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.test.tsx @@ -7,15 +7,17 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { TestProviders } from '../../../../common/mock'; -import { useRiskScore, useRiskScoreKpi } from '../../../containers/risk_score'; -import { useQueryToggle } from '../../../../common/containers/query_toggle'; +import { TestProviders } from '../../common/mock'; +import { useQueryToggle } from '../../common/containers/query_toggle'; import { UserRiskScoreQueryTabBody } from './user_risk_score_tab_body'; -import { UsersType } from '../../store/model'; +import { UsersType } from '../../explore/users/store/model'; +import { useRiskScore } from '../api/hooks/use_risk_score'; +import { useRiskScoreKpi } from '../api/hooks/use_risk_score_kpi'; -jest.mock('../../../containers/risk_score'); -jest.mock('../../../../common/containers/query_toggle'); -jest.mock('../../../../common/lib/kibana'); +jest.mock('../api/hooks/use_risk_score_kpi'); +jest.mock('../api/hooks/use_risk_score'); +jest.mock('../../common/containers/query_toggle'); +jest.mock('../../common/lib/kibana'); describe('All users query tab body', () => { const mockUseRiskScore = useRiskScore as jest.Mock; diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/navigation/user_risk_score_tab_body.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.tsx similarity index 76% rename from x-pack/plugins/security_solution/public/explore/users/pages/navigation/user_risk_score_tab_body.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.tsx index 4097d673f39828..c216d3786434e1 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/navigation/user_risk_score_tab_body.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.tsx @@ -8,24 +8,21 @@ import React, { useEffect, useMemo, useState } from 'react'; import { noop } from 'lodash/fp'; -import { EnableRiskScore } from '../../../components/risk_score/enable_risk_score'; -import type { UsersComponentsQueryProps } from './types'; -import { manageQuery } from '../../../../common/components/page/manage_query'; -import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; -import type { State } from '../../../../common/store'; - -import { UserRiskScoreTable } from '../../components/user_risk_score_table'; -import { usersSelectors } from '../../store'; -import { - UserRiskScoreQueryId, - useRiskScore, - useRiskScoreKpi, -} from '../../../containers/risk_score'; -import { useQueryToggle } from '../../../../common/containers/query_toggle'; -import { EMPTY_SEVERITY_COUNT, RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RiskScoresNoDataDetected } from '../../../components/risk_score/risk_score_onboarding/risk_score_no_data_detected'; -import { useRiskEngineStatus } from '../../../../entity_analytics/api/hooks/use_risk_engine_status'; -import { RiskScoreUpdatePanel } from '../../../../entity_analytics/components/risk_score_update_panel'; +import { useRiskScoreKpi } from '../api/hooks/use_risk_score_kpi'; +import { useRiskScore } from '../api/hooks/use_risk_score'; +import { UserRiskScoreQueryId } from '../common/utils'; +import { EnableRiskScore } from './enable_risk_score'; +import type { UsersComponentsQueryProps } from '../../explore/users/pages/navigation/types'; +import { manageQuery } from '../../common/components/page/manage_query'; +import { useDeepEqualSelector } from '../../common/hooks/use_selector'; +import type { State } from '../../common/store'; +import { UserRiskScoreTable } from './user_risk_score_table'; +import { usersSelectors } from '../../explore/users/store'; +import { useQueryToggle } from '../../common/containers/query_toggle'; +import { EMPTY_SEVERITY_COUNT, RiskScoreEntity } from '../../../common/search_strategy'; +import { RiskScoresNoDataDetected } from './risk_score_onboarding/risk_score_no_data_detected'; +import { useRiskEngineStatus } from '../api/hooks/use_risk_engine_status'; +import { RiskScoreUpdatePanel } from './risk_score_update_panel'; const UserRiskScoreTableManage = manageQuery(UserRiskScoreTable); diff --git a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/columns.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/columns.test.tsx similarity index 93% rename from x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/columns.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/columns.test.tsx index 3f9fe129815098..5fbbcf30d13bfb 100644 --- a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/columns.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/columns.test.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { render } from '@testing-library/react'; import type { UserRiskScoreColumns } from '.'; import { getUserRiskScoreColumns } from './columns'; -import { TestProviders } from '../../../../common/mock'; -import { RiskScoreFields } from '../../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; +import { RiskScoreFields } from '../../../../common/search_strategy'; describe('getUserRiskScoreColumns', () => { const defaultProps = { diff --git a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/columns.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/columns.tsx similarity index 77% rename from x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/columns.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/columns.tsx index a23d62d0e83d5a..49eaf7b3cc26ba 100644 --- a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/columns.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/columns.tsx @@ -11,19 +11,19 @@ import { SecurityCellActions, SecurityCellActionsTrigger, CellActionsMode, -} from '../../../../common/components/cell_actions'; -import { escapeDataProviderId } from '../../../../common/components/drag_and_drop/helpers'; -import { getEmptyTagValue } from '../../../../common/components/empty_value'; +} from '../../../common/components/cell_actions'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; import type { UserRiskScoreColumns } from '.'; import * as i18n from './translations'; -import { RiskScoreLevel } from '../../../components/risk_score/severity/common'; -import type { Maybe, RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreEntity, RiskScoreFields } from '../../../../../common/search_strategy'; -import { UserDetailsLink } from '../../../../common/components/links'; -import { UsersTableType } from '../../store/model'; -import { ENTITY_RISK_LEVEL } from '../../../components/risk_score/translations'; -import { CELL_ACTIONS_TELEMETRY } from '../../../components/risk_score/constants'; -import { FormattedRelativePreferenceDate } from '../../../../common/components/formatted_date'; +import { RiskScoreLevel } from '../severity/common'; +import type { Maybe, RiskSeverity } from '../../../../common/search_strategy'; +import { RiskScoreEntity, RiskScoreFields } from '../../../../common/search_strategy'; +import { UserDetailsLink } from '../../../common/components/links'; +import { UsersTableType } from '../../../explore/users/store/model'; +import { ENTITY_RISK_LEVEL } from '../risk_score/translations'; +import { CELL_ACTIONS_TELEMETRY } from '../risk_score/constants'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; export const getUserRiskScoreColumns = ({ dispatchSeverityUpdate, diff --git a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.test.tsx similarity index 83% rename from x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/index.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.test.tsx index 2d3cedad6bea11..87905b248a7d97 100644 --- a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.test.tsx @@ -9,10 +9,10 @@ import { render } from '@testing-library/react'; import { noop } from 'lodash'; import React from 'react'; import { UserRiskScoreTable } from '.'; -import type { UserRiskScore } from '../../../../../common/search_strategy'; -import { RiskSeverity } from '../../../../../common/search_strategy'; -import { TestProviders } from '../../../../common/mock'; -import { UsersType } from '../../store/model'; +import type { UserRiskScore } from '../../../../common/search_strategy'; +import { RiskSeverity } from '../../../../common/search_strategy'; +import { TestProviders } from '../../../common/mock'; +import { UsersType } from '../../../explore/users/store/model'; describe('UserRiskScoreTable', () => { const username = 'test_user_name'; diff --git a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.tsx similarity index 83% rename from x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/index.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.tsx index 01a2df82b40c94..6a99e64d04b279 100644 --- a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.tsx @@ -9,29 +9,29 @@ import React, { useMemo, useCallback } from 'react'; import { useDispatch } from 'react-redux'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import type { Columns, Criteria, ItemsPerRow } from '../../../components/paginated_table'; -import { PaginatedTable } from '../../../components/paginated_table'; +import type { Columns, Criteria, ItemsPerRow } from '../../../explore/components/paginated_table'; +import { PaginatedTable } from '../../../explore/components/paginated_table'; import { getUserRiskScoreColumns } from './columns'; -import * as i18nUsers from '../../pages/translations'; +import * as i18nUsers from '../../../explore/users/pages/translations'; import * as i18n from './translations'; -import { usersModel, usersSelectors, usersActions } from '../../store'; -import type { UserRiskScoreItem } from '../../../../../common/search_strategy/security_solution/users/common'; -import type { SeverityCount } from '../../../components/risk_score/severity/types'; -import { SeverityBadges } from '../../../components/risk_score/severity/severity_badges'; -import { SeverityBar } from '../../../components/risk_score/severity/severity_bar'; -import { SeverityFilterGroup } from '../../../components/risk_score/severity/severity_filter_group'; -import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; -import type { State } from '../../../../common/store'; +import { usersModel, usersSelectors, usersActions } from '../../../explore/users/store'; +import type { UserRiskScoreItem } from '../../../../common/search_strategy/security_solution/users/common'; +import type { SeverityCount } from '../severity/types'; +import { SeverityBadges } from '../severity/severity_badges'; +import { SeverityBar } from '../severity/severity_bar'; +import { SeverityFilterGroup } from '../severity/severity_filter_group'; +import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; +import type { State } from '../../../common/store'; import type { RiskScoreFields, RiskScoreSortField, RiskSeverity, UserRiskScore, -} from '../../../../../common/search_strategy'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RiskInformationButtonEmpty } from '../../../components/risk_score/risk_information'; +} from '../../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { RiskInformationButtonEmpty } from '../risk_information'; export const rowItems: ItemsPerRow[] = [ { diff --git a/x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/users/components/user_risk_score_table/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/translations.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/index.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/index.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/index.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/index.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.test.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.test.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/ingest_pipelines.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/ingest_pipelines.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/onboarding.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/onboarding.ts similarity index 94% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/onboarding.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/onboarding.ts index a8578d4d53f7e4..ff6344679455f2 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/onboarding.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/onboarding.ts @@ -7,9 +7,9 @@ import type { HttpSetup, NotificationsStart } from '@kbn/core/public'; -import { INTERNAL_RISK_SCORE_URL } from '../../../../../../common/constants'; +import { INTERNAL_RISK_SCORE_URL } from '../../../../common/constants'; -import { RiskScoreEntity } from '../../../../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; import { HOST_RISK_SCORES_ENABLED_TITLE, INSTALLATION_ERROR, diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/saved_objects.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/saved_objects.ts similarity index 96% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/saved_objects.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/saved_objects.ts index 6e5369f2337f90..4c3f863ddbeae7 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/saved_objects.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/saved_objects.ts @@ -11,13 +11,13 @@ import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import { RISKY_HOSTS_DASHBOARD_TITLE, RISKY_USERS_DASHBOARD_TITLE, -} from '../../../../components/risk_score/constants'; +} from '../../components/risk_score/constants'; import { prebuiltSavedObjectsBulkCreateUrl, prebuiltSavedObjectsBulkDeleteUrl, -} from '../../../../../../common/constants'; +} from '../../../../common/constants'; -import { RiskScoreEntity } from '../../../../../../common/search_strategy'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; import { DELETE_SAVED_OBJECTS_FAILURE, diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.test.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.test.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts similarity index 97% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts index 6a7fa486bc729e..243106325982a4 100644 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/stored_scripts.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/stored_scripts.ts @@ -9,7 +9,7 @@ import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import { RISK_SCORE_CREATE_STORED_SCRIPT, RISK_SCORE_DELETE_STORED_SCRIPT, -} from '../../../../../../common/constants'; +} from '../../../../common/constants'; import { STORED_SCRIPT_CREATION_ERROR_MESSAGE, STORED_SCRIPT_DELETION_ERROR_MESSAGE, diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/transforms.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/transforms.test.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/transforms.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/transforms.test.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/transforms.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/transforms.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/transforms.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/transforms.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/translations.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/translations.ts diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/types.ts b/x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/types.ts similarity index 100% rename from x-pack/plugins/security_solution/public/explore/containers/risk_score/onboarding/api/types.ts rename to x-pack/plugins/security_solution/public/entity_analytics/deprecated_risk_engine/api/types.ts diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_donut.test.ts.snap b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/__snapshots__/risk_score_donut.test.ts.snap similarity index 100% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_donut.test.ts.snap rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/__snapshots__/risk_score_donut.test.ts.snap diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_over_time_area.test.ts.snap b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/__snapshots__/risk_score_over_time_area.test.ts.snap similarity index 100% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_over_time_area.test.ts.snap rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/__snapshots__/risk_score_over_time_area.test.ts.snap diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_summary.test.ts.snap b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/__snapshots__/risk_score_summary.test.ts.snap similarity index 100% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_summary.test.ts.snap rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/__snapshots__/risk_score_summary.test.ts.snap diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_donut.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_donut.test.ts similarity index 82% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_donut.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_donut.test.ts index df536a7e33d179..00b91ceb44e2b9 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_donut.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_donut.test.ts @@ -6,13 +6,12 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { wrapper } from '../../../mocks'; - -import { useLensAttributes } from '../../../use_lens_attributes'; +import { wrapper } from '../../common/components/visualization_actions/mocks'; +import { useLensAttributes } from '../../common/components/visualization_actions/use_lens_attributes'; import { getRiskScoreDonutAttributes } from './risk_score_donut'; -jest.mock('../../../../../containers/sourcerer', () => ({ +jest.mock('../../common/containers/sourcerer', () => ({ useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', @@ -20,7 +19,7 @@ jest.mock('../../../../../containers/sourcerer', () => ({ }), })); -jest.mock('../../../../../utils/route/use_route_spy', () => ({ +jest.mock('../../common/utils/route/use_route_spy', () => ({ useRouteSpy: jest.fn().mockReturnValue([ { detailName: 'undefined', diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_donut.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_donut.ts similarity index 98% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_donut.ts rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_donut.ts index 5260a98c5b8740..dccdab8984607a 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_donut.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_donut.ts @@ -6,7 +6,7 @@ */ import { v4 as uuidv4 } from 'uuid'; -import type { GetLensAttributes } from '../../../types'; +import type { GetLensAttributes } from '../../common/components/visualization_actions/types'; const internalReferenceIdMapping: Record = { host: uuidv4(), user: uuidv4() }; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_over_time_area.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts similarity index 89% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_over_time_area.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts index 97dbe4ea17e48b..5a642e804befd2 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_over_time_area.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts @@ -7,13 +7,12 @@ import { renderHook } from '@testing-library/react-hooks'; import type { XYState } from '@kbn/lens-plugin/public'; -import { wrapper } from '../../../mocks'; - -import { useLensAttributes } from '../../../use_lens_attributes'; import { getRiskScoreOverTimeAreaAttributes } from './risk_score_over_time_area'; +import { useLensAttributes } from '../../common/components/visualization_actions/use_lens_attributes'; +import { wrapper } from '../../common/components/visualization_actions/mocks'; -jest.mock('../../../../../containers/sourcerer', () => ({ +jest.mock('../../common/containers/sourcerer', () => ({ useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', @@ -21,7 +20,7 @@ jest.mock('../../../../../containers/sourcerer', () => ({ }), })); -jest.mock('../../../../../utils/route/use_route_spy', () => ({ +jest.mock('../../common/utils/route/use_route_spy', () => ({ useRouteSpy: jest.fn().mockReturnValue([ { detailName: 'mockHost', diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_over_time_area.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.ts similarity index 98% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_over_time_area.ts rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.ts index b100e5042a33a5..af76c9282873df 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_over_time_area.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.ts @@ -6,7 +6,7 @@ */ import { v4 as uuidv4 } from 'uuid'; -import type { GetLensAttributes } from '../../../types'; +import type { GetLensAttributes } from '../../common/components/visualization_actions/types'; const internalReferenceIdMapping: Record = { host: uuidv4(), user: uuidv4() }; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts similarity index 85% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.test.ts rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts index e8af897c51cea1..6ef0abbf77693d 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { RiskScoreEntity } from '../../../../../../../common/entity_analytics/risk_engine'; +import { RiskScoreEntity } from '../../../common/entity_analytics/risk_engine'; import { renderHook } from '@testing-library/react-hooks'; -import { wrapper } from '../../../mocks'; -import { useLensAttributes } from '../../../use_lens_attributes'; import { getRiskScoreSummaryAttributes } from './risk_score_summary'; -import { RiskSeverity } from '../../../../../../../common/search_strategy'; +import { RiskSeverity } from '../../../common/search_strategy'; import type { MetricVisualizationState } from '@kbn/lens-plugin/public'; +import { wrapper } from '../../common/components/visualization_actions/mocks'; +import { useLensAttributes } from '../../common/components/visualization_actions/use_lens_attributes'; -jest.mock('../../../../../containers/sourcerer', () => ({ +jest.mock('../../common/containers/sourcerer', () => ({ useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.ts similarity index 93% rename from x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.ts rename to x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.ts index 728c6e17713734..544badd18b5e98 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.ts @@ -6,14 +6,10 @@ */ import { v4 as uuidv4 } from 'uuid'; -import { - SEVERITY_UI_SORT_ORDER, - RISK_SEVERITY_COLOUR, - RISK_SCORE_RANGES, -} from '../../../../../../entity_analytics/common/utils'; -import type { RiskSeverity } from '../../../../../../../common/search_strategy'; -import { RiskScoreEntity, RiskScoreFields } from '../../../../../../../common/search_strategy'; -import type { LensAttributes } from '../../../types'; +import type { LensAttributes } from '@kbn/lens-embeddable-utils'; +import { SEVERITY_UI_SORT_ORDER, RISK_SEVERITY_COLOUR, RISK_SCORE_RANGES } from '../common/utils'; +import type { RiskSeverity } from '../../../common/search_strategy'; +import { RiskScoreEntity, RiskScoreFields } from '../../../common/search_strategy'; interface GetRiskScoreSummaryAttributesProps { query?: string; diff --git a/x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx b/x-pack/plugins/security_solution/public/entity_analytics/pages/entity_analytics_dashboard.tsx similarity index 92% rename from x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/pages/entity_analytics_dashboard.tsx index 96476c90aa1806..76efd79b4d63d2 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/pages/entity_analytics_dashboard.tsx @@ -7,7 +7,6 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; -import { EntityAnalyticsRiskScores } from '../components/entity_analytics/risk_score'; import { RiskScoreEntity } from '../../../common/search_strategy'; import { ENTITY_ANALYTICS } from '../../app/translations'; import { SpyRoute } from '../../common/utils/route/spy_routes'; @@ -16,15 +15,15 @@ import { useSourcererDataView } from '../../common/containers/sourcerer'; import { SecuritySolutionPageWrapper } from '../../common/components/page_wrapper'; import { HeaderPage } from '../../common/components/header_page'; import { LandingPageComponent } from '../../common/components/landing_page'; - -import { EntityAnalyticsHeader } from '../components/entity_analytics/header'; -import { EntityAnalyticsAnomalies } from '../components/entity_analytics/anomalies'; import { SiemSearchBar } from '../../common/components/search_bar'; import { InputsModelId } from '../../common/store/inputs/constants'; import { FiltersGlobal } from '../../common/components/filters_global'; -import { useRiskEngineStatus } from '../../entity_analytics/api/hooks/use_risk_engine_status'; -import { RiskScoreUpdatePanel } from '../../entity_analytics/components/risk_score_update_panel'; +import { useRiskEngineStatus } from '../api/hooks/use_risk_engine_status'; +import { RiskScoreUpdatePanel } from '../components/risk_score_update_panel'; import { useHasSecurityCapability } from '../../helper_hooks'; +import { EntityAnalyticsHeader } from '../components/entity_analytics_header'; +import { EntityAnalyticsAnomalies } from '../components/entity_analytics_anomalies'; +import { EntityAnalyticsRiskScores } from '../components/entity_analytics_risk_score'; const EntityAnalyticsComponent = () => { const { data: riskScoreEngineStatus } = useRiskEngineStatus(); diff --git a/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx b/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx index 6c870c313a4128..cbee7c586bbf5d 100644 --- a/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx @@ -41,7 +41,7 @@ import type { } from '../../network/components/network_top_countries_table/columns'; import type { TlsColumns } from '../../network/components/tls_table/columns'; import type { UncommonProcessTableColumns } from '../../hosts/components/uncommon_process_table'; -import type { HostRiskScoreColumns } from '../../hosts/components/host_risk_score_table'; +import type { HostRiskScoreColumns } from '../../../entity_analytics/components/host_risk_score_table'; import type { UsersColumns } from '../../network/components/users_table/columns'; import { HeaderSection } from '../../../common/components/header_section'; diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/all/translations.ts b/x-pack/plugins/security_solution/public/explore/containers/risk_score/all/translations.ts deleted file mode 100644 index 8cc275674d4e9f..00000000000000 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/all/translations.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const ERROR_RISK_SCORE = i18n.translate( - 'xpack.securitySolution.riskScore.errorSearchDescription', - { - defaultMessage: `An error has occurred on risk score search`, - } -); - -export const FAIL_RISK_SCORE = i18n.translate( - 'xpack.securitySolution.riskScore.failSearchDescription', - { - defaultMessage: `Failed to run search on risk score`, - } -); diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/api.ts b/x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/api.ts deleted file mode 100644 index 2cfaa2265f527c..00000000000000 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/feature_status/api.ts +++ /dev/null @@ -1,33 +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 { KibanaServices } from '../../../../common/lib/kibana'; -import { RISK_SCORE_INDEX_STATUS_API_URL } from '../../../../../common/constants'; -import type { RiskScoreEntity } from '../../../../../common/search_strategy'; - -export const getRiskScoreIndexStatus = async (params: { - query: { - indexName: string; - entity: RiskScoreEntity; - }; - signal?: AbortSignal; -}): Promise<{ - isDeprecated: boolean; - isEnabled: boolean; -}> => { - const { indexName, entity } = params.query; - return KibanaServices.get().http.fetch<{ isDeprecated: boolean; isEnabled: boolean }>( - RISK_SCORE_INDEX_STATUS_API_URL, - { - method: 'GET', - version: '1', - query: { indexName, entity }, - asSystemRequest: true, - signal: params.signal, - } - ); -}; diff --git a/x-pack/plugins/security_solution/public/explore/containers/risk_score/index.ts b/x-pack/plugins/security_solution/public/explore/containers/risk_score/index.ts deleted file mode 100644 index 892bcd24dee747..00000000000000 --- a/x-pack/plugins/security_solution/public/explore/containers/risk_score/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { - HostRiskScore, - UserRiskScore, -} from '../../../../common/search_strategy/security_solution/risk_score'; - -export * from './all'; -export * from './kpi'; - -export enum UserRiskScoreQueryId { - USERS_BY_RISK = 'UsersByRisk', - USER_DETAILS_RISK_SCORE = 'UserDetailsRiskScore', -} - -export enum HostRiskScoreQueryId { - DEFAULT = 'HostRiskScore', - HOST_DETAILS_RISK_SCORE = 'HostDetailsRiskScore', - OVERVIEW_RISKY_HOSTS = 'OverviewRiskyHosts', - HOSTS_BY_RISK = 'HostsByRisk', -} - -export interface HostRisk { - loading: boolean; - isModuleEnabled: boolean; - result?: HostRiskScore[]; -} - -export interface UserRisk { - loading: boolean; - isModuleEnabled: boolean; - result?: UserRiskScore[]; -} diff --git a/x-pack/plugins/security_solution/public/explore/hosts/components/hosts_table/columns.tsx b/x-pack/plugins/security_solution/public/explore/hosts/components/hosts_table/columns.tsx index 292e106fa5d4d0..270a10b52155a7 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/components/hosts_table/columns.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/components/hosts_table/columns.tsx @@ -19,9 +19,9 @@ import type { HostsTableColumns } from '.'; import * as i18n from './translations'; import type { Maybe, RiskSeverity } from '../../../../../common/search_strategy'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { VIEW_HOSTS_BY_SEVERITY } from '../host_risk_score_table/translations'; -import { RiskScoreLevel } from '../../../components/risk_score/severity/common'; -import { ENTITY_RISK_LEVEL } from '../../../components/risk_score/translations'; +import { VIEW_HOSTS_BY_SEVERITY } from '../../../../entity_analytics/components/host_risk_score_table/translations'; +import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; +import { ENTITY_RISK_LEVEL } from '../../../../entity_analytics/components/risk_score/translations'; export const getHostsColumns = ( showRiskColumn: boolean, diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx index cc21c96ac9405d..4a758dadc5cbd2 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { Routes, Route } from '@kbn/shared-ux-router'; import { TableId } from '@kbn/securitysolution-data-table'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RiskDetailsTabBody } from '../../../components/risk_score/risk_details_tab_body'; +import { RiskDetailsTabBody } from '../../../../entity_analytics/components/risk_details_tab_body'; import { HostsType, HostsTableType } from '../../store/model'; import { AnomaliesQueryTabBody } from '../../../../common/containers/anomalies/anomalies_query_tab_body'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.test.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.test.tsx index 0ea63088628bfd..30083b2452d94c 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.test.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.test.tsx @@ -8,12 +8,14 @@ import React from 'react'; import { render } from '@testing-library/react'; import { TestProviders } from '../../../../common/mock'; -import { useRiskScore, useRiskScoreKpi } from '../../../containers/risk_score'; import { useQueryToggle } from '../../../../common/containers/query_toggle'; import { HostRiskScoreQueryTabBody } from './host_risk_score_tab_body'; import { HostsType } from '../../store/model'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; +import { useRiskScoreKpi } from '../../../../entity_analytics/api/hooks/use_risk_score_kpi'; -jest.mock('../../../containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score_kpi'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); jest.mock('../../../../common/containers/query_toggle'); jest.mock('../../../../common/lib/kibana'); diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx index 7139102bd35a55..c9ab211c8dc079 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx @@ -8,21 +8,19 @@ import React, { useEffect, useMemo, useState } from 'react'; import { EuiPanel } from '@elastic/eui'; import { noop } from 'lodash/fp'; -import { EnableRiskScore } from '../../../components/risk_score/enable_risk_score'; +import { HostRiskScoreQueryId } from '../../../../entity_analytics/common/utils'; +import { useRiskScoreKpi } from '../../../../entity_analytics/api/hooks/use_risk_score_kpi'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; +import { EnableRiskScore } from '../../../../entity_analytics/components/enable_risk_score'; import type { HostsComponentsQueryProps } from './types'; import { manageQuery } from '../../../../common/components/page/manage_query'; -import { HostRiskScoreTable } from '../../components/host_risk_score_table'; +import { HostRiskScoreTable } from '../../../../entity_analytics/components/host_risk_score_table'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; import { hostsModel, hostsSelectors } from '../../store'; import type { State } from '../../../../common/store'; -import { - HostRiskScoreQueryId, - useRiskScore, - useRiskScoreKpi, -} from '../../../containers/risk_score'; import { useQueryToggle } from '../../../../common/containers/query_toggle'; import { EMPTY_SEVERITY_COUNT, RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RiskScoresNoDataDetected } from '../../../components/risk_score/risk_score_onboarding/risk_score_no_data_detected'; +import { RiskScoresNoDataDetected } from '../../../../entity_analytics/components/risk_score_onboarding/risk_score_no_data_detected'; import { useRiskEngineStatus } from '../../../../entity_analytics/api/hooks/use_risk_engine_status'; import { RiskScoreUpdatePanel } from '../../../../entity_analytics/components/risk_score_update_panel'; diff --git a/x-pack/plugins/security_solution/public/explore/users/components/all_users/index.tsx b/x-pack/plugins/security_solution/public/explore/users/components/all_users/index.tsx index 7cf90c41fd7c3a..6948009ebb188b 100644 --- a/x-pack/plugins/security_solution/public/explore/users/components/all_users/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/components/all_users/index.tsx @@ -27,9 +27,9 @@ import { usersActions, usersModel, usersSelectors } from '../../store'; import type { User } from '../../../../../common/search_strategy/security_solution/users/all'; import type { SortUsersField } from '../../../../../common/search_strategy/security_solution/users/common'; import type { RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreLevel } from '../../../components/risk_score/severity/common'; +import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; -import { VIEW_USERS_BY_SEVERITY } from '../user_risk_score_table/translations'; +import { VIEW_USERS_BY_SEVERITY } from '../../../../entity_analytics/components/user_risk_score_table/translations'; import { SecurityPageName } from '../../../../app/types'; import { UsersTableType } from '../../store/model'; import { useNavigateTo } from '../../../../common/lib/kibana'; diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/details/details_tabs.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/details/details_tabs.tsx index d2649a33292040..9719dc0844e4ac 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/details/details_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/details/details_tabs.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { Routes, Route } from '@kbn/shared-ux-router'; import { TableId } from '@kbn/securitysolution-data-table'; -import { RiskDetailsTabBody } from '../../../components/risk_score/risk_details_tab_body'; +import { RiskDetailsTabBody } from '../../../../entity_analytics/components/risk_details_tab_body'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { UsersTableType } from '../../store/model'; import { AnomaliesUserTable } from '../../../../common/components/ml/tables/anomalies_user_table'; diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/users_tabs.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/users_tabs.tsx index 034ee2a71ab9d7..bc6dd85e21e259 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/users_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/users_tabs.tsx @@ -16,7 +16,7 @@ import { AllUsersQueryTabBody, AuthenticationsQueryTabBody } from './navigation' import { AnomaliesQueryTabBody } from '../../../common/containers/anomalies/anomalies_query_tab_body'; import { AnomaliesUserTable } from '../../../common/components/ml/tables/anomalies_user_table'; -import { UserRiskScoreQueryTabBody } from './navigation/user_risk_score_tab_body'; +import { UserRiskScoreQueryTabBody } from '../../../entity_analytics/components/user_risk_score_tab_body'; import { EventsQueryTabBody } from '../../../common/components/events_tab'; import { userNameExistsFilter } from './details/helpers'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx index 0a8807b2fb75aa..b6aacd491a0557 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx @@ -16,12 +16,12 @@ import { mockContextValue } from '../mocks/mock_context'; import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '../../../shared/components/test_ids'; import type { Anomalies } from '../../../../common/components/ml/types'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { mockAnomalies } from '../../../../common/components/ml/mock'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; import { useHostRelatedUsers } from '../../../../common/containers/related_entities/related_users'; import { useObservedUserDetails } from '../../../../explore/users/containers/users/observed_details'; import { useUserRelatedHosts } from '../../../../common/containers/related_entities/related_hosts'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -86,7 +86,7 @@ const mockUseHostDetails = useHostDetails as jest.Mock; jest.mock('../../../../common/containers/related_entities/related_users'); const mockUseHostsRelatedUsers = useHostRelatedUsers as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); const mockUseRiskScore = useRiskScore as jest.Mock; jest.mock('../../../../explore/users/containers/users/observed_details'); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx index b711e6d3d5f7ed..e8dfa71d0b4c21 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx @@ -11,7 +11,6 @@ import type { Anomalies } from '../../../../common/components/ml/types'; import { TestProviders } from '../../../../common/mock'; import { HostDetails } from './host_details'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { mockAnomalies } from '../../../../common/components/ml/mock'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; import { useHostRelatedUsers } from '../../../../common/containers/related_entities/related_users'; @@ -22,6 +21,7 @@ import { HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID, } from './test_ids'; import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '../../../shared/components/test_ids'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -83,7 +83,7 @@ const mockUseHostDetails = useHostDetails as jest.Mock; jest.mock('../../../../common/containers/related_entities/related_users'); const mockUseHostsRelatedUsers = useHostRelatedUsers as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); const mockUseRiskScore = useRiskScore as jest.Mock; const timestamp = '2022-07-25T08:20:18.966Z'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx index 3f68ef15956ede..711eb2a6500f10 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx @@ -30,7 +30,7 @@ import { AnomalyTableProvider } from '../../../../common/components/ml/anomaly/a import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; import { NetworkDetailsLink } from '../../../../common/components/links'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RiskScoreLevel } from '../../../../explore/components/risk_score/severity/common'; +import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { InputsModelId } from '../../../../common/store/inputs/constants'; import { @@ -49,7 +49,7 @@ import { useHostRelatedUsers } from '../../../../common/containers/related_entit import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; import { HOST_DETAILS_TEST_ID, HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID } from './test_ids'; -import { ENTITY_RISK_LEVEL } from '../../../../explore/components/risk_score/translations'; +import { ENTITY_RISK_LEVEL } from '../../../../entity_analytics/components/risk_score/translations'; import { useHasSecurityCapability } from '../../../../helper_hooks'; const HOST_DETAILS_ID = 'entities-hosts-details'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx index 1f2d5b464d4e97..77e42400001f3c 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx @@ -11,7 +11,6 @@ import type { Anomalies } from '../../../../common/components/ml/types'; import { TestProviders } from '../../../../common/mock'; import { UserDetails } from './user_details'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { mockAnomalies } from '../../../../common/components/ml/mock'; import { useObservedUserDetails } from '../../../../explore/users/containers/users/observed_details'; import { useUserRelatedHosts } from '../../../../common/containers/related_entities/related_hosts'; @@ -22,6 +21,7 @@ import { USER_DETAILS_RELATED_HOSTS_TABLE_TEST_ID, } from './test_ids'; import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '../../../shared/components/test_ids'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -80,7 +80,7 @@ const mockUseObservedUserDetails = useObservedUserDetails as jest.Mock; jest.mock('../../../../common/containers/related_entities/related_hosts'); const mockUseUsersRelatedHosts = useUserRelatedHosts as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); const mockUseRiskScore = useRiskScore as jest.Mock; const timestamp = '2022-07-25T08:20:18.966Z'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx index 1758bbc5b05d85..0aa2624f202ff1 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx @@ -30,7 +30,7 @@ import { AnomalyTableProvider } from '../../../../common/components/ml/anomaly/a import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; import { NetworkDetailsLink } from '../../../../common/components/links'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RiskScoreLevel } from '../../../../explore/components/risk_score/severity/common'; +import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { SecurityCellActions, @@ -49,7 +49,7 @@ import { useUserRelatedHosts } from '../../../../common/containers/related_entit import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; import { USER_DETAILS_RELATED_HOSTS_TABLE_TEST_ID, USER_DETAILS_TEST_ID } from './test_ids'; -import { ENTITY_RISK_LEVEL } from '../../../../explore/components/risk_score/translations'; +import { ENTITY_RISK_LEVEL } from '../../../../entity_analytics/components/risk_score/translations'; import { useHasSecurityCapability } from '../../../../helper_hooks'; const USER_DETAILS_ID = 'entities-users-details'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.test.tsx index 117420358ded54..6388d5f8fb85dc 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.test.tsx @@ -15,7 +15,6 @@ import { } from './test_ids'; import { EntitiesOverview } from './entities_overview'; import { TestProviders } from '../../../../common/mock'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { useFirstLastSeen } from '../../../../common/containers/use_first_last_seen'; import { useObservedUserDetails } from '../../../../explore/users/containers/users/observed_details'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; @@ -26,6 +25,7 @@ import { EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID, EXPANDABLE_PANEL_TOGGLE_ICON_TEST_ID, } from '../../../shared/components/test_ids'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; const from = '2022-04-05T12:00:00.000Z'; const to = '2022-04-08T12:00:00.;000Z'; @@ -49,7 +49,7 @@ const mockUseUserDetails = useObservedUserDetails as jest.Mock; jest.mock('../../../../explore/users/containers/users/observed_details'); const mockUseRiskScore = useRiskScore as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); const mockUseFirstLastSeen = useFirstLastSeen as jest.Mock; jest.mock('../../../../common/containers/use_first_last_seen'); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx index 36fb3731943c4a..f7fc4c2a22d90a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { render } from '@testing-library/react'; import { TestProviders } from '../../../../common/mock'; import { HostEntityOverview } from './host_entity_overview'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; import { useFirstLastSeen } from '../../../../common/containers/use_first_last_seen'; import { @@ -25,6 +24,7 @@ import type { ExpandableFlyoutContextValue } from '@kbn/expandable-flyout/src/co import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; const hostName = 'host'; const osFamily = 'Windows'; @@ -63,7 +63,7 @@ const mockUseHostDetails = useHostDetails as jest.Mock; jest.mock('../../../../explore/hosts/containers/hosts/details'); const mockUseRiskScore = useRiskScore as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); const mockUseFirstLastSeen = useFirstLastSeen as jest.Mock; jest.mock('../../../../common/containers/use_first_last_seen'); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx index a1d42871a42e4f..dd90245a97f707 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx @@ -19,6 +19,7 @@ import { css } from '@emotion/css'; import { getOr } from 'lodash/fp'; import { i18n } from '@kbn/i18n'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; import { useRightPanelContext } from '../context'; import type { DescriptionList } from '../../../../../common/utility_types'; import { @@ -30,10 +31,9 @@ import { getEmptyTagValue } from '../../../../common/components/empty_value'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { DescriptionListStyled } from '../../../../common/components/page'; import { OverviewDescriptionList } from '../../../../common/components/overview_description_list'; -import { RiskScoreLevel } from '../../../../explore/components/risk_score/severity/common'; +import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; import { FAMILY, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx index bb776547d2a9fe..bef01182954700 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx @@ -10,7 +10,6 @@ import { render } from '@testing-library/react'; import { RightPanelContext } from '../context'; import { INSIGHTS_HEADER_TEST_ID } from './test_ids'; import { TestProviders } from '../../../../common/mock'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { useFirstLastSeen } from '../../../../common/containers/use_first_last_seen'; import { useObservedUserDetails } from '../../../../explore/users/containers/users/observed_details'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; @@ -20,6 +19,7 @@ import { mockGetFieldsData } from '../../shared/mocks/mock_get_fields_data'; import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; import { InsightsSection } from './insights_section'; import { useAlertPrevalence } from '../../../../common/containers/alerts/use_alert_prevalence'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; jest.mock('../../../../common/containers/alerts/use_alert_prevalence'); @@ -69,7 +69,7 @@ const mockUseUserDetails = useObservedUserDetails as jest.Mock; jest.mock('../../../../explore/users/containers/users/observed_details'); const mockUseRiskScore = useRiskScore as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); const mockUseFirstLastSeen = useFirstLastSeen as jest.Mock; jest.mock('../../../../common/containers/use_first_last_seen'); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx index c8673f41376f44..b36c21faf3f736 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { render } from '@testing-library/react'; import { TestProviders } from '../../../../common/mock'; import { UserEntityOverview } from './user_entity_overview'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; import { useFirstLastSeen } from '../../../../common/containers/use_first_last_seen'; import { ENTITIES_USER_OVERVIEW_DOMAIN_TEST_ID, @@ -25,6 +24,7 @@ import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { RightPanelContext } from '../context'; import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; const userName = 'user'; const domain = 'n54bg2lfc7'; @@ -63,7 +63,7 @@ const mockUseUserDetails = useObservedUserDetails as jest.Mock; jest.mock('../../../../explore/users/containers/users/observed_details'); const mockUseRiskScore = useRiskScore as jest.Mock; -jest.mock('../../../../explore/containers/risk_score'); +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score'); const mockUseFirstLastSeen = useFirstLastSeen as jest.Mock; jest.mock('../../../../common/containers/use_first_last_seen'); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx index 313719ec1c0bac..34768540e93376 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx @@ -32,10 +32,11 @@ import { getEmptyTagValue } from '../../../../common/components/empty_value'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { DescriptionListStyled } from '../../../../common/components/page'; import { OverviewDescriptionList } from '../../../../common/components/overview_description_list'; -import { RiskScoreLevel } from '../../../../explore/components/risk_score/severity/common'; +import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; +import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; + import { USER_DOMAIN, LAST_SEEN, diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/content.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/content.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/content.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/header.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/header.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/header.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/header.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/index.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs.tsx similarity index 84% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs.tsx index f86dc25ffe2195..61f408a5c0ade3 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs.tsx @@ -9,14 +9,14 @@ import type { ReactElement } from 'react'; import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { getRiskInputTab } from '../../../entity_analytics/components/entity_details_flyout'; import { UserAssetTableType } from '../../../explore/users/store/model'; import { ManagedUserDatasetKey } from '../../../../common/search_strategy/security_solution/users/managed_details'; import type { ManagedUserHits, ManagedUserHit, } from '../../../../common/search_strategy/security_solution/users/managed_details'; -import { ENTRA_TAB_TEST_ID, OKTA_TAB_TEST_ID, RISK_INPUTS_TAB_TEST_ID } from './test_ids'; -import { RiskInputsTab } from './tabs/risk_inputs'; +import { ENTRA_TAB_TEST_ID, OKTA_TAB_TEST_ID } from './test_ids'; import { AssetDocumentTab } from './tabs/asset_document'; import { RightPanelProvider } from '../../document_details/right/context'; @@ -54,18 +54,6 @@ export const useTabs = (managedUser: ManagedUserHits, alertIds: string[]): LeftP return tabs; }, [alertIds, managedUser]); -const getRiskInputTab = (alertIds: string[]) => ({ - id: UserDetailsLeftPanelTab.RISK_INPUTS, - 'data-test-subj': RISK_INPUTS_TAB_TEST_ID, - name: ( - - ), - content: , -}); - const getOktaTab = (oktaManagedUser: ManagedUserHit) => ({ id: UserDetailsLeftPanelTab.OKTA, 'data-test-subj': OKTA_TAB_TEST_ID, diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/asset_document.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs/asset_document.test.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/asset_document.test.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs/asset_document.test.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/asset_document.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs/asset_document.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/asset_document.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs/asset_document.tsx diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs/test_ids.ts similarity index 100% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/tabs/test_ids.ts rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs/test_ids.ts diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/test_ids.ts similarity index 85% rename from x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/test_ids.ts rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/test_ids.ts index b67efe48dca673..1b1bf00b48401e 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_detais_left/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/test_ids.ts @@ -7,6 +7,5 @@ import { PREFIX } from '../../shared/test_ids'; -export const RISK_INPUTS_TAB_TEST_ID = `${PREFIX}RiskInputsTab` as const; export const OKTA_TAB_TEST_ID = `${PREFIX}OktaTab` as const; export const ENTRA_TAB_TEST_ID = `${PREFIX}EntraTab` as const; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx index d782849ce5ee43..9b99c42aeac7a5 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx @@ -8,6 +8,8 @@ import { EuiHorizontalRule } from '@elastic/eui'; import React from 'react'; +import { RiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary'; +import type { RiskScoreState } from '../../../entity_analytics/api/hooks/use_risk_score'; import { ManagedUser } from '../../../timelines/components/side_panel/new_user_detail/managed_user'; import type { ManagedUserData, @@ -15,11 +17,9 @@ import type { } from '../../../timelines/components/side_panel/new_user_detail/types'; import { ObservedUser } from '../../../timelines/components/side_panel/new_user_detail/observed_user'; import type { RiskScoreEntity } from '../../../../common/search_strategy'; -import type { RiskScoreState } from '../../../explore/containers/risk_score'; -import { RiskSummary } from '../shared/components/risk_summary'; import { USER_PANEL_RISK_SCORE_QUERY_ID } from '.'; import { FlyoutBody } from '../../shared/components/flyout_body'; -import type { UserDetailsLeftPanelTab } from '../user_detais_left/tabs'; +import type { UserDetailsLeftPanelTab } from '../user_details_left/tabs'; interface UserPanelContentProps { observedUser: ObservedUserData; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.test.tsx index 5ac5495c3a19f1..1c74e4ed23ea57 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.test.tsx @@ -27,7 +27,7 @@ const mockProps: UserPanelProps = { jest.mock('../../../common/components/visualization_actions/visualization_embeddable'); const mockedUseRiskScore = jest.fn().mockReturnValue(mockRiskScoreState); -jest.mock('../../../explore/containers/risk_score', () => ({ +jest.mock('../../../entity_analytics/api/hooks/use_risk_score', () => ({ useRiskScore: () => mockedUseRiskScore(), })); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx index fdc4c9fa703520..76168bc01c8421 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx @@ -8,6 +8,7 @@ import React, { useCallback, useMemo } from 'react'; import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; +import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import { ManagedUserDatasetKey } from '../../../../common/search_strategy/security_solution/users/managed_details'; import { useManagedUser } from '../../../timelines/components/side_panel/new_user_detail/hooks/use_managed_user'; import { useObservedUser } from '../../../timelines/components/side_panel/new_user_detail/hooks/use_observed_user'; @@ -17,14 +18,13 @@ import { getCriteriaFromUsersType } from '../../../common/components/ml/criteria import { useGlobalTime } from '../../../common/containers/use_global_time'; import { AnomalyTableProvider } from '../../../common/components/ml/anomaly/anomaly_table_provider'; import { buildUserNamesFilter } from '../../../../common/search_strategy'; -import { useRiskScore } from '../../../explore/containers/risk_score'; import { RiskScoreEntity } from '../../../../common/entity_analytics/risk_engine'; import { FlyoutLoading } from '../../shared/components/flyout_loading'; import { FlyoutNavigation } from '../../shared/components/flyout_navigation'; import { UserPanelContent } from './content'; import { UserPanelHeader } from './header'; -import { UserDetailsPanelKey } from '../user_detais_left'; -import type { UserDetailsLeftPanelTab } from '../user_detais_left/tabs'; +import { UserDetailsPanelKey } from '../user_details_left'; +import type { UserDetailsLeftPanelTab } from '../user_details_left/tabs'; export interface UserPanelProps extends Record { contextID: string; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/mocks/index.ts b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/mocks/index.ts index d677f79ca43228..88ab3c10241cb6 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/mocks/index.ts +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/mocks/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { RiskScoreState } from '../../../../explore/containers/risk_score'; +import type { RiskScoreState } from '../../../../entity_analytics/api/hooks/use_risk_score'; import type { RiskScoreEntity, UserRiskScore } from '../../../../../common/search_strategy'; import { RiskSeverity } from '../../../../../common/search_strategy'; import { RiskCategories } from '../../../../../common/entity_analytics/risk_engine'; diff --git a/x-pack/plugins/security_solution/public/flyout/index.tsx b/x-pack/plugins/security_solution/public/flyout/index.tsx index 01c14b3d3ed293..ef7e182324c630 100644 --- a/x-pack/plugins/security_solution/public/flyout/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/index.tsx @@ -24,8 +24,8 @@ import { PreviewPanel, DocumentDetailsPreviewPanelKey } from './document_details import { PreviewPanelProvider } from './document_details/preview/context'; import type { UserPanelExpandableFlyoutProps } from './entity_details/user_right'; import { UserPanel, UserPanelKey } from './entity_details/user_right'; -import type { UserDetailsPanelProps } from './entity_details/user_detais_left'; -import { UserDetailsPanel, UserDetailsPanelKey } from './entity_details/user_detais_left'; +import type { UserDetailsPanelProps } from './entity_details/user_details_left'; +import { UserDetailsPanel, UserDetailsPanelKey } from './entity_details/user_details_left'; /** * List of all panels that will be used within the document details expandable flyout. * This needs to be passed to the expandable flyout registeredPanels property. diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx index 7920bae8b22d79..b70a74d839bc98 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/action_log_expanded_tray.tsx @@ -6,7 +6,7 @@ */ import React, { memo, useMemo } from 'react'; -import { EuiCodeBlock, EuiFlexGroup, EuiFlexItem, EuiDescriptionList } from '@elastic/eui'; +import { EuiCodeBlock, EuiDescriptionList, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { css, euiStyled } from '@kbn/kibana-react-plugin/common'; import { map } from 'lodash'; import { EndpointUploadActionResult } from '../../endpoint_upload_action_result'; @@ -96,7 +96,8 @@ const OutputContent = memo<{ action: MaybeImmutable; 'data-test-s canAccessEndpointActionsLogManagement, } = useUserPrivileges().endpointPrivileges; - const { command, isCompleted, isExpired, wasSuccessful, errors } = action; + const { command: _command, isCompleted, isExpired, wasSuccessful, errors } = action; + const command = getUiCommand(_command); if (errors?.length) { return ( diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx index 1e835e34ac7ef3..93e6719db3569a 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx @@ -34,6 +34,7 @@ import { getEndpointAuthzInitialStateMock } from '../../../../../common/endpoint import { useGetEndpointActionList as _useGetEndpointActionList } from '../../../hooks/response_actions/use_get_endpoint_action_list'; import { OUTPUT_MESSAGES } from '../translations'; import { EndpointActionGenerator } from '../../../../../common/endpoint/data_generators/endpoint_action_generator'; +import { getUiCommand } from '../components/hooks'; const useGetEndpointActionListMock = _useGetEndpointActionList as jest.Mock; @@ -981,10 +982,12 @@ describe('Response actions history', () => { render(); + const outputCommand = getUiCommand(command); + const outputs = expandRows(); expect(outputs.map((n) => n.textContent)).toEqual([ - expect.stringContaining(`${command} completed successfully`), - expect.stringContaining(`${command} completed successfully`), + expect.stringContaining(`${outputCommand} completed successfully`), + expect.stringContaining(`${outputCommand} completed successfully`), ]); expect( renderResult.getAllByTestId(`${testPrefix}-column-status`).map((n) => n.textContent) @@ -1006,10 +1009,11 @@ describe('Response actions history', () => { }); render(); + const outputCommand = getUiCommand(command); const outputs = expandRows(); expect(outputs.map((n) => n.textContent)).toEqual([ - `${command} failed`, - `${command} failed`, + `${outputCommand} failed`, + `${outputCommand} failed`, ]); expect( renderResult.getAllByTestId(`${testPrefix}-column-status`).map((n) => n.textContent) @@ -1032,10 +1036,11 @@ describe('Response actions history', () => { }); render(); + const outputCommand = getUiCommand(command); const outputs = expandRows(); expect(outputs.map((n) => n.textContent)).toEqual([ - `${command} failed: action expired`, - `${command} failed: action expired`, + `${outputCommand} failed: action expired`, + `${outputCommand} failed: action expired`, ]); expect( renderResult.getAllByTestId(`${testPrefix}-column-status`).map((n) => n.textContent) diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/create_and_enroll_endpoint_host_ci.ts b/x-pack/plugins/security_solution/public/management/cypress/support/create_and_enroll_endpoint_host_ci.ts index df3a5cf6d38a07..ef28ebc445e2ad 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/create_and_enroll_endpoint_host_ci.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/create_and_enroll_endpoint_host_ci.ts @@ -6,6 +6,8 @@ */ import { kibanaPackageJson } from '@kbn/repo-info'; +import type { Client } from '@elastic/elasticsearch'; + import type { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test/src/kbn_client'; import { isFleetServerRunning } from '../../../../scripts/endpoint/common/fleet_server/fleet_server_services'; @@ -28,6 +30,7 @@ import { export interface CreateAndEnrollEndpointHostCIOptions extends Pick { + esClient: Client; kbnClient: KbnClient; log: ToolingLog; /** The fleet Agent Policy ID to use for enrolling the agent */ @@ -51,6 +54,7 @@ export interface CreateAndEnrollEndpointHostCIResponse { */ export const createAndEnrollEndpointHostCI = async ({ kbnClient, + esClient, log, agentPolicyId, cpus, @@ -122,7 +126,13 @@ export const createAndEnrollEndpointHostCI = async ({ await hostVm.exec(agentEnrollCommand); - const { id: agentId } = await waitForHostToEnroll(kbnClient, log, hostVm.name, 240000); + const { id: agentId } = await waitForHostToEnroll( + kbnClient, + log, + hostVm.name, + 5 * 60 * 1000, + esClient + ); return { hostname: hostVm.name, diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts index 1c6e50b1cf2f4e..356082f7325da3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts @@ -169,12 +169,13 @@ export const dataLoaders = ( endpointPackageVersion?: string; agentPolicyName?: string; }) => { - const { kbnClient } = await stackServicesPromise; + const { kbnClient, log } = await stackServicesPromise; return indexFleetEndpointPolicy( kbnClient, policyName, endpointPackageVersion, - agentPolicyName + agentPolicyName, + log ); }, @@ -390,7 +391,7 @@ ${s1Info.status} createEndpointHost: async ( options: Omit ): Promise => { - const { kbnClient, log } = await stackServicesPromise; + const { kbnClient, log, esClient } = await stackServicesPromise; let retryAttempt = 0; const attemptCreateEndpointHost = @@ -403,6 +404,7 @@ ${s1Info.status} ...options, log, kbnClient, + esClient, }) : await createAndEnrollEndpointHost({ useClosestVersionMatch: true, diff --git a/x-pack/plugins/security_solution/public/overview/components/common.tsx b/x-pack/plugins/security_solution/public/overview/components/common.tsx index f9068a4507b75c..fcf4072db1afd2 100644 --- a/x-pack/plugins/security_solution/public/overview/components/common.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/common.tsx @@ -8,7 +8,7 @@ import { EuiButtonIcon, EuiPopover, EuiPopoverTitle, EuiText } from '@elastic/eui'; import React, { useCallback, useState } from 'react'; import * as i18n from './translations'; -import { RiskScoreDocLink } from '../../explore/components/risk_score/risk_score_onboarding/risk_score_doc_link'; +import { RiskScoreDocLink } from '../../entity_analytics/components/risk_score_onboarding/risk_score_doc_link'; import type { RiskScoreEntity } from '../../../common/entity_analytics/risk_engine'; export const RiskScoreInfoTooltip: React.FC<{ diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/translations.ts b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/translations.ts deleted file mode 100644 index cc538bedae1eaf..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/translations.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'; - -export const TOTAL_LABEL = i18n.translate('xpack.securitySolution.entityAnalytics.totalLabel', { - defaultMessage: 'Total', -}); - -export const HOST_RISK_TITLE = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.title', - { - defaultMessage: 'Host Risk Scores', - } -); - -export const USER_RISK_TITLE = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.title', - { - defaultMessage: 'User Risk Scores', - } -); diff --git a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.test.tsx index edbb6d03bf9a9d..b1714aace87a51 100644 --- a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.test.tsx @@ -14,7 +14,7 @@ import { TestProviders } from '../../../common/mock'; import { HostOverview } from '.'; import { mockData } from './mock'; import { mockAnomalies } from '../../../common/components/ml/mock'; -import { useRiskScore } from '../../../explore/containers/risk_score/all'; +import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; const defaultProps = { data: undefined, @@ -25,7 +25,7 @@ const defaultProps = { loading: true, }; -jest.mock('../../../explore/containers/risk_score/all'); +jest.mock('../../../entity_analytics/api/hooks/use_risk_score'); const mockUseRiskScore = useRiskScore as jest.Mock; diff --git a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx index 686828412977a8..a6409c587e0a6e 100644 --- a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx @@ -10,6 +10,7 @@ import { euiDarkVars as darkTheme, euiLightVars as lightTheme } from '@kbn/ui-th import { getOr } from 'lodash/fp'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; +import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import type { HostItem } from '../../../../common/search_strategy'; import { buildHostNamesFilter, RiskScoreEntity } from '../../../../common/search_strategy'; import { DEFAULT_DARK_MODE } from '../../../../common/constants'; @@ -35,9 +36,8 @@ import { DescriptionListStyled, OverviewWrapper } from '../../../common/componen import * as i18n from './translations'; import { EndpointOverview } from './endpoint_overview'; import { OverviewDescriptionList } from '../../../common/components/overview_description_list'; -import { useRiskScore } from '../../../explore/containers/risk_score'; -import { RiskScoreLevel } from '../../../explore/components/risk_score/severity/common'; -import { RiskScoreHeaderTitle } from '../../../explore/components/risk_score/risk_score_onboarding/risk_score_header_title'; +import { RiskScoreLevel } from '../../../entity_analytics/components/severity/common'; +import { RiskScoreHeaderTitle } from '../../../entity_analytics/components/risk_score_onboarding/risk_score_header_title'; import type { SourcererScopeName } from '../../../common/store/sourcerer/model'; import { RiskScoreDocTooltip } from '../common'; diff --git a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.test.tsx index 185f2a0fc17b5a..74d78af12fde46 100644 --- a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.test.tsx @@ -12,7 +12,7 @@ import '../../../common/mock/match_media'; import { TestProviders } from '../../../common/mock'; import { mockAnomalies } from '../../../common/components/ml/mock'; -import { useRiskScore } from '../../../explore/containers/risk_score/all'; +import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import type { UserSummaryProps } from '.'; import { UserOverview } from '.'; @@ -25,7 +25,7 @@ const defaultProps = { loading: false, }; -jest.mock('../../../explore/containers/risk_score/all'); +jest.mock('../../../entity_analytics/api/hooks/use_risk_score'); const mockRiskScore = useRiskScore as jest.Mock; diff --git a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx index 446fe215a695a9..572e4aab7e6dfa 100644 --- a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx @@ -10,6 +10,7 @@ import { euiDarkVars as darkTheme, euiLightVars as lightTheme } from '@kbn/ui-th import { getOr } from 'lodash/fp'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; +import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import { buildUserNamesFilter, RiskScoreEntity } from '../../../../common/search_strategy'; import { DEFAULT_DARK_MODE } from '../../../../common/constants'; import type { DescriptionList } from '../../../../common/utility_types'; @@ -32,10 +33,9 @@ import { DescriptionListStyled, OverviewWrapper } from '../../../common/componen import * as i18n from './translations'; import { OverviewDescriptionList } from '../../../common/components/overview_description_list'; -import { useRiskScore } from '../../../explore/containers/risk_score'; -import { RiskScoreLevel } from '../../../explore/components/risk_score/severity/common'; +import { RiskScoreLevel } from '../../../entity_analytics/components/severity/common'; import type { UserItem } from '../../../../common/search_strategy/security_solution/users/common'; -import { RiskScoreHeaderTitle } from '../../../explore/components/risk_score/risk_score_onboarding/risk_score_header_title'; +import { RiskScoreHeaderTitle } from '../../../entity_analytics/components/risk_score_onboarding/risk_score_header_title'; import type { SourcererScopeName } from '../../../common/store/sourcerer/model'; import { RiskScoreDocTooltip } from '../common'; diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx index c98dbc74d5a2cd..b4abb383319521 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx @@ -24,8 +24,8 @@ import { useCtiDashboardLinks } from '../containers/overview_cti_links'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { initialUserPrivilegesState } from '../../common/components/user_privileges/user_privileges_context'; import type { EndpointPrivileges } from '../../../common/endpoint/types'; -import { useRiskScore } from '../../explore/containers/risk_score'; import { mockCasesContract } from '@kbn/cases-plugin/public/mocks'; +import { useRiskScore } from '../../entity_analytics/api/hooks/use_risk_score'; const mockNavigateToApp = jest.fn(); jest.mock('../../common/components/landing_page'); @@ -97,7 +97,7 @@ jest.mock('../containers/overview_cti_links/use_all_ti_data_sources'); const useAllTiDataSourcesMock = useAllTiDataSources as jest.Mock; useAllTiDataSourcesMock.mockReturnValue(mockTiDataSources); -jest.mock('../../explore/containers/risk_score'); +jest.mock('../../entity_analytics/api/hooks/use_risk_score'); const useRiskScoreMock = useRiskScore as jest.Mock; useRiskScoreMock.mockReturnValue({ loading: false, data: [], isModuleEnabled: false }); diff --git a/x-pack/plugins/security_solution/public/overview/routes.tsx b/x-pack/plugins/security_solution/public/overview/routes.tsx index 560daf686242e0..82214b2463bdfa 100644 --- a/x-pack/plugins/security_solution/public/overview/routes.tsx +++ b/x-pack/plugins/security_solution/public/overview/routes.tsx @@ -21,7 +21,7 @@ import { StatefulOverview } from './pages/overview'; import { DataQuality } from './pages/data_quality'; import { DetectionResponse } from './pages/detection_response'; import { PluginTemplateWrapper } from '../common/components/plugin_template_wrapper'; -import { EntityAnalyticsPage } from './pages/entity_analytics'; +import { EntityAnalyticsPage } from '../entity_analytics/pages/entity_analytics_dashboard'; import { SecurityRoutePageWrapper } from '../common/components/security_route_page_wrapper'; import { LandingPage } from './pages/landing'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.test.tsx index 3f7702d490e9dc..f50142177ba8b6 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.test.tsx @@ -116,7 +116,7 @@ jest.mock( } ); jest.mock('../../../../detections/components/alerts_table/actions'); -jest.mock('../../../../explore/containers/risk_score', () => { +jest.mock('../../../../entity_analytics/api/hooks/use_risk_score', () => { return { useRiskScore: jest.fn().mockReturnValue({ loading: true, diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx index a208a9ae3f41f1..590f120b196878 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx @@ -18,7 +18,7 @@ import { import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/css'; -import type { UserDetailsLeftPanelTab } from '../../../../flyout/entity_details/user_detais_left/tabs'; +import type { UserDetailsLeftPanelTab } from '../../../../flyout/entity_details/user_details_left/tabs'; import { UserAssetTableType } from '../../../../explore/users/store/model'; import type { ManagedUserFields } from '../../../../../common/search_strategy/security_solution/users/managed_details'; import { ManagedUserDatasetKey } from '../../../../../common/search_strategy/security_solution/users/managed_details'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx index 9ae5a6433f0413..a03775f61cf26b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx @@ -11,7 +11,7 @@ import React from 'react'; import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; import { get } from 'lodash/fp'; -import { UserDetailsLeftPanelTab } from '../../../../flyout/entity_details/user_detais_left/tabs'; +import { UserDetailsLeftPanelTab } from '../../../../flyout/entity_details/user_details_left/tabs'; import { ExpandablePanel } from '../../../../flyout/shared/components/expandable_panel'; import type { ManagedUserFields } from '../../../../../common/search_strategy/security_solution/users/managed_details'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/risk_score_field.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/risk_score_field.tsx index 798588928bb777..fab77b92582f67 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/risk_score_field.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/risk_score_field.tsx @@ -15,8 +15,8 @@ import * as i18n from './translations'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { RiskScoreLevel } from '../../../../explore/components/risk_score/severity/common'; -import type { RiskScoreState } from '../../../../explore/containers/risk_score'; +import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; +import type { RiskScoreState } from '../../../../entity_analytics/api/hooks/use_risk_score'; import { RiskScoreDocTooltip } from '../../../../overview/components/common'; export const TooltipContainer = styled.div` diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/connectors_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/connectors_services.ts new file mode 100644 index 00000000000000..3fb2971f1236d2 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/connectors_services.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { KbnClient } from '@kbn/test'; +import type { AllConnectorsResponseV1 } from '@kbn/actions-plugin/common/routes/connector/response'; +import type { bodySchema } from '@kbn/actions-plugin/server/routes/create'; +import type { TypeOf } from '@kbn/config-schema'; +import type { Connector } from '@kbn/actions-plugin/server/application/connector/types'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; + +/** + * Retrieve list of configured Connectors + * @param kbnClient + */ +export const fetchConnectorsList = async ( + kbnClient: KbnClient +): Promise => { + return kbnClient + .request({ + path: '/api/actions/connectors', + method: 'GET', + }) + .catch(catchAxiosErrorFormatAndThrow) + .then((response) => response.data); +}; + +/** + * Returns the first connector instance (if any) of a given type + * @param kbnClient + * @param connectorTypeId + */ +export const fetchConnectorByType = async ( + kbnClient: KbnClient, + connectorTypeId: string +): Promise => { + const allConnectors = await fetchConnectorsList(kbnClient); + + for (const connector of allConnectors) { + if (connector.connector_type_id === connectorTypeId) { + return connector; + } + } +}; + +type CreateConnectorBody = TypeOf; + +/** + * Creates a connector in the stack + * @param kbnClient + * @param createPayload + */ +export const createConnector = async ( + kbnClient: KbnClient, + createPayload: CreateConnectorBody +): Promise => { + return kbnClient + .request({ + path: '/api/actions/connector', + method: 'POST', + body: createPayload, + }) + .catch(catchAxiosErrorFormatAndThrow) + .then((response) => response.data); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/detection_rules_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/detection_rules_services.ts new file mode 100644 index 00000000000000..478501b00b89d9 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/detection_rules_services.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { KbnClient } from '@kbn/test'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; +import { + DETECTION_ENGINE_RULES_URL, + DETECTION_ENGINE_RULES_URL_FIND, +} from '../../../common/constants'; +import type { + CreateRuleRequestBody, + FindRulesRequestQuery, + FindRulesResponse, + RuleResponse, +} from '../../../common/api/detection_engine'; + +/** + * Creates a detection engine rule + * @param kbnClient + * @param payload + */ +export const createRule = async ( + kbnClient: KbnClient, + payload: Partial = {} +): Promise => { + return kbnClient + .request({ + path: DETECTION_ENGINE_RULES_URL, + method: 'POST', + body: { + type: 'query', + index: [ + 'apm-*-transaction*', + 'auditbeat-*', + 'endgame-*', + 'filebeat-*', + 'logs-*', + 'packetbeat-*', + 'traces-apm*', + 'winlogbeat-*', + '-*elastic-cloud-logs-*', + ], + filters: [], + language: 'kuery', + query: '_id:*', + author: [], + false_positives: [], + references: [], + risk_score: 21, + risk_score_mapping: [], + severity: 'low', + severity_mapping: [], + threat: [], + name: `Test rule - ${Math.random().toString(36).substring(2)}`, + description: `Test rule created from: ${__filename}`, + tags: [], + license: '', + interval: '1m', + from: 'now-120s', + to: 'now', + meta: { + from: '1m', + kibana_siem_app_url: kbnClient.resolveUrl('/app/security'), + }, + actions: [], + enabled: true, + throttle: 'no_actions', + + ...payload, + }, + headers: { 'elastic-api-version': '2023-10-31' }, + }) + .catch(catchAxiosErrorFormatAndThrow) + .then((response) => response.data); +}; + +/** + * Query the Detection Rules + * @param kbnClient + * @param query + */ +export const findRules = async ( + kbnClient: KbnClient, + query: Partial = {} +): Promise => { + return kbnClient + .request({ + path: DETECTION_ENGINE_RULES_URL_FIND, + method: 'GET', + headers: { 'elastic-api-version': '2023-10-31' }, + query, + }) + .catch(catchAxiosErrorFormatAndThrow) + .then((response) => response.data); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_metadata_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_metadata_services.ts index a69f348c366ebe..cf0672b113ac70 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_metadata_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_metadata_services.ts @@ -10,7 +10,11 @@ import type { KbnClient } from '@kbn/test'; import type { WriteResponseBase } from '@elastic/elasticsearch/lib/api/types'; import { clone, merge } from 'lodash'; import type { DeepPartial } from 'utility-types'; -import { catchAxiosErrorFormatAndThrow } from './format_axios_error'; +import { + RETRYABLE_TRANSIENT_ERRORS, + retryOnError, +} from '../../../common/endpoint/data_loaders/utils'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; import type { GetMetadataListRequestQuery } from '../../../common/api/endpoint'; import { resolvePathVariables } from '../../../public/common/utils/resolve_path_variables'; import { @@ -19,6 +23,7 @@ import { METADATA_DATASTREAM, } from '../../../common/endpoint/constants'; import type { HostInfo, HostMetadata, MetadataListResponse } from '../../../common/endpoint/types'; +import { HostStatus } from '../../../common/endpoint/types'; import { EndpointDocGenerator } from '../../../common/endpoint/generate_data'; const endpointGenerator = new EndpointDocGenerator(); @@ -163,15 +168,15 @@ export const waitForEndpointToStreamData = async ( let found: HostInfo | undefined; while (!found && !hasTimedOut()) { - found = await fetchEndpointMetadata(kbnClient, endpointAgentId).catch((error) => { - // Ignore `not found` (404) responses. Endpoint could be new and thus documents might not have - // been streamed yet. - if (error?.response?.status === 404) { - return undefined; - } - - throw error; - }); + found = await retryOnError( + async () => + fetchEndpointMetadataList(kbnClient, { + kuery: `united.endpoint.agent.id: "${endpointAgentId}"`, + }).then((response) => { + return response.data.filter((record) => record.host_status === HostStatus.HEALTHY)[0]; + }), + RETRYABLE_TRANSIENT_ERRORS + ); if (!found) { // sleep and check again diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts index bb322482feebf2..c9d5b84eb167bf 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts @@ -49,8 +49,8 @@ import { retryOnError, } from '../../../../common/endpoint/data_loaders/utils'; import { isServerlessKibanaFlavor } from '../stack_services'; -import type { FormattedAxiosError } from '../format_axios_error'; -import { catchAxiosErrorFormatAndThrow } from '../format_axios_error'; +import type { FormattedAxiosError } from '../../../../common/endpoint/format_axios_error'; +import { catchAxiosErrorFormatAndThrow } from '../../../../common/endpoint/format_axios_error'; import { ensureFleetSetup, fetchFleetOutputs, @@ -247,113 +247,120 @@ const startFleetServerWithDocker = async ({ let agentVersion = version || (await getAgentVersionMatchingCurrentStack(kbnClient)); const localhostRealIp = getLocalhostRealIp(); const fleetServerUrl = `https://${localhostRealIp}:${port}`; + const isServerless = await isServerlessKibanaFlavor(kbnClient); + const esURL = new URL(await getFleetElasticsearchOutputHost(kbnClient)); + const containerName = `dev-fleet-server.${port}`; log.info( `Starting a new fleet server using Docker\n Agent version: ${agentVersion}\n Server URL: ${fleetServerUrl}` ); - const response: StartedServer = await log.indent(4, async () => { - const isServerless = await isServerlessKibanaFlavor(kbnClient); - const esURL = new URL(await getFleetElasticsearchOutputHost(kbnClient)); - const containerName = `dev-fleet-server.${port}`; - const hostname = `dev-fleet-server.${port}.${Math.random().toString(32).substring(2, 6)}`; - let containerId = ''; - let fleetServerVersionInfo = ''; - - if (isLocalhost(esURL.hostname)) { - esURL.hostname = localhostRealIp; - } + let retryAttempt = isServerless ? 0 : 1; + const attemptServerlessFleetServerSetup = async (): Promise => { + return log.indent(4, async () => { + const hostname = `dev-fleet-server.${port}.${Math.random().toString(32).substring(2, 6)}`; + let containerId = ''; + let fleetServerVersionInfo = ''; + + if (isLocalhost(esURL.hostname)) { + esURL.hostname = localhostRealIp; + } - if (isServerless) { - log.info(`Kibana running in serverless mode. + if (isServerless) { + log.info(`Kibana running in serverless mode. - will install/run standalone Fleet Server - version adjusted to [latest] from [${agentVersion}]`); - agentVersion = 'latest'; - } else { - assert.ok(!!policyId, '`policyId` is required'); - assert.ok(!!serviceToken, '`serviceToken` is required'); - } - - // Create the `elastic` network to use with all containers - await maybeCreateDockerNetwork(log); + agentVersion = 'latest'; + } else { + assert.ok(!!policyId, '`policyId` is required'); + assert.ok(!!serviceToken, '`serviceToken` is required'); + } - try { - const dockerArgs = isServerless - ? getFleetServerStandAloneDockerArgs({ - containerName, - hostname, - port, - esUrl: esURL.toString(), - agentVersion, + // Create the `elastic` network to use with all containers + await maybeCreateDockerNetwork(log); + try { + const dockerArgs = isServerless + ? getFleetServerStandAloneDockerArgs({ + containerName, + hostname, + port, + esUrl: esURL.toString(), + agentVersion, + }) + : getFleetServerManagedDockerArgs({ + containerName, + hostname, + port, + serviceToken, + policyId, + agentVersion, + esUrl: esURL.toString(), + }); + + await execa('docker', ['kill', containerName]) + .then(() => { + log.info( + `Killed an existing container with name [${containerName}]. New one will be started.` + ); }) - : getFleetServerManagedDockerArgs({ - containerName, - hostname, - port, - serviceToken, - policyId, - agentVersion, - esUrl: esURL.toString(), + .catch((error) => { + if (!/no such container/i.test(error.message)) { + log.verbose(`Attempt to kill currently running fleet-server container with name [${containerName}] was unsuccessful: + ${error}`); + } }); - await execa('docker', ['kill', containerName]) - .then(() => { - log.info( - `Killed an existing container with name [${containerName}]. New one will be started.` - ); - }) - .catch((error) => { - if (!/no such container/i.test(error.message)) { - log.verbose(`Attempt to kill currently running fleet-server container with name [${containerName}] was unsuccessful: - ${error}`); - } - }); + log.verbose(`docker arguments:\n${dockerArgs.join(' ')}`); - log.verbose(`docker arguments:\n${dockerArgs.join(' ')}`); + containerId = (await execa('docker', dockerArgs)).stdout; - containerId = (await execa('docker', dockerArgs)).stdout; + log.info(`Fleet server started`); - log.info(`Fleet server started`); + if (!isServerless) { + await addFleetServerHostToFleetSettings(kbnClient, log, fleetServerUrl); + } - if (!isServerless) { - await addFleetServerHostToFleetSettings(kbnClient, log, fleetServerUrl); - } + await updateFleetElasticsearchOutputHostNames(kbnClient, log); - await updateFleetElasticsearchOutputHostNames(kbnClient, log); + if (isServerless) { + log.info(`Waiting for server [${hostname}] to register with Elasticsearch`); + await waitForFleetServerToRegisterWithElasticsearch(kbnClient, hostname, 180000); + } else { + await waitForHostToEnroll(kbnClient, log, hostname, 120000); + } - if (isServerless) { - log.info(`Waiting for server [${hostname}] to register with Elasticsearch`); + fleetServerVersionInfo = isServerless + ? // `/usr/bin/fleet-server` process does not seem to support a `--version` type of argument + 'Running latest standalone fleet server' + : ( + await execa('docker', [ + 'exec', + containerName, + '/bin/bash', + '-c', + '/usr/share/elastic-agent/elastic-agent version', + ]).catch((err) => { + log.verbose( + `Failed to retrieve agent version information from running instance.`, + err + ); + return { stdout: 'Unable to retrieve version information' }; + }) + ).stdout; + } catch (error) { + if (retryAttempt < 1) { + retryAttempt++; + log.error(`Failed to start fleet server, retrying. Error: ${error.message}`); + log.verbose(dump(error)); + return attemptServerlessFleetServerSetup(); + } - await waitForFleetServerToRegisterWithElasticsearch(kbnClient, hostname, 180000); - } else { - await waitForHostToEnroll(kbnClient, log, hostname, 120000); + log.error(dump(error)); + throw error; } - fleetServerVersionInfo = isServerless - ? // `/usr/bin/fleet-server` process does not seem to support a `--version` type of argument - 'Running latest standalone fleet server' - : ( - await execa('docker', [ - 'exec', - containerName, - '/bin/bash', - '-c', - '/usr/share/elastic-agent/elastic-agent version', - ]).catch((err) => { - log.verbose( - `Failed to retrieve agent version information from running instance.`, - err - ); - return { stdout: 'Unable to retrieve version information' }; - }) - ).stdout; - } catch (error) { - log.error(dump(error)); - throw error; - } - - const info = `Container Name: ${containerName} + const info = `Container Name: ${containerName} Container Id: ${containerId} Fleet-server version: ${fleetServerVersionInfo.replace(/\n/g, '\n ')} @@ -363,26 +370,29 @@ Shell access: ${chalk.cyan(`docker exec -it ${containerName} /bin/bash`) Kill container: ${chalk.cyan(`docker kill ${containerId}`)} `; - return { - type: 'docker', - name: containerName, - id: containerId, - url: fleetServerUrl, - info, - stop: async () => { - log.info( - `Stopping (kill) fleet server. Container name [${containerName}] id [${containerId}]` - ); - await execa('docker', ['kill', containerId]); - }, - stopNow: () => { - log.info( - `Stopping (kill) fleet server. Container name [${containerName}] id [${containerId}]` - ); - execa.sync('docker', ['kill', containerId]); - }, - }; - }); + return { + type: 'docker', + name: containerName, + id: containerId, + url: fleetServerUrl, + info, + stop: async () => { + log.info( + `Stopping (kill) fleet server. Container name [${containerName}] id [${containerId}]` + ); + await execa('docker', ['kill', containerId]); + }, + stopNow: () => { + log.info( + `Stopping (kill) fleet server. Container name [${containerName}] id [${containerId}]` + ); + execa.sync('docker', ['kill', containerId]); + }, + }; + }); + }; + + const response: StartedServer = await attemptServerlessFleetServerSetup(); log.info(`Done. Fleet server up and running`); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index 1ca0e3ef12273d..b1ff5e8464a00d 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -9,20 +9,20 @@ import { map, memoize, pick } from 'lodash'; import type { Client, estypes } from '@elastic/elasticsearch'; import type { Agent, + AgentPolicy, AgentStatus, + CreateAgentPolicyRequest, + CreateAgentPolicyResponse, + CreatePackagePolicyRequest, + CreatePackagePolicyResponse, GetAgentPoliciesRequest, GetAgentPoliciesResponse, GetAgentsResponse, + GetInfoResponse, + GetOneAgentPolicyResponse, GetPackagePoliciesRequest, GetPackagePoliciesResponse, - CreateAgentPolicyRequest, - AgentPolicy, - CreateAgentPolicyResponse, - CreatePackagePolicyResponse, - CreatePackagePolicyRequest, PackagePolicy, - GetInfoResponse, - GetOneAgentPolicyResponse, PostFleetSetupResponse, } from '@kbn/fleet-plugin/common'; import { @@ -47,13 +47,13 @@ import { outputRoutesService, } from '@kbn/fleet-plugin/common/services'; import type { + DeleteAgentPolicyResponse, EnrollmentAPIKey, + GenerateServiceTokenResponse, GetAgentsRequest, GetEnrollmentAPIKeysResponse, - PostAgentUnenrollResponse, - GenerateServiceTokenResponse, GetOutputsResponse, - DeleteAgentPolicyResponse, + PostAgentUnenrollResponse, } from '@kbn/fleet-plugin/common/types'; import nodeFetch from 'node-fetch'; import semver from 'semver'; @@ -68,10 +68,9 @@ import { createToolingLogger, RETRYABLE_TRANSIENT_ERRORS, retryOnError, - wrapErrorAndRejectPromise, } from '../../../common/endpoint/data_loaders/utils'; import { fetchKibanaStatus } from './stack_services'; -import { catchAxiosErrorFormatAndThrow } from './format_axios_error'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; import { FleetAgentGenerator } from '../../../common/endpoint/data_generators/fleet_agent_generator'; const fleetGenerator = new FleetAgentGenerator(); @@ -161,12 +160,14 @@ export const fetchFleetAgents = async ( * @param log * @param hostname * @param timeoutMs + * @param esClient */ export const waitForHostToEnroll = async ( kbnClient: KbnClient, log: ToolingLog, hostname: string, - timeoutMs: number = 30000 + timeoutMs: number = 30000, + esClient: Client | undefined = undefined ): Promise => { log.info(`Waiting for host [${hostname}] to enroll with fleet`); @@ -212,6 +213,12 @@ export const waitForHostToEnroll = async ( log.debug(`Host [${hostname}] has been enrolled with fleet`); log.verbose(found); + // Workaround for united metadata sometimes being unable to find docs in .fleet-agents index. This + // seems to be a timing issue with the index refresh. + await esClient?.search({ + index: AGENTS_INDEX, + }); + return found; }; @@ -401,9 +408,7 @@ export const getAgentFileName = (agentVersion: string): string => { const downloadArch = { arm64: 'arm64', x64: 'x86_64' }[process.arch as string] ?? `UNSUPPORTED_ARCHITECTURE_${process.arch}`; - const fileName = `elastic-agent-${agentVersion}-linux-${downloadArch}`; - - return fileName; + return `elastic-agent-${agentVersion}-linux-${downloadArch}`; }; interface ElasticArtifactSearchResponse { @@ -560,8 +565,7 @@ export const unEnrollFleetAgent = async ( * Un-enrolls a Fleet agent * * @param kbnClient - * @param agentId - * @param force + * @param policyId */ export const getAgentPolicyEnrollmentKey = async ( kbnClient: KbnClient, @@ -655,7 +659,7 @@ interface EnrollHostVmWithFleetOptions { /** * Installs the Elastic agent on the provided Host VM and enrolls with it Fleet. * - * NOTE: this method assumes that FLeet-Server is already setup and running. + * NOTE: this method assumes that Fleet-Server is already setup and running. * * @param hostVm * @param kbnClient @@ -772,13 +776,13 @@ export const getOrCreateDefaultAgentPolicy = async ({ }); if (existingPolicy.items[0]) { - log.info(`Re-using existing Fleet test agent policy`); + log.info(`Re-using existing Fleet test agent policy: [${existingPolicy.items[0].name}]`); log.verbose(existingPolicy.items[0]); return existingPolicy.items[0]; } - log.info(`Creating new default test/dev Fleet agent policy`); + log.info(`Creating default test/dev Fleet agent policy with name: [${policyName}]`); const newAgentPolicyData: CreateAgentPolicyRequest['body'] = { name: policyName, @@ -797,7 +801,7 @@ export const getOrCreateDefaultAgentPolicy = async ({ body: newAgentPolicyData, }) .then((response) => response.data.item) - .catch(wrapErrorAndRejectPromise); + .catch(catchAxiosErrorFormatAndThrow); log.verbose(newAgentPolicy); @@ -823,7 +827,7 @@ export const createIntegrationPolicy = async ( }, }) .then((response) => response.data.item) - .catch(wrapErrorAndRejectPromise); + .catch(catchAxiosErrorFormatAndThrow); }; /** @@ -842,7 +846,7 @@ export const fetchPackageInfo = async ( method: 'GET', }) .then((response) => response.data.item) - .catch(wrapErrorAndRejectPromise); + .catch(catchAxiosErrorFormatAndThrow); }; interface AddSentinelOneIntegrationToAgentPolicyOptions { diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/random_policy_id_generator.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/random_policy_id_generator.ts index 3b494d3bfe9cb2..3c58f44b3d266f 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/random_policy_id_generator.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/random_policy_id_generator.ts @@ -12,7 +12,7 @@ import { PACKAGE_POLICY_API_ROUTES, PACKAGE_POLICY_SAVED_OBJECT_TYPE, } from '@kbn/fleet-plugin/common/constants'; -import { catchAxiosErrorFormatAndThrow } from './format_axios_error'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; import { indexFleetEndpointPolicy } from '../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import { setupFleetForEndpoint } from '../../../common/endpoint/data_loaders/setup_fleet_for_endpoint'; import type { GetPolicyListResponse } from '../../../public/management/pages/policy/types'; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/role_and_user_loader.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/role_and_user_loader.ts index f8c51d52550184..eb493e22dafafd 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/role_and_user_loader.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/role_and_user_loader.ts @@ -14,7 +14,7 @@ import { inspect } from 'util'; import type { AxiosError } from 'axios'; import type { EndpointSecurityRoleDefinitions } from './roles_users'; import { getAllEndpointSecurityRoles } from './roles_users'; -import { catchAxiosErrorFormatAndThrow } from './format_axios_error'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; import { COMMON_API_HEADERS } from './constants'; const ignoreHttp409Error = (error: AxiosError) => { diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts index 13fc2a1a0ffba2..f95ee808408ed7 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts @@ -17,7 +17,7 @@ import type { ClientOptions } from '@elastic/elasticsearch/lib/client'; import fs from 'fs'; import { CA_CERT_PATH } from '@kbn/dev-utils'; import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; -import { catchAxiosErrorFormatAndThrow } from './format_axios_error'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; import { isLocalhost } from './is_localhost'; import { getLocalhostRealIp } from './network_services'; import { createSecuritySuperuser } from './security_user_services'; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/vm_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/vm_services.ts index 17c74b1bf6fc3a..4209b554b2732b 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/vm_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/vm_services.ts @@ -178,10 +178,10 @@ export const getMultipassVmCountNotice = async (threshold: number = 1): Promise< if (output.list.length > threshold) { return `----------------------------------------------------------------- ${chalk.red('NOTE:')} ${chalk.bold( - chalk.cyan(`You currently have ${chalk.red(output.list.length)} VMs running.`) - )} Remember to delete those - no longer being used. - View running VMs: ${chalk.bold('multipass list')} + chalk.red(`You currently have ${chalk.red(output.list.length)} VMs running.`) + )} + Remember to delete those no longer being used. + View running VMs: ${chalk.cyan('multipass list')} ----------------------------------------------------------------- `; } diff --git a/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/common.ts b/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/common.ts index f15c08ee875002..fe9053795737a9 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/common.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/common.ts @@ -8,15 +8,22 @@ import type { ToolingLog } from '@kbn/tooling-log'; import type { AxiosRequestConfig } from 'axios'; import axios from 'axios'; +import type { KbnClient } from '@kbn/test'; +import { SENTINELONE_CONNECTOR_ID } from '@kbn/stack-connectors-plugin/common/sentinelone/constants'; +import { type RuleResponse } from '../../../common/api/detection_engine'; +import { dump } from '../endpoint_agent_runner/utils'; import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; import type { S1SitesListApiResponse, S1AgentPackage, S1AgentPackageListApiResponse, } from './types'; -import { catchAxiosErrorFormatAndThrow } from '../common/format_axios_error'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; import type { HostVm } from '../common/types'; +import { createConnector, fetchConnectorByType } from '../common/connectors_services'; +import { createRule, findRules } from '../common/detection_rules_services'; + interface S1ClientOptions { /** The base URL for SentinelOne */ url: string; @@ -200,6 +207,13 @@ export const installSentinelOneAgent = async ({ const status = (await hostVm.exec(`sudo ${installPath} control status`)).stdout; + try { + // Generate an alert in SentinelOne + await hostVm.exec('nslookup amazon.com'); + } catch (e) { + log?.warning(`Attempted to generate an alert on SentinelOne host failed: ${e.message}`); + } + log.info('done'); return { @@ -208,3 +222,73 @@ export const installSentinelOneAgent = async ({ }; }); }; + +interface CreateSentinelOneStackConnectorIfNeededOptions { + kbnClient: KbnClient; + log: ToolingLog; + s1Url: string; + s1ApiToken: string; + name?: string; +} + +export const createSentinelOneStackConnectorIfNeeded = async ({ + kbnClient, + log, + s1ApiToken, + s1Url, + name = 'SentinelOne Dev instance', +}: CreateSentinelOneStackConnectorIfNeededOptions): Promise => { + const connector = await fetchConnectorByType(kbnClient, SENTINELONE_CONNECTOR_ID); + + if (connector) { + log.debug(`Nothing to do. A connector for SentinelOne is already configured`); + log.verbose(dump(connector)); + return; + } + + log.info(`Creating SentinelOne Connector with name: ${name}`); + + await createConnector(kbnClient, { + name, + config: { + url: s1Url, + }, + secrets: { + token: s1ApiToken, + }, + connector_type_id: SENTINELONE_CONNECTOR_ID, + }); +}; + +export const createDetectionEngineSentinelOneRuleIfNeeded = async ( + kbnClient: KbnClient, + log: ToolingLog +): Promise => { + const ruleName = 'Promote SentinelOne alerts'; + const sentinelOneAlertsIndexPattern = 'logs-sentinel_one.alert'; + const ruleQueryValue = 'observer.serial_number:*'; + + const { data } = await findRules(kbnClient, { + filter: `(alert.attributes.params.query: "${ruleQueryValue}" AND alert.attributes.params.index: ${sentinelOneAlertsIndexPattern})`, + }); + + if (data.length) { + log.info( + `Detection engine rule for SentinelOne alerts already exists [${data[0].name}]. No need to create a new one.` + ); + + return data[0]; + } + + log.info(`Creating new detection engine rule named [${ruleName}] for SentinelOne`); + + const createdRule = await createRule(kbnClient, { + index: [sentinelOneAlertsIndexPattern], + query: ruleQueryValue, + from: 'now-3660s', + }); + + log.verbose(dump(createdRule)); + + return createdRule; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/index.ts index 3fad8bf0223bb7..3416b8d4e51b6f 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/sentinelone_host/index.ts @@ -21,7 +21,12 @@ import { fetchAgentPolicy, getOrCreateDefaultAgentPolicy, } from '../common/fleet_services'; -import { installSentinelOneAgent, S1Client } from './common'; +import { + createDetectionEngineSentinelOneRuleIfNeeded, + createSentinelOneStackConnectorIfNeeded, + installSentinelOneAgent, + S1Client, +} from './common'; import { createVm, generateVmName, getMultipassVmCountNotice } from '../common/vm_services'; import { createKbnClient } from '../common/stack_services'; @@ -157,11 +162,16 @@ const runCli: RunFn = async ({ log, flags }) => { agentPolicyId, }); } else { - log.info( + log.debug( `No host VM created for Fleet agent policy [${agentPolicyName}]. It already shows to have [${agents}] enrolled` ); } + await Promise.all([ + createSentinelOneStackConnectorIfNeeded({ kbnClient, log, s1ApiToken, s1Url }), + createDetectionEngineSentinelOneRuleIfNeeded(kbnClient, log), + ]); + log.info(`Done! ${hostVm.info()} diff --git a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts index 3fb28c1c5099db..4a1c1332916db0 100644 --- a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts +++ b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts @@ -9,6 +9,7 @@ import type { ElasticsearchClient, KibanaRequest, Logger, + LoggerFactory, SavedObjectsClientContract, } from '@kbn/core/server'; import type { ExceptionListClient, ListsServerExtensionRegistrar } from '@kbn/lists-plugin/server'; @@ -52,6 +53,7 @@ import type { AppFeaturesService } from '../lib/app_features_service/app_feature export interface EndpointAppContextServiceSetupContract { securitySolutionRequestContextFactory: IRequestContextFactory; cloud: CloudSetup; + loggerFactory: LoggerFactory; } export interface EndpointAppContextServiceStartContract { @@ -172,6 +174,14 @@ export class EndpointAppContextService { return this.startDependencies.fleetAuthzService; } + public createLogger(...contextParts: string[]) { + if (!this.setupDependencies?.loggerFactory) { + throw new EndpointAppContentServicesNotStartedError(); + } + + return this.setupDependencies.loggerFactory.get(...contextParts); + } + public async getEndpointAuthz(request: KibanaRequest): Promise { const fleetAuthz = await this.getFleetAuthzService().fromRequest(request); const userRoles = this.security?.authc.getCurrentUser(request)?.roles ?? []; diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/response_actions/base_actions_provider.ts b/x-pack/plugins/security_solution/server/endpoint/lib/response_actions/base_actions_provider.ts deleted file mode 100644 index 906402b877e0e0..00000000000000 --- a/x-pack/plugins/security_solution/server/endpoint/lib/response_actions/base_actions_provider.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import type { CasesClient } from '@kbn/cases-plugin/server'; -import type { Logger } from '@kbn/logging'; -import type { EndpointAppContext } from '../../types'; -import type { ResponseActionsProvider } from './types'; -import type { - ActionDetails, - GetProcessesActionOutputContent, - KillOrSuspendProcessRequestBody, - KillProcessActionOutputContent, - ResponseActionExecuteOutputContent, - ResponseActionGetFileOutputContent, - ResponseActionGetFileParameters, - ResponseActionParametersWithPidOrEntityId, - ResponseActionsExecuteParameters, - ResponseActionUploadOutputContent, - ResponseActionUploadParameters, - SuspendProcessActionOutputContent, -} from '../../../../common/endpoint/types'; -import type { - IsolationRouteRequestBody, - ExecuteActionRequestBody, - GetProcessesRequestBody, - ResponseActionGetFileRequestBody, - UploadActionApiRequestBody, -} from '../../../../common/api/endpoint'; - -export interface BaseActionsProviderOptions { - endpointContext: EndpointAppContext; - esClient: ElasticsearchClient; - casesClient?: CasesClient; - /** Username that will be stored along with the action's ES documents */ - username: string; -} - -export abstract class BaseResponseActionsClient implements ResponseActionsProvider { - protected readonly log: Logger; - - constructor(protected readonly options: BaseActionsProviderOptions) { - this.log = options.endpointContext.logFactory.get(this.constructor.name ?? 'ActionsProvider'); - } - - // TODO:PT implement a generic way to update cases without relying on the Attachments being endpoint agents - // protected async updateCases(): Promise { - // throw new Error('Method not yet implemented'); - // } - - public abstract isolate(options: IsolationRouteRequestBody): Promise; - - public abstract release(options: IsolationRouteRequestBody): Promise; - - public abstract killProcess( - options: KillOrSuspendProcessRequestBody - ): Promise< - ActionDetails - >; - - public abstract suspendProcess( - options: KillOrSuspendProcessRequestBody - ): Promise< - ActionDetails - >; - - public abstract runningProcesses( - options: GetProcessesRequestBody - ): Promise>; - - public abstract getFile( - options: ResponseActionGetFileRequestBody - ): Promise>; - - public abstract execute( - options: ExecuteActionRequestBody - ): Promise>; - - public abstract upload( - options: UploadActionApiRequestBody - ): Promise>; -} diff --git a/x-pack/plugins/security_solution/server/endpoint/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/mocks.ts index 6376bf45540415..477d1e70be966d 100644 --- a/x-pack/plugins/security_solution/server/endpoint/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/mocks.ts @@ -101,6 +101,7 @@ export const createMockEndpointAppContextService = ( const fleetFromHostFilesClientMock = createFleetFromHostFilesClientMock(); const fleetToHostFilesClientMock = createFleetToHostFilesClientMock(); const fleetActionsClientMock = createFleetActionsClientMock(); + const loggerFactory = loggingSystemMock.create(); return { start: jest.fn(), @@ -108,6 +109,7 @@ export const createMockEndpointAppContextService = ( experimentalFeatures: { ...allowedExperimentalValues, }, + createLogger: jest.fn((...parts) => loggerFactory.get(...parts)), getManifestManager: jest.fn().mockReturnValue(mockManifestManager ?? jest.fn()), getEndpointMetadataService: jest.fn(() => mockEndpointMetadataContext.endpointMetadataService), getInternalFleetServices: jest.fn(() => mockEndpointMetadataContext.fleetServices), @@ -133,6 +135,7 @@ export const createMockEndpointAppContextServiceSetupContract = return { securitySolutionRequestContextFactory: requestContextFactoryMock.create(), cloud: cloudMock.createSetup(), + loggerFactory: loggingSystemMock.create(), }; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts index 8f7682c83daadf..055ef330cb08fa 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts @@ -62,13 +62,30 @@ import * as ActionDetailsService from '../../services/actions/action_details_by_ import { CaseStatuses } from '@kbn/cases-components'; import { getEndpointAuthzInitialStateMock } from '../../../../common/endpoint/service/authz/mocks'; import { actionCreateService } from '../../services/actions'; +import { getResponseActionsClient as _getResponseActionsClient } from '../../services'; import type { UploadActionApiRequestBody } from '../../../../common/api/endpoint'; import type { FleetToHostFileClientInterface } from '@kbn/fleet-plugin/server'; import type { HapiReadableStream, SecuritySolutionRequestHandlerContext } from '../../../types'; import { createHapiReadableStreamMock } from '../../services/actions/mocks'; import { EndpointActionGenerator } from '../../../../common/endpoint/data_generators/endpoint_action_generator'; import { CustomHttpRequestError } from '../../../utils/custom_http_request_error'; -import { omit } from 'lodash'; +import { omit, set } from 'lodash'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; +import { responseActionsClientMock } from '../../services/actions/clients/mocks'; +import type { ActionsApiRequestHandlerContext } from '@kbn/actions-plugin/server'; + +jest.mock('../../services', () => { + const realModule = jest.requireActual('../../services'); + + return { + ...realModule, + getResponseActionsClient: jest.fn((...args) => { + return realModule.getResponseActionsClient(...args); + }), + }; +}); + +const getResponseActionsClientMock = _getResponseActionsClient; interface CallRouteInterface { body?: ResponseActionRequestBody; @@ -1085,7 +1102,7 @@ describe('Response actions', () => { }); afterEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); it('should create a file', async () => { @@ -1147,4 +1164,96 @@ describe('Response actions', () => { }); }); }); + + describe('and `responseActionsSentinelOneV1Enabled` feature flag is enabled', () => { + let testSetup: HttpApiTestSetupMock; + let httpRequestMock: ReturnType; + let httpHandlerContextMock: HttpApiTestSetupMock['httpHandlerContextMock']; + let httpResponseMock: HttpApiTestSetupMock['httpResponseMock']; + let callHandler: () => ReturnType; + + beforeEach(async () => { + testSetup = createHttpApiTestSetupMock(); + + ({ httpHandlerContextMock, httpResponseMock } = testSetup); + httpRequestMock = testSetup.createRequestMock(); + + testSetup.endpointAppContextMock.experimentalFeatures = { + ...testSetup.endpointAppContextMock.experimentalFeatures, + responseActionsSentinelOneV1Enabled: true, + }; + + httpHandlerContextMock.actions = Promise.resolve({ + getActionsClient: () => responseActionsClientMock.createConnectorActionsClient(), + } as unknown as jest.Mocked); + + // Set the esClient to be used in the handler context + // eslint-disable-next-line require-atomic-updates + httpHandlerContextMock.core = Promise.resolve( + set( + await httpHandlerContextMock.core, + 'elasticsearch.client.asInternalUser', + responseActionsClientMock.createConstructorOptions().esClient + ) + ); + + httpRequestMock = testSetup.createRequestMock({ + body: { + endpoint_ids: ['123-456'], + }, + }); + registerResponseActionRoutes(testSetup.routerMock, testSetup.endpointAppContextMock); + + (testSetup.endpointAppContextMock.service.getEndpointMetadataService as jest.Mock) = jest + .fn() + .mockReturnValue({ + getMetadataForEndpoints: jest.fn().mockResolvedValue([ + { + elastic: { + agent: { + id: '123-456', + }, + }, + }, + ]), + }); + + const handler = testSetup.getRegisteredVersionedRoute( + 'post', + ISOLATE_HOST_ROUTE_V2, + '2023-10-31' + ).routeHandler as RequestHandler; + + callHandler = () => handler(httpHandlerContextMock, httpRequestMock, httpResponseMock); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it.each([ + ['undefined', undefined], + ['blank value', ''], + ['endpoint', 'endpoint'], + ])( + 'should use endpoint response actions client when agentType is: %s', + async (_, agentTypeValue) => { + if (agentTypeValue !== undefined) { + httpRequestMock.body.agent_type = agentTypeValue as ResponseActionAgentType; + } + await callHandler(); + + expect(getResponseActionsClientMock).toHaveBeenCalledWith('endpoint', expect.anything()); + expect(httpResponseMock.ok).toHaveBeenCalled(); + } + ); + + it('should use SentinelOne response actions client when agent type is sentinel_one', async () => { + httpRequestMock.body.agent_type = 'sentinel_one'; + await callHandler(); + + expect(getResponseActionsClientMock).toHaveBeenCalledWith('sentinel_one', expect.anything()); + expect(httpResponseMock.ok).toHaveBeenCalled(); + }); + }); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts index c8669869833fe4..4e8fdc997572af 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts @@ -7,8 +7,10 @@ import type { RequestHandler } from '@kbn/core/server'; import type { TypeOf } from '@kbn/config-schema'; +import { dump } from '../../utils/dump'; +import { getResponseActionsClient } from '../../services'; +import type { ResponseActionsClient } from '../../services/actions/clients/lib/types'; import { CustomHttpRequestError } from '../../../utils/custom_http_request_error'; -import { EndpointActionsClient } from '../../services/actions/clients'; import type { NoParametersRequestSchema, ResponseActionsRequestBody, @@ -290,50 +292,77 @@ function responseActionRequestHandler { + logger.debug(`response action [${command}]:\n${dump(req.body)}`); + + // Note: because our API schemas are defined as module static variables (as opposed to a + // `getter` function), we need to include this additional validation here, since + // `agent_type` is included in the schema independent of the feature flag + if ( + req.body.agent_type && + !endpointContext.experimentalFeatures.responseActionsSentinelOneV1Enabled + ) { + return errorHandler( + logger, + res, + new CustomHttpRequestError(`[request body.agent_type]: feature is disabled`, 400) + ); + } + const user = endpointContext.service.security?.authc.getCurrentUser(req); const esClient = (await context.core).elasticsearch.client.asInternalUser; const casesClient = await endpointContext.service.getCasesClient(req); - const actionsClient = new EndpointActionsClient({ - esClient, - casesClient, - endpointContext, - username: user?.username ?? 'unknown', - }); + const connectorActions = (await context.actions).getActionsClient(); + const responseActionsClient: ResponseActionsClient = getResponseActionsClient( + req.body.agent_type || 'endpoint', + { + esClient, + casesClient, + endpointService: endpointContext.service, + username: user?.username || 'unknown', + connectorActions, + } + ); try { let action: ActionDetails; switch (command) { case 'isolate': - action = await actionsClient.isolate(req.body); + action = await responseActionsClient.isolate(req.body); break; case 'unisolate': - action = await actionsClient.release(req.body); + action = await responseActionsClient.release(req.body); break; case 'running-processes': - action = await actionsClient.runningProcesses(req.body); + action = await responseActionsClient.runningProcesses(req.body); break; case 'execute': - action = await actionsClient.execute(req.body as ExecuteActionRequestBody); + action = await responseActionsClient.execute(req.body as ExecuteActionRequestBody); break; case 'suspend-process': - action = await actionsClient.suspendProcess(req.body as KillOrSuspendProcessRequestBody); + action = await responseActionsClient.suspendProcess( + req.body as KillOrSuspendProcessRequestBody + ); break; case 'kill-process': - action = await actionsClient.killProcess(req.body as KillOrSuspendProcessRequestBody); + action = await responseActionsClient.killProcess( + req.body as KillOrSuspendProcessRequestBody + ); break; case 'get-file': - action = await actionsClient.getFile(req.body as ResponseActionGetFileRequestBody); + action = await responseActionsClient.getFile( + req.body as ResponseActionGetFileRequestBody + ); break; case 'upload': - action = await actionsClient.upload(req.body as UploadActionApiRequestBody); + action = await responseActionsClient.upload(req.body as UploadActionApiRequestBody); break; default: diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.test.ts index 452bf46316d603..54d536e314edd7 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.test.ts @@ -127,11 +127,7 @@ describe('When using `getActionDetailsById()', () => { body: { query: { bool: { - filter: [ - { term: { action_id: '123' } }, - { term: { input_type: 'endpoint' } }, - { term: { type: 'INPUT_ACTION' } }, - ], + filter: [{ term: { action_id: '123' } }], }, }, }, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.ts index 9c85a193d712d8..8e3d6ddad12b87 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_details_by_id.ts @@ -31,11 +31,11 @@ import { NotFoundError } from '../../errors'; import { ACTION_RESPONSE_INDICES, ACTIONS_SEARCH_PAGE_SIZE } from './constants'; import type { EndpointMetadataService } from '../metadata'; -export const getActionDetailsById = async ( +export const getActionDetailsById = async ( esClient: ElasticsearchClient, metadataService: EndpointMetadataService, actionId: string -): Promise => { +): Promise => { let actionRequestsLogEntries: EndpointActivityLogAction[]; let normalizedActionRequest: ReturnType | undefined; @@ -52,11 +52,7 @@ export const getActionDetailsById = async ( body: { query: { bool: { - filter: [ - { term: { action_id: actionId } }, - { term: { input_type: 'endpoint' } }, - { term: { type: 'INPUT_ACTION' } }, - ], + filter: [{ term: { action_id: actionId } }], }, }, }, @@ -148,5 +144,5 @@ export const getActionDetailsById = async ( parameters: normalizedActionRequest.parameters, }; - return actionDetails; + return actionDetails as T; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint_actions_client.ts index 2b5813fa6c909e..a999659f2273a7 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint_actions_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint_actions_client.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { dump } from '../../../utils/dump'; import type { HapiReadableStream } from '../../../../types'; import type { ResponseActionsApiCommandNames } from '../../../../../common/endpoint/service/response_actions/constants'; import { updateCases } from '../create/update_cases'; @@ -17,7 +18,7 @@ import type { UploadActionApiRequestBody, ResponseActionsRequestBody, } from '../../../../../common/api/endpoint'; -import { BaseResponseActionsClient } from '../../../lib/response_actions/base_actions_provider'; +import { ResponseActionsClientImpl } from './lib/base_response_actions_client'; import type { ActionDetails, HostMetadata, @@ -32,18 +33,16 @@ import type { ResponseActionUploadOutputContent, ResponseActionUploadParameters, SuspendProcessActionOutputContent, - HostMetadataInterface, - ImmutableObject, } from '../../../../../common/endpoint/types'; -export class EndpointActionsClient extends BaseResponseActionsClient { +export class EndpointActionsClient extends ResponseActionsClientImpl { private async checkAgentIds(ids: string[]): Promise<{ valid: string[]; invalid: string[]; allValid: boolean; hosts: HostMetadata[]; }> { - const foundEndpointHosts = await this.options.endpointContext.service + const foundEndpointHosts = await this.options.endpointService .getEndpointMetadataService() .getMetadataForEndpoints(this.options.esClient, [...new Set(ids)]); const validIds = foundEndpointHosts.map((endpoint: HostMetadata) => endpoint.elastic.agent.id); @@ -72,26 +71,24 @@ export class EndpointActionsClient extends BaseResponseActionsClient { user: { username: this.options.username }, }; - const response = await this.options.endpointContext.service + const response = await this.options.endpointService .getActionCreateService() .createAction(createPayload, agentIds.valid); - await this.updateCases(createPayload, agentIds.hosts); + try { + await updateCases({ + casesClient: this.options.casesClient, + endpointData: agentIds.hosts, + createActionPayload: createPayload, + }); + } catch (err) { + // failures during update of cases should not cause the response action to fail. Just log error + this.log.warn(`failed to update cases: ${err.message}\n${dump(err)}`); + } return response as TResponse; } - protected async updateCases( - createActionPayload: CreateActionPayload, - endpointData: Array> - ): Promise { - return updateCases({ - casesClient: this.options.casesClient, - createActionPayload, - endpointData, - }); - } - async isolate(options: IsolationRouteRequestBody): Promise { return this.handleResponseAction('isolate', options); } @@ -155,7 +152,7 @@ export class EndpointActionsClient extends BaseResponseActionsClient { async upload( options: UploadActionApiRequestBody ): Promise> { - const fleetFiles = await this.options.endpointContext.service.getFleetToHostFilesClient(); + const fleetFiles = await this.options.endpointService.getFleetToHostFilesClient(); const fileStream = options.file as HapiReadableStream; const { file: _, parameters: userParams, ...actionPayload } = options; const uploadParameters: ResponseActionUploadParameters = { diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/errors.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/errors.ts new file mode 100644 index 00000000000000..300f2fa56cade1 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/errors.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. + */ + +/* eslint-disable max-classes-per-file */ + +import type { ResponseActionsApiCommandNames } from '../../../../../common/endpoint/service/response_actions/constants'; +import { dump } from '../../../utils/dump'; +import { CustomHttpRequestError } from '../../../../utils/custom_http_request_error'; + +/** + * Errors associated with Response Actions clients + */ +export class ResponseActionsClientError extends CustomHttpRequestError { + toJSON() { + return { + message: this.message, + statusCode: this.statusCode, + meta: this.meta, + stack: this.stack, + }; + } + + toString() { + return JSON.stringify(dump(this.toJSON()), null, 2); + } +} + +export class ResponseActionsNotSupportedError extends ResponseActionsClientError { + constructor( + responseAction?: ResponseActionsApiCommandNames, + statusCode: number = 405, + meta?: unknown + ) { + super(`Action ${responseAction ? `[${responseAction}] ` : ''}not supported`, statusCode, meta); + } +} + +export class UnsupportedResponseActionsAgentTypeError extends ResponseActionsClientError { + constructor(message: string, statusCode = 501, meta?: unknown) { + super(message, statusCode, meta); + } +} diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/get_response_actions_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/get_response_actions_client.test.ts new file mode 100644 index 00000000000000..f0cee2a616462b --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/get_response_actions_client.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { GetResponseActionsClientConstructorOptions } from '../..'; +import { responseActionsClientMock } from './mocks'; +import { RESPONSE_ACTION_AGENT_TYPE } from '../../../../../common/endpoint/service/response_actions/constants'; +import { getResponseActionsClient } from '../..'; +import { ResponseActionsClientImpl } from './lib/base_response_actions_client'; +import { UnsupportedResponseActionsAgentTypeError } from './errors'; + +describe('getResponseActionsClient()', () => { + let options: GetResponseActionsClientConstructorOptions; + + beforeEach(() => { + options = { + ...responseActionsClientMock.createConstructorOptions(), + connectorActions: responseActionsClientMock.createConnectorActionsClient(), + }; + }); + + it.each(RESPONSE_ACTION_AGENT_TYPE)( + 'should return a response actions client for agentType: %s', + (agentType) => { + expect(getResponseActionsClient(agentType, options)).toBeInstanceOf( + ResponseActionsClientImpl + ); + } + ); + + it(`should throw error if agentType is not supported`, () => { + expect(() => getResponseActionsClient('foo', options)).toThrow( + UnsupportedResponseActionsAgentTypeError + ); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/get_response_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/get_response_actions_client.ts new file mode 100644 index 00000000000000..b60e9419208b97 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/get_response_actions_client.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SentinelOneActionsClientOptions } from './sentinelone/sentinel_one_actions_client'; +import type { ResponseActionsClient } from './lib/types'; +import type { ResponseActionsClientOptions } from './lib/base_response_actions_client'; +import { EndpointActionsClient } from './endpoint_actions_client'; +import { SentinelOneActionsClient } from './sentinelone/sentinel_one_actions_client'; +import { UnsupportedResponseActionsAgentTypeError } from './errors'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; + +export type GetResponseActionsClientConstructorOptions = ResponseActionsClientOptions & + SentinelOneActionsClientOptions; + +/** + * Retrieve a response actions client for an agent type + * @param agentType + * @param constructorOptions + * + * @throws UnsupportedResponseActionsAgentTypeError + */ +export const getResponseActionsClient = ( + agentType: string | ResponseActionAgentType, + constructorOptions: GetResponseActionsClientConstructorOptions +): ResponseActionsClient => { + switch (agentType) { + case 'endpoint': + return new EndpointActionsClient(constructorOptions); + case 'sentinel_one': + return new SentinelOneActionsClient(constructorOptions); + } + + throw new UnsupportedResponseActionsAgentTypeError( + `Agent type [${agentType}] does not support response actions` + ); +}; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts index 83a11352dfe950..dba0f0771de1f8 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts @@ -5,4 +5,8 @@ * 2.0. */ -export { EndpointActionsClient } from './endpoint_actions_client'; +export * from './endpoint_actions_client'; +export * from './sentinelone/sentinel_one_actions_client'; +export * from './get_response_actions_client'; + +export * from './lib/types'; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.test.ts new file mode 100644 index 00000000000000..7b6d991e28f0bc --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.test.ts @@ -0,0 +1,515 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { ResponseActionsClient } from './types'; +import type { + ResponseActionsClientUpdateCasesOptions, + ResponseActionsClientWriteActionRequestToEndpointIndexOptions, + ResponseActionsClientWriteActionResponseToEndpointIndexOptions, +} from './base_response_actions_client'; +import { ResponseActionsClientImpl } from './base_response_actions_client'; +import type { + ActionDetails, + LogsEndpointAction, + LogsEndpointActionResponse, +} from '../../../../../../common/endpoint/types'; +import type { EndpointAppContextService } from '../../../../endpoint_app_context_services'; +import type { ElasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; +import { ResponseActionsClientError, ResponseActionsNotSupportedError } from '../errors'; +import type { CasesClientMock } from '@kbn/cases-plugin/server/client/mocks'; +import type { CasesByAlertIDParams } from '@kbn/cases-plugin/server/client/cases/get'; +import type { Logger } from '@kbn/logging'; +import { getActionDetailsById as _getActionDetailsById } from '../../action_details_by_id'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { TransportResult } from '@elastic/elasticsearch'; +import { ENDPOINT_ACTIONS_INDEX } from '../../../../../../common/endpoint/constants'; +import type { DeepMutable } from '../../../../../../common/endpoint/types/utility_types'; +import { set } from 'lodash'; +import { responseActionsClientMock } from '../mocks'; + +jest.mock('../../action_details_by_id', () => { + const original = jest.requireActual('../../action_details_by_id'); + + return { + ...original, + getActionDetailsById: jest.fn(original.getActionDetailsById), + }; +}); + +const getActionDetailsByIdMock = _getActionDetailsById as jest.Mock; + +describe('ResponseActionsClientImpl base class', () => { + let esClient: ElasticsearchClientMock; + let endpointAppContextService: EndpointAppContextService; + let baseClassMock: MockClassWithExposedProtectedMembers; + let casesClient: CasesClientMock; + let logger: Logger; + + beforeEach(async () => { + const constructorOptions = responseActionsClientMock.createConstructorOptions(); + + esClient = constructorOptions.esClient; + casesClient = constructorOptions.casesClient; + endpointAppContextService = constructorOptions.endpointService; + logger = endpointAppContextService.createLogger(); + baseClassMock = new MockClassWithExposedProtectedMembers(constructorOptions); + }); + + afterEach(() => { + getActionDetailsByIdMock.mockClear(); + }); + + describe('Public methods', () => { + const methods: Array = [ + 'isolate', + 'release', + 'killProcess', + 'suspendProcess', + 'runningProcesses', + 'getFile', + 'execute', + 'upload', + ]; + + it.each(methods)('should throw Not Supported error for %s()', async (method) => { + // @ts-expect-error ignoring input type to method since they all should throw + const responsePromise = baseClassMock[method]({}); + + await expect(responsePromise).rejects.toBeInstanceOf(ResponseActionsNotSupportedError); + await expect(responsePromise).rejects.toHaveProperty('statusCode', 405); + }); + }); + + describe('#updateCases()', () => { + const KNOWN_ALERT_ID_1 = 'alert-1'; + const KNOWN_ALERT_ID_2 = 'alert-2'; + const KNOWN_ALERT_ID_3 = 'alert-3'; + + let updateCasesOptions: Required; + + beforeEach(async () => { + (casesClient.cases.getCasesByAlertID as jest.Mock).mockImplementation( + async ({ alertID }: CasesByAlertIDParams) => { + if (alertID === KNOWN_ALERT_ID_1) { + return [{ id: 'case-1' }, { id: 'case-2' }, { id: 'case-3' }]; + } + + if (alertID === KNOWN_ALERT_ID_2) { + return [{ id: 'case-3' }]; + } + + if (alertID === KNOWN_ALERT_ID_3) { + return []; + } + + throw new Error('test: alert id not found'); + } + ); + + updateCasesOptions = { + command: 'isolate', + caseIds: ['case-999'], + alertIds: [KNOWN_ALERT_ID_1, KNOWN_ALERT_ID_2, KNOWN_ALERT_ID_3], + comment: 'this is a case comment', + hosts: [ + { + hostId: '1-2-3', + hostname: 'foo-one', + }, + { + hostId: '4-5-6', + hostname: 'foo-two', + }, + ], + }; + }); + + it('should do nothing if no caseIds nor alertIds are provided', async () => { + updateCasesOptions.caseIds.length = 0; + updateCasesOptions.alertIds.length = 0; + await baseClassMock.updateCases(updateCasesOptions); + + expect(casesClient.cases.getCasesByAlertID).not.toHaveBeenCalled(); + expect(casesClient.attachments.bulkCreate).not.toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalledWith( + "Nothing to do. 'caseIds' and 'alertIds' are empty" + ); + }); + + it('should do nothing if no hosts were provided', async () => { + updateCasesOptions.hosts.length = 0; + await baseClassMock.updateCases(updateCasesOptions); + + expect(casesClient.cases.getCasesByAlertID).not.toHaveBeenCalled(); + expect(casesClient.attachments.bulkCreate).not.toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalledWith("Nothing to do. 'hosts' is empty"); + }); + + it('should do nothing if cases client was not provided', async () => { + const mockInstance = new MockClassWithExposedProtectedMembers({ + esClient, + endpointService: endpointAppContextService, + username: 'foo', + }); + await mockInstance.updateCases(updateCasesOptions); + + expect(casesClient.cases.getCasesByAlertID).not.toHaveBeenCalled(); + expect(casesClient.attachments.bulkCreate).not.toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalledWith( + 'No CasesClient available. Skipping updates to Cases!' + ); + }); + + it('should retrieve caseIds from alerts if alertIds was provided', async () => { + await baseClassMock.updateCases(updateCasesOptions); + + expect(casesClient.cases.getCasesByAlertID).toHaveBeenCalledTimes(3); + }); + + it('should not error is retrieving case id for alert fails', async () => { + updateCasesOptions.alertIds.push('invalid-alert-id'); + await baseClassMock.updateCases(updateCasesOptions); + + expect(casesClient.cases.getCasesByAlertID).toHaveBeenCalledTimes(4); + expect(logger.warn).toHaveBeenCalledWith( + expect.stringContaining('Attempt to get cases for alertID [invalid-alert-id]') + ); + }); + + it('should do nothing if alertIDs were not associated with any cases', async () => { + updateCasesOptions.caseIds.length = 0; + updateCasesOptions.alertIds = [KNOWN_ALERT_ID_3]; + await baseClassMock.updateCases(updateCasesOptions); + + expect(logger.debug).toHaveBeenCalledWith(`Nothing to do. Alert IDs are not tied to Cases`); + }); + + it('should update cases with an attachment for each host', async () => { + const updateResponse = await baseClassMock.updateCases(updateCasesOptions); + + expect(updateResponse).toBeUndefined(); + expect(casesClient.attachments.bulkCreate).toHaveBeenCalledTimes(4); + expect(casesClient.attachments.bulkCreate).toHaveBeenLastCalledWith({ + attachments: [ + { + actions: { + targets: [ + { + endpointId: '1-2-3', + hostname: 'foo-one', + }, + { + endpointId: '4-5-6', + hostname: 'foo-two', + }, + ], + type: 'isolate', + }, + comment: 'this is a case comment', + owner: 'securitySolution', + type: 'actions', + }, + { + actions: { + targets: [ + { + endpointId: '1-2-3', + hostname: 'foo-one', + }, + { + endpointId: '4-5-6', + hostname: 'foo-two', + }, + ], + type: 'isolate', + }, + comment: 'this is a case comment', + owner: 'securitySolution', + type: 'actions', + }, + { + actions: { + targets: [ + { + endpointId: '1-2-3', + hostname: 'foo-one', + }, + { + endpointId: '4-5-6', + hostname: 'foo-two', + }, + ], + type: 'isolate', + }, + comment: 'this is a case comment', + owner: 'securitySolution', + type: 'actions', + }, + { + actions: { + targets: [ + { + endpointId: '1-2-3', + hostname: 'foo-one', + }, + { + endpointId: '4-5-6', + hostname: 'foo-two', + }, + ], + type: 'isolate', + }, + comment: 'this is a case comment', + owner: 'securitySolution', + type: 'actions', + }, + ], + caseId: 'case-3', + }); + }); + + it('should not error if update to a case fails', async () => { + (casesClient.attachments.bulkCreate as jest.Mock).mockImplementation(async (options) => { + if (options.caseId === 'case-2') { + throw new Error('update filed to case-2'); + } + }); + await baseClassMock.updateCases(updateCasesOptions); + + expect(logger.warn).toHaveBeenCalledWith( + expect.stringContaining('Attempt to update case ID [case-2] failed:') + ); + }); + }); + + describe('#fetchActionDetails()', () => { + it('should retrieve action details', async () => { + await baseClassMock.fetchActionDetails('one').catch(() => { + // just ignoring error + }); + + expect(getActionDetailsByIdMock).toHaveBeenCalledWith( + expect.anything(), + expect.anything(), + 'one' + ); + }); + }); + + describe('#writeActionRequestToEndpointIndex()', () => { + let esIndexDocResponse: TransportResult; + let indexDocOptions: DeepMutable; + let expectedIndexDoc: LogsEndpointAction; + + beforeEach(() => { + esIndexDocResponse = { + body: { + result: 'created', + _id: '123', + _index: ENDPOINT_ACTIONS_INDEX, + _version: 1, + }, + statusCode: 201, + headers: {}, + meta: {}, + warnings: null, + } as TransportResult; + + indexDocOptions = { + command: 'isolate', + agent_type: 'endpoint', + endpoint_ids: ['one'], + comment: 'test comment', + rule_name: undefined, + rule_id: undefined, + alert_ids: undefined, + case_ids: undefined, + hosts: undefined, + parameters: undefined, + file: undefined, + }; + + expectedIndexDoc = { + '@timestamp': expect.any(String), + EndpointActions: { + action_id: expect.any(String), + data: { + command: 'isolate', + comment: 'test comment', + }, + expiration: expect.any(String), + input_type: 'endpoint', + type: 'INPUT_ACTION', + }, + agent: { + id: ['one'], + }, + user: { + id: 'foo', + }, + }; + + // @ts-expect-error TS2345: Argument of type... Due to the fact that the method definition is overloaded + esClient.index.mockResolvedValue(esIndexDocResponse); + }); + + it('should return indexed record on success', async () => { + await expect( + baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions) + ).resolves.toEqual(expectedIndexDoc); + }); + + it('should set `EndpointActions.input_type` to the correct value', async () => { + indexDocOptions.agent_type = 'sentinel_one'; + set(expectedIndexDoc, 'EndpointActions.input_type', 'sentinel_one'); + + await expect( + baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions) + ).resolves.toEqual(expectedIndexDoc); + }); + + it('should include alert_ids if any were provided', async () => { + indexDocOptions.alert_ids = ['one', 'two']; + set(expectedIndexDoc, 'EndpointActions.data.alert_id', indexDocOptions.alert_ids); + + await expect( + baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions) + ).resolves.toEqual(expectedIndexDoc); + }); + + it('should include hosts if any where provided', async () => { + indexDocOptions.hosts = { hostA: { name: 'host a' } }; + set(expectedIndexDoc, 'EndpointActions.data.hosts', indexDocOptions.hosts); + + await expect( + baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions) + ).resolves.toEqual(expectedIndexDoc); + }); + + it('should include Rule information if rule_id and rule_name were provided', async () => { + indexDocOptions.rule_id = '1-2-3'; + indexDocOptions.rule_name = 'rule 123'; + expectedIndexDoc.rule = { + name: indexDocOptions.rule_name, + id: indexDocOptions.rule_id, + }; + + await expect( + baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions) + ).resolves.toEqual(expectedIndexDoc); + }); + + it('should NOT include Rule information if rule_id or rule_name are missing', async () => { + indexDocOptions.rule_id = '1-2-3'; + + await expect( + baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions) + ).resolves.toEqual(expectedIndexDoc); + }); + + it('should error if index of document did not return a 201', async () => { + esIndexDocResponse.statusCode = 200; + const responsePromise = baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions); + + await expect(responsePromise).rejects.toBeInstanceOf(ResponseActionsClientError); + await expect(responsePromise).rejects.toHaveProperty('statusCode', 500); + }); + + it('should throw ResponseActionsClientError if operation fails', async () => { + esClient.index.mockImplementation(async () => { + throw new Error('test error'); + }); + const responsePromise = baseClassMock.writeActionRequestToEndpointIndex(indexDocOptions); + + await expect(responsePromise).rejects.toBeInstanceOf(ResponseActionsClientError); + await expect(responsePromise).rejects.toHaveProperty('statusCode', 500); + await expect(responsePromise).rejects.toHaveProperty( + 'message', + expect.stringContaining('Failed to create action request document:') + ); + }); + }); + + describe('#writeActionResponseToEndpointIndex()', () => { + let actionResponseOptions: ResponseActionsClientWriteActionResponseToEndpointIndexOptions; + + beforeEach(() => { + actionResponseOptions = { + actionId: '1-2-3', + agentId: '123', + error: { message: 'test error' }, + data: { + command: 'isolate', + comment: 'some comment', + output: undefined, + }, + }; + }); + + it('should return indexed record on success', async () => { + await expect( + baseClassMock.writeActionResponseToEndpointIndex(actionResponseOptions) + ).resolves.toEqual({ + '@timestamp': expect.any(String), + EndpointActions: { + action_id: '1-2-3', + completed_at: expect.any(String), + data: { + command: 'isolate', + comment: 'some comment', + }, + started_at: expect.any(String), + }, + agent: { + id: '123', + }, + error: { + message: 'test error', + }, + }); + }); + + it('should throw ResponseActionsClientError if operation fails', async () => { + esClient.index.mockImplementation(async () => { + throw new Error('oh oh'); + }); + const responsePromise = + baseClassMock.writeActionResponseToEndpointIndex(actionResponseOptions); + + await expect(responsePromise).rejects.toBeInstanceOf(ResponseActionsClientError); + await expect(responsePromise).rejects.toHaveProperty( + 'message', + expect.stringContaining('Failed to create action response document: ') + ); + await expect(responsePromise).rejects.toHaveProperty('statusCode', 500); + }); + }); +}); + +class MockClassWithExposedProtectedMembers extends ResponseActionsClientImpl { + public async updateCases(options: ResponseActionsClientUpdateCasesOptions): Promise { + return super.updateCases(options); + } + + public async fetchActionDetails( + actionId: string + ): Promise { + return super.fetchActionDetails(actionId); + } + + public async writeActionRequestToEndpointIndex( + actionRequest: ResponseActionsClientWriteActionRequestToEndpointIndexOptions + ): Promise { + return super.writeActionRequestToEndpointIndex(actionRequest); + } + + public async writeActionResponseToEndpointIndex( + options: ResponseActionsClientWriteActionResponseToEndpointIndexOptions + ): Promise> { + return super.writeActionResponseToEndpointIndex(options); + } +} diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts new file mode 100644 index 00000000000000..cea80bd3f9bcda --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts @@ -0,0 +1,366 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { CasesClient } from '@kbn/cases-plugin/server'; +import type { Logger } from '@kbn/logging'; +import { v4 as uuidv4 } from 'uuid'; +import { AttachmentType } from '@kbn/cases-plugin/common'; +import type { BulkCreateArgs } from '@kbn/cases-plugin/server/client/attachments/types'; +import type { EndpointAppContextService } from '../../../../endpoint_app_context_services'; +import { APP_ID } from '../../../../../../common'; +import type { ResponseActionsApiCommandNames } from '../../../../../../common/endpoint/service/response_actions/constants'; +import { getActionDetailsById } from '../../action_details_by_id'; +import { ResponseActionsClientError, ResponseActionsNotSupportedError } from '../errors'; +import { + addRuleInfoToAction, + getActionParameters, + getActionRequestExpiration, +} from '../../create/write_action_to_indices'; +import { + ENDPOINT_ACTION_RESPONSES_INDEX, + ENDPOINT_ACTIONS_INDEX, +} from '../../../../../../common/endpoint/constants'; +import type { ResponseActionsClient } from './types'; +import type { + ActionDetails, + GetProcessesActionOutputContent, + KillOrSuspendProcessRequestBody, + KillProcessActionOutputContent, + ResponseActionExecuteOutputContent, + ResponseActionGetFileOutputContent, + ResponseActionGetFileParameters, + ResponseActionParametersWithPidOrEntityId, + ResponseActionsExecuteParameters, + ResponseActionUploadOutputContent, + ResponseActionUploadParameters, + SuspendProcessActionOutputContent, + LogsEndpointAction, + EndpointActionDataParameterTypes, + LogsEndpointActionResponse, +} from '../../../../../../common/endpoint/types'; +import type { + IsolationRouteRequestBody, + ExecuteActionRequestBody, + GetProcessesRequestBody, + ResponseActionGetFileRequestBody, + UploadActionApiRequestBody, + ResponseActionsRequestBody, +} from '../../../../../../common/api/endpoint'; +import type { CreateActionPayload } from '../../create/types'; +import { dump } from '../../../../utils/dump'; + +export interface ResponseActionsClientOptions { + endpointService: EndpointAppContextService; + esClient: ElasticsearchClient; + casesClient?: CasesClient; + /** Username that will be stored along with the action's ES documents */ + username: string; +} + +export interface ResponseActionsClientUpdateCasesOptions { + /** The Response Action that was taken */ + command: ResponseActionsApiCommandNames; + /** the list of hosts that received the response action `command` */ + hosts: Array<{ + hostname: string; + hostId: string; + }>; + caseIds?: string[]; + /** If defined, any case that the alert is included in will also receive an update */ + alertIds?: string[]; + /** Comment to include in the Case attachment */ + comment?: string; +} + +export type ResponseActionsClientWriteActionRequestToEndpointIndexOptions = + ResponseActionsRequestBody & + Pick; + +export type ResponseActionsClientWriteActionResponseToEndpointIndexOptions< + TOutputContent extends object = object +> = { + agentId: LogsEndpointActionResponse['agent']['id']; + actionId: string; +} & Pick & + Pick['EndpointActions'], 'data'>; + +/** + * Base class for a Response Actions client + */ +export class ResponseActionsClientImpl implements ResponseActionsClient { + protected readonly log: Logger; + + constructor(protected readonly options: ResponseActionsClientOptions) { + this.log = options.endpointService.createLogger( + this.constructor.name ?? 'ResponseActionsClient' + ); + } + + /** + * Update cases with information about the hosts that received a response action. + * + * **NOTE:** Failures during update will not cause this operation to fail - it will only log the errors + * @protected + */ + protected async updateCases({ + command, + hosts, + caseIds = [], + alertIds = [], + comment = '', + }: ResponseActionsClientUpdateCasesOptions): Promise { + if (caseIds.length === 0 && alertIds.length === 0) { + this.log.debug(`Nothing to do. 'caseIds' and 'alertIds' are empty`); + return; + } + + if (hosts.length === 0) { + this.log.debug(`Nothing to do. 'hosts' is empty`); + return; + } + + const casesClient = this.options.casesClient; + + if (!casesClient) { + this.log.debug(`No CasesClient available. Skipping updates to Cases!`); + return; + } + + const casesFromAlertIds = await Promise.all( + alertIds.map((alertID) => { + return casesClient.cases + .getCasesByAlertID({ alertID, options: { owner: APP_ID } }) + .then((casesFound) => { + return casesFound.map((caseInfo) => caseInfo.id); + }) + .catch((err) => { + this.log.warn( + `Attempt to get cases for alertID [${alertID}][owner: ${APP_ID}] failed with: ${err.message}` + ); + + // We don't fail everything here. Just log it and keep going + return [] as string[]; + }); + }) + ).then((results) => { + return results.flat(); + }); + + const allCases = [...new Set([...caseIds, ...casesFromAlertIds])]; + + if (allCases.length === 0) { + this.log.debug(`Nothing to do. Alert IDs are not tied to Cases`); + return; + } + + this.log.debug(`Updating cases:\n${dump(allCases)}`); + + // Create an attachment for each case that includes info. about the response actions taken against the hosts + const attachments = allCases.map(() => ({ + type: AttachmentType.actions, + comment, + actions: { + targets: hosts.map(({ hostId: endpointId, hostname }) => ({ endpointId, hostname })), + type: command, + }, + owner: APP_ID, + })) as BulkCreateArgs['attachments']; + + const casesUpdateResponse = await Promise.all( + allCases.map((caseId) => + casesClient.attachments + .bulkCreate({ + caseId, + attachments, + }) + .catch((err) => { + // Log any error, BUT: do not fail execution + this.log.warn( + `Attempt to update case ID [${caseId}] failed: ${err.message}\n${dump(err)}` + ); + return null; + }) + ) + ); + + this.log.debug(`Update to cases done:\n${dump(casesUpdateResponse)}`); + } + + /** + * Returns the action details for a given response action id + * @param actionId + * @protected + */ + protected async fetchActionDetails( + actionId: string + ): Promise { + return getActionDetailsById( + this.options.esClient, + this.options.endpointService.getEndpointMetadataService(), + actionId + ); + } + + /** + * Creates a Response Action request document in the Endpoint index (`.logs-endpoint.actions-default`) + * @protected + */ + protected async writeActionRequestToEndpointIndex( + actionRequest: ResponseActionsClientWriteActionRequestToEndpointIndexOptions + ): Promise { + const doc: LogsEndpointAction = { + '@timestamp': new Date().toISOString(), + agent: { + id: actionRequest.endpoint_ids, + }, + EndpointActions: { + action_id: uuidv4(), + expiration: getActionRequestExpiration(), + type: 'INPUT_ACTION', + input_type: actionRequest.agent_type ?? 'endpoint', + data: { + command: actionRequest.command, + comment: actionRequest.comment ?? undefined, + ...(actionRequest.alert_ids ? { alert_id: actionRequest.alert_ids } : {}), + ...(actionRequest.hosts ? { hosts: actionRequest.hosts } : {}), + parameters: getActionParameters(actionRequest) as EndpointActionDataParameterTypes, + }, + }, + user: { + id: this.options.username, + }, + ...addRuleInfoToAction(actionRequest), + }; + + try { + const logsEndpointActionsResult = await this.options.esClient.index( + { + index: ENDPOINT_ACTIONS_INDEX, + document: doc, + refresh: 'wait_for', + }, + { meta: true } + ); + + if (logsEndpointActionsResult.statusCode !== 201) { + throw new ResponseActionsClientError( + `Failed to create (index) action request document. StatusCode: [${logsEndpointActionsResult.statusCode}] Result: ${logsEndpointActionsResult.body.result}`, + 500, + logsEndpointActionsResult + ); + } + + return doc; + } catch (err) { + if (!(err instanceof ResponseActionsClientError)) { + throw new ResponseActionsClientError( + `Failed to create action request document: ${err.message}`, + 500, + err + ); + } + + throw err; + } + } + + /** + * Writes a Response Action response document to the Endpoint index + * @param options + * @protected + */ + protected async writeActionResponseToEndpointIndex({ + actionId, + error, + agentId, + data, + }: ResponseActionsClientWriteActionResponseToEndpointIndexOptions): Promise< + LogsEndpointActionResponse + > { + const timestamp = new Date().toISOString(); + const doc: LogsEndpointActionResponse = { + '@timestamp': timestamp, + agent: { + id: agentId, + }, + EndpointActions: { + action_id: actionId, + started_at: timestamp, + completed_at: timestamp, + data, + }, + error, + }; + + this.log.debug(`Writing response action response:\n${dump(doc)}`); + + await this.options.esClient + .index({ + index: ENDPOINT_ACTION_RESPONSES_INDEX, + document: doc, + refresh: 'wait_for', + }) + .catch((err) => { + throw new ResponseActionsClientError( + `Failed to create action response document: ${err.message}`, + err.statusCode ?? 500, + err + ); + }); + + return doc; + } + + public async isolate(options: IsolationRouteRequestBody): Promise { + throw new ResponseActionsNotSupportedError('isolate'); + } + + public async release(options: IsolationRouteRequestBody): Promise { + throw new ResponseActionsNotSupportedError('unisolate'); + } + + public async killProcess( + options: KillOrSuspendProcessRequestBody + ): Promise< + ActionDetails + > { + throw new ResponseActionsNotSupportedError('kill-process'); + } + + public async suspendProcess( + options: KillOrSuspendProcessRequestBody + ): Promise< + ActionDetails + > { + throw new ResponseActionsNotSupportedError('suspend-process'); + } + + public async runningProcesses( + options: GetProcessesRequestBody + ): Promise> { + throw new ResponseActionsNotSupportedError('running-processes'); + } + + public async getFile( + options: ResponseActionGetFileRequestBody + ): Promise> { + throw new ResponseActionsNotSupportedError('get-file'); + } + + public async execute( + options: ExecuteActionRequestBody + ): Promise> { + throw new ResponseActionsNotSupportedError('execute'); + } + + public async upload( + options: UploadActionApiRequestBody + ): Promise> { + throw new ResponseActionsNotSupportedError('upload'); + } +} diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/response_actions/types.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/types.ts similarity index 93% rename from x-pack/plugins/security_solution/server/endpoint/lib/response_actions/types.ts rename to x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/types.ts index 5578128cf4248c..c6407dceae9ddb 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/response_actions/types.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/types.ts @@ -18,19 +18,19 @@ import type { ResponseActionsExecuteParameters, ResponseActionUploadOutputContent, ResponseActionUploadParameters, -} from '../../../../common/endpoint/types'; +} from '../../../../../../common/endpoint/types'; import type { IsolationRouteRequestBody, GetProcessesRequestBody, ResponseActionGetFileRequestBody, ExecuteActionRequestBody, UploadActionApiRequestBody, -} from '../../../../common/api/endpoint'; +} from '../../../../../../common/api/endpoint'; /** * The interface required for a Response Actions provider */ -export interface ResponseActionsProvider { +export interface ResponseActionsClient { isolate: (options: IsolationRouteRequestBody) => Promise; release: (options: IsolationRouteRequestBody) => Promise; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts new file mode 100644 index 00000000000000..27773a898b9329 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts @@ -0,0 +1,209 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { ActionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; +import { actionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; +import type { ConnectorWithExtraFindData } from '@kbn/actions-plugin/server/application/connector/types'; +import { SENTINELONE_CONNECTOR_ID } from '@kbn/stack-connectors-plugin/common/sentinelone/constants'; +import type { DeepPartial } from 'utility-types'; +import type { ActionTypeExecutorResult } from '@kbn/actions-plugin/common'; +import type { ElasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; +import type { CasesClientMock } from '@kbn/cases-plugin/server/client/mocks'; +import { createCasesClientMock } from '@kbn/cases-plugin/server/client/mocks'; +import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; +import { merge } from 'lodash'; +import type * as esTypes from '@elastic/elasticsearch/lib/api/types'; +import type { TransportResult } from '@elastic/elasticsearch'; +import type { AttachmentsSubClient } from '@kbn/cases-plugin/server/client/attachments/client'; +import { BaseDataGenerator } from '../../../../../common/endpoint/data_generators/base_data_generator'; +import { + createActionRequestsEsSearchResultsMock, + createActionResponsesEsSearchResultsMock, +} from '../mocks'; +import { + ENDPOINT_ACTION_RESPONSES_INDEX, + ENDPOINT_ACTIONS_INDEX, +} from '../../../../../common/endpoint/constants'; +import type { DeepMutable } from '../../../../../common/endpoint/types/utility_types'; +import { EndpointAppContextService } from '../../../endpoint_app_context_services'; +import { + createMockEndpointAppContextServiceSetupContract, + createMockEndpointAppContextServiceStartContract, +} from '../../../mocks'; +import type { IsolationRouteRequestBody } from '../../../../../common/api/endpoint'; +import type { ResponseActionsClientOptions } from './lib/base_response_actions_client'; +import { ACTION_RESPONSE_INDICES } from '../constants'; + +export interface ResponseActionsClientOptionsMock extends ResponseActionsClientOptions { + esClient: ElasticsearchClientMock; + casesClient?: CasesClientMock; +} + +const createConstructorOptionsMock = (): Required => { + const esClient = elasticsearchServiceMock.createScopedClusterClient().asInternalUser; + const casesClient = createCasesClientMock(); + const endpointService = new EndpointAppContextService(); + + esClient.index.mockImplementation((async (payload) => { + switch (payload.index) { + case ENDPOINT_ACTIONS_INDEX: + case ENDPOINT_ACTION_RESPONSES_INDEX: + return createEsIndexTransportResponseMock({ body: { _index: payload.index } }); + default: + throw new Error(`no esClient.index() mock defined for index ${payload.index}`); + } + }) as typeof esClient.index); + + esClient.search.mockImplementation(async (payload) => { + if (payload) { + switch (payload.index) { + case ENDPOINT_ACTIONS_INDEX: + return createActionRequestsEsSearchResultsMock(); + case ACTION_RESPONSE_INDICES: + return createActionResponsesEsSearchResultsMock(); + } + } + + return BaseDataGenerator.toEsSearchResponse([]); + }); + + (casesClient.attachments.bulkCreate as jest.Mock).mockImplementation( + (async () => {}) as unknown as jest.Mocked['bulkCreate'] + ); + + endpointService.setup(createMockEndpointAppContextServiceSetupContract()); + endpointService.start(createMockEndpointAppContextServiceStartContract()); + + return { + esClient, + casesClient, + endpointService, + username: 'foo', + }; +}; + +const createEsIndexTransportResponseMock = ( + overrides: DeepPartial> = {} +): TransportResult => { + const responseDoc: TransportResult = { + body: { + _id: 'indexed-1-2-3', + _index: 'some-index', + _primary_term: 1, + result: 'created', + _seq_no: 1, + _shards: { + failed: 0, + successful: 1, + total: 1, + }, + _version: 1, + }, + statusCode: 201, + headers: {}, + warnings: null, + meta: { + context: {}, + name: 'foo', + request: { + params: { + method: 'GET', + path: 'some/path', + }, + options: {}, + id: 'some-id', + }, + connection: null, + attempts: 1, + aborted: false, + }, + }; + + return merge(responseDoc, overrides); +}; + +const createIsolateOptionsMock = ( + overrides: Partial = {} +): DeepMutable => { + const isolateOptions: IsolationRouteRequestBody = { + agent_type: 'endpoint', + endpoint_ids: ['1-2-3'], + comment: 'test comment', + }; + + return merge(isolateOptions, overrides); +}; + +const createConnectorActionsClientMock = (): ActionsClientMock => { + const client = actionsClientMock.create(); + + // Mock result of retrieving list of connectors + (client.getAll as jest.Mock).mockImplementation(async () => { + const result: ConnectorWithExtraFindData[] = [ + // SentinelOne connector + createConnectorMock({ + actionTypeId: SENTINELONE_CONNECTOR_ID, + id: 's1-connector-instance-id', + }), + ]; + + return result; + }); + + (client.execute as jest.Mock).mockImplementation(async () => { + return createConnectorAcitonExecuteResponseMock(); + }); + + return client; +}; + +const createConnectorMock = ( + overrides: DeepPartial = {} +): ConnectorWithExtraFindData => { + return merge( + { + id: 'connector-mock-id-1', + actionTypeId: '.some-type', + name: 'some mock name', + isMissingSecrets: false, + config: {}, + isPreconfigured: false, + isDeprecated: false, + isSystemAction: false, + referencedByCount: 0, + }, + overrides + ); +}; + +const createConnectorAcitonExecuteResponseMock = ( + overrides: DeepPartial> = {} +): ActionTypeExecutorResult<{}> => { + const result: ActionTypeExecutorResult<{}> = { + actionId: 'execute-response-mock-1', + data: undefined, + message: 'some mock message', + serviceMessage: 'some mock service message', + retry: true, + status: 'ok', + }; + + return merge(result, overrides); +}; + +export const responseActionsClientMock = Object.freeze({ + createConstructorOptions: createConstructorOptionsMock, + createIsolateOptions: createIsolateOptionsMock, + createReleaseOptions: createIsolateOptionsMock, + // TODO:PT add more methods to get option mocks for other class methods + + createIndexedResponse: createEsIndexTransportResponseMock, + + createConnectorActionsClient: createConnectorActionsClientMock, + createConnector: createConnectorMock, + createConnectorActionExecuteResponse: createConnectorAcitonExecuteResponseMock, +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts new file mode 100644 index 00000000000000..a56b54ce2e65fa --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts @@ -0,0 +1,167 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { ResponseActionsClient } from '../lib/types'; +import { responseActionsClientMock } from '../mocks'; +import type { SentinelOneActionsClientOptions } from '../../..'; +import { SentinelOneActionsClient } from '../../..'; +import { getActionDetailsById as _getActionDetailsById } from '../../action_details_by_id'; +import { ResponseActionsClientError, ResponseActionsNotSupportedError } from '../errors'; +import type { ActionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; + +jest.mock('../../action_details_by_id', () => { + const originalMod = jest.requireActual('../../action_details_by_id'); + + return { + ...originalMod, + getActionDetailsById: jest.fn(originalMod.getActionDetailsById), + }; +}); + +const getActionDetailsByIdMock = _getActionDetailsById as jest.Mock; + +describe('SentinelOneActionsClient class', () => { + let classConstructorOptions: SentinelOneActionsClientOptions; + let s1ActionsClient: ResponseActionsClient; + let connectorActionsMock: ActionsClientMock; + + const createS1IsolateOptions = () => + responseActionsClientMock.createIsolateOptions({ agent_type: 'sentinel_one' }); + + beforeEach(() => { + connectorActionsMock = responseActionsClientMock.createConnectorActionsClient(); + + connectorActionsMock.getAll(); + + classConstructorOptions = { + ...responseActionsClientMock.createConstructorOptions(), + connectorActions: connectorActionsMock, + }; + s1ActionsClient = new SentinelOneActionsClient(classConstructorOptions); + }); + + it.each([ + 'release', + 'killProcess', + 'suspendProcess', + 'runningProcesses', + 'getFile', + 'execute', + 'upload', + ] as Array)( + 'should throw an un-supported error for %s', + async (methodName) => { + // @ts-expect-error Purposely passing in empty object for options + await expect(s1ActionsClient[methodName]({})).rejects.toBeInstanceOf( + ResponseActionsNotSupportedError + ); + } + ); + + it('should error if unable to retrieve list of connectors', async () => { + connectorActionsMock.getAll.mockImplementation(async () => { + throw new Error('oh oh'); + }); + const responsePromise = s1ActionsClient.isolate(createS1IsolateOptions()); + + await expect(responsePromise).rejects.toBeInstanceOf(ResponseActionsClientError); + await expect(responsePromise).rejects.toHaveProperty( + 'message', + expect.stringContaining('Unable to retrieve list of stack connectors:') + ); + await expect(responsePromise).rejects.toHaveProperty('statusCode', 400); + }); + + it('should error if retrieving connectors fails', async () => { + (connectorActionsMock.getAll as jest.Mock).mockImplementation(async () => { + throw new Error('oh oh'); + }); + + await expect(s1ActionsClient.isolate(createS1IsolateOptions())).rejects.toMatchObject({ + message: `Unable to retrieve list of stack connectors: oh oh`, + statusCode: 400, + }); + }); + + it.each([ + ['no connector defined', async () => []], + [ + 'deprecated connector', + async () => [responseActionsClientMock.createConnector({ isDeprecated: true })], + ], + [ + 'missing secrets', + async () => [responseActionsClientMock.createConnector({ isMissingSecrets: true })], + ], + ])('should error if: %s', async (_, getAllImplementation) => { + (connectorActionsMock.getAll as jest.Mock).mockImplementation(getAllImplementation); + + await expect(s1ActionsClient.isolate(createS1IsolateOptions())).rejects.toMatchObject({ + message: `No SentinelOne stack connector found`, + statusCode: 400, + }); + }); + + it('should error if multiple agent ids are received', async () => { + const payload = createS1IsolateOptions(); + payload.endpoint_ids.push('second-host-id'); + + await expect(s1ActionsClient.isolate(payload)).rejects.toMatchObject({ + message: `[body.endpoint_ids]: Multiple agents IDs not currently supported for SentinelOne`, + statusCode: 400, + }); + }); + + describe(`#isolate()`, () => { + it('should send action to sentinelone', async () => { + await s1ActionsClient.isolate(createS1IsolateOptions()); + + expect(connectorActionsMock.execute as jest.Mock).toHaveBeenCalledWith({ + actionId: 's1-connector-instance-id', + params: { + subAction: 'isolateHost', + subActionParams: { + uuid: '1-2-3', + }, + }, + }); + }); + + it('should write action request and response to endpoint indexes', async () => { + await s1ActionsClient.isolate(createS1IsolateOptions()); + + expect(classConstructorOptions.esClient.index).toHaveBeenCalledTimes(1); + // FIXME:PT once we start writing the Response, check above should be removed and new assertion added for it + expect(classConstructorOptions.esClient.index).toHaveBeenNthCalledWith( + 1, + { + document: { + '@timestamp': expect.any(String), + EndpointActions: { + action_id: expect.any(String), + data: { command: 'isolate', comment: 'test comment', parameters: undefined }, + expiration: expect.any(String), + input_type: 'sentinel_one', + type: 'INPUT_ACTION', + }, + agent: { id: ['1-2-3'] }, + user: { id: 'foo' }, + }, + index: '.logs-endpoint.actions-default', + refresh: 'wait_for', + }, + { meta: true } + ); + }); + + it('should return action details', async () => { + await s1ActionsClient.isolate(createS1IsolateOptions()); + + expect(getActionDetailsByIdMock).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts new file mode 100644 index 00000000000000..4837f427a926b6 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { ActionsClient } from '@kbn/actions-plugin/server'; +import { + SENTINELONE_CONNECTOR_ID, + SUB_ACTION, +} from '@kbn/stack-connectors-plugin/common/sentinelone/constants'; +import type { ConnectorWithExtraFindData } from '@kbn/actions-plugin/server/application/connector/types'; +import { once } from 'lodash'; +import type { ActionTypeExecutorResult } from '@kbn/actions-plugin/common'; +import { dump } from '../../../../utils/dump'; +import { ResponseActionsClientError } from '../errors'; +import type { ActionDetails } from '../../../../../../common/endpoint/types'; +import type { + IsolationRouteRequestBody, + BaseActionRequestBody, +} from '../../../../../../common/api/endpoint'; +import type { ResponseActionsClientOptions } from '../lib/base_response_actions_client'; +import { ResponseActionsClientImpl } from '../lib/base_response_actions_client'; + +export type SentinelOneActionsClientOptions = ResponseActionsClientOptions & { + connectorActions: ActionsClient; +}; + +export class SentinelOneActionsClient extends ResponseActionsClientImpl { + private readonly connectorActionsClient: ActionsClient; + private readonly getConnector: () => Promise; + + constructor({ connectorActions, ...options }: SentinelOneActionsClientOptions) { + super(options); + this.connectorActionsClient = connectorActions; + + this.getConnector = once(async () => { + let connectorList: ConnectorWithExtraFindData[] = []; + + try { + connectorList = await this.connectorActionsClient.getAll(); + } catch (err) { + throw new ResponseActionsClientError( + `Unable to retrieve list of stack connectors: ${err.message}`, + // failure here is likely due to Authz, but because we don't have a good way to determine that, + // the `statusCode` below is set to `400` instead of `401`. + 400, + err + ); + } + const connector = connectorList.find(({ actionTypeId, isDeprecated, isMissingSecrets }) => { + return actionTypeId === SENTINELONE_CONNECTOR_ID && !isDeprecated && !isMissingSecrets; + }); + + if (!connector) { + throw new ResponseActionsClientError( + `No SentinelOne stack connector found`, + 400, + connectorList + ); + } + + this.log.debug(`Using SentinelOne stack connector: ${connector.name} (${connector.id})`); + + return connector; + }); + } + + /** + * Sends actions to SentinelOne directly + * @private + */ + private async sendAction( + actionType: SUB_ACTION, + actionParams: object + // FIXME:PT type properly the options above once PR 168441 for 8.12 merges + ): Promise> { + const { id: connectorId } = await this.getConnector(); + const executeOptions: Parameters[0] = { + actionId: connectorId, + params: { + subAction: actionType, + subActionParams: actionParams, + }, + }; + + this.log.debug( + `calling connector actions 'execute()' for SentinelOne with:\n${dump(executeOptions)}` + ); + + const actionSendResponse = await this.connectorActionsClient.execute(executeOptions); + + if (actionSendResponse.status === 'error') { + this.log.error(dump(actionSendResponse)); + + throw new ResponseActionsClientError( + `Attempt to send [${actionType}] to SentinelOne failed: ${ + actionSendResponse.serviceMessage || actionSendResponse.message + }`, + 500, + actionSendResponse + ); + } + + this.log.debug(`Response:\n${dump(actionSendResponse)}`); + + return actionSendResponse; + } + + private async validateRequest(payload: BaseActionRequestBody): Promise { + if (payload.endpoint_ids.length > 1) { + throw new ResponseActionsClientError( + `[body.endpoint_ids]: Multiple agents IDs not currently supported for SentinelOne`, + 400 + ); + } + } + + async isolate(options: IsolationRouteRequestBody): Promise { + // TODO:PT support multiple agents + await this.validateRequest(options); + + const agentUUID = options.endpoint_ids[0]; + + await this.sendAction(SUB_ACTION.ISOLATE_HOST, { + uuid: agentUUID, + }); + + // FIXME:PT need to grab data from the response above and store it with the Request or Response documents on our side + + const actionRequestDoc = await this.writeActionRequestToEndpointIndex({ + ...options, + command: 'isolate', + }); + + // TODO: un-comment code below once we have proper authz given to `kibana_system` account (security issue #8190) + // await this.writeActionResponseToEndpointIndex({ + // actionId: actionRequestDoc.EndpointActions.action_id, + // agentId: actionRequestDoc.agent.id, + // data: { + // command: actionRequestDoc.EndpointActions.data.command, + // }, + // }); + + return this.fetchActionDetails(actionRequestDoc.EndpointActions.action_id); + } +} diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/create/write_action_to_indices.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/create/write_action_to_indices.ts index 6df43004acb1a7..b502ec082c69b7 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/create/write_action_to_indices.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/create/write_action_to_indices.ts @@ -179,20 +179,18 @@ const createFailedActionResponseEntry = async ({ } }; -const addRuleInfoToAction = ( - payload: CreateActionPayload -): - | { - rule: { id: string; name: string }; - } - | undefined => { +export const addRuleInfoToAction = ( + payload: Pick +): Pick => { if (payload.rule_id && payload.rule_name) { return { rule: { id: payload.rule_id, name: payload.rule_name } }; } + + return {}; }; -const getActionParameters = ( - action: CreateActionPayload +export const getActionParameters = ( + action: Pick ): ResponseActionsExecuteParameters | Readonly<{}> | undefined => { // set timeout to 4h (if not specified or when timeout is specified as 0) when command is `execute` if (action.command === 'execute') { @@ -206,3 +204,7 @@ const getActionParameters = ( // for all other commands return the parameters as is return action.parameters ?? undefined; }; + +export const getActionRequestExpiration = (): string => { + return moment().add(2, 'weeks').toISOString(); +}; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/index.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/index.ts index 67a8167ad5fa1e..49f8a89944d372 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/index.ts @@ -11,3 +11,4 @@ export { getActionList, getActionListByStatus } from './action_list'; export { getPendingActionsSummary } from './pending_actions_summary'; export { validateActionId } from './validate_action_id'; export * from './create'; +export * from './clients'; diff --git a/x-pack/plugins/security_solution/server/endpoint/utils/dump.ts b/x-pack/plugins/security_solution/server/endpoint/utils/dump.ts new file mode 100644 index 00000000000000..ae05b73fac05a4 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/utils/dump.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 { inspect } from 'util'; + +/** + * Safely traverse some content (object, array, etc) and stringify it + * @param content + * @param depth + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const dump = (content: any, depth = 8): string => { + return inspect(content, { depth }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.ts index 846c714a9c099b..024f1b123ff997 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.ts @@ -80,6 +80,8 @@ import { ALERT_RULE_THREAT, ALERT_RULE_EXCEPTIONS_LIST, ALERT_RULE_IMMUTABLE, + ALERT_HOST_CRITICALITY, + ALERT_USER_CRITICALITY, } from '../../../../../../common/field_maps/field_names'; import type { CompleteRule, RuleParams } from '../../../rule_schema'; import { commonParamsCamelToSnake, typeSpecificCamelToSnake } from '../../../rule_management'; @@ -256,6 +258,9 @@ export const buildAlert = ( 'kibana.alert.rule.risk_score': params.riskScore, 'kibana.alert.rule.severity': params.severity, 'kibana.alert.rule.building_block_type': params.buildingBlockType, + // asset criticality fields will be enriched before ingestion + [ALERT_HOST_CRITICALITY]: undefined, + [ALERT_USER_CRITICALITY]: undefined, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts index 41ede6563524ca..70c554231a0e12 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts @@ -156,11 +156,7 @@ export const thresholdExecutor = async ({ let createResult: GenericBulkCreateResponse; let newSignalHistory: ThresholdSignalHistory; - if ( - alertSuppression?.duration && - runOpts?.experimentalFeatures?.alertSuppressionForThresholdRuleEnabled && - hasPlatinumLicense - ) { + if (alertSuppression?.duration && hasPlatinumLicense) { const suppressedResults = await bulkCreateSuppressedThresholdAlerts({ buckets, completeRule, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/__mocks__/alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/__mocks__/alerts.ts index e19e7ad1bc0eee..efbf39d815aeac 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/__mocks__/alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/__mocks__/alerts.ts @@ -68,6 +68,8 @@ import { ALERT_RULE_TIMELINE_TITLE, ALERT_RULE_INDICES, ALERT_RULE_TIMESTAMP_OVERRIDE, + ALERT_HOST_CRITICALITY, + ALERT_USER_CRITICALITY, } from '../../../../../../../common/field_maps/field_names'; export const createAlert = ( @@ -194,6 +196,8 @@ export const createAlert = ( rule_name_override: undefined, timestamp_override: undefined, }, + [ALERT_HOST_CRITICALITY]: undefined, + [ALERT_USER_CRITICALITY]: undefined, ...data, }, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/create_single_field_match_enrichment.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/create_single_field_match_enrichment.ts index 982de01b8bae78..874556fb94dae2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/create_single_field_match_enrichment.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/create_single_field_match_enrichment.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { flatten, chunk } from 'lodash'; +import { chunk } from 'lodash'; import { searchEnrichments } from './search_enrichments'; import { makeSingleFieldMatchQuery } from './utils/requests'; import { getEventValue, getFieldValue } from './utils/events'; @@ -22,12 +22,14 @@ export const createSingleFieldMatchEnrichment: CreateFieldsMatchEnrichment = asy createEnrichmentFunction, name, enrichmentResponseFields, + extraFilters, }) => { try { logger.debug(`Enrichment ${name}: started`); - const eventsWithField = events.filter((event) => getEventValue(event, mappingField.eventField)); - const eventsMapByFieldValue = eventsWithField.reduce((acc, event) => { + const eventsToEnrich = events.filter((event) => getEventValue(event, mappingField.eventField)); + + const eventsMapByFieldValue = eventsToEnrich.reduce((acc, event) => { const eventFieldValue = getEventValue(event, mappingField.eventField); if (!eventFieldValue) return {}; @@ -39,6 +41,7 @@ export const createSingleFieldMatchEnrichment: CreateFieldsMatchEnrichment = asy }, {} as { [key: string]: typeof events }); const uniqueEventsValuesToSearchBy = Object.keys(eventsMapByFieldValue); + const chunksUniqueEventsValuesToSearchBy = chunk(uniqueEventsValuesToSearchBy, MAX_CLAUSES); const getAllEnrichment = chunksUniqueEventsValuesToSearchBy @@ -46,6 +49,7 @@ export const createSingleFieldMatchEnrichment: CreateFieldsMatchEnrichment = asy makeSingleFieldMatchQuery({ values: enrichmentValuesChunk, searchByField: mappingField.enrichmentField, + extraFilters, }) ) .filter((query) => query.query?.bool?.should?.length > 0) @@ -59,11 +63,9 @@ export const createSingleFieldMatchEnrichment: CreateFieldsMatchEnrichment = asy }) ); - const enrichmentsResults = (await Promise.allSettled(getAllEnrichment)) + const enrichments = (await Promise.allSettled(getAllEnrichment)) .filter((result) => result.status === 'fulfilled') - .map((result) => (result as PromiseFulfilledResult)?.value); - - const enrichments = flatten(enrichmentsResults); + .flatMap((result) => (result as PromiseFulfilledResult)?.value); if (enrichments.length === 0) { logger.debug(`Enrichment ${name}: no enrichment found`); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/asset_criticality.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/asset_criticality.ts new file mode 100644 index 00000000000000..e2bd3319062ae1 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/asset_criticality.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 { cloneDeep } from 'lodash'; +import { + ALERT_HOST_CRITICALITY, + ALERT_USER_CRITICALITY, +} from '../../../../../../../common/field_maps/field_names'; +import { createSingleFieldMatchEnrichment } from '../create_single_field_match_enrichment'; +import type { CreateCriticalityEnrichment, CreateEnrichmentFunction } from '../types'; +import { getFieldValue } from '../utils/events'; +import { getAssetCriticalityIndex } from '../../../../../../../common/entity_analytics/asset_criticality'; + +const enrichmentResponseFields = ['id_value', 'criticality_level']; + +const getExtraFiltersForEnrichment = (field: string) => [ + { + match: { + id_field: { + query: field, + }, + }, + }, +]; + +const createEnrichmentFactoryFunction = + ( + alertField: typeof ALERT_HOST_CRITICALITY | typeof ALERT_USER_CRITICALITY + ): CreateEnrichmentFunction => + (enrichment) => + (event) => { + const criticality = getFieldValue(enrichment, 'criticality_level'); + + if (!criticality) { + return event; + } + const newEvent = cloneDeep(event); + if (criticality && newEvent._source) { + newEvent._source[alertField] = criticality; + } + return newEvent; + }; + +export const createHostAssetCriticalityEnrichments: CreateCriticalityEnrichment = async ({ + services, + logger, + events, + spaceId, +}) => { + return createSingleFieldMatchEnrichment({ + name: 'Host Asset Criticality', + index: [getAssetCriticalityIndex(spaceId)], + services, + logger, + events, + mappingField: { + eventField: 'host.name', + enrichmentField: 'id_value', + }, + enrichmentResponseFields, + extraFilters: getExtraFiltersForEnrichment('host.name'), + createEnrichmentFunction: createEnrichmentFactoryFunction(ALERT_HOST_CRITICALITY), + }); +}; + +export const createUserAssetCriticalityEnrichments: CreateCriticalityEnrichment = async ({ + services, + logger, + events, + spaceId, +}) => { + return createSingleFieldMatchEnrichment({ + name: 'User Asset Criticality', + index: [getAssetCriticalityIndex(spaceId)], + services, + logger, + events, + mappingField: { + eventField: 'user.name', + enrichmentField: 'id_value', + }, + enrichmentResponseFields, + extraFilters: getExtraFiltersForEnrichment('user.name'), + createEnrichmentFunction: createEnrichmentFactoryFunction(ALERT_USER_CRITICALITY), + }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/host_risk.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/host_risk.ts index 6b18979c0d3c0d..1b34f6cb878595 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/host_risk.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/host_risk.ts @@ -10,23 +10,9 @@ import { cloneDeep } from 'lodash'; import { getHostRiskIndex } from '../../../../../../../common/search_strategy/security_solution/risk_score/common'; import { RiskScoreFields } from '../../../../../../../common/search_strategy/security_solution/risk_score/all'; import { createSingleFieldMatchEnrichment } from '../create_single_field_match_enrichment'; -import type { CreateRiskEnrichment, GetIsRiskScoreAvailable } from '../types'; +import type { CreateRiskEnrichment } from '../types'; import { getFieldValue } from '../utils/events'; -export const getIsHostRiskScoreAvailable: GetIsRiskScoreAvailable = async ({ - spaceId, - services, - isNewRiskScoreModuleInstalled, -}) => { - const isHostRiskScoreIndexExist = await services.scopedClusterClient.asCurrentUser.indices.exists( - { - index: getHostRiskIndex(spaceId, true, isNewRiskScoreModuleInstalled), - } - ); - - return isHostRiskScoreIndexExist; -}; - export const createHostRiskEnrichments: CreateRiskEnrichment = async ({ services, logger, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/user_risk.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/user_risk.ts index b0e8d87f3019fb..27ae894f281343 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/user_risk.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/enrichment_by_type/user_risk.ts @@ -9,23 +9,9 @@ import { cloneDeep } from 'lodash'; import { getUserRiskIndex } from '../../../../../../../common/search_strategy/security_solution/risk_score/common'; import { RiskScoreFields } from '../../../../../../../common/search_strategy/security_solution/risk_score/all'; import { createSingleFieldMatchEnrichment } from '../create_single_field_match_enrichment'; -import type { CreateRiskEnrichment, GetIsRiskScoreAvailable } from '../types'; +import type { CreateRiskEnrichment } from '../types'; import { getFieldValue } from '../utils/events'; -export const getIsUserRiskScoreAvailable: GetIsRiskScoreAvailable = async ({ - services, - spaceId, - isNewRiskScoreModuleInstalled, -}) => { - const isUserRiskScoreIndexExist = await services.scopedClusterClient.asCurrentUser.indices.exists( - { - index: getUserRiskIndex(spaceId, true, isNewRiskScoreModuleInstalled), - } - ); - - return isUserRiskScoreIndexExist; -}; - export const createUserRiskEnrichments: CreateRiskEnrichment = async ({ services, logger, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.test.ts index 8f98b5bfe04b75..4c87c6f5a82720 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.test.ts @@ -11,26 +11,20 @@ import { enrichEvents } from '.'; import { searchEnrichments } from './search_enrichments'; import { ruleExecutionLogMock } from '../../../rule_monitoring/mocks'; import { createAlert } from './__mocks__/alerts'; -import { getIsHostRiskScoreAvailable } from './enrichment_by_type/host_risk'; -import { getIsUserRiskScoreAvailable } from './enrichment_by_type/user_risk'; +import { isIndexExist } from './utils/is_index_exist'; + +import { allowedExperimentalValues } from '../../../../../../common'; jest.mock('./search_enrichments', () => ({ searchEnrichments: jest.fn(), })); const mockSearchEnrichments = searchEnrichments as jest.Mock; -jest.mock('./enrichment_by_type/host_risk', () => ({ - ...jest.requireActual('./enrichment_by_type/host_risk'), - getIsHostRiskScoreAvailable: jest.fn(), -})); -const mockGetIsHostRiskScoreAvailable = getIsHostRiskScoreAvailable as jest.Mock; - -jest.mock('./enrichment_by_type/user_risk', () => ({ - ...jest.requireActual('./enrichment_by_type/user_risk'), - getIsUserRiskScoreAvailable: jest.fn(), +jest.mock('./utils/is_index_exist', () => ({ + isIndexExist: jest.fn(), })); -const mockGetIsUserRiskScoreAvailable = getIsUserRiskScoreAvailable as jest.Mock; +const mockIsIndexExist = isIndexExist as jest.Mock; const hostEnrichmentResponse = [ { @@ -66,6 +60,30 @@ const userEnrichmentResponse = [ }, ]; +const assetCriticalityUserResponse = [ + { + fields: { + id_value: ['user name 1'], + criticality_level: ['important'], + }, + }, +]; + +const assetCriticalityHostResponse = [ + { + fields: { + id_value: ['host name 2'], + criticality_level: ['very_important'], + }, + }, + { + fields: { + id_value: ['host name 1'], + criticality_level: ['low'], + }, + }, +]; + describe('enrichEvents', () => { let ruleExecutionLogger: ReturnType; let alertServices: RuleExecutorServicesMock; @@ -76,11 +94,13 @@ describe('enrichEvents', () => { ruleExecutionLogger = ruleExecutionLogMock.forExecutors.create(); alertServices = alertsMock.createRuleExecutorServices(); }); + afterEach(() => { + mockIsIndexExist.mockClear(); + }); it('return the same events, if risk indexes are not available', async () => { mockSearchEnrichments.mockImplementation(() => []); - mockGetIsUserRiskScoreAvailable.mockImplementation(() => false); - mockGetIsHostRiskScoreAvailable.mockImplementation(() => false); + mockIsIndexExist.mockImplementation(() => false); const events = [ createAlert('1', createEntity('host', 'host name')), createAlert('2', createEntity('user', 'user name')), @@ -97,8 +117,7 @@ describe('enrichEvents', () => { it('return the same events, if there no fields', async () => { mockSearchEnrichments.mockImplementation(() => []); - mockGetIsUserRiskScoreAvailable.mockImplementation(() => true); - mockGetIsHostRiskScoreAvailable.mockImplementation(() => true); + mockIsIndexExist.mockImplementation(() => true); const events = [createAlert('1'), createAlert('2')]; const enrichedEvents = await enrichEvents({ logger: ruleExecutionLogger, @@ -110,12 +129,11 @@ describe('enrichEvents', () => { expect(enrichedEvents).toEqual(events); }); - it('return enriched events', async () => { + it('return enriched events with risk score', async () => { mockSearchEnrichments .mockReturnValueOnce(hostEnrichmentResponse) .mockReturnValueOnce(userEnrichmentResponse); - mockGetIsUserRiskScoreAvailable.mockImplementation(() => true); - mockGetIsHostRiskScoreAvailable.mockImplementation(() => true); + mockIsIndexExist.mockImplementation(() => true); const enrichedEvents = await enrichEvents({ logger: ruleExecutionLogger, @@ -159,14 +177,57 @@ describe('enrichEvents', () => { ]); }); + it('return enriched events with asset criticality', async () => { + mockSearchEnrichments + .mockReturnValueOnce(assetCriticalityUserResponse) + .mockReturnValueOnce(assetCriticalityHostResponse); + + // disable risk score enrichments + mockIsIndexExist.mockImplementationOnce(() => false); + mockIsIndexExist.mockImplementationOnce(() => false); + mockIsIndexExist.mockImplementationOnce(() => false); + // enable for asset criticality + mockIsIndexExist.mockImplementation(() => true); + + const enrichedEvents = await enrichEvents({ + logger: ruleExecutionLogger, + services: alertServices, + events: [ + createAlert('1', { + ...createEntity('host', 'host name 1'), + ...createEntity('user', 'user name 1'), + }), + createAlert('2', createEntity('host', 'user name 1')), + ], + spaceId: 'default', + experimentalFeatures: { + ...allowedExperimentalValues, + entityAnalyticsAssetCriticalityEnabled: true, + }, + }); + + expect(enrichedEvents).toEqual([ + createAlert('1', { + ...createEntity('user', 'user name 1'), + ...createEntity('host', 'host name 1'), + + 'kibana.alert.host.criticality_level': 'low', + 'kibana.alert.user.criticality_level': 'important', + }), + createAlert('2', { + ...createEntity('host', 'user name 1'), + }), + ]); + }); + it('if some enrichments failed, another work as expected', async () => { mockSearchEnrichments .mockImplementationOnce(() => { throw new Error('1'); }) .mockImplementationOnce(() => userEnrichmentResponse); - mockGetIsUserRiskScoreAvailable.mockImplementation(() => true); - mockGetIsHostRiskScoreAvailable.mockImplementation(() => true); + mockIsIndexExist.mockImplementation(() => true); + mockIsIndexExist.mockImplementation(() => true); const enrichedEvents = await enrichEvents({ logger: ruleExecutionLogger, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.ts index a27cc55801820d..cfd51f21e20cd2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/index.ts @@ -5,21 +5,26 @@ * 2.0. */ -import { - createHostRiskEnrichments, - getIsHostRiskScoreAvailable, -} from './enrichment_by_type/host_risk'; +import { createHostRiskEnrichments } from './enrichment_by_type/host_risk'; + +import { createUserRiskEnrichments } from './enrichment_by_type/user_risk'; import { - createUserRiskEnrichments, - getIsUserRiskScoreAvailable, -} from './enrichment_by_type/user_risk'; + createHostAssetCriticalityEnrichments, + createUserAssetCriticalityEnrichments, +} from './enrichment_by_type/asset_criticality'; +import { getAssetCriticalityIndex } from '../../../../../../common/entity_analytics/asset_criticality'; import type { EnrichEventsFunction, EventsMapByEnrichments, CreateEnrichEventsFunction, } from './types'; import { applyEnrichmentsToEvents } from './utils/transforms'; +import { isIndexExist } from './utils/is_index_exist'; +import { + getHostRiskIndex, + getUserRiskIndex, +} from '../../../../../../common/search_strategy/security_solution/risk_score/common'; export const enrichEvents: EnrichEventsFunction = async ({ services, @@ -29,23 +34,30 @@ export const enrichEvents: EnrichEventsFunction = async ({ experimentalFeatures, }) => { try { - const enrichments = []; + const enrichments: Array> = []; logger.debug('Alert enrichments started'); const isNewRiskScoreModuleAvailable = experimentalFeatures?.riskScoringRoutesEnabled ?? false; + const isAssetCriticalityEnabled = + experimentalFeatures?.entityAnalyticsAssetCriticalityEnabled ?? false; let isNewRiskScoreModuleInstalled = false; if (isNewRiskScoreModuleAvailable) { - isNewRiskScoreModuleInstalled = await getIsHostRiskScoreAvailable({ - spaceId, + isNewRiskScoreModuleInstalled = await isIndexExist({ services, - isNewRiskScoreModuleInstalled: true, + index: getHostRiskIndex(spaceId, true, true), }); } const [isHostRiskScoreIndexExist, isUserRiskScoreIndexExist] = await Promise.all([ - getIsHostRiskScoreAvailable({ spaceId, services, isNewRiskScoreModuleInstalled }), - getIsUserRiskScoreAvailable({ spaceId, services, isNewRiskScoreModuleInstalled }), + isIndexExist({ + services, + index: getHostRiskIndex(spaceId, true, isNewRiskScoreModuleInstalled), + }), + isIndexExist({ + services, + index: getUserRiskIndex(spaceId, true, isNewRiskScoreModuleInstalled), + }), ]); if (isHostRiskScoreIndexExist) { @@ -72,9 +84,34 @@ export const enrichEvents: EnrichEventsFunction = async ({ ); } + if (isAssetCriticalityEnabled) { + const assetCriticalityIndexExist = await isIndexExist({ + services, + index: getAssetCriticalityIndex(spaceId), + }); + if (assetCriticalityIndexExist) { + enrichments.push( + createUserAssetCriticalityEnrichments({ + services, + logger, + events, + spaceId, + }) + ); + enrichments.push( + createHostAssetCriticalityEnrichments({ + services, + logger, + events, + spaceId, + }) + ); + } + } + const allEnrichmentsResults = await Promise.allSettled(enrichments); - const allFulfilledEnrichmentsResults = allEnrichmentsResults + const allFulfilledEnrichmentsResults: EventsMapByEnrichments[] = allEnrichmentsResults .filter((result) => result.status === 'fulfilled') .map((result) => (result as PromiseFulfilledResult)?.value); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/types.ts index 73c703235edcac..70f710630da37a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/types.ts @@ -6,6 +6,7 @@ */ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import type { Filter } from '@kbn/es-query'; import type { ExperimentalFeatures } from '../../../../../../common'; @@ -27,7 +28,6 @@ export type EnrichmentFunction = ( e: EventsForEnrichment ) => EventsForEnrichment; -// export interface EventsMapByEnrichments { [id: string]: EnrichmentFunction[]; } @@ -48,11 +48,6 @@ interface BasedEnrichParamters { events: Array>; } -interface SingleMappingField { - eventField: string; - enrichmentField: string; -} - export type GetEventValue = ( events: EventsForEnrichment, path: string @@ -60,9 +55,10 @@ export type GetEventValue = ( export type GetFieldValue = (events: EnrichmentType, path: string) => string | undefined; -export type MakeSingleFieldMatchQuery = (params: { +export type MakeSingleFieldMatchQuery = (params: { values: string[]; searchByField: string; + extraFilters?: QueryDslQueryContainer[]; }) => Filter; export type SearchEnrichments = (params: { @@ -79,6 +75,8 @@ export type GetIsRiskScoreAvailable = (params: { isNewRiskScoreModuleInstalled: boolean; }) => Promise; +export type IsIndexExist = (params: { services: RuleServices; index: string }) => Promise; + export type CreateRiskEnrichment = ( params: BasedEnrichParamters & { spaceId: string; @@ -86,13 +84,28 @@ export type CreateRiskEnrichment = ( } ) => Promise; +export type CreateCriticalityEnrichment = ( + params: BasedEnrichParamters & { + spaceId: string; + } +) => Promise; + +export type CreateEnrichmentFunction = (enrichmentDoc: EnrichmentType) => EnrichmentFunction; + export type CreateFieldsMatchEnrichment = ( params: BasedEnrichParamters & { name: string; index: string[]; - mappingField: SingleMappingField; + mappingField: { + /** The field on events which contains the value we'll use to build a query. */ + eventField: string; + /** Used in a `match` query to find documents that match the values of `eventField`. */ + enrichmentField: string; + }; + /** Specifies which fields should be returned when querying the enrichment index. */ enrichmentResponseFields: string[]; - createEnrichmentFunction: (enrichmentDoc: EnrichmentType) => EnrichmentFunction; + createEnrichmentFunction: CreateEnrichmentFunction; + extraFilters?: QueryDslQueryContainer[]; } ) => Promise; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/events.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/events.ts index 54eea14c6e94a5..b08b0f2b362b8e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/events.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/events.ts @@ -6,7 +6,8 @@ */ import { get } from 'lodash'; -import type { GetEventValue, GetFieldValue } from '../types'; +import type { BaseFieldsLatest } from '../../../../../../../common/api/detection_engine/model/alerts'; +import type { EventsForEnrichment, GetEventValue, GetFieldValue } from '../types'; export const getEventValue: GetEventValue = (event, path) => { const value = get(event, `_source.${path}`) || event?._source?.[path]; @@ -19,3 +20,30 @@ export const getEventValue: GetEventValue = (event, path) => { }; export const getFieldValue: GetFieldValue = (event, path) => get(event?.fields, path)?.[0]; + +/** Given an eventField, returns a map of values found in that field to the events that contain that value. */ +export function getEventsMapByFieldValue( + events: Array>, + eventField: string +): Record< + /** values found in mappingField.eventField */ string, + /** Array of events with the corresponding value */ typeof events +> { + const eventsWithField = events.filter((event) => getEventValue(event, eventField)); + + const eventsMapByFieldValue: Record< + /** values found in mappingField.eventField */ string, + /** Array of events with the corresponding value */ typeof events + > = eventsWithField.reduce((acc, event) => { + const eventFieldValue = getEventValue(event, eventField); + + if (!eventFieldValue) return {}; + + acc[eventFieldValue] ??= []; + acc[eventFieldValue].push(event); + + return acc; + }, {} as { [key: string]: typeof events }); + + return eventsMapByFieldValue; +} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/is_index_exist.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/is_index_exist.ts new file mode 100644 index 00000000000000..eb7813c3504166 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/is_index_exist.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 { IsIndexExist } from '../types'; + +export const isIndexExist: IsIndexExist = async ({ services, index }) => { + const isAssetCriticalityIndexExist = + await services.scopedClusterClient.asInternalUser.indices.exists({ + index, + }); + + return isAssetCriticalityIndexExist; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.test.ts index 8cae81c8ef3b09..b8f3253bb69f76 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.test.ts @@ -20,6 +20,7 @@ describe('makeSingleFieldMatchQuery', () => { query: { bool: { should: [], + filter: [], minimum_should_match: 1, }, }, @@ -58,6 +59,46 @@ describe('makeSingleFieldMatchQuery', () => { }, }, ], + filter: [], + minimum_should_match: 1, + }, + }, + }); + }); + + it('return query with extra filters', () => { + expect( + makeSingleFieldMatchQuery({ + values: [], + searchByField: 'host.name', + extraFilters: [ + { + match: { + id_field: { + query: 'host.name', + }, + }, + }, + ], + }) + ).toEqual({ + meta: { + alias: null, + negate: false, + disabled: false, + }, + query: { + bool: { + should: [], + filter: [ + { + match: { + id_field: { + query: 'host.name', + }, + }, + }, + ], minimum_should_match: 1, }, }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.ts index b4567481691b6b..704fb89812e4a7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/enrichments/utils/requests.ts @@ -7,7 +7,12 @@ import type { MakeSingleFieldMatchQuery } from '../types'; -export const makeSingleFieldMatchQuery: MakeSingleFieldMatchQuery = ({ values, searchByField }) => { +/** makes a query that gets back any documents with the given `values` in the `searchByField` */ +export const makeSingleFieldMatchQuery: MakeSingleFieldMatchQuery = ({ + values, + searchByField, + extraFilters, +}) => { const shouldClauses = values.map((value) => ({ match: { [searchByField]: { @@ -26,6 +31,7 @@ export const makeSingleFieldMatchQuery: MakeSingleFieldMatchQuery = ({ values, s query: { bool: { should: shouldClauses, + filter: extraFilters ?? [], minimum_should_match: 1, }, }, diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 227a7ea7e1439d..53141fc1751ceb 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -211,6 +211,7 @@ export class Plugin implements ISecuritySolutionPlugin { this.endpointAppContextService.setup({ securitySolutionRequestContextFactory: requestContextFactory, cloud: plugins.cloud, + loggerFactory: this.pluginContext.logger, }); initUsageCollectors({ diff --git a/x-pack/plugins/security_solution/server/utils/custom_http_request_error.ts b/x-pack/plugins/security_solution/server/utils/custom_http_request_error.ts index 0146912d78c6ca..9ce131a9182efa 100644 --- a/x-pack/plugins/security_solution/server/utils/custom_http_request_error.ts +++ b/x-pack/plugins/security_solution/server/utils/custom_http_request_error.ts @@ -5,10 +5,13 @@ * 2.0. */ export class CustomHttpRequestError extends Error { - constructor(message: string, public readonly statusCode: number = 500, meta?: unknown) { + constructor( + message: string, + public readonly statusCode: number = 500, + public readonly meta?: unknown + ) { super(message); // For debugging - capture name of subclasses this.name = this.constructor.name; - this.message = message; } } diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index 2158fe97996dc2..92f062103e7597 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -185,6 +185,8 @@ "@kbn/core-http-common", "@kbn/search-errors", "@kbn/stack-connectors-plugin", - "@kbn/elastic-assistant-common" + "@kbn/elastic-assistant-common", + "@kbn/core-elasticsearch-server-mocks", + "@kbn/lens-embeddable-utils" ] } diff --git a/x-pack/plugins/session_view/public/test/index.tsx b/x-pack/plugins/session_view/public/test/index.tsx index 277917e44ccafc..23f5fe8b25ce1c 100644 --- a/x-pack/plugins/session_view/public/test/index.tsx +++ b/x-pack/plugins/session_view/public/test/index.tsx @@ -11,7 +11,6 @@ import { render as reactRender, RenderOptions, RenderResult } from '@testing-lib import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { Router } from '@kbn/shared-ux-router'; import { History } from 'history'; -import useObservable from 'react-use/lib/useObservable'; import { I18nProvider } from '@kbn/i18n-react'; import { CoreStart } from '@kbn/core/public'; import { coreMock } from '@kbn/core/public/mocks'; @@ -68,8 +67,8 @@ const AppRootProvider = memo<{ history: History; coreStart: CoreStart; children: ReactNode | ReactNode[]; -}>(({ history, coreStart: { http, notifications, uiSettings, application }, children }) => { - const isDarkMode = useObservable(uiSettings.get$('theme:darkMode')); +}>(({ history, coreStart: { http, notifications, theme, application }, children }) => { + const isDarkMode = theme.getTheme().darkMode; const services = useMemo( () => ({ http, notifications, application }), [application, http, notifications] diff --git a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/_policy_form.scss b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/_policy_form.scss index 389e925f392c27..0a5187908f8542 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/_policy_form.scss +++ b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/_policy_form.scss @@ -4,7 +4,7 @@ .snapshotRestore__policyForm__stepSettings { .euiFormRow--hasEmptyLabelSpace { min-height: auto; - margin-top: $euiFontSizeXS + $euiSizeS + calc($euiSizeXXL / 4); + margin-top: $euiFontSizeXS + $euiSizeS + ($euiSizeXXL / 4); } } @@ -13,4 +13,4 @@ */ .snapshotRestore__policyForm__stepSettings__indicesFieldWrapper .euiFormLabel { width: 100%; -} +} \ No newline at end of file diff --git a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/_restore_snapshot_form.scss b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/_restore_snapshot_form.scss index ec680472edf465..6a8f0b951c99fe 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/_restore_snapshot_form.scss +++ b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/_restore_snapshot_form.scss @@ -5,7 +5,7 @@ .snapshotRestore__restoreForm__stepSettings { .euiFormRow--hasEmptyLabelSpace { min-height: auto; - margin-top: $euiFontSizeXS + $euiSizeS + calc($euiSizeXXL / 4); + margin-top: $euiFontSizeXS + $euiSizeS + ($euiSizeXXL / 4); } } @@ -14,4 +14,4 @@ */ .snapshotRestore__restoreForm__stepLogistics__indicesFieldWrapper .euiFormLabel { width: 100%; -} +} \ No newline at end of file diff --git a/x-pack/plugins/stack_alerts/common/constants.ts b/x-pack/plugins/stack_alerts/common/constants.ts index a2be12ee63867c..b378e097d883a2 100644 --- a/x-pack/plugins/stack_alerts/common/constants.ts +++ b/x-pack/plugins/stack_alerts/common/constants.ts @@ -6,3 +6,18 @@ */ export const MAX_SELECTABLE_GROUP_BY_TERMS = 4; +export const MAX_SELECTABLE_SOURCE_FIELDS = 5; + +const HOST_NAME = 'host.name'; +const HOST_HOSTNAME = 'host.hostname'; +const HOST_ID = 'host.id'; +const CONTAINER_ID = 'container.id'; +const KUBERNETES_POD_UID = 'kubernetes.pod.uid'; + +export const validSourceFields = [ + HOST_NAME, + HOST_HOSTNAME, + HOST_ID, + CONTAINER_ID, + KUBERNETES_POD_UID, +]; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/components/source_fields_select.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/components/source_fields_select.test.tsx new file mode 100644 index 00000000000000..aed0f36b27c8eb --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/components/source_fields_select.test.tsx @@ -0,0 +1,226 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { cleanup, render, screen, waitFor } from '@testing-library/react'; +import { I18nProvider } from '@kbn/i18n-react'; +import { SourceFields } from './source_fields_select'; +import { SourceField } from '../es_query/types'; + +const AppWrapper: React.FC<{ children: React.ReactElement }> = React.memo(({ children }) => ( + {children} +)); + +describe('SourceFields', () => { + afterEach(() => { + cleanup(); + }); + + it('should render SourceFields component if there are valid sourceFields', () => { + const result = render( + {}} + esFields={[ + { + name: 'host.name', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: true, + }, + ]} + sourceFields={[]} + errors={[]} + />, + { + wrapper: AppWrapper, + } + ); + + expect(result.getByTestId('sourceFields')).toBeInTheDocument(); + }); + + it('should not render SourceFields component if there are not valid sourceFields', () => { + const result = render( + {}} + esFields={[ + { + name: 'test', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: true, + }, + ]} + sourceFields={[]} + errors={[]} + />, + { + wrapper: AppWrapper, + } + ); + + expect(result.queryByTestId('sourceFields')).not.toBeInTheDocument(); + }); + + it('should render sourceFields param', () => { + const result = render( + {}} + esFields={[ + { + name: 'host.name', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: true, + }, + ]} + sourceFields={[{ label: 'host.name', searchPath: 'host.name' }]} + errors={[]} + />, + { + wrapper: AppWrapper, + } + ); + + expect(result.getByTestId('option-host.name')).toBeInTheDocument(); + }); + + it('should auto select valid sourceFields if sourceFields param is not defined', async () => { + let sourceFields: SourceField[] | undefined; + const onChange = (fields: SourceField[]) => { + sourceFields = fields; + }; + const { rerender } = render( + , + { + wrapper: AppWrapper, + } + ); + + await waitFor(() => { + rerender( + + ); + expect(screen.getByTestId('option-host.name')).toBeInTheDocument(); + }); + }); + + it('should remove duplicate and non-aggregatable esFields and handle keyword esFields', async () => { + let sourceFields: SourceField[] | undefined; + const onChange = (fields: SourceField[]) => { + sourceFields = fields; + }; + const esFields = [ + { + name: 'host.name', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: false, + }, + { + name: 'host.hostname', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: true, + }, + { + name: 'host.hostname.keyword', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: true, + }, + { + name: 'host.id.keyword', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: true, + }, + ]; + const { rerender } = render( + , + { + wrapper: AppWrapper, + } + ); + + await waitFor(() => { + rerender( + + ); + expect(screen.queryByTestId('option-host.name')).not.toBeInTheDocument(); + expect(screen.getAllByTestId('option-host.hostname')).toHaveLength(1); + expect(screen.getByTestId('option-host.id')).toBeInTheDocument(); + }); + }); + + it('should render SourceFields component with errors', () => { + const result = render( + {}} + esFields={[ + { + name: 'host.name', + type: 'type', + normalizedType: 'type', + searchable: true, + aggregatable: true, + }, + ]} + sourceFields={[]} + errors={['test error']} + />, + { + wrapper: AppWrapper, + } + ); + + expect(result.getByText('test error')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/components/source_fields_select.tsx b/x-pack/plugins/stack_alerts/public/rule_types/components/source_fields_select.tsx new file mode 100644 index 00000000000000..3cd34a3cd00155 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/components/source_fields_select.tsx @@ -0,0 +1,120 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect, useState } from 'react'; +import { uniqBy } from 'lodash'; +import { EuiComboBox, EuiFormRow, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { FieldOption } from '@kbn/triggers-actions-ui-plugin/public/common'; +import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { MAX_SELECTABLE_SOURCE_FIELDS, validSourceFields } from '../../../common/constants'; +import { SourceField } from '../es_query/types'; + +interface SourceFieldsOption { + label: string; + value: string; +} + +interface SourceFieldsProps { + esFields: FieldOption[]; + onChangeSourceFields: (selectedSourceFields: SourceField[]) => void; + errors: string | string[] | IErrorObject; + sourceFields?: SourceField[]; +} + +export const SourceFields: React.FC = ({ + esFields, + onChangeSourceFields, + errors, + sourceFields, +}) => { + const [sourceFieldsOptions, setSourceFieldsOptions] = useState([]); + + useEffect(() => { + const options = uniqBy( + esFields + .filter((f) => f.aggregatable) + .flatMap((f) => { + const validSourceField = validSourceFields.find( + (validatedField) => f.name === validatedField || f.name === `${validatedField}.keyword` + ); + if (validSourceField) { + return [ + { + label: validSourceField, + value: f.name, + 'data-test-subj': `option-${validSourceField}`, + }, + ]; + } + return []; + }), + 'label' + ); + + setSourceFieldsOptions(options); + + // if not sourceFields, auto select the current options + if (!sourceFields) { + const fields: SourceField[] = []; + options.forEach((f) => { + if (f.value && fields.length < MAX_SELECTABLE_SOURCE_FIELDS) { + fields.push({ label: f.label, searchPath: f.value }); + } + }); + onChangeSourceFields(fields); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [esFields]); + + return sourceFieldsOptions.length > 0 ? ( + 0 && sourceFields !== undefined} + error={errors} + > + <> + +
    + +
    +
    + + 0 && sourceFields !== undefined} + selectedOptions={(sourceFields || []).map((f) => ({ + label: f.label, + value: f.searchPath, + 'data-test-subj': `option-${f.label}`, + }))} + onChange={(options) => { + const fields: SourceField[] = []; + options.forEach((f) => { + if (f.value) { + fields.push({ label: f.label, searchPath: f.value }); + } + }); + onChangeSourceFields(fields); + }} + options={sourceFieldsOptions} + /> + +
    + ) : null; +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts index f99b97634fc5ad..690387d0549392 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/constants.ts @@ -23,6 +23,7 @@ export const DEFAULT_VALUES = { GROUP_BY: 'all', EXCLUDE_PREVIOUS_HITS: true, CAN_SELECT_MULTI_TERMS: true, + SOURCE_FIELDS: [], }; export const COMMON_EXPRESSION_ERRORS = { @@ -36,6 +37,7 @@ export const COMMON_EXPRESSION_ERRORS = { groupBy: new Array(), termSize: new Array(), termField: new Array(), + sourceFields: new Array(), }; export const SEARCH_SOURCE_ONLY_EXPRESSION_ERRORS = { diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/es_query_expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/es_query_expression.tsx index f1e91ba63dc691..1cf901ecae8f90 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/es_query_expression.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/es_query_expression.tsx @@ -55,6 +55,7 @@ export const EsQueryExpression: React.FC< termSize, termField, excludeHitsFromPreviousRun, + sourceFields, } = ruleParams; const [currentRuleParams, setCurrentRuleParams] = useState>( @@ -72,6 +73,7 @@ export const EsQueryExpression: React.FC< searchType: SearchType.esQuery, excludeHitsFromPreviousRun: excludeHitsFromPreviousRun ?? DEFAULT_VALUES.EXCLUDE_PREVIOUS_HITS, + sourceFields, } ); @@ -229,6 +231,7 @@ export const EsQueryExpression: React.FC< termSize: DEFAULT_VALUES.TERM_SIZE, searchType: SearchType.esQuery, excludeHitsFromPreviousRun: DEFAULT_VALUES.EXCLUDE_PREVIOUS_HITS, + sourceFields: undefined, }); } else { await refreshEsFields(indices); @@ -352,6 +355,11 @@ export const EsQueryExpression: React.FC< [setParam] )} canSelectMultiTerms={DEFAULT_VALUES.CAN_SELECT_MULTI_TERMS} + onChangeSourceFields={useCallback( + (selectedSourceFields) => setParam('sourceFields', selectedSourceFields), + [setParam] + )} + sourceFields={sourceFields} /> diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx index 8f3edd45a1e283..30f34b0a15d057 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/esql_query_expression.tsx @@ -6,7 +6,7 @@ */ import React, { useState, Fragment, useEffect, useCallback } from 'react'; -import { get } from 'lodash'; +import { debounce, get } from 'lodash'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiFieldNumber, @@ -23,11 +23,13 @@ import { fetchFieldsFromESQL } from '@kbn/text-based-editor'; import { AggregateQuery, getIndexPatternFromESQLQuery } from '@kbn/es-query'; import { parseDuration } from '@kbn/alerting-plugin/common'; import { + FieldOption, firstFieldOption, getTimeFieldOptions, getTimeOptions, parseAggregationResults, } from '@kbn/triggers-actions-ui-plugin/public/common'; +import { SourceFields } from '../../components/source_fields_select'; import { EsQueryRuleParams, EsQueryRuleMetaData, SearchType } from '../types'; import { DEFAULT_VALUES } from '../constants'; import { useTriggerUiActionServices } from '../util'; @@ -39,7 +41,7 @@ export const EsqlQueryExpression: React.FC< RuleTypeParamsExpressionProps, EsQueryRuleMetaData> > = ({ ruleParams, setRuleParams, setRuleProperty, errors }) => { const { expressions, http } = useTriggerUiActionServices(); - const { esqlQuery, timeWindowSize, timeWindowUnit, timeField } = ruleParams; + const { esqlQuery, timeWindowSize, timeWindowUnit, timeField, sourceFields } = ruleParams; const [currentRuleParams, setCurrentRuleParams] = useState< EsQueryRuleParams @@ -57,10 +59,12 @@ export const EsqlQueryExpression: React.FC< groupBy: DEFAULT_VALUES.GROUP_BY, termSize: DEFAULT_VALUES.TERM_SIZE, searchType: SearchType.esqlQuery, + sourceFields: sourceFields ?? DEFAULT_VALUES.SOURCE_FIELDS, }); const [query, setQuery] = useState({ esql: '' }); const [timeFieldOptions, setTimeFieldOptions] = useState([firstFieldOption]); const [detectTimestamp, setDetectTimestamp] = useState(false); + const [esFields, setEsFields] = useState([]); const setParam = useCallback( (paramField: string, paramValue: unknown) => { @@ -79,6 +83,7 @@ export const EsqlQueryExpression: React.FC< if (esqlQuery && 'esql' in esqlQuery) { if (esqlQuery.esql) { refreshTimeFields(esqlQuery); + refreshEsFields(esqlQuery, false); } } if (timeField) { @@ -138,6 +143,7 @@ export const EsqlQueryExpression: React.FC< let hasTimestamp = false; const indexPattern: string = getIndexPatternFromESQLQuery(get(q, 'esql')); const currentEsFields = await getFields(http, [indexPattern]); + const timeFields = getTimeFieldOptions(currentEsFields); setTimeFieldOptions([firstFieldOption, ...timeFields]); @@ -149,6 +155,29 @@ export const EsqlQueryExpression: React.FC< setDetectTimestamp(hasTimestamp); }; + const refreshEsFields = async (q: AggregateQuery, resetSourceFields: boolean = true) => { + let fields: FieldOption[] = []; + try { + const table = await fetchFieldsFromESQL({ esql: `${get(q, 'esql')} | limit 0` }, expressions); + if (table) { + fields = table.columns.map((c) => ({ + name: c.id, + type: c.meta.type, + normalizedType: c.meta.type, + searchable: true, + aggregatable: true, + })); + } + } catch (error) { + /** ignore error */ + } + + if (resetSourceFields) { + setParam('sourceFields', undefined); + } + setEsFields(fields); + }; + return ( @@ -163,11 +192,12 @@ export const EsqlQueryExpression: React.FC< { + onTextLangQueryChange={debounce((q: AggregateQuery) => { setQuery(q); setParam('esqlQuery', q); refreshTimeFields(q); - }} + refreshEsFields(q); + }, 1000)} expandCodeEditor={() => true} isCodeEditorExpanded={true} onTextLangQuerySubmit={() => {}} @@ -176,6 +206,14 @@ export const EsqlQueryExpression: React.FC< hideRunQueryText={true} /> + + setParam('sourceFields', selectedSourceFields) + } + esFields={esFields} + sourceFields={sourceFields} + errors={errors.sourceFields} + />
    diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression.tsx index b8fd6d1ee086f0..dae9a67fd0c380 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression.tsx @@ -43,6 +43,7 @@ export const SearchSourceExpression = ({ termField, termSize, excludeHitsFromPreviousRun, + sourceFields, } = ruleParams; const { data } = useTriggerUiActionServices(); @@ -92,6 +93,7 @@ export const SearchSourceExpression = ({ termSize: termSize ?? DEFAULT_VALUES.TERM_SIZE, excludeHitsFromPreviousRun: excludeHitsFromPreviousRun ?? DEFAULT_VALUES.EXCLUDE_PREVIOUS_HITS, + sourceFields, }); setSearchSource(createdSearchSource); } catch (error) { diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx index c4419a780809df..c6ee0157e082ab 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx @@ -27,7 +27,13 @@ import { import { STACK_ALERTS_FEATURE_ID } from '@kbn/rule-data-utils'; import { getComparatorScript } from '../../../../common'; import { Comparator } from '../../../../common/comparator_types'; -import { CommonRuleParams, EsQueryRuleMetaData, EsQueryRuleParams, SearchType } from '../types'; +import { + CommonRuleParams, + EsQueryRuleMetaData, + EsQueryRuleParams, + SearchType, + SourceField, +} from '../types'; import { DEFAULT_VALUES } from '../constants'; import { DataViewSelectPopover } from '../../components/data_view_select_popover'; import { RuleCommonExpressions } from '../rule_common_expressions'; @@ -49,7 +55,7 @@ interface LocalStateAction { type: SearchSourceParamsAction['type'] | keyof CommonRuleParams; payload: | SearchSourceParamsAction['payload'] - | (number[] | number | string | string[] | boolean | undefined); + | (number[] | number | string | string[] | boolean | SourceField[] | undefined); } type LocalStateReducer = (prevState: LocalState, action: LocalStateAction) => LocalState; @@ -112,6 +118,7 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp size: ruleParams.size ?? DEFAULT_VALUES.SIZE, excludeHitsFromPreviousRun: ruleParams.excludeHitsFromPreviousRun ?? DEFAULT_VALUES.EXCLUDE_PREVIOUS_HITS, + sourceFields: ruleParams.sourceFields, } ); @@ -123,8 +130,9 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp ); const onSelectDataView = useCallback((newDataView: DataView) => { - setEsFields(convertFieldSpecToFieldOption(newDataView.fields.map((field) => field.toSpec()))); dispatch({ type: 'index', payload: newDataView }); + dispatch({ type: 'sourceFields', payload: undefined }); + setEsFields(convertFieldSpecToFieldOption(newDataView.fields.map((field) => field.toSpec()))); }, []); const onUpdateFilters = useCallback((newFilters) => { @@ -226,6 +234,12 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp [] ); + const onChangeSourceFields = useCallback( + (selectedSourceFields: SourceField[]) => + dispatch({ type: 'sourceFields', payload: selectedSourceFields }), + [] + ); + const timeWindow = `${ruleConfiguration.timeWindowSize}${ruleConfiguration.timeWindowUnit}`; const createTestSearchSource = useCallback(() => { @@ -372,6 +386,8 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp excludeHitsFromPreviousRun={ruleConfiguration.excludeHitsFromPreviousRun} onChangeExcludeHitsFromPreviousRun={onChangeExcludeHitsFromPreviousRun} canSelectMultiTerms={DEFAULT_VALUES.CAN_SELECT_MULTI_TERMS} + onChangeSourceFields={onChangeSourceFields} + sourceFields={ruleConfiguration.sourceFields} /> diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.test.tsx index 267b289cf5ca85..c235c3fe8fc3e5 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.test.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.test.tsx @@ -93,6 +93,7 @@ describe('RuleCommonExpressions', () => { }} excludeHitsFromPreviousRun={excludeHitsFromPreviousRun} onChangeExcludeHitsFromPreviousRun={onChangeExcludeHitsFromPreviousRunFn} + onChangeSourceFields={() => {}} /> ); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.tsx index cee08144f307e7..313d3f586c73ef 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/rule_common_expressions/rule_common_expressions.tsx @@ -28,7 +28,8 @@ import { WhenExpression, } from '@kbn/triggers-actions-ui-plugin/public'; import { builtInGroupByTypes, FieldOption } from '@kbn/triggers-actions-ui-plugin/public/common'; -import { CommonRuleParams } from '../types'; +import { SourceFields } from '../../components/source_fields_select'; +import { CommonRuleParams, SourceField } from '../types'; import { DEFAULT_VALUES } from '../constants'; import { TestQueryRow, TestQueryRowProps } from '../test_query_row'; import { QueryThresholdHelpPopover } from './threshold_help_popover'; @@ -53,6 +54,7 @@ export interface RuleCommonExpressionsProps extends CommonRuleParams { onCopyQuery?: TestQueryRowProps['copyQuery']; onChangeExcludeHitsFromPreviousRun: (exclude: boolean) => void; canSelectMultiTerms?: boolean; + onChangeSourceFields: (selectedSourceFields: SourceField[]) => void; } export const RuleCommonExpressions: React.FC = ({ @@ -67,6 +69,7 @@ export const RuleCommonExpressions: React.FC = ({ termField, termSize, size, + sourceFields, errors, hasValidationErrors, onChangeSelectedAggField, @@ -84,6 +87,7 @@ export const RuleCommonExpressions: React.FC = ({ excludeHitsFromPreviousRun, onChangeExcludeHitsFromPreviousRun, canSelectMultiTerms, + onChangeSourceFields, }) => { const [isExcludeHitsDisabled, setIsExcludeHitsDisabled] = useState(false); @@ -205,6 +209,13 @@ export const RuleCommonExpressions: React.FC = ({ })} /> + + Promise.resolve({ testResults: { - results: [{ group: 'all documents', hits: [], count: 42 }], + results: [{ group: 'all documents', hits: [], count: 42, sourceFields: [] }], truncated: false, }, isGrouped: false, diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts index 44c2a1cf557177..f476d7d896b69d 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/test_query_row/use_test_query.test.ts @@ -15,7 +15,7 @@ describe('useTestQuery', () => { initialProps: () => Promise.resolve({ testResults: { - results: [{ group: 'all documents', hits: [], count: 1 }], + results: [{ group: 'all documents', hits: [], count: 1, sourceFields: [] }], truncated: false, }, isGrouped: false, @@ -46,8 +46,8 @@ describe('useTestQuery', () => { Promise.resolve({ testResults: { results: [ - { group: 'a', count: 1, value: 10, hits: [] }, - { group: 'b', count: 2, value: 20, hits: [] }, + { group: 'a', count: 1, value: 10, hits: [], sourceFields: [] }, + { group: 'b', count: 2, value: 20, hits: [], sourceFields: [] }, ], truncated: false, }, diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts index 93b184f8552326..4e1abc5b52a5cb 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/types.ts @@ -17,6 +17,11 @@ export enum SearchType { esqlQuery = 'esqlQuery', } +export interface SourceField { + label: string; + searchPath: string; +} + export interface CommonRuleParams { size: number; thresholdComparator?: string; @@ -29,6 +34,7 @@ export interface CommonRuleParams { termSize?: number; termField?: string | string[]; excludeHitsFromPreviousRun: boolean; + sourceFields?: SourceField[]; } export interface CommonEsQueryRuleParams extends RuleTypeParams, CommonRuleParams {} diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts index 54363fe1010f3e..e665ac79088884 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.test.ts @@ -377,4 +377,27 @@ describe('expression params validation', () => { 'Threshold is required to be 0.' ); }); + + test('if sourceFields property is an array but has more than 5 items, should return proper error message', () => { + const sourceField = { label: 'test', searchPath: 'test' }; + const initialParams: EsQueryRuleParams = { + index: ['test'], + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + size: 100, + timeWindowSize: 1, + timeWindowUnit: 's', + threshold: [0], + timeField: '', + excludeHitsFromPreviousRun: true, + aggType: 'count', + groupBy: 'top', + termSize: 10, + termField: ['term'], + sourceFields: [sourceField, sourceField, sourceField, sourceField, sourceField, sourceField], + }; + expect(validateExpression(initialParams).errors.sourceFields.length).toBeGreaterThan(0); + expect(validateExpression(initialParams).errors.sourceFields[0]).toBe( + 'Cannot select more than 5 fields' + ); + }); }); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts index 5830a506a00732..59c5a4ff55e814 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/validation.ts @@ -14,7 +14,10 @@ import { builtInGroupByTypes, COMPARATORS, } from '@kbn/triggers-actions-ui-plugin/public'; -import { MAX_SELECTABLE_GROUP_BY_TERMS } from '../../../common/constants'; +import { + MAX_SELECTABLE_SOURCE_FIELDS, + MAX_SELECTABLE_GROUP_BY_TERMS, +} from '../../../common/constants'; import { EsQueryRuleParams, SearchType } from './types'; import { isEsqlQueryRule, isSearchSourceRule } from './util'; import { @@ -35,6 +38,7 @@ const validateCommonParams = (ruleParams: EsQueryRuleParams) => { groupBy, termSize, termField, + sourceFields, } = ruleParams; const errors: typeof COMMON_EXPRESSION_ERRORS = defaultsDeep({}, COMMON_EXPRESSION_ERRORS); @@ -149,6 +153,19 @@ const validateCommonParams = (ruleParams: EsQueryRuleParams) => { ); } + if ( + sourceFields && + Array.isArray(sourceFields) && + sourceFields.length > MAX_SELECTABLE_SOURCE_FIELDS + ) { + errors.sourceFields.push( + i18n.translate('xpack.stackAlerts.esqlQuery.ui.validation.error.sourceFields', { + defaultMessage: `Cannot select more than {max} fields`, + values: { max: MAX_SELECTABLE_SOURCE_FIELDS }, + }) + ); + } + return errors; }; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts index 33d7babe6b1b9f..aa8c7d1dbc0def 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.test.ts @@ -34,6 +34,7 @@ describe('addMessages', () => { conditions: 'count greater than 4', hits: [], link: 'link-mock', + sourceFields: [], }; const context = addMessages({ ruleName: '[rule-name]', @@ -67,6 +68,7 @@ describe('addMessages', () => { conditions: 'count not greater than 4', hits: [], link: 'link-mock', + sourceFields: [], }; const context = addMessages({ ruleName: '[rule-name]', @@ -101,6 +103,7 @@ describe('addMessages', () => { conditions: 'count between 4 and 5', hits: [], link: 'link-mock', + sourceFields: [], }; const context = addMessages({ ruleName: '[rule-name]', @@ -136,6 +139,7 @@ describe('addMessages', () => { conditions: `count for group "host-1" not greater than 4`, hits: [], link: 'link-mock', + sourceFields: [], }; const context = addMessages({ ruleName: '[rule-name]', @@ -172,6 +176,7 @@ describe('addMessages', () => { conditions: 'count greater than 4', hits: [], link: 'link-mock', + sourceFields: [], }; const context = addMessages({ ruleName: '[rule-name]', @@ -205,6 +210,7 @@ describe('addMessages', () => { conditions: 'count greater than 4', hits: [], link: 'link-mock', + sourceFields: [], }; const context = addMessages({ ruleName: '[rule-name]', @@ -238,6 +244,7 @@ describe('addMessages', () => { conditions: 'count greater than 4', hits: [], link: 'link-mock', + sourceFields: [], }; const context = addMessages({ ruleName: '[rule-name]', diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts index fe70914a9e7bd1..719d497a10236f 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/action_context.ts @@ -34,6 +34,7 @@ export interface EsQueryRuleActionContext extends AlertInstanceContext { // a link to see records that triggered the rule for Discover rule // a link which navigates to stack management in case of Elastic query rule link: string; + sourceFields: string[]; } interface AddMessagesOpts { diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts index 02ddc658b021f1..7ab974dc8d82bb 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.test.ts @@ -645,6 +645,7 @@ describe('es_query executor', () => { message: 'Document count is 0 in the last 5m. Alert when greater than or equal to 500.', title: "rule 'test-rule-name' recovered", value: 0, + sourceFields: [], }, payload: { 'kibana.alert.evaluation.conditions': @@ -705,6 +706,7 @@ describe('es_query executor', () => { 'Document count is 0 in the last 5m for host-1. Alert when greater than or equal to 200.', title: "rule 'test-rule-name' recovered", value: 0, + sourceFields: [], }, payload: { 'kibana.alert.evaluation.conditions': @@ -729,6 +731,7 @@ describe('es_query executor', () => { 'Document count is 0 in the last 5m for host-2. Alert when greater than or equal to 200.', title: "rule 'test-rule-name' recovered", value: 0, + sourceFields: [], }, payload: { 'kibana.alert.evaluation.conditions': @@ -783,6 +786,7 @@ describe('es_query executor', () => { message: 'Document count is 0 in the last 5m. Alert when greater than 0.', title: "rule 'test-rule-name' recovered", value: 0, + sourceFields: [], }, payload: { 'kibana.alert.evaluation.conditions': 'Query did NOT match documents', @@ -797,6 +801,87 @@ describe('es_query executor', () => { expect(mockSetLimitReached).toHaveBeenCalledTimes(1); expect(mockSetLimitReached).toHaveBeenCalledWith(false); }); + + it('should correctly handle alerts with sourceFields', async () => { + mockFetchEsQuery.mockResolvedValueOnce({ + parsedResults: { + results: [ + { + group: 'host-1', + count: 291, + hits: [], + sourceFields: { + 'host.hostname': ['host-1'], + 'host.id': ['1'], + 'host.name': ['host-1'], + }, + }, + ], + truncated: false, + }, + link: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + }); + await executor(coreMock, { + ...defaultExecutorOptions, + // @ts-expect-error + params: { + ...defaultProps, + threshold: [200], + thresholdComparator: '>=' as Comparator, + groupBy: 'top', + termSize: 10, + termField: 'host.name', + sourceFields: [ + { label: 'host.hostname', searchPath: 'host.hostname.keyword' }, + { label: 'host.id', searchPath: 'host.id.keyword' }, + { label: 'host.name', searchPath: 'host.name.keyword' }, + ], + }, + }); + + expect(mockReport).toHaveBeenCalledTimes(1); + expect(mockReport).toHaveBeenNthCalledWith(1, { + actionGroup: 'query matched', + context: { + conditions: + 'Number of matching documents for group "host-1" is greater than or equal to 200', + date: new Date(mockNow).toISOString(), + hits: [], + link: 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + message: + 'Document count is 291 in the last 5m for host-1. Alert when greater than or equal to 200.', + title: "rule 'test-rule-name' matched query for group host-1", + value: 291, + sourceFields: { + 'host.hostname': ['host-1'], + 'host.id': ['1'], + 'host.name': ['host-1'], + }, + }, + id: 'host-1', + state: { + dateEnd: new Date(mockNow).toISOString(), + dateStart: new Date(mockNow).toISOString(), + latestTimestamp: undefined, + }, + payload: { + 'kibana.alert.evaluation.conditions': + 'Number of matching documents for group "host-1" is greater than or equal to 200', + 'kibana.alert.evaluation.threshold': 200, + 'kibana.alert.evaluation.value': '291', + 'kibana.alert.reason': + 'Document count is 291 in the last 5m for host-1. Alert when greater than or equal to 200.', + 'kibana.alert.title': "rule 'test-rule-name' matched query for group host-1", + 'kibana.alert.url': + 'https://localhost:5601/app/management/insightsAndAlerting/triggersActions/rule/test-rule-id', + 'host.hostname': ['host-1'], + 'host.id': ['1'], + 'host.name': ['host-1'], + }, + }); + expect(mockSetLimitReached).toHaveBeenCalledTimes(1); + expect(mockSetLimitReached).toHaveBeenCalledWith(false); + }); }); describe('tryToParseAsDate', () => { diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts index 7d8d2df355c16c..5e23bf9498ec5e 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts @@ -136,6 +136,7 @@ export async function executor(core: CoreSetup, options: ExecutorOptions { expect(onValidate()).not.toThrow(); }); + it('fails for invalid sourceFields', async () => { + // no array that has more than 5 elements + const sourceField = { label: 'test', searchPath: 'test' }; + params.sourceFields = [ + sourceField, + sourceField, + sourceField, + sourceField, + sourceField, + sourceField, + ]; + expect(onValidate()).toThrow( + '[sourceFields]: array size is [6], but cannot be greater than [5]' + ); + }); + describe('esqlQuery search type', () => { beforeEach(() => { params = { ...DefaultParams, searchType: 'esqlQuery', esqlQuery: { esql: 'from test' } }; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts index d1f99b4e97b93d..73e8eae32cf9b2 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type_params.ts @@ -15,7 +15,10 @@ import { } from '@kbn/triggers-actions-ui-plugin/server'; import { RuleTypeState } from '@kbn/alerting-plugin/server'; import { SerializedSearchSourceFields } from '@kbn/data-plugin/common'; -import { MAX_SELECTABLE_GROUP_BY_TERMS } from '../../../common/constants'; +import { + MAX_SELECTABLE_SOURCE_FIELDS, + MAX_SELECTABLE_GROUP_BY_TERMS, +} from '../../../common/constants'; import { ComparatorFnNames } from '../../../common'; import { Comparator } from '../../../common/comparator_types'; import { getComparatorSchemaType } from '../lib/comparator'; @@ -96,6 +99,17 @@ const EsQueryRuleParamsSchemaProperties = { schema.object({ esql: schema.string({ minLength: 1 }) }), schema.never() ), + sourceFields: schema.maybe( + schema.arrayOf( + schema.object({ + label: schema.string(), + searchPath: schema.string(), + }), + { + maxSize: MAX_SELECTABLE_SOURCE_FIELDS, + } + ) + ), }; export const EsQueryRuleParamsSchema = schema.object(EsQueryRuleParamsSchemaProperties, { diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/render_app.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/render_app.tsx index 23e82f6f2c6dc8..d7f3b79ef53cbc 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/render_app.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/render_app.tsx @@ -11,11 +11,7 @@ import { i18n as i18nFormatter } from '@kbn/i18n'; import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { SyntheticsAppProps } from './contexts'; import { getIntegratedAppAvailability } from './utils/adapters'; -import { - DEFAULT_DARK_MODE, - DEFAULT_TIMEPICKER_QUICK_RANGES, - INTEGRATED_SOLUTIONS, -} from '../../../common/constants'; +import { DEFAULT_TIMEPICKER_QUICK_RANGES, INTEGRATED_SOLUTIONS } from '../../../common/constants'; import { SyntheticsApp } from './synthetics_app'; import { ClientPluginsSetup, ClientPluginsStart } from '../../plugin'; @@ -32,6 +28,7 @@ export function renderApp( docLinks, http: { basePath }, i18n, + theme, } = core; const { apm, infrastructure, logs } = getIntegratedAppAvailability( @@ -40,6 +37,7 @@ export function renderApp( ); const canSave = (capabilities.uptime.save ?? false) as boolean; // TODO: Determine for synthetics + const darkMode = theme.getTheme().darkMode; const props: SyntheticsAppProps = { isDev, @@ -49,7 +47,7 @@ export function renderApp( i18n, startPlugins, basePath: basePath.get(), - darkMode: core.uiSettings.get(DEFAULT_DARK_MODE), + darkMode, commonlyUsedRanges: core.uiSettings.get(DEFAULT_TIMEPICKER_QUICK_RANGES), isApmAvailable: apm, isInfraAvailable: infrastructure, diff --git a/x-pack/plugins/synthetics/public/hooks/use_base_chart_theme.ts b/x-pack/plugins/synthetics/public/hooks/use_base_chart_theme.ts index be10a050905e6a..413081b998aecf 100644 --- a/x-pack/plugins/synthetics/public/hooks/use_base_chart_theme.ts +++ b/x-pack/plugins/synthetics/public/hooks/use_base_chart_theme.ts @@ -7,10 +7,11 @@ import { DARK_THEME, LIGHT_THEME, Theme } from '@elastic/charts'; import { useMemo } from 'react'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +import { useDarkMode } from '@kbn/kibana-react-plugin/public'; export const useBaseChartTheme = (): Theme => { - const [darkMode] = useUiSetting$('theme:darkMode'); + const darkMode = useDarkMode(false); + return useMemo(() => { return darkMode ? DARK_THEME : LIGHT_THEME; }, [darkMode]); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/table/cell_renderer.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/table/cell_renderer.tsx index 520a9d69c4f2a5..6ac03f591eb5fa 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/table/cell_renderer.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/table/cell_renderer.tsx @@ -8,8 +8,8 @@ import { EuiDataGridCellValueElementProps } from '@elastic/eui'; import React, { useContext, useEffect } from 'react'; import { euiDarkVars as themeDark, euiLightVars as themeLight } from '@kbn/ui-theme'; +import { useDarkMode } from '@kbn/kibana-react-plugin/public'; import { useStyles } from './styles'; -import { useKibana } from '../../../../hooks/use_kibana'; import { Indicator } from '../../../../../common/types/indicator'; import { IndicatorFieldValue } from '../common/field_value'; import { IndicatorsTableContext } from '../../hooks/use_table_context'; @@ -25,11 +25,7 @@ export const cellRendererFactory = (from: number) => { throw new Error('this can only be used inside indicators table'); } - const { - services: { uiSettings }, - } = useKibana(); - - const darkMode = uiSettings.get('theme:darkMode'); + const darkMode = useDarkMode(); const { indicators, expanded } = indicatorsTableContext; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 1f97750f40911b..d47d3add7fd8ba 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -34810,7 +34810,6 @@ "xpack.securitySolution.entityAnalytics.hostsRiskDashboard.title": "Scores de risque de l'hôte", "xpack.securitySolution.entityAnalytics.riskDashboard.viewAllLabel": "Afficher tout", "xpack.securitySolution.entityAnalytics.technicalPreviewLabel": "Version d'évaluation technique", - "xpack.securitySolution.entityAnalytics.totalLabel": "Total", "xpack.securitySolution.entityAnalytics.usersRiskDashboard.title": "Scores de risque de l'utilisateur", "xpack.securitySolution.event.module.linkToElasticEndpointSecurityDescription": "Ouvrir dans Endpoint Security", "xpack.securitySolution.event.summary.threat_indicator.modal.allMatches": "Toutes les correspondances d'indicateur", @@ -35969,7 +35968,6 @@ "xpack.securitySolution.riskScore.errorPanel.errors": "Erreurs", "xpack.securitySolution.riskScore.errorPanel.message": "Un problème est survenu. Réessayez plus tard.", "xpack.securitySolution.riskScore.errorPanel.title": "Désolé, une erreur est survenue.", - "xpack.securitySolution.riskScore.errorSearchDescription": "Une erreur s'est produite sur la recherche du score de risque", "xpack.securitySolution.riskScore.failSearchDescription": "Impossible de lancer une recherche sur le score de risque", "xpack.securitySolution.riskScore.hostRiskScoresEnabledTitle": "Scores de risque de l'hôte activés", "xpack.securitySolution.riskScore.hostsDashboardWarningPanelBody": "Nous n’avons pas trouvé de données de score de risque de l’hôte. Vérifiez si vous avez des filtres globaux dans la barre de recherche KQL globale. Si vous venez d’activer le module de risque de l’hôte, le moteur de risque peut mettre une heure à générer les données de score de risque de l’hôte et les afficher dans ce panneau.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 0bcc41300dc7b5..71ebe72b930256 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -34809,7 +34809,6 @@ "xpack.securitySolution.entityAnalytics.hostsRiskDashboard.title": "ホストリスクスコア", "xpack.securitySolution.entityAnalytics.riskDashboard.viewAllLabel": "すべて表示", "xpack.securitySolution.entityAnalytics.technicalPreviewLabel": "テクニカルプレビュー", - "xpack.securitySolution.entityAnalytics.totalLabel": "合計", "xpack.securitySolution.entityAnalytics.usersRiskDashboard.title": "ユーザーリスクスコア", "xpack.securitySolution.event.module.linkToElasticEndpointSecurityDescription": "Endpoint Securityで開く", "xpack.securitySolution.event.summary.threat_indicator.modal.allMatches": "すべてのインジケーター一致", @@ -35968,7 +35967,6 @@ "xpack.securitySolution.riskScore.errorPanel.errors": "エラー", "xpack.securitySolution.riskScore.errorPanel.message": "何か問題が発生しましたしばらくたってから再試行してください。", "xpack.securitySolution.riskScore.errorPanel.title": "申し訳ございません、エラーが発生しました", - "xpack.securitySolution.riskScore.errorSearchDescription": "リスクスコア検索でエラーが発生しました", "xpack.securitySolution.riskScore.failSearchDescription": "リスクスコアで検索を実行できませんでした", "xpack.securitySolution.riskScore.hostRiskScoresEnabledTitle": "ホストリスクスコア有効", "xpack.securitySolution.riskScore.hostsDashboardWarningPanelBody": "ホストリスクスコアデータが見つかりません。グローバルKQL検索バーにグローバルフィルターがあるかどうかを確認してください。ホストリスクモジュールを有効にしたばかりの場合は、リスクエンジンがホストリスクスコアデータを生成し、このパネルに表示するまでに1時間かかることがあります。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9e283e2a5fe0bb..ff583c718ddf8b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -34804,7 +34804,6 @@ "xpack.securitySolution.entityAnalytics.hostsRiskDashboard.title": "主机风险分数", "xpack.securitySolution.entityAnalytics.riskDashboard.viewAllLabel": "查看全部", "xpack.securitySolution.entityAnalytics.technicalPreviewLabel": "技术预览", - "xpack.securitySolution.entityAnalytics.totalLabel": "合计", "xpack.securitySolution.entityAnalytics.usersRiskDashboard.title": "用户风险分数", "xpack.securitySolution.event.module.linkToElasticEndpointSecurityDescription": "在 Endpoint Security 中打开", "xpack.securitySolution.event.summary.threat_indicator.modal.allMatches": "所有指标匹配", @@ -35963,7 +35962,6 @@ "xpack.securitySolution.riskScore.errorPanel.errors": "错误", "xpack.securitySolution.riskScore.errorPanel.message": "出问题了。请稍后重试。", "xpack.securitySolution.riskScore.errorPanel.title": "抱歉,有错误", - "xpack.securitySolution.riskScore.errorSearchDescription": "搜索风险分数时发生错误", "xpack.securitySolution.riskScore.failSearchDescription": "无法对风险分数执行搜索", "xpack.securitySolution.riskScore.hostRiskScoresEnabledTitle": "已启用主机风险分数", "xpack.securitySolution.riskScore.hostsDashboardWarningPanelBody": "找不到任何主机风险分数数据。检查全局 KQL 搜索栏中是否具有任何全局筛选。如果刚刚启用了主机风险模块,风险引擎可能需要一小时才能生成并在此面板中显示主机风险分数数据。", diff --git a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts index 1925954ea7bb9d..08c43eb9f8c0fb 100644 --- a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts +++ b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts @@ -919,4 +919,142 @@ describe('buildAgg', () => { }, }); }); + + it('should correctly apply the sourceFieldsParams if specified', async () => { + expect( + buildAggregation({ + timeSeries: { + timeField: 'time-field', + timeWindowSize: 5, + timeWindowUnit: 'm', + dateStart: '2021-04-22T15:19:31Z', + dateEnd: '2021-04-22T15:20:31Z', + interval: '1m', + }, + aggType: 'count', + aggField: undefined, + termField: 'the-term', + termSize: 100, + condition: { + conditionScript: `params.compareValue > 1`, + }, + sourceFieldsParams: [ + { label: 'host.hostname', searchPath: 'host.hostname.keyword' }, + { label: 'host.id', searchPath: 'host.id.keyword' }, + { label: 'host.name', searchPath: 'host.name.keyword' }, + ], + }) + ).toEqual({ + groupAgg: { + terms: { + field: 'the-term', + size: 100, + }, + aggs: { + conditionSelector: { + bucket_selector: { + buckets_path: { + compareValue: '_count', + }, + script: `params.compareValue > 1`, + }, + }, + dateAgg: { + date_range: { + field: 'time-field', + format: 'strict_date_time', + ranges: [ + { + from: '2021-04-22T15:14:31.000Z', + to: '2021-04-22T15:19:31.000Z', + }, + { + from: '2021-04-22T15:15:31.000Z', + to: '2021-04-22T15:20:31.000Z', + }, + ], + }, + }, + 'host.hostname': { + terms: { + field: 'host.hostname.keyword', + size: 10, + }, + }, + 'host.id': { + terms: { + field: 'host.id.keyword', + size: 10, + }, + }, + 'host.name': { + terms: { + field: 'host.name.keyword', + size: 10, + }, + }, + }, + }, + groupAggCount: { + stats_bucket: { + buckets_path: 'groupAgg._count', + }, + }, + }); + }); + + it('should correctly apply the sourceFieldsParams if specified on a grouped query', async () => { + expect( + buildAggregation({ + aggType: 'avg', + aggField: 'event.duration', + termField: 'event.action', + termSize: 10, + sourceFieldsParams: [{ label: 'event.provider', searchPath: 'event.provider' }], + condition: { resultLimit: 1000, conditionScript: 'params.compareValue > -1L' }, + topHitsSize: 100, + }) + ).toEqual({ + groupAgg: { + aggs: { + conditionSelector: { + bucket_selector: { + buckets_path: { + compareValue: 'metricAgg', + }, + script: 'params.compareValue > -1L', + }, + }, + 'event.provider': { + terms: { + field: 'event.provider', + size: 10, + }, + }, + metricAgg: { + avg: { + field: 'event.duration', + }, + }, + topHitsAgg: { + top_hits: { + size: 100, + }, + }, + }, + terms: { + field: 'event.action', + order: { + metricAgg: 'desc', + }, + size: 10, + }, + }, + groupAggCount: { + stats_bucket: { + buckets_path: 'groupAgg._count', + }, + }, + }); + }); }); diff --git a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts index 2c6ccac04c638e..dfb141554a9fd8 100644 --- a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts +++ b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts @@ -20,6 +20,7 @@ export interface BuildAggregationOpts { aggField?: string; termSize?: number; termField?: string | string[]; + sourceFieldsParams?: Array<{ label: string; searchPath: string }>; topHitsSize?: number; condition?: { resultLimit?: number; @@ -30,6 +31,7 @@ export interface BuildAggregationOpts { export const BUCKET_SELECTOR_PATH_NAME = 'compareValue'; export const BUCKET_SELECTOR_FIELD = `params.${BUCKET_SELECTOR_PATH_NAME}`; export const DEFAULT_GROUPS = 100; +export const MAX_SOURCE_FIELDS_TO_COPY = 10; export const isCountAggregation = (aggType: string) => aggType === 'count'; export const isGroupAggregation = (termField?: string | string[]) => !!termField; @@ -40,6 +42,7 @@ export const buildAggregation = ({ aggField, termField, termSize, + sourceFieldsParams, condition, topHitsSize, }: BuildAggregationOpts): Record => { @@ -126,10 +129,21 @@ export const buildAggregation = ({ }, }; } - aggParent = aggParent.aggs.groupAgg; } + // add sourceField aggregations + if (sourceFieldsParams && sourceFieldsParams.length > 0) { + sourceFieldsParams.forEach((field) => { + aggParent.aggs = { + ...aggParent.aggs, + [field.label]: { + terms: { field: field.searchPath, size: MAX_SOURCE_FIELDS_TO_COPY }, + }, + }; + }); + } + // next, add the time window aggregation if (isDateAgg) { aggParent.aggs = { diff --git a/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.test.ts b/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.test.ts index e0935326368f84..e22d4959c6093b 100644 --- a/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.test.ts +++ b/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.test.ts @@ -62,6 +62,50 @@ const sampleHit = { sort: [1668020234918], }; +const sampleSourceFieldsHit = { + _index: 'test-data', + _id: '6S04F4wBEMHmjvc_YPJ_', + _score: null, + _source: { + '@timestamp': '2023-11-27T10:00:00', + host: { id: '1', name: 'host-1', hostname: 'host-1' }, + }, + fields: { '@timestamp': ['2023-11-27T10:00:00.000Z'] }, + sort: ['2023-11-27T10:00:00.000Z'], +}; + +const sampleAggregations = { + 'host.name': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: 'host-1', doc_count: 5 }], + }, + 'host.hostname': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: 'host-1', doc_count: 5 }], + }, + 'host.id': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: '1', doc_count: 5 }], + }, +}; + +const sampleEsqlSourceFieldsHit = { + _id: 'esql_query_document', + _index: '', + _source: { + '@timestamp': '2023-11-27T10:00:00.000Z', + 'host.hostname': 'host-1', + 'host.hostname.keyword': 'host-1', + 'host.id': '1', + 'host.id.keyword': '1', + 'host.name': 'host-1', + 'host.name.keyword': 'host-1', + }, +}; + describe('parseAggregationResults', () => { it('correctly parses results for count over all', () => { expect( @@ -85,6 +129,7 @@ describe('parseAggregationResults', () => { group: 'all documents', count: 491, hits: [sampleHit], + sourceFields: {}, }, ], truncated: false, @@ -137,26 +182,31 @@ describe('parseAggregationResults', () => { group: 'execute', count: 120, hits: [], + sourceFields: {}, }, { group: 'execute-start', count: 120, hits: [], + sourceFields: {}, }, { group: 'active-instance', count: 100, hits: [], + sourceFields: {}, }, { group: 'execute-action', count: 100, hits: [], + sourceFields: {}, }, { group: 'new-instance', count: 100, hits: [], + sourceFields: {}, }, ], truncated: false, @@ -259,26 +309,31 @@ describe('parseAggregationResults', () => { group: 'execute', count: 120, hits: [sampleHit], + sourceFields: {}, }, { group: 'execute-start', count: 120, hits: [sampleHit], + sourceFields: {}, }, { group: 'active-instance', count: 100, hits: [sampleHit], + sourceFields: {}, }, { group: 'execute-action', count: 100, hits: [sampleHit], + sourceFields: {}, }, { group: 'new-instance', count: 100, hits: [sampleHit], + sourceFields: {}, }, ], truncated: false, @@ -309,6 +364,7 @@ describe('parseAggregationResults', () => { hits: [sampleHit], count: 643, value: 3578195238.095238, + sourceFields: {}, }, ], truncated: false, @@ -377,30 +433,35 @@ describe('parseAggregationResults', () => { count: 120, hits: [], value: null, + sourceFields: {}, }, { group: 'execute-start', count: 139, hits: [], value: null, + sourceFields: {}, }, { group: 'starting', count: 1, hits: [], value: null, + sourceFields: {}, }, { group: 'recovered-instance', count: 120, hits: [], value: 12837500000, + sourceFields: {}, }, { group: 'execute', count: 139, hits: [], value: 137647482.0143885, + sourceFields: {}, }, ], truncated: false, @@ -519,30 +580,35 @@ describe('parseAggregationResults', () => { count: 120, hits: [sampleHit], value: null, + sourceFields: {}, }, { group: 'execute-start', count: 139, hits: [sampleHit], value: null, + sourceFields: {}, }, { group: 'starting', count: 1, hits: [sampleHit], value: null, + sourceFields: {}, }, { group: 'recovered-instance', count: 120, hits: [sampleHit], value: 12837500000, + sourceFields: {}, }, { group: 'execute', count: 139, hits: [sampleHit], value: 137647482.0143885, + sourceFields: {}, }, ], truncated: false, @@ -599,19 +665,191 @@ describe('parseAggregationResults', () => { group: 'execute', count: 120, hits: [], + sourceFields: {}, }, { group: 'execute-start', count: 120, hits: [], + sourceFields: {}, }, { group: 'active-instance', count: 100, hits: [], + sourceFields: {}, }, ], truncated: true, }); }); + + it('correctly parses results for count with source fields', () => { + expect( + parseAggregationResults({ + isCountAgg: true, + isGroupAgg: false, + esResult: { + took: 1, + timed_out: false, + _shards: { total: 1, successful: 1, skipped: 0, failed: 0 }, + hits: { + total: 491, + max_score: null, + hits: [sampleSourceFieldsHit], + }, + aggregations: sampleAggregations, + }, + resultLimit: 1000, + sourceFieldsParams: [ + { label: 'host.hostname', searchPath: 'host.hostname.keyword' }, + { label: 'host.id', searchPath: 'host.id.keyword' }, + { label: 'host.name', searchPath: 'host.name.keyword' }, + ], + }) + ).toEqual({ + results: [ + { + group: 'all documents', + count: 491, + hits: [sampleSourceFieldsHit], + sourceFields: { + 'host.hostname': ['host-1'], + 'host.id': ['1'], + 'host.name': ['host-1'], + }, + }, + ], + truncated: false, + }); + }); + + it('correctly parses results for aggregate metric with source fields', () => { + expect( + parseAggregationResults({ + isCountAgg: true, + isGroupAgg: true, + esResult: { + took: 7, + timed_out: false, + _shards: { total: 4, successful: 1, skipped: 0, failed: 0 }, + hits: { total: { value: 4, relation: 'eq' }, max_score: null, hits: [] }, + aggregations: { + groupAgg: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'host-1', + doc_count: 4, + topHitsAgg: { + hits: { + total: { value: 4, relation: 'eq' }, + max_score: 0, + hits: [ + sampleSourceFieldsHit, + sampleSourceFieldsHit, + sampleSourceFieldsHit, + sampleSourceFieldsHit, + ], + }, + }, + 'host.name': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: 'host-1', doc_count: 4 }], + }, + 'host.hostname': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: 'host-1', doc_count: 4 }], + }, + 'host.id': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: '1', doc_count: 4 }], + }, + }, + ], + }, + groupAggCount: { count: 1, min: 4, max: 4, avg: 4, sum: 4 }, + }, + }, + resultLimit: 1000, + sourceFieldsParams: [ + { label: 'host.hostname', searchPath: 'host.hostname.keyword' }, + { label: 'host.id', searchPath: 'host.id.keyword' }, + { label: 'host.name', searchPath: 'host.name.keyword' }, + ], + }) + ).toEqual({ + results: [ + { + group: 'host-1', + hits: [ + sampleSourceFieldsHit, + sampleSourceFieldsHit, + sampleSourceFieldsHit, + sampleSourceFieldsHit, + ], + count: 4, + sourceFields: { + 'host.hostname': ['host-1'], + 'host.id': ['1'], + 'host.name': ['host-1'], + }, + }, + ], + truncated: false, + }); + }); + + it('correctly parses results for count with source fields and generateSourceFieldsFromHits = true', () => { + expect( + parseAggregationResults({ + isCountAgg: true, + isGroupAgg: false, + esResult: { + took: 0, + timed_out: false, + _shards: { total: 0, successful: 0, skipped: 0, failed: 0 }, + hits: { + total: 4, + hits: [ + sampleEsqlSourceFieldsHit, + sampleEsqlSourceFieldsHit, + sampleEsqlSourceFieldsHit, + sampleEsqlSourceFieldsHit, + ], + }, + }, + resultLimit: 1000, + sourceFieldsParams: [ + { label: 'host.hostname', searchPath: 'host.hostname.keyword' }, + { label: 'host.id', searchPath: 'host.id.keyword' }, + { label: 'host.name', searchPath: 'host.name.keyword' }, + ], + generateSourceFieldsFromHits: true, + }) + ).toEqual({ + results: [ + { + group: 'all documents', + count: 4, + hits: [ + sampleEsqlSourceFieldsHit, + sampleEsqlSourceFieldsHit, + sampleEsqlSourceFieldsHit, + sampleEsqlSourceFieldsHit, + ], + sourceFields: { + 'host.hostname': ['host-1'], + 'host.id': ['1'], + 'host.name': ['host-1'], + }, + }, + ], + truncated: false, + }); + }); }); diff --git a/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.ts b/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.ts index 5c1f5ecba90c52..6fe7040abacc34 100644 --- a/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.ts +++ b/x-pack/plugins/triggers_actions_ui/common/data/lib/parse_aggregation_results.ts @@ -17,6 +17,7 @@ export interface ParsedAggregationGroup { group: string; count: number; hits: Array>; + sourceFields: string[]; value?: number; } @@ -30,12 +31,16 @@ interface ParseAggregationResultsOpts { isGroupAgg: boolean; esResult: SearchResponse; resultLimit?: number; + sourceFieldsParams?: Array<{ label: string; searchPath: string }>; + generateSourceFieldsFromHits?: boolean; } export const parseAggregationResults = ({ isCountAgg, isGroupAgg, esResult, resultLimit, + sourceFieldsParams = [], + generateSourceFieldsFromHits = false, }: ParseAggregationResultsOpts): ParsedAggregationResults => { const aggregations = esResult?.aggregations || {}; @@ -51,6 +56,7 @@ export const parseAggregationResults = ({ hits: esResult.hits.hits ?? [], }, }, + ...aggregations, // sourceFields ...(!isCountAgg ? { metricAgg: { @@ -77,11 +83,32 @@ export const parseAggregationResults = ({ if (resultLimit && results.results.length === resultLimit) break; const groupName: string = `${groupBucket?.key}`; + const sourceFields: { [key: string]: string[] } = {}; + + sourceFieldsParams.forEach((field) => { + if (generateSourceFieldsFromHits) { + const fieldsSet = new Set(); + groupBucket.topHitsAgg.hits.hits.forEach((hit: SearchHit<{ [key: string]: string }>) => { + if (hit._source && hit._source[field.label]) { + fieldsSet.add(hit._source[field.label]); + } + }); + sourceFields[field.label] = Array.from(fieldsSet); + } else { + if (groupBucket[field.label]?.buckets && groupBucket[field.label].buckets.length > 0) { + sourceFields[field.label] = groupBucket[field.label].buckets.map( + (bucket: { doc_count: number; key: string | number }) => bucket.key + ); + } + } + }); + const groupResult: any = { group: groupName, count: groupBucket?.doc_count, hits: groupBucket?.topHitsAgg?.hits?.hits ?? [], ...(!isCountAgg ? { value: groupBucket?.metricAgg?.value } : {}), + sourceFields, }; results.results.push(groupResult); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx index 62eaf684e97dad..585f65954254ae 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx @@ -11,7 +11,6 @@ import { Router, Routes, Route } from '@kbn/shared-ux-router'; import { ChromeBreadcrumb, CoreStart, CoreTheme, ScopedHistory } from '@kbn/core/public'; import { render, unmountComponentAtNode } from 'react-dom'; import { I18nProvider } from '@kbn/i18n-react'; -import useObservable from 'react-use/lib/useObservable'; import { Observable } from 'rxjs'; import { KibanaFeature } from '@kbn/features-plugin/common'; import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; @@ -86,17 +85,17 @@ export const renderApp = (deps: TriggersAndActionsUiServices) => { }; export const App = ({ deps }: { deps: TriggersAndActionsUiServices }) => { - const { dataViews, uiSettings, theme$ } = deps; + const { dataViews, theme } = deps; const sections: Section[] = ['rules', 'logs', 'alerts']; - const isDarkMode = useObservable(uiSettings.get$('theme:darkMode')); + const isDarkMode = theme.getTheme().darkMode; const sectionsRegex = sections.join('|'); setDataViewsService(dataViews); return ( - - + + diff --git a/x-pack/plugins/triggers_actions_ui/public/application/connectors_app.tsx b/x-pack/plugins/triggers_actions_ui/public/application/connectors_app.tsx index 876c8a26b00ec7..089908dcbbdbcc 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/connectors_app.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/connectors_app.tsx @@ -11,7 +11,6 @@ import { Router, Routes, Route } from '@kbn/shared-ux-router'; import { ChromeBreadcrumb, CoreStart, CoreTheme, ScopedHistory } from '@kbn/core/public'; import { render, unmountComponentAtNode } from 'react-dom'; import { I18nProvider } from '@kbn/i18n-react'; -import useObservable from 'react-use/lib/useObservable'; import { Observable } from 'rxjs'; import { KibanaFeature } from '@kbn/features-plugin/common'; import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; @@ -74,8 +73,8 @@ export const renderApp = (deps: TriggersAndActionsUiServices) => { }; export const App = ({ deps }: { deps: TriggersAndActionsUiServices }) => { - const { dataViews, uiSettings, theme$ } = deps; - const isDarkMode = useObservable(uiSettings.get$('theme:darkMode')); + const { dataViews, theme } = deps; + const isDarkMode = theme.getTheme().darkMode; const sections: Section[] = ['connectors', 'logs']; const sectionsRegex = sections.join('|'); @@ -83,7 +82,7 @@ export const App = ({ deps }: { deps: TriggersAndActionsUiServices }) => { return ( - + diff --git a/x-pack/plugins/triggers_actions_ui/public/application/constants/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/constants/index.ts index bf4cafcf63da96..649af1c9fa07a8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/constants/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/constants/index.ts @@ -6,7 +6,11 @@ */ import { i18n } from '@kbn/i18n'; -import { ES_QUERY_ID, OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; +import { + ES_QUERY_ID, + OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, +} from '@kbn/rule-data-utils'; export { BASE_ALERTING_API_PATH, INTERNAL_BASE_ALERTING_API_PATH, @@ -120,4 +124,8 @@ export const GLOBAL_CONNECTOR_EXECUTION_DEFAULT_INITIAL_VISIBLE_COLUMNS = [ ...CONNECTOR_LOCKED_COLUMNS, ]; -export const MULTI_CONSUMER_RULE_TYPE_IDS = [OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, ES_QUERY_ID]; +export const MULTI_CONSUMER_RULE_TYPE_IDS = [ + OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + ES_QUERY_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, +]; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx index 7f6a45c7d99926..07264709dd5448 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx @@ -315,6 +315,7 @@ const RuleAdd = ({ onChangeMetaData={onChangeMetaData} setConsumer={setSelectedConsumer} useRuleProducer={useRuleProducer} + initialSelectedConsumer={initialSelectedConsumer} /> > { validConsumers?: RuleCreationValidConsumer[]; onChangeMetaData: (metadata: MetaData) => void; useRuleProducer?: boolean; + initialSelectedConsumer?: RuleCreationValidConsumer | null; } const EMPTY_ARRAY: string[] = []; @@ -183,6 +184,7 @@ export const RuleForm = ({ validConsumers, onChangeMetaData, useRuleProducer, + initialSelectedConsumer, }: RuleFormProps) => { const { notifications: { toasts }, @@ -818,6 +820,7 @@ export const RuleForm = ({ onChange={setConsumer} errors={errors} selectedConsumer={selectedConsumer} + initialSelectedConsumer={initialSelectedConsumer} /> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form_consumer_selection.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form_consumer_selection.test.tsx index 324e9a290e8316..bec46c682919b8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form_consumer_selection.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form_consumer_selection.test.tsx @@ -41,6 +41,71 @@ describe('RuleFormConsumerSelectionModal', () => { expect(screen.getByText('Stack Rules')).toBeInTheDocument(); }); + it('should be able to initialize to the prop initialSelectedConsumer', () => { + render( + + ); + expect(mockOnChange).toHaveBeenLastCalledWith('logs'); + }); + + it('should NOT initialize if initialSelectedConsumer is equal to null', () => { + render( + + ); + expect(mockOnChange).not.toBeCalled(); + }); + + it('should initialize to the first valid consumers if initialSelectedConsumer is not valid', () => { + render( + + ); + expect(mockOnChange).toHaveBeenLastCalledWith('logs'); + }); + + it('should initialize to stackAlerts if the initialSelectedConsumer is not a valid and consumers has stackAlerts', () => { + render( + + ); + expect(mockOnChange).toHaveBeenLastCalledWith('stackAlerts'); + }); + + it('should initialize to stackAlerts if the initialSelectedConsumer is undefined and consumers has stackAlerts', () => { + render( + + ); + expect(mockOnChange).toHaveBeenLastCalledWith('stackAlerts'); + }); + it('should be able to select infrastructure and call onChange', () => { render( void; errors: IErrorObject; - selectedConsumer: RuleCreationValidConsumer | null | undefined; + selectedConsumer?: RuleCreationValidConsumer | null; + /* FUTURE ENGINEER + * if this prop is set to null then we wont initialize the value and the user will have to set it + * if this prop is set to a valid consumers then we will set it up to what was passed + * if this prop is not valid or undefined but the valid consumers has stackAlerts then we will default it to stackAlerts + */ + initialSelectedConsumer?: RuleCreationValidConsumer | null; } const SINGLE_SELECTION = { asPlainText: true }; export const RuleFormConsumerSelection = (props: RuleFormConsumerSelectionProps) => { - const { consumers, errors, onChange, selectedConsumer } = props; + const { consumers, errors, onChange, selectedConsumer, initialSelectedConsumer } = props; const isInvalid = errors?.consumer?.length > 0; const handleOnChange = useCallback( (selected: Array>) => { @@ -123,13 +130,18 @@ export const RuleFormConsumerSelection = (props: RuleFormConsumerSelectionProps) }, [consumers]); useEffect(() => { - // At initialization, select Stack Alerts, or the first value + // At initialization, select initialSelectedConsumer or the first value if (!validatedSelectedConsumer) { - if (consumers.includes(STACK_ALERTS_FEATURE_ID)) { + if (initialSelectedConsumer === null) { + return; + } else if (initialSelectedConsumer && consumers.includes(initialSelectedConsumer)) { + onChange(initialSelectedConsumer); + return; + } else if (consumers.includes(STACK_ALERTS_FEATURE_ID)) { onChange(STACK_ALERTS_FEATURE_ID); return; } - onChange(consumers[0] as RuleCreationValidConsumer); + onChange(consumers[0]); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.tsx index fe6ba4b9ab91aa..61d9fb7133f65f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.tsx @@ -41,6 +41,7 @@ import { RuleLastRunOutcomeValues, } from '@kbn/alerting-plugin/common'; import { + RuleCreationValidConsumer, ruleDetailsRoute as commonRuleDetailsRoute, STACK_ALERTS_FEATURE_ID, } from '@kbn/rule-data-utils'; @@ -136,6 +137,7 @@ export interface RulesListProps { onTypeFilterChange?: (type: string[]) => void; onRefresh?: (refresh: Date) => void; setHeaderActions?: (components?: React.ReactNode[]) => void; + initialSelectedConsumer?: RuleCreationValidConsumer | null; } export const percentileFields = { @@ -176,6 +178,7 @@ export const RulesList = ({ onTypeFilterChange, onRefresh, setHeaderActions, + initialSelectedConsumer = STACK_ALERTS_FEATURE_ID, }: RulesListProps) => { const history = useHistory(); const kibanaServices = useKibana().services; @@ -1007,7 +1010,7 @@ export const RulesList = ({ ruleTypeRegistry={ruleTypeRegistry} ruleTypeIndex={ruleTypesState.data} onSave={refreshRules} - initialSelectedConsumer={STACK_ALERTS_FEATURE_ID} + initialSelectedConsumer={initialSelectedConsumer} /> )} diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/deprecation_logging_toggle/_deprecation_logging_toggle.scss b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/deprecation_logging_toggle/_deprecation_logging_toggle.scss index abcc87b75cd081..e8b6ec06ed7c99 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/deprecation_logging_toggle/_deprecation_logging_toggle.scss +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/deprecation_logging_toggle/_deprecation_logging_toggle.scss @@ -3,5 +3,5 @@ // them. With this selector we offset the difference so that the content // of the page doesnt jump when toggling between states. .upgToggleLoading > .upgLoadingItem { - margin: calc($euiSizeM / 2); + margin: $euiSizeM / 2; } diff --git a/x-pack/plugins/uptime/public/legacy_uptime/app/render_app.tsx b/x-pack/plugins/uptime/public/legacy_uptime/app/render_app.tsx index d0c6a2f550e4eb..1a9d5aac398abe 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/app/render_app.tsx +++ b/x-pack/plugins/uptime/public/legacy_uptime/app/render_app.tsx @@ -10,11 +10,7 @@ import ReactDOM from 'react-dom'; import { i18n as i18nFormatter } from '@kbn/i18n'; import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { getIntegratedAppAvailability } from '../lib/adapters/framework/capabilities_adapter'; -import { - DEFAULT_DARK_MODE, - DEFAULT_TIMEPICKER_QUICK_RANGES, - INTEGRATED_SOLUTIONS, -} from '../../../common/constants'; +import { DEFAULT_TIMEPICKER_QUICK_RANGES, INTEGRATED_SOLUTIONS } from '../../../common/constants'; import { UptimeApp, UptimeAppProps } from './uptime_app'; import { ClientPluginsSetup, ClientPluginsStart } from '../../plugin'; @@ -31,6 +27,7 @@ export function renderApp( docLinks, http: { basePath }, i18n, + theme, } = core; const { apm, infrastructure, logs } = getIntegratedAppAvailability( @@ -39,6 +36,7 @@ export function renderApp( ); const canSave = (capabilities.uptime.save ?? false) as boolean; + const darkMode = theme.getTheme().darkMode; const props: UptimeAppProps = { isDev, @@ -48,7 +46,7 @@ export function renderApp( i18n, startPlugins, basePath: basePath.get(), - darkMode: core.uiSettings.get(DEFAULT_DARK_MODE), + darkMode, commonlyUsedRanges: core.uiSettings.get(DEFAULT_TIMEPICKER_QUICK_RANGES), isApmAvailable: apm, isInfraAvailable: infrastructure, diff --git a/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap b/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap index acf41bdf93448f..6f9a8644bb706c 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap +++ b/x-pack/plugins/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap @@ -204,6 +204,19 @@ exports[`DonutChart component passes correct props without errors for valid prop "visible": true, }, }, + "bulletGraph": Object { + "angularTickLabelPadding": 10, + "barBackground": "#343741", + "border": "#EDF0F5", + "colorBands": Array [ + "#D9C6EF", + "#AA87D1", + ], + "fallbackBandColor": "#98A2B3", + "minHeight": 64, + "nonFiniteText": "N/A", + "textColor": "#343741", + }, "chartMargins": Object { "bottom": 0, "left": 0, @@ -523,7 +536,7 @@ exports[`DonutChart component passes correct props without errors for valid prop "tooltip": Object { "defaultDotColor": "black", "maxTableHeight": 120, - "maxWidth": 260, + "maxWidth": 500, }, } } diff --git a/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_base_chart_theme.ts b/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_base_chart_theme.ts index f8cb8dfd4134f9..007d463c63e1b0 100644 --- a/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_base_chart_theme.ts +++ b/x-pack/plugins/uptime/public/legacy_uptime/hooks/use_base_chart_theme.ts @@ -6,11 +6,11 @@ */ import { useMemo } from 'react'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +import { useDarkMode } from '@kbn/kibana-react-plugin/public'; import { DARK_THEME, LIGHT_THEME, Theme } from '@elastic/charts'; export const useBaseChartTheme = (): Theme => { - const [darkMode] = useUiSetting$('theme:darkMode'); + const darkMode = useDarkMode(); return useMemo(() => { return darkMode ? DARK_THEME : LIGHT_THEME; }, [darkMode]); diff --git a/x-pack/plugins/ux/public/application/ux_app.tsx b/x-pack/plugins/ux/public/application/ux_app.tsx index aae803dec162a5..e8fdbb96b5e7ba 100644 --- a/x-pack/plugins/ux/public/application/ux_app.tsx +++ b/x-pack/plugins/ux/public/application/ux_app.tsx @@ -23,7 +23,7 @@ import { import { KibanaContextProvider, KibanaThemeProvider, - useUiSetting$, + useDarkMode, } from '@kbn/kibana-react-plugin/public'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; @@ -66,10 +66,9 @@ export const uxRoutes: RouteDefinition[] = [ ]; function UxApp() { - const [darkMode] = useUiSetting$('theme:darkMode'); - const { http } = useKibanaServices(); const basePath = http.basePath.get(); + const darkMode = useDarkMode(false); useBreadcrumbs([ { diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts index 90998bc55623b2..d2f29896575833 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts @@ -6,6 +6,7 @@ */ import moment from 'moment'; +import { omit } from 'lodash'; import { cleanup, generate } from '@kbn/infra-forge'; import { Aggregators, @@ -14,6 +15,7 @@ import { import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/constants'; import expect from '@kbn/expect'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; +import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import { createIndexConnector, createRule } from '../helpers/alerting_api_helper'; import { waitForAlertInIndex, @@ -21,7 +23,8 @@ import { waitForRuleStatus, } from '../helpers/alerting_wait_for_helpers'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { ActionDocument } from './typings'; +import { ActionDocument, LogExplorerLocatorParsedParams } from './typings'; +import { ISO_DATE_REGEX } from './constants'; // eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { @@ -35,12 +38,12 @@ export default function ({ getService }: FtrProviderContext) { const ALERT_ACTION_INDEX = 'alert-action-threshold'; // DATE_VIEW should match the index template: // x-pack/packages/kbn-infra-forge/src/data_sources/composable/template.json - const DATE_VIEW = 'kbn-data-forge-fake_hosts'; + const DATE_VIEW_TITLE = 'kbn-data-forge-fake_hosts'; const DATE_VIEW_NAME = 'ad-hoc-data-view-name'; const DATA_VIEW_ID = 'data-view-id'; const MOCKED_AD_HOC_DATA_VIEW = { id: DATA_VIEW_ID, - title: DATE_VIEW, + title: DATE_VIEW_TITLE, timeFieldName: '@timestamp', sourceFilters: [], fieldFormats: {}, @@ -122,6 +125,7 @@ export default function ({ getService }: FtrProviderContext) { reason: '{{context.reason}}', value: '{{context.value}}', host: '{{context.host}}', + viewInAppUrl: '{{context.viewInAppUrl}}', }, ], }, @@ -218,6 +222,18 @@ export default function ({ getService }: FtrProviderContext) { `Average system.cpu.user.pct is 250%, above the threshold of 50%. (duration: 5 mins, data view: ${DATE_VIEW_NAME})` ); expect(resp.hits.hits[0]._source?.value).eql('250%'); + + const parsedViewInAppUrl = parseSearchParams( + new URL(resp.hits.hits[0]._source?.viewInAppUrl || '').search + ); + + expect(resp.hits.hits[0]._source?.viewInAppUrl).contain('LOG_EXPLORER_LOCATOR'); + expect(omit(parsedViewInAppUrl.params, 'timeRange.from')).eql({ + dataset: DATE_VIEW_TITLE, + timeRange: { to: 'now' }, + query: { query: '', language: 'kuery' }, + }); + expect(parsedViewInAppUrl.params.timeRange.from).match(ISO_DATE_REGEX); }); }); }); diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts index ae3689fbb49e3b..e1d029f375c92e 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts @@ -5,12 +5,14 @@ * 2.0. */ +import { omit } from 'lodash'; import moment from 'moment'; import { Aggregators, Comparator, } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; import { NO_DATA_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/constants'; +import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import expect from '@kbn/expect'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; @@ -22,7 +24,8 @@ import { waitForRuleStatus, } from '../helpers/alerting_wait_for_helpers'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { ActionDocument } from './typings'; +import { ISO_DATE_REGEX } from './constants'; +import { ActionDocument, LogExplorerLocatorParsedParams } from './typings'; // eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { @@ -114,6 +117,7 @@ export default function ({ getService }: FtrProviderContext) { alertDetailsUrl: '{{context.alertDetailsUrl}}', reason: '{{context.reason}}', value: '{{context.value}}', + viewInAppUrl: '{{context.viewInAppUrl}}', }, ], }, @@ -210,6 +214,18 @@ export default function ({ getService }: FtrProviderContext) { 'Average system.cpu.user.pct reported no data in the last 5m' ); expect(resp.hits.hits[0]._source?.value).eql('[NO DATA]'); + + const parsedViewInAppUrl = parseSearchParams( + new URL(resp.hits.hits[0]._source?.viewInAppUrl || '').search + ); + + expect(resp.hits.hits[0]._source?.viewInAppUrl).contain('LOG_EXPLORER_LOCATOR'); + expect(omit(parsedViewInAppUrl.params, 'timeRange.from')).eql({ + dataset: DATA_VIEW_ID, + timeRange: { to: 'now' }, + query: { query: '', language: 'kuery' }, + }); + expect(parsedViewInAppUrl.params.timeRange.from).match(ISO_DATE_REGEX); }); }); }); diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/constants.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/constants.ts new file mode 100644 index 00000000000000..5cf1e0b4d66145 --- /dev/null +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/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 ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/; diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts index 361ca1d05b225d..5bad9470f5d75c 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts @@ -5,15 +5,17 @@ * 2.0. */ +import { omit } from 'lodash'; import moment from 'moment'; +import expect from '@kbn/expect'; import { cleanup, generate } from '@kbn/infra-forge'; import { Aggregators, Comparator, } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/constants'; -import expect from '@kbn/expect'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; +import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import { createIndexConnector, createRule } from '../helpers/alerting_api_helper'; import { createDataView, deleteDataView } from '../helpers/data_view'; import { @@ -22,7 +24,8 @@ import { waitForRuleStatus, } from '../helpers/alerting_wait_for_helpers'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { ActionDocument } from './typings'; +import { ISO_DATE_REGEX } from './constants'; +import { ActionDocument, LogExplorerLocatorParsedParams } from './typings'; // eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { @@ -95,14 +98,14 @@ export default function ({ getService }: FtrProviderContext) { threshold: [1, 2], timeSize: 1, timeUnit: 'm', - metrics: [{ name: 'A', filter: '', aggType: Aggregators.COUNT }], + metrics: [{ name: 'A', filter: 'container.id:*', aggType: Aggregators.COUNT }], }, ], alertOnNoData: true, alertOnGroupDisappear: true, searchConfiguration: { query: { - query: '', + query: 'host.name:*', language: 'kuery', }, index: DATA_VIEW_ID, @@ -119,6 +122,7 @@ export default function ({ getService }: FtrProviderContext) { alertDetailsUrl: '{{context.alertDetailsUrl}}', reason: '{{context.reason}}', value: '{{context.value}}', + viewInAppUrl: '{{context.viewInAppUrl}}', }, ], }, @@ -190,12 +194,15 @@ export default function ({ getService }: FtrProviderContext) { threshold: [1, 2], timeSize: 1, timeUnit: 'm', - metrics: [{ name: 'A', filter: '', aggType: 'count' }], + metrics: [{ name: 'A', filter: 'container.id:*', aggType: 'count' }], }, ], alertOnNoData: true, alertOnGroupDisappear: true, - searchConfiguration: { index: 'data-view-id', query: { query: '', language: 'kuery' } }, + searchConfiguration: { + index: 'data-view-id', + query: { query: 'host.name:*', language: 'kuery' }, + }, }); }); @@ -214,6 +221,18 @@ export default function ({ getService }: FtrProviderContext) { `Document count is 3, not between the threshold of 1 and 2. (duration: 1 min, data view: ${DATE_VIEW_NAME})` ); expect(resp.hits.hits[0]._source?.value).eql('3'); + + const parsedViewInAppUrl = parseSearchParams( + new URL(resp.hits.hits[0]._source?.viewInAppUrl || '').search + ); + + expect(resp.hits.hits[0]._source?.viewInAppUrl).contain('LOG_EXPLORER_LOCATOR'); + expect(omit(parsedViewInAppUrl.params, 'timeRange.from')).eql({ + dataset: DATA_VIEW_ID, + timeRange: { to: 'now' }, + query: { query: 'host.name:* and container.id:*', language: 'kuery' }, + }); + expect(parsedViewInAppUrl.params.timeRange.from).match(ISO_DATE_REGEX); }); }); }); diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/typings.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/typings.ts index 83894e6cf24a2f..a0cfb54fff1577 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/typings.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/typings.ts @@ -5,11 +5,21 @@ * 2.0. */ +import { Query, TimeRange } from '@kbn/es-query'; +import { SerializableRecord } from '@kbn/utility-types'; + export interface ActionDocument { ruleType: string; alertDetailsUrl: string; reason: string; value: string; + viewInAppUrl: string; host?: string; group?: string; } + +export interface LogExplorerLocatorParsedParams extends SerializableRecord { + dataset: string; + timeRange: TimeRange; + query: Query; +} diff --git a/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts b/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts index 7607cecc3e2f29..1a84915a5c935e 100644 --- a/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts +++ b/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts @@ -61,6 +61,25 @@ export class ESTestIndexTool { group: { type: 'keyword', }, + host: { + properties: { + hostname: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + ignore_above: 256, + }, + }, + }, + id: { + type: 'keyword', + }, + name: { + type: 'keyword', + }, + }, + }, }, }, }, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts index ee8811cf98f28a..d79fdd086cab9d 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts @@ -109,6 +109,11 @@ async function createEsDocument( testedValueFloat: 234.2534643, testedValueUnsigned: '18446744073709551615', '@timestamp': new Date(epochMillis).toISOString(), + host: { + hostname: 'host-1', + id: '1', + name: 'host-1', + }, ...(group ? { group } : {}), }; @@ -147,6 +152,25 @@ export async function createDataStream(es: Client, name: string) { enabled: false, type: 'object', }, + host: { + properties: { + hostname: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + ignore_above: 256, + }, + }, + }, + id: { + type: 'keyword', + }, + name: { + type: 'keyword', + }, + }, + }, }, }, }, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/common.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/common.ts index fc7a65978aaa0f..26d8c64a302969 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/common.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/common.ts @@ -24,6 +24,11 @@ export const RULE_INTERVAL_SECONDS = 4; export const RULE_INTERVAL_MILLIS = RULE_INTERVAL_SECONDS * 1000; export const ES_GROUPS_TO_WRITE = 3; +export interface SourceField { + label: string; + searchPath: string; +} + export async function createConnector( supertest: any, objectRemover: ObjectRemover, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts index b5b2d41e9a4044..f193af1b81703c 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/esql_only.ts @@ -22,6 +22,7 @@ import { RULE_INTERVAL_MILLIS, RULE_INTERVAL_SECONDS, RULE_TYPE_ID, + SourceField, } from './common'; import { createDataStream, deleteDataStream } from '../../../create_test_data'; @@ -38,6 +39,12 @@ export default function ruleTests({ getService }: FtrProviderContext) { getAllAADDocs, } = getRuleServices(getService); + const sourceFields = [ + { label: 'host.hostname', searchPath: 'host.hostname.keyword' }, + { label: 'host.id', searchPath: 'host.id' }, + { label: 'host.name', searchPath: 'host.name' }, + ]; + describe('rule', async () => { let endDate: string; let connectorId: string; @@ -72,11 +79,15 @@ export default function ruleTests({ getService }: FtrProviderContext) { await createEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); await createRule({ name: 'never fire', - esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c < 0', + esqlQuery: + 'from .kibana-alerting-test-data | stats c = count(date) by host.hostname, host.name, host.id | where c < 0', + sourceFields, }); await createRule({ name: 'always fire', - esqlQuery: 'from .kibana-alerting-test-data | stats c = count(date) | where c > -1', + esqlQuery: + 'from .kibana-alerting-test-data | stats c = count(date) by host.hostname, host.name, host.id | where c > -1', + sourceFields, }); const docs = await waitForDocs(2); @@ -103,6 +114,9 @@ export default function ruleTests({ getService }: FtrProviderContext) { const value = parseInt(alertDoc['kibana.alert.evaluation.value'], 10); expect(value).greaterThan(0); expect(alertDoc[ALERT_URL]).to.contain('/s/space1/app/'); + expect(alertDoc['host.name']).to.eql(['host-1']); + expect(alertDoc['host.hostname']).to.eql(['host-1']); + expect(alertDoc['host.id']).to.eql(['1']); }); it('runs correctly: use epoch millis - threshold on hit count < >', async () => { @@ -209,13 +223,19 @@ export default function ruleTests({ getService }: FtrProviderContext) { ); await createRule({ name: 'never fire', - esqlQuery: 'from test-data-stream | stats c = count(@timestamp) | where c < 0', + esqlQuery: + 'from test-data-stream | stats c = count(@timestamp) by host.hostname, host.name, host.id | where c < 0', + sourceFields, }); await createRule({ name: 'always fire', - esqlQuery: 'from test-data-stream | stats c = count(@timestamp) | where c > -1', + esqlQuery: + 'from test-data-stream | stats c = count(@timestamp) by host.hostname, host.name, host.id | where c > -1', + sourceFields, }); + const messagePattern = /Document count is \d+ in the last 20s. Alert when greater than 0./; + const docs = await waitForDocs(2); for (let i = 0; i < docs.length; i++) { const doc = docs[i]; @@ -224,10 +244,22 @@ export default function ruleTests({ getService }: FtrProviderContext) { expect(name).to.be('always fire'); expect(title).to.be(`rule 'always fire' matched query`); - const messagePattern = /Document count is \d+ in the last 20s. Alert when greater than 0./; expect(message).to.match(messagePattern); expect(hits).not.to.be.empty(); } + + const aadDocs = await getAllAADDocs(1); + + const alertDoc = aadDocs.body.hits.hits[0]._source; + expect(alertDoc[ALERT_REASON]).to.match(messagePattern); + expect(alertDoc['kibana.alert.title']).to.be("rule 'always fire' matched query"); + expect(alertDoc['kibana.alert.evaluation.conditions']).to.be('Query matched documents'); + const value = parseInt(alertDoc['kibana.alert.evaluation.value'], 10); + expect(value).greaterThan(0); + expect(alertDoc[ALERT_URL]).to.contain('/s/space1/app/'); + expect(alertDoc['host.name']).to.eql(['host-1']); + expect(alertDoc['host.hostname']).to.eql(['host-1']); + expect(alertDoc['host.id']).to.eql(['1']); }); it('throws an error if the thresholdComparator is not >', async () => { @@ -365,6 +397,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy?: string; termField?: string; termSize?: number; + sourceFields?: SourceField[]; } async function createRule(params: CreateRuleParams): Promise { @@ -436,6 +469,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { termSize: params.termSize, timeField: params.timeField || 'date', esqlQuery: { esql: params.esqlQuery }, + sourceFields: params.sourceFields, }, }) .expect(200); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/query_dsl_only.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/query_dsl_only.ts index 8a558c8e27299b..c339bb7f24604d 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/query_dsl_only.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/query_dsl_only.ts @@ -6,9 +6,8 @@ */ import expect from '@kbn/expect'; - import { ES_TEST_INDEX_NAME } from '@kbn/alerting-api-integration-helpers'; - +import { pull } from 'lodash'; import { Spaces } from '../../../../../scenarios'; import { FtrProviderContext } from '../../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover } from '../../../../../../common/lib'; @@ -144,7 +143,16 @@ export default function ruleTests({ getService }: FtrProviderContext) { expect(hits).not.to.be.empty(); hits.forEach((hit: any) => { expect(hit.fields).not.to.be.empty(); - expect(Object.keys(hit.fields).sort()).to.eql(Object.keys(hit._source).sort()); + expect( + pull( + // remove nested fields + Object.keys(hit.fields), + 'host.hostname', + 'host.hostname.keyword', + 'host.id', + 'host.name' + ).sort() + ).to.eql(Object.keys(hit._source).sort()); }); } }); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/rule.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/rule.ts index 948eccc893e18e..58d439a0aab4e3 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/rule.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/es_query/rule.ts @@ -25,6 +25,7 @@ import { RULE_INTERVAL_MILLIS, RULE_INTERVAL_SECONDS, RULE_TYPE_ID, + SourceField, } from './common'; import { createDataStream, deleteDataStream } from '../../../create_test_data'; @@ -43,6 +44,12 @@ export default function ruleTests({ getService }: FtrProviderContext) { getAllAADDocs, } = getRuleServices(getService); + const sourceFields = [ + { label: 'host.hostname', searchPath: 'host.hostname.keyword' }, + { label: 'host.id', searchPath: 'host.id' }, + { label: 'host.name', searchPath: 'host.name' }, + ]; + describe('rule', async () => { let endDate: string; let connectorId: string; @@ -82,6 +89,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { size: 100, thresholdComparator: '<', threshold: [0], + sourceFields, }); await createRule({ name: 'always fire', @@ -89,6 +97,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { size: 100, thresholdComparator: '>', threshold: [-1], + sourceFields, }); }, ] as const, @@ -114,6 +123,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { index: esTestDataView.id, filter: [], }, + sourceFields, }); await createRule({ name: 'always fire', @@ -129,6 +139,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { index: esTestDataView.id, filter: [], }, + sourceFields, }); }, ] as const, @@ -173,6 +184,9 @@ export default function ruleTests({ getService }: FtrProviderContext) { const value = parseInt(alertDoc['kibana.alert.evaluation.value'], 10); expect(value).greaterThan(0); expect(alertDoc[ALERT_URL]).to.contain('/s/space1/app/'); + expect(alertDoc['host.name']).to.eql(['host-1']); + expect(alertDoc['host.hostname']).to.eql(['host-1']); + expect(alertDoc['host.id']).to.eql(['1']); }) ); @@ -188,6 +202,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { threshold: [0], aggType: 'avg', aggField: 'testedValue', + sourceFields, }); await createRule({ name: 'always fire', @@ -197,6 +212,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { threshold: [-1], aggType: 'avg', aggField: 'testedValue', + sourceFields, }); }, ] as const, @@ -224,6 +240,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { }, aggType: 'avg', aggField: 'testedValue', + sourceFields, }); await createRule({ name: 'always fire', @@ -241,6 +258,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { }, aggType: 'avg', aggField: 'testedValue', + sourceFields, }); }, ] as const, @@ -250,6 +268,9 @@ export default function ruleTests({ getService }: FtrProviderContext) { await createEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); await initData(); + const messagePattern = + /Document count is \d+.?\d* in the last 20s in .kibana-alerting-test-data (?:index|data view). Alert when greater than -1./; + const docs = await waitForDocs(2); for (let i = 0; i < docs.length; i++) { const doc = docs[i]; @@ -258,8 +279,6 @@ export default function ruleTests({ getService }: FtrProviderContext) { expect(name).to.be('always fire'); expect(title).to.be(`rule 'always fire' matched query`); - const messagePattern = - /Document count is \d+.?\d* in the last 20s in .kibana-alerting-test-data (?:index|data view). Alert when greater than -1./; expect(message).to.match(messagePattern); expect(hits).not.to.be.empty(); @@ -271,6 +290,21 @@ export default function ruleTests({ getService }: FtrProviderContext) { expect(previousTimestamp).not.to.be.empty(); } } + + const aadDocs = await getAllAADDocs(1); + + const alertDoc = aadDocs.body.hits.hits[0]._source; + expect(alertDoc[ALERT_REASON]).to.match(messagePattern); + expect(alertDoc['kibana.alert.title']).to.be("rule 'always fire' matched query"); + expect(alertDoc['kibana.alert.evaluation.conditions']).to.be( + 'Number of matching documents where avg of testedValue is greater than -1' + ); + const value = parseInt(alertDoc['kibana.alert.evaluation.value'], 10); + expect(value).greaterThan(0); + expect(alertDoc[ALERT_URL]).to.contain('/s/space1/app/'); + expect(alertDoc['host.name']).to.eql(['host-1']); + expect(alertDoc['host.hostname']).to.eql(['host-1']); + expect(alertDoc['host.id']).to.eql(['1']); }) ); @@ -287,6 +321,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy: 'top', termField: 'group', termSize: 2, + sourceFields, }); await createRule({ name: 'always fire', @@ -297,6 +332,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy: 'top', termField: 'group', termSize: 2, + sourceFields, }); }, ] as const, @@ -325,6 +361,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy: 'top', termField: 'group', termSize: 2, + sourceFields, }); await createRule({ name: 'always fire', @@ -343,6 +380,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy: 'top', termField: 'group', termSize: 2, + sourceFields, }); }, ] as const, @@ -352,6 +390,12 @@ export default function ruleTests({ getService }: FtrProviderContext) { await createGroupedEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); await initData(); + const messagePattern = + /Document count is \d+.?\d* in the last 20s for group-\d+ in .kibana-alerting-test-data (?:index|data view). Alert when greater than -1./; + const titlePattern = /rule 'always fire' matched query for group group-\d/; + const conditionPattern = + /Number of matching documents for group "group-\d" is greater than -1/; + const docs = await waitForDocs(2); for (let i = 0; i < docs.length; i++) { const doc = docs[i]; @@ -359,15 +403,25 @@ export default function ruleTests({ getService }: FtrProviderContext) { const { name, title, message } = doc._source.params; expect(name).to.be('always fire'); - const titlePattern = /rule 'always fire' matched query for group group-\d/; expect(title).to.match(titlePattern); - const messagePattern = - /Document count is \d+.?\d* in the last 20s for group-\d+ in .kibana-alerting-test-data (?:index|data view). Alert when greater than -1./; expect(message).to.match(messagePattern); expect(hits).not.to.be.empty(); expect(previousTimestamp).to.be.empty(); } + + const aadDocs = await getAllAADDocs(1); + + const alertDoc = aadDocs.body.hits.hits[0]._source; + expect(alertDoc[ALERT_REASON]).to.match(messagePattern); + expect(alertDoc['kibana.alert.title']).to.match(titlePattern); + expect(alertDoc['kibana.alert.evaluation.conditions']).to.match(conditionPattern); + const value = parseInt(alertDoc['kibana.alert.evaluation.value'], 10); + expect(value).greaterThan(0); + expect(alertDoc[ALERT_URL]).to.contain('/s/space1/app/'); + expect(alertDoc['host.name']).to.eql(['host-1']); + expect(alertDoc['host.hostname']).to.eql(['host-1']); + expect(alertDoc['host.id']).to.eql(['1']); }) ); @@ -384,6 +438,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy: 'top', termField: ['group', 'testedValue'], termSize: 2, + sourceFields, }); }, ] as const, @@ -412,6 +467,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy: 'top', termField: ['group', 'testedValue'], termSize: 2, + sourceFields, }); }, ] as const, @@ -421,6 +477,12 @@ export default function ruleTests({ getService }: FtrProviderContext) { await createGroupedEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); await initData(); + const messagePattern = + /Document count is \d+.?\d* in the last 20s for group-\d+,\d+ in .kibana-alerting-test-data (?:index|data view). Alert when greater than -1./; + const titlePattern = /rule 'always fire' matched query for group group-\d+,\d+/; + const conditionPattern = + /Number of matching documents for group "group-\d+,\d+" is greater than -1/; + const docs = await waitForDocs(2); for (let i = 0; i < docs.length; i++) { const doc = docs[i]; @@ -428,15 +490,25 @@ export default function ruleTests({ getService }: FtrProviderContext) { const { name, title, message } = doc._source.params; expect(name).to.be('always fire'); - const titlePattern = /rule 'always fire' matched query for group group-\d/; expect(title).to.match(titlePattern); - const messagePattern = - /Document count is \d+.?\d* in the last 20s for group-\d+,\d+ in .kibana-alerting-test-data (?:index|data view). Alert when greater than -1./; expect(message).to.match(messagePattern); expect(hits).not.to.be.empty(); expect(previousTimestamp).to.be.empty(); } + + const aadDocs = await getAllAADDocs(1); + + const alertDoc = aadDocs.body.hits.hits[0]._source; + expect(alertDoc[ALERT_REASON]).to.match(messagePattern); + expect(alertDoc['kibana.alert.title']).to.match(titlePattern); + expect(alertDoc['kibana.alert.evaluation.conditions']).to.match(conditionPattern); + const value = parseInt(alertDoc['kibana.alert.evaluation.value'], 10); + expect(value).greaterThan(0); + expect(alertDoc[ALERT_URL]).to.contain('/s/space1/app/'); + expect(alertDoc['host.name']).to.eql(['host-1']); + expect(alertDoc['host.hostname']).to.eql(['host-1']); + expect(alertDoc['host.id']).to.eql(['1']); }) ); @@ -904,6 +976,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { threshold: [0], indexName: ES_TEST_DATA_STREAM_NAME, timeField: '@timestamp', + sourceFields, }); await createRule({ name: 'always fire', @@ -913,6 +986,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { threshold: [-1], indexName: ES_TEST_DATA_STREAM_NAME, timeField: '@timestamp', + sourceFields, }); }, ] as const, @@ -938,6 +1012,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { index: esTestDataView.id, filter: [], }, + sourceFields, }); await createRule({ name: 'always fire', @@ -953,6 +1028,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { index: esTestDataView.id, filter: [], }, + sourceFields, }); }, ] as const, @@ -967,6 +1043,9 @@ export default function ruleTests({ getService }: FtrProviderContext) { ); await initData(); + const messagePattern = + /Document count is \d+.?\d* in the last 20s in test-data-stream (?:index|data view). Alert when greater than -1./; + const docs = await waitForDocs(2); for (let i = 0; i < docs.length; i++) { const doc = docs[i]; @@ -975,8 +1054,6 @@ export default function ruleTests({ getService }: FtrProviderContext) { expect(name).to.be('always fire'); expect(title).to.be(`rule 'always fire' matched query`); - const messagePattern = - /Document count is \d+.?\d* in the last 20s in test-data-stream (?:index|data view). Alert when greater than -1./; expect(message).to.match(messagePattern); expect(hits).not.to.be.empty(); @@ -988,6 +1065,21 @@ export default function ruleTests({ getService }: FtrProviderContext) { expect(previousTimestamp).not.to.be.empty(); } } + + const aadDocs = await getAllAADDocs(1); + + const alertDoc = aadDocs.body.hits.hits[0]._source; + expect(alertDoc[ALERT_REASON]).to.match(messagePattern); + expect(alertDoc['kibana.alert.title']).to.be("rule 'always fire' matched query"); + expect(alertDoc['kibana.alert.evaluation.conditions']).to.be( + 'Number of matching documents is greater than -1' + ); + const value = parseInt(alertDoc['kibana.alert.evaluation.value'], 10); + expect(value).greaterThan(0); + expect(alertDoc[ALERT_URL]).to.contain('/s/space1/app/'); + expect(alertDoc['host.name']).to.eql(['host-1']); + expect(alertDoc['host.hostname']).to.eql(['host-1']); + expect(alertDoc['host.id']).to.eql(['1']); }) ); @@ -1121,6 +1213,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { groupBy?: string; termField?: string | string[]; termSize?: number; + sourceFields?: SourceField[]; } async function createRule(params: CreateRuleParams): Promise { @@ -1201,6 +1294,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { aggField: params.aggField, termField: params.termField, termSize: params.termSize, + sourceFields: params.sourceFields, ...(params.excludeHitsFromPreviousRun !== undefined && { excludeHitsFromPreviousRun: params.excludeHitsFromPreviousRun, }), diff --git a/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts b/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts index dad7845e60e317..fd08e1cae3f3a6 100644 --- a/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts +++ b/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts @@ -12,14 +12,16 @@ import { ELASTIC_HTTP_VERSION_HEADER, X_ELASTIC_INTERNAL_ORIGIN_REQUEST, } from '@kbn/core-http-common'; +import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; +import { + CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, + DETECTION_RULE_RULES_API_CURRENT_VERSION, +} from '@kbn/cloud-security-posture-plugin/common/constants'; +import type { CspBenchmarkRule } from '@kbn/cloud-security-posture-plugin/common/types/latest'; +// eslint-disable @kbn/imports/no_boundary_crossing +import { generateBenchmarkRuleTags } from '@kbn/cloud-security-posture-plugin/common/utils/detection_rules'; import type { FtrProviderContext } from '../ftr_provider_context'; -interface RuleIdentifier { - benchmarkId: string; - benchmarkVersion: string; - ruleNumber: string; -} - // eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const retry = getService('retry'); @@ -27,24 +29,52 @@ export default function ({ getService }: FtrProviderContext) { const log = getService('log'); const kibanaServer = getService('kibanaServer'); - const generateRuleKey = (ruleParams: RuleIdentifier): string => { - return `${ruleParams.benchmarkId};${ruleParams.benchmarkVersion};${ruleParams.ruleNumber}`; + const generateRuleKey = (rule: CspBenchmarkRule): string => { + return `${rule.metadata.benchmark.id};${rule.metadata.benchmark.version};${rule.metadata.benchmark.rule_number}`; + }; + + const getRandomCspBenchmarkRule = async () => { + const cspBenchmarkRules = await kibanaServer.savedObjects.find({ + type: CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, + }); + + expect(cspBenchmarkRules.saved_objects.length).greaterThan(0); + + const randomIndex = Math.floor(Math.random() * cspBenchmarkRules.saved_objects.length); + return cspBenchmarkRules.saved_objects[randomIndex].attributes; }; - const generateRandomRule = (): RuleIdentifier => { - const majorVersionNumber = Math.floor(Math.random() * 10); // Random major number between 0 and 9 - const minorVersionNumber = Math.floor(Math.random() * 10); - const benchmarksIds = ['cis_aws', 'cis_k8s', 'cis_k8s']; - const benchmarksVersions = ['v2.0.0', 'v2.0.1', 'v2.0.3', 'v3.0.0']; - const randomBenchmarkId = benchmarksIds[Math.floor(Math.random() * benchmarksIds.length)]; - const randomBenchmarkVersion = - benchmarksVersions[Math.floor(Math.random() * benchmarksVersions.length)]; - - return { - benchmarkId: randomBenchmarkId, - benchmarkVersion: randomBenchmarkVersion, - ruleNumber: `${majorVersionNumber}.${minorVersionNumber}`, - }; + const createDetectionRule = async (rule: CspBenchmarkRule) => { + await supertest + .post(DETECTION_ENGINE_RULES_URL) + .set('version', DETECTION_RULE_RULES_API_CURRENT_VERSION) + .set('kbn-xsrf', 'xxxx') + .send({ + type: 'query', + language: 'kuery', + license: 'Elastic', + author: ['Elastic License v2'], + filters: [], + false_positives: [], + risk_score: 0, + risk_score_mapping: [], + severity: 'low', + severity_mapping: [], + threat: [], + interval: '1h', + from: 'now-26h', + to: 'now', + max_signals: 100, + timestamp_override: 'event.ingested', + timestamp_override_fallback_disabled: false, + actions: [], + enabled: true, + index: ['logs-cloud_security_posture.findings-default*'], + query: 'rule.benchmark.rule_number: foo', + name: rule.metadata.name, + description: rule.metadata.rationale, + tags: generateBenchmarkRuleTags(rule.metadata), + }); }; /** @@ -66,15 +96,15 @@ export default function ({ getService }: FtrProviderContext) { await waitForPluginInitialized(); }); - afterEach(async () => { + beforeEach(async () => { await kibanaServer.savedObjects.clean({ types: ['cloud-security-posture-settings'], }); }); - it('mute rules successfully', async () => { - const rule1 = generateRandomRule(); - const rule2 = generateRandomRule(); + it('mute benchmark rules successfully', async () => { + const rule1 = await getRandomCspBenchmarkRule(); + const rule2 = await getRandomCspBenchmarkRule(); const { body } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) @@ -85,14 +115,10 @@ export default function ({ getService }: FtrProviderContext) { action: 'mute', rules: [ { - benchmark_id: rule1.benchmarkId, - benchmark_version: rule1.benchmarkVersion, - rule_number: rule1.ruleNumber, + rule_id: rule1.metadata.id, }, { - benchmark_id: rule2.benchmarkId, - benchmark_version: rule2.benchmarkVersion, - rule_number: rule2.ruleNumber, + rule_id: rule2.metadata.id, }, ], }) @@ -100,16 +126,33 @@ export default function ({ getService }: FtrProviderContext) { expectExpect(body.updated_benchmark_rules).toEqual( expectExpect.objectContaining({ - [generateRuleKey(rule1)]: { muted: true }, - [generateRuleKey(rule2)]: { muted: true }, + [generateRuleKey(rule1)]: { + muted: true, + benchmark_id: rule1.metadata.benchmark.id, + benchmark_version: rule1.metadata.benchmark.version, + rule_number: rule1.metadata.benchmark.rule_number + ? rule1.metadata.benchmark.rule_number + : '', + rule_id: rule1.metadata.id, + }, + [generateRuleKey(rule2)]: { + muted: true, + benchmark_id: rule2.metadata.benchmark.id, + benchmark_version: rule2.metadata.benchmark.version, + rule_number: rule2.metadata.benchmark.rule_number + ? rule2.metadata.benchmark.rule_number + : '', + rule_id: rule2.metadata.id, + }, }) ); + expectExpect(body.detection_rules).toEqual('disabled 0 detections rules.'); }); it('unmute rules successfully', async () => { - const rule1 = generateRandomRule(); - const rule2 = generateRandomRule(); - + const rule1 = await getRandomCspBenchmarkRule(); + const rule2 = await getRandomCspBenchmarkRule(); + // getRandomCspBenchmarkRule(); const { body } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') @@ -119,14 +162,10 @@ export default function ({ getService }: FtrProviderContext) { action: 'unmute', rules: [ { - benchmark_id: rule1.benchmarkId, - benchmark_version: rule1.benchmarkVersion, - rule_number: rule1.ruleNumber, + rule_id: rule1.metadata.id, }, { - benchmark_id: rule2.benchmarkId, - benchmark_version: rule2.benchmarkVersion, - rule_number: rule2.ruleNumber, + rule_id: rule2.metadata.id, }, ], }) @@ -134,19 +173,35 @@ export default function ({ getService }: FtrProviderContext) { expectExpect(body.updated_benchmark_rules).toEqual( expectExpect.objectContaining({ - [generateRuleKey(rule1)]: { muted: false }, - [generateRuleKey(rule2)]: { muted: false }, + [generateRuleKey(rule1)]: { + muted: false, + benchmark_id: rule1.metadata.benchmark.id, + benchmark_version: rule1.metadata.benchmark.version, + rule_number: rule1.metadata.benchmark.rule_number + ? rule1.metadata.benchmark.rule_number + : '', + rule_id: rule1.metadata.id, + }, + [generateRuleKey(rule2)]: { + muted: false, + benchmark_id: rule2.metadata.benchmark.id, + benchmark_version: rule2.metadata.benchmark.version, + rule_number: rule2.metadata.benchmark.rule_number + ? rule2.metadata.benchmark.rule_number + : '', + rule_id: rule2.metadata.id, + }, }) ); }); it('verify new rules are added and existing rules are set.', async () => { - const rule1 = generateRandomRule(); - const rule2 = generateRandomRule(); - const rule3 = generateRandomRule(); + const rule1 = await getRandomCspBenchmarkRule(); + const rule2 = await getRandomCspBenchmarkRule(); + const rule3 = await getRandomCspBenchmarkRule(); // unmute rule1 and rule2 - const cspSettingsResponse = await supertest + const { body } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') @@ -155,28 +210,40 @@ export default function ({ getService }: FtrProviderContext) { action: 'unmute', rules: [ { - benchmark_id: rule1.benchmarkId, - benchmark_version: rule1.benchmarkVersion, - rule_number: rule1.ruleNumber, + rule_id: rule1.metadata.id, }, { - benchmark_id: rule2.benchmarkId, - benchmark_version: rule2.benchmarkVersion, - rule_number: rule2.ruleNumber, + rule_id: rule2.metadata.id, }, ], }) .expect(200); - expectExpect(cspSettingsResponse.body.updated_benchmark_rules).toEqual( + expectExpect(body.updated_benchmark_rules).toEqual( expectExpect.objectContaining({ - [generateRuleKey(rule1)]: { muted: false }, - [generateRuleKey(rule2)]: { muted: false }, + [generateRuleKey(rule1)]: { + muted: false, + benchmark_id: rule1.metadata.benchmark.id, + benchmark_version: rule1.metadata.benchmark.version, + rule_number: rule1.metadata.benchmark.rule_number + ? rule1.metadata.benchmark.rule_number + : '', + rule_id: rule1.metadata.id, + }, + [generateRuleKey(rule2)]: { + muted: false, + benchmark_id: rule2.metadata.benchmark.id, + benchmark_version: rule2.metadata.benchmark.version, + rule_number: rule2.metadata.benchmark.rule_number + ? rule2.metadata.benchmark.rule_number + : '', + rule_id: rule2.metadata.id, + }, }) ); // mute rule1 and rule3 - const updatedCspSettingsResponse = await supertest + const { body: body2 } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') @@ -185,29 +252,43 @@ export default function ({ getService }: FtrProviderContext) { action: 'mute', rules: [ { - benchmark_id: rule1.benchmarkId, - benchmark_version: rule1.benchmarkVersion, - rule_number: rule1.ruleNumber, + rule_id: rule1.metadata.id, }, { - benchmark_id: rule3.benchmarkId, - benchmark_version: rule3.benchmarkVersion, - rule_number: rule3.ruleNumber, + rule_id: rule3.metadata.id, }, ], }) .expect(200); - expectExpect(updatedCspSettingsResponse.body.updated_benchmark_rules).toEqual( + expectExpect(body2.updated_benchmark_rules).toEqual( expectExpect.objectContaining({ - [generateRuleKey(rule1)]: { muted: true }, - [generateRuleKey(rule3)]: { muted: true }, + [generateRuleKey(rule1)]: { + muted: true, + benchmark_id: rule1.metadata.benchmark.id, + benchmark_version: rule1.metadata.benchmark.version, + rule_number: rule1.metadata.benchmark.rule_number + ? rule1.metadata.benchmark.rule_number + : '', + rule_id: rule1.metadata.id, + }, + [generateRuleKey(rule3)]: { + muted: true, + benchmark_id: rule3.metadata.benchmark.id, + benchmark_version: rule3.metadata.benchmark.version, + rule_number: rule3.metadata.benchmark.rule_number + ? rule3.metadata.benchmark.rule_number + : '', + rule_id: rule3.metadata.id, + }, }) ); }); - it('set wrong action input', async () => { - const rule1 = generateRandomRule(); + it('mute detection rule successfully', async () => { + const rule1 = await getRandomCspBenchmarkRule(); + + await createDetectionRule(rule1); const { body } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) @@ -215,21 +296,24 @@ export default function ({ getService }: FtrProviderContext) { .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .set('kbn-xsrf', 'xxxx') .send({ - action: 'foo', + action: 'mute', rules: [ { - benchmark_id: rule1.benchmarkId, - benchmark_version: rule1.benchmarkVersion, - rule_number: rule1.ruleNumber, + rule_id: rule1.metadata.id, }, ], - }); + }) + .expect(200); - expect(body.error).to.eql('Bad Request'); - expect(body.statusCode).to.eql(400); + expectExpect(body.detection_rules).toEqual('disabled 1 detections rules.'); }); - it('set wrong rule ids input', async () => { + it('Expect to two benchmark rules and one detection rule', async () => { + const rule1 = await getRandomCspBenchmarkRule(); + const rule2 = await getRandomCspBenchmarkRule(); + + await createDetectionRule(rule1); + const { body } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') @@ -237,7 +321,35 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'xxxx') .send({ action: 'mute', - rule_ids: ['invalid_rule_structure'], + rules: [ + { + rule_id: rule1.metadata.id, + }, + { + rule_id: rule2.metadata.id, + }, + ], + }) + .expect(200); + + expectExpect(body.detection_rules).toEqual('disabled 1 detections rules.'); + }); + + it('set wrong action input', async () => { + const rule1 = await getRandomCspBenchmarkRule(); + + const { body } = await supertest + .post(`/internal/cloud_security_posture/rules/_bulk_action`) + .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .set('kbn-xsrf', 'xxxx') + .send({ + action: 'foo', + rules: [ + { + rule_id: rule1.metadata.id, + }, + ], }); expect(body.error).to.eql('Bad Request'); diff --git a/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts b/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts index 7f15daf653478f..892d31e4bc04bb 100644 --- a/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts +++ b/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts @@ -19,7 +19,7 @@ export interface CnvmStatistics { highCount?: number; mediumCount?: number; resourcesScanned?: number; - cloudRegions?: number; + cloudAccounts?: number; } export interface AccountVulnStats { @@ -211,7 +211,7 @@ export default function ({ getService }: FtrProviderContext) { highCount: 1, mediumCount: 1, resourcesScanned: 2, - cloudRegions: 1, + cloudAccounts: 1, }, vulnTrends: [ { diff --git a/x-pack/test/functional/apps/maps/group1/sample_data.js b/x-pack/test/functional/apps/maps/group1/sample_data.js index 09b29f5e529c31..377d80a63999bc 100644 --- a/x-pack/test/functional/apps/maps/group1/sample_data.js +++ b/x-pack/test/functional/apps/maps/group1/sample_data.js @@ -15,7 +15,7 @@ export default function ({ getPageObjects, getService, updateBaselines }) { const kibanaServer = getService('kibanaServer'); const security = getService('security'); - // Only update the baseline images from Jenkins session images after comparing them + // Only update the baseline images from CI session images after comparing them // These tests might fail locally because of scaling factors and resolution. describe('maps loaded from sample data', () => { diff --git a/x-pack/test/functional/es_archives/asset_criticality/data.json b/x-pack/test/functional/es_archives/asset_criticality/data.json new file mode 100644 index 00000000000000..dae5bd12006a80 --- /dev/null +++ b/x-pack/test/functional/es_archives/asset_criticality/data.json @@ -0,0 +1,143 @@ +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "1", + "source": { + "id_field": "host.name", + "id_value": "suricata-zeek-sensor-toronto", + "criticality_level": "important", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "2", + "source": { + "id_field": "host.name", + "id_value": "host-0", + "criticality_level": "very_important", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "20", + "source": { + "id_field": "host.name", + "id_value": "zeek-newyork-sha-aa8df15", + "criticality_level": "normal", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "21", + "source": { + "id_field": "host.name", + "id_value": "zeek-sensor-amsterdam", + "criticality_level": "low", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "22", + "source": { + "id_field": "host.name", + "id_value": "suricata-sensor-london", + "criticality_level": "important", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "3", + "source": { + "id_field": "user.name", + "id_value": "root", + "criticality_level": "very_important", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "4", + "source": { + "id_field": "user.name", + "id_value": "User 2", + "criticality_level": "important", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "5", + "source": { + "id_field": "host.name", + "id_value": "abc", + "criticality_level": "normal", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "id": "6", + "source": { + "id_field": "user.name", + "id_value": "abc", + "criticality_level": "not_important", + "@timestamp": "2022-08-12T14:45:36.171Z", + "updated_at": "2022-08-12T14:45:36.171Z" + }, + "type": "_doc" + } +} \ No newline at end of file diff --git a/x-pack/test/functional/es_archives/asset_criticality/mappings.json b/x-pack/test/functional/es_archives/asset_criticality/mappings.json new file mode 100644 index 00000000000000..94fe5389706b20 --- /dev/null +++ b/x-pack/test/functional/es_archives/asset_criticality/mappings.json @@ -0,0 +1,32 @@ +{ + "type": "index", + "value": { + "index": ".asset-criticality.asset-criticality-default", + "mappings": { + "properties": { + "id_value": { + "type": "keyword" + }, + "id_field": { + "type": "keyword" + }, + "criticality_level": { + "type": "keyword" + }, + "@timestamp": { + "type": "date" + }, + "updated_at": { + "type": "date" + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_api_integration/tests/api_keys/has_active_key.ts b/x-pack/test/security_api_integration/tests/api_keys/has_active_key.ts new file mode 100644 index 00000000000000..11b118abb1d67b --- /dev/null +++ b/x-pack/test/security_api_integration/tests/api_keys/has_active_key.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import type { ApiKey } from '@kbn/security-plugin/common/model'; +import type { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + + const createKey = async () => { + const { body: apiKey } = await supertest + .post('/api_keys/_grant') + .set('kbn-xsrf', 'xxx') + .send({ name: 'an-actual-api-key' }) + .expect(200); + expect(apiKey.name).to.eql('an-actual-api-key'); + return apiKey; + }; + + const cleanup = async () => { + // get existing keys which would affect test results + const { body: getResponseBody } = await supertest.get('/internal/security/api_key').expect(200); + const apiKeys: ApiKey[] = getResponseBody.apiKeys; + const existing = apiKeys.map(({ id, name }) => ({ id, name })); + + // invalidate the keys + await supertest + .post(`/internal/security/api_key/invalidate`) + .set('kbn-xsrf', 'xxx') + .send({ apiKeys: existing, isAdmin: false }) + .expect(200, { itemsInvalidated: existing, errors: [] }); + }; + + describe('Has Active API Keys: _has_active', () => { + before(cleanup); + after(cleanup); + + it('detects when user has no API Keys', async () => { + await supertest + .get('/internal/security/api_key/_has_active') + .set('kbn-xsrf', 'xxx') + .expect(200, { hasApiKeys: false }); + }); + + it('detects when user has some API Keys', async () => { + await createKey(); + + await supertest + .get('/internal/security/api_key/_has_active') + .set('kbn-xsrf', 'xxx') + .expect(200, { hasApiKeys: true }); + }); + }); +} diff --git a/x-pack/test/security_api_integration/tests/api_keys/index.ts b/x-pack/test/security_api_integration/tests/api_keys/index.ts index a20f0a30181ff2..a36a76c0c95663 100644 --- a/x-pack/test/security_api_integration/tests/api_keys/index.ts +++ b/x-pack/test/security_api_integration/tests/api_keys/index.ts @@ -10,5 +10,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('security APIs - Api Keys', function () { loadTestFile(require.resolve('./grant_api_key')); + loadTestFile(require.resolve('./has_active_key')); }); } diff --git a/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts b/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts index 45d3bfc5b12eae..32f5351b4e4609 100644 --- a/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts +++ b/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts @@ -150,8 +150,7 @@ export default function ({ getService }: FtrProviderContext) { }); } - // Failing: See https://github.com/elastic/kibana/issues/149091 - describe.skip('Session Concurrent Limit cleanup', () => { + describe('Session Concurrent Limit cleanup', () => { before(async () => { await security.user.create('anonymous_user', { password: 'changeme', @@ -181,7 +180,10 @@ export default function ({ getService }: FtrProviderContext) { await setTimeoutAsync(500); const basicSessionCookieThree = await loginWithBasic(testUser); - expect(await getNumberOfSessionDocuments()).to.be(3); + log.debug('Waiting for all sessions to be persisted...'); + await retry.tryForTime(20000, async () => { + expect(await getNumberOfSessionDocuments()).to.be(3); + }); // Poke the background task to run await runCleanupTaskSoon(); @@ -210,7 +212,10 @@ export default function ({ getService }: FtrProviderContext) { const basicSessionCookieThree = await loginWithBasic(testUser); const samlSessionCookieThree = await loginWithSAML(); - expect(await getNumberOfSessionDocuments()).to.be(6); + log.debug('Waiting for all sessions to be persisted...'); + await retry.tryForTime(20000, async () => { + expect(await getNumberOfSessionDocuments()).to.be(6); + }); // Poke the background task to run await runCleanupTaskSoon(); @@ -243,7 +248,10 @@ export default function ({ getService }: FtrProviderContext) { const basicSessionCookieThree = await loginWithBasic(testUser); const samlSessionCookieThree = await loginWithSAML(); - expect(await getNumberOfSessionDocuments()).to.be(6); + log.debug('Waiting for all sessions to be persisted...'); + await retry.tryForTime(20000, async () => { + expect(await getNumberOfSessionDocuments()).to.be(6); + }); // Remove `createdAt` field from the most recent sessions to emulate legacy sessions. // 1. Get the latest session for every unique credentials. @@ -305,7 +313,10 @@ export default function ({ getService }: FtrProviderContext) { await setTimeoutAsync(500); const basicSessionCookieTwo = await loginWithBasic(testUser); - expect(await getNumberOfSessionDocuments()).to.be(2); + log.debug('Waiting for all sessions to be persisted...'); + await retry.tryForTime(20000, async () => { + expect(await getNumberOfSessionDocuments()).to.be(2); + }); // Poke the background task to run await runCleanupTaskSoon(); @@ -328,7 +339,10 @@ export default function ({ getService }: FtrProviderContext) { const anonymousSessionCookieTwo = await loginWithAnonymous(); const anonymousSessionCookieThree = await loginWithAnonymous(); - expect(await getNumberOfSessionDocuments()).to.be(3); + log.debug('Waiting for all sessions to be persisted...'); + await retry.tryForTime(20000, async () => { + expect(await getNumberOfSessionDocuments()).to.be(3); + }); // Poke the background task to run await runCleanupTaskSoon(); @@ -357,7 +371,10 @@ export default function ({ getService }: FtrProviderContext) { const unauthenticatedSessionTwo = await startSAMLHandshake(); const unauthenticatedSessionThree = await startSAMLHandshake(); - expect(await getNumberOfSessionDocuments()).to.be(3); + log.debug('Waiting for all sessions to be persisted...'); + await retry.tryForTime(20000, async () => { + expect(await getNumberOfSessionDocuments()).to.be(3); + }); // Poke the background task to run await runCleanupTaskSoon(); diff --git a/x-pack/test/security_solution_api_integration/config/ess/config.base.ts b/x-pack/test/security_solution_api_integration/config/ess/config.base.ts index b7f08d5180bbe8..89e6df3c68cd25 100644 --- a/x-pack/test/security_solution_api_integration/config/ess/config.base.ts +++ b/x-pack/test/security_solution_api_integration/config/ess/config.base.ts @@ -81,7 +81,7 @@ export function createTestConfig(options: CreateTestConfigOptions, testFiles?: s 'previewTelemetryUrlEnabled', 'riskScoringPersistence', 'riskScoringRoutesEnabled', - 'alertSuppressionForThresholdRuleEnabled', + 'entityAnalyticsAssetCriticalityEnabled', ])}`, '--xpack.task_manager.poll_interval=1000', `--xpack.actions.preconfigured=${JSON.stringify({ diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.ts index c01c3a74e61cfd..1f43395efcd902 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.ts @@ -17,7 +17,7 @@ export default createTestConfig({ '/testing_regex*/', ])}`, // See tests within the file "ignore_fields.ts" which use these values in "alertIgnoreFields" `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'alertSuppressionForThresholdRuleEnabled', + 'entityAnalyticsAssetCriticalityEnabled', ])}`, ], }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/eql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/eql.ts index db5a924b48a05f..03af11e239c68b 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/eql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/eql.ts @@ -41,6 +41,13 @@ import { import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; +/** + * Specific AGENT_ID to use for some of the tests. If the archiver changes and you see errors + * here, update this to a new value of a chosen auditbeat record and update the tests values. + */ +const AGENT_ID = 'a1d7b39c-f898-4dbe-a761-efb61939302d'; +const specificQueryForTests = `configuration where agent.id=="${AGENT_ID}"`; + export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -73,7 +80,7 @@ export default ({ getService }: FtrProviderContext) => { it('generates a correctly formatted alert from EQL non-sequence queries', async () => { const rule: EqlRuleCreateProps = { ...getEqlRuleForAlertTesting(['auditbeat-*']), - query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', + query: specificQueryForTests, }; const createdRule = await createRule(supertest, log, rule); const alerts = await getOpenAlerts(supertest, log, es, createdRule); @@ -88,7 +95,7 @@ export default ({ getService }: FtrProviderContext) => { agent: { ephemeral_id: '0010d67a-14f7-41da-be30-489fea735967', hostname: 'suricata-zeek-sensor-toronto', - id: 'a1d7b39c-f898-4dbe-a761-efb61939302d', + id: AGENT_ID, type: 'auditbeat', version: '8.0.0', }, @@ -196,7 +203,7 @@ export default ({ getService }: FtrProviderContext) => { it('uses the provided event_category_override', async () => { const rule: EqlRuleCreateProps = { ...getEqlRuleForAlertTesting(['auditbeat-*']), - query: 'config_change where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', + query: `config_change where agent.id=="${AGENT_ID}"`, event_category_override: 'auditd.message_type', }; const { previewId } = await previewRule({ supertest, rule }); @@ -542,7 +549,7 @@ export default ({ getService }: FtrProviderContext) => { it('generates alerts when an index name contains special characters to encode', async () => { const rule: EqlRuleCreateProps = { ...getEqlRuleForAlertTesting(['auditbeat-*', '']), - query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', + query: specificQueryForTests, }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); @@ -607,7 +614,7 @@ export default ({ getService }: FtrProviderContext) => { it('should be enriched with host risk score', async () => { const rule: EqlRuleCreateProps = { ...getEqlRuleForAlertTesting(['auditbeat-*']), - query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', + query: specificQueryForTests, }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); @@ -620,5 +627,27 @@ export default ({ getService }: FtrProviderContext) => { expect(fullAlert?.host?.risk?.calculated_score_norm).to.eql(96); }); }); + + describe('with asset criticality', async () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/asset_criticality'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/asset_criticality'); + }); + + it('should be enriched alert with criticality_level', async () => { + const rule: EqlRuleCreateProps = { + ...getEqlRuleForAlertTesting(['auditbeat-*']), + query: specificQueryForTests, + }; + + const { previewId } = await previewRule({ supertest, rule }); + const previewAlerts = await getPreviewAlerts({ es, previewId }); + const fullAlert = previewAlerts[0]._source; + expect(fullAlert?.['kibana.alert.host.criticality_level']).to.eql('important'); + }); + }); }); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/esql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/esql.ts index cb0f31ad254600..caf649896abf3a 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/esql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/esql.ts @@ -859,6 +859,45 @@ export default ({ getService }: FtrProviderContext) => { }); }); + describe('with asset criticality', async () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/asset_criticality'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/asset_criticality'); + }); + + it('should be enriched alert with criticality_level', async () => { + const id = uuidv4(); + const interval: [string, string] = ['2020-10-28T06:00:00.000Z', '2020-10-28T06:10:00.000Z']; + const doc1 = { host: { name: 'host-0' } }; + + await indexEnhancedDocuments({ documents: [doc1], interval, id }); + + const rule: EsqlRuleCreateProps = { + ...getCreateEsqlRulesSchemaMock('rule-1', true), + query: `from ecs_compliant ${internalIdPipe(id)} | where host.name=="host-0"`, + from: 'now-1h', + interval: '1h', + }; + + const { previewId } = await previewRule({ + supertest, + rule, + timeframeEnd: new Date('2020-10-28T06:30:00.000Z'), + }); + + const previewAlerts = await getPreviewAlerts({ es, previewId }); + + expect(previewAlerts.length).toBe(1); + + expect(previewAlerts[0]?._source?.['kibana.alert.host.criticality_level']).toBe( + 'very_important' + ); + }); + }); + describe('ECS fields validation', () => { it('creates alert if ECS field has multifields', async () => { const id = uuidv4(); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts index d58227377f116d..8787a51871125a 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts @@ -273,5 +273,25 @@ export default ({ getService }: FtrProviderContext) => { expect(fullAlert?.host?.risk?.calculated_score_norm).toBe(1); }); }); + + describe('with asset criticality', async () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/asset_criticality'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/asset_criticality'); + }); + + it('should be enriched alert with criticality_level', async () => { + const { previewId } = await previewRule({ supertest, rule }); + const previewAlerts = await getPreviewAlerts({ es, previewId }); + expect(previewAlerts.length).toBe(1); + const fullAlert = previewAlerts[0]._source; + + expect(fullAlert?.['kibana.alert.host.criticality_level']).toBe('normal'); + expect(fullAlert?.['kibana.alert.user.criticality_level']).toBe('very_important'); + }); + }); }); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/new_terms.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/new_terms.ts index 8a47aeaa89bdcd..9aea83afb95d00 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/new_terms.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/new_terms.ts @@ -1040,5 +1040,31 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts[0]?._source?.host?.risk?.calculated_score_norm).to.eql(23); }); }); + + describe('with asset criticality', async () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/asset_criticality'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/asset_criticality'); + }); + + it('should be enriched alert with criticality_level', async () => { + const rule: NewTermsRuleCreateProps = { + ...getCreateNewTermsRulesSchemaMock('rule-1', true), + new_terms_fields: ['host.name'], + from: '2019-02-19T20:42:00.000Z', + history_window_start: '2019-01-19T20:42:00.000Z', + }; + + const { previewId } = await previewRule({ supertest, rule }); + const previewAlerts = await getPreviewAlerts({ es, previewId }); + const fullAlert = previewAlerts[0]._source; + + expect(fullAlert?.['kibana.alert.host.criticality_level']).to.eql('normal'); + expect(fullAlert?.['kibana.alert.user.criticality_level']).to.eql('very_important'); + }); + }); }); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/query.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/query.ts index 19c02fe389fe4c..38930bafa564ea 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/query.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/query.ts @@ -280,6 +280,31 @@ export default ({ getService }: FtrProviderContext) => { }); }); + describe('with asset criticality', async () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/asset_criticality'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/asset_criticality'); + }); + + it('should be enriched alert with criticality_level', async () => { + const rule: QueryRuleCreateProps = { + ...getRuleForAlertTesting(['auditbeat-*']), + query: `_id:${ID}`, + }; + const { previewId } = await previewRule({ supertest, rule }); + const previewAlerts = await getPreviewAlerts({ es, previewId }); + expect(previewAlerts[0]?._source?.['kibana.alert.host.criticality_level']).to.eql( + 'important' + ); + expect(previewAlerts[0]?._source?.['kibana.alert.user.criticality_level']).to.eql( + 'very_important' + ); + }); + }); + /** * Here we test the functionality of Severity and Risk Score overrides (also called "mappings" * in the code). If the rule specifies a mapping, then the final Severity or Risk Score diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threat_match.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threat_match.ts index 9b6c525b5e3516..734583d009ca38 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threat_match.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threat_match.ts @@ -1623,5 +1623,49 @@ export default ({ getService }: FtrProviderContext) => { expect(fullAlert?.host?.risk?.calculated_score_norm).to.eql(70); }); }); + + describe('with asset criticality', async () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/asset_criticality'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/asset_criticality'); + }); + + it('should be enriched alert with criticality_level', async () => { + const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ + query: '*:*', + threat_query: 'source.ip: "188.166.120.93"', // narrow things down with a query to a specific source ip + threat_mapping: [ + // We match host.name against host.name + { + entries: [ + { + field: 'host.name', + value: 'host.name', + type: 'mapping', + }, + ], + }, + ], + }); + + const { previewId } = await previewRule({ supertest, rule }); + const previewAlerts = await getPreviewAlerts({ es, previewId, size: 100 }); + expect(previewAlerts.length).equal(88); + const fullSource = previewAlerts.find( + (alert) => + (alert._source?.[ALERT_ANCESTORS] as Ancestor[])[0].id === '7yJ-B2kBR346wHgnhlMn' + ); + const fullAlert = fullSource?._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); + } + + expect(fullAlert?.['kibana.alert.host.criticality_level']).to.eql('low'); + expect(fullAlert?.['kibana.alert.user.criticality_level']).to.eql('very_important'); + }); + }); }); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold.ts index 5edee29c02dc6d..dce4886bc1ba57 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold.ts @@ -430,5 +430,30 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts[1]?._source?.host?.risk?.calculated_score_norm).toEqual(96); }); }); + + describe('with asset criticality', async () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/asset_criticality'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/asset_criticality'); + }); + + it('should be enriched alert with criticality_level', async () => { + const rule: ThresholdRuleCreateProps = { + ...getThresholdRuleForAlertTesting(['auditbeat-*']), + threshold: { + field: 'host.name', + value: 100, + }, + }; + const { previewId } = await previewRule({ supertest, rule }); + const previewAlerts = await getPreviewAlerts({ es, previewId, sort: ['host.name'] }); + const fullAlert = previewAlerts[0]?._source; + + expect(fullAlert?.['kibana.alert.host.criticality_level']).toEqual('important'); + }); + }); }); }; diff --git a/x-pack/test/security_solution_cypress/config.ts b/x-pack/test/security_solution_cypress/config.ts index 4fe61b660f1a4f..fb34362f7fb9b5 100644 --- a/x-pack/test/security_solution_cypress/config.ts +++ b/x-pack/test/security_solution_cypress/config.ts @@ -46,7 +46,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { '--xpack.ruleRegistry.unsafe.legacyMultiTenancy.enabled=true', `--xpack.securitySolution.enableExperimental=${JSON.stringify([ 'chartEmbeddablesEnabled', - 'alertSuppressionForThresholdRuleEnabled', ])}`, // mock cloud to enable the guided onboarding tour in e2e tests '--xpack.cloud.id=test', diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule.cy.ts index fa925131892e15..3a09073b71f388 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule.cy.ts @@ -72,15 +72,6 @@ describe( 'Threshold rules', { tags: ['@ess', '@serverless'], - env: { - ftrConfig: { - kbnServerArgs: [ - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'alertSuppressionForThresholdRuleEnabled', - ])}`, - ], - }, - }, }, () => { const rule = getNewThresholdRule(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule_serverless_essentials.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule_serverless_essentials.cy.ts index 5b8ec27e2c8910..c26954ea7e37b3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule_serverless_essentials.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/threshold_rule_serverless_essentials.cy.ts @@ -23,11 +23,6 @@ describe( { product_line: 'security', product_tier: 'essentials' }, { product_line: 'endpoint', product_tier: 'essentials' }, ], - kbnServerArgs: [ - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'alertSuppressionForThresholdRuleEnabled', - ])}`, - ], }, }, }, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/threshold_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/threshold_rule.cy.ts index 5eed825f99ada0..8d4bdf2d349766 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/threshold_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/threshold_rule.cy.ts @@ -41,15 +41,6 @@ describe( 'Detection threshold rules, edit', { tags: ['@ess', '@serverless'], - env: { - ftrConfig: { - kbnServerArgs: [ - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'alertSuppressionForThresholdRuleEnabled', - ])}`, - ], - }, - }, }, () => { describe('without suppression', () => { diff --git a/x-pack/test/security_solution_cypress/serverless_config.ts b/x-pack/test/security_solution_cypress/serverless_config.ts index 8eb8d2efdefdc9..d0ee1613f6e4cc 100644 --- a/x-pack/test/security_solution_cypress/serverless_config.ts +++ b/x-pack/test/security_solution_cypress/serverless_config.ts @@ -34,9 +34,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { { product_line: 'endpoint', product_tier: 'complete' }, { product_line: 'cloud', product_tier: 'complete' }, ])}`, - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'alertSuppressionForThresholdRuleEnabled', - ])}`, ], }, testRunner: SecuritySolutionConfigurableCypressTestRunner, diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts new file mode 100644 index 00000000000000..696c48183624a4 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.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 { ISOLATE_HOST_ROUTE_V2 } from '@kbn/security-solution-plugin/common/endpoint/constants'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + + describe('Response Actions support for agentType', function () { + targetTags(this, ['@ess', '@serverless']); + + describe('and the "responseActionsSentinelOneV1Enabled" feature flag is disabled', () => { + // When feature flag is enabled, this entire `describe()` block should be removed + it('should return an error', async () => { + await supertest + .post(ISOLATE_HOST_ROUTE_V2) + .set('kbn-xsrf', 'true') + .set('Elastic-Api-Version', '2023-10-31') + .send({ endpoint_ids: ['test'], agent_type: 'endpoint' }) + .expect(400, { + statusCode: 400, + error: 'Bad Request', + message: '[request body.agent_type]: feature is disabled', + }); + }); + }); + }); +} diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts index c0668612907a76..b4f4bb4b46063a 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts @@ -57,6 +57,7 @@ export default function endpointAPIIntegrationTests(providerContext: FtrProvider loadTestFile(require.resolve('./package')); loadTestFile(require.resolve('./endpoint_authz')); loadTestFile(require.resolve('./endpoint_response_actions/execute')); + loadTestFile(require.resolve('./endpoint_response_actions/agent_type_support')); loadTestFile(require.resolve('./endpoint_artifacts/trusted_apps')); loadTestFile(require.resolve('./endpoint_artifacts/event_filters')); loadTestFile(require.resolve('./endpoint_artifacts/host_isolation_exceptions')); diff --git a/yarn.lock b/yarn.lock index e7bf86c9eb972c..bf07d32acc0c74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1321,11 +1321,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@bufbuild/protobuf@^1.0.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.2.1.tgz#f8b1fbbe79726a4eafa9772ddde147b57f85d177" - integrity sha512-cwwGvLGqvoaOZmoP5+i4v/rbW+rHkguvTehuZyM2p/xpmaNSdT2h3B7kHw33aiffv35t1XrYHIkdJSEkSEMJuA== - "@cbor-extract/cbor-extract-darwin-arm64@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.0.0.tgz#cf0667e4c22111c9d45e16c29964892b12460a76" @@ -1549,14 +1544,14 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@61.0.3": - version "61.0.3" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-61.0.3.tgz#77a2e1f18a39dd4b421a91edfd30f19cde740594" - integrity sha512-TY7hUieULTchNFgvpi6Rt7wMxrYMCmuZ4bbS6szOGBIY4WKJvZCgMfgZ2kUdC5MVG/jEzd8Qu+Xixce7GDpRxw== +"@elastic/charts@61.2.0": + version "61.2.0" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-61.2.0.tgz#fa065b85324d5660e4b6355390cca8699ef0d6ff" + integrity sha512-LBmZ+6wSR9/BCR+go5eIBy51Jpxr0cbK/a7vslZNYIGCdpHsWxGZgcqG3KgshFxOmUvcP7kj9LEEmeCTEGhbUQ== dependencies: "@popperjs/core" "^2.11.8" bezier-easing "^2.1.0" - chroma-js "^2.1.0" + chroma-js "^2.4.2" classnames "^2.2.6" d3-array "^1.2.4" d3-cloud "^1.2.5" @@ -2248,7 +2243,7 @@ pngjs "7.0.0" sharp "0.32.1" -"@gar/promisify@^1.0.1": +"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== @@ -6791,6 +6786,14 @@ "@gar/promisify" "^1.0.1" semver "^7.3.5" +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + "@npmcli/fs@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" @@ -6805,6 +6808,14 @@ dependencies: mkdirp "^1.0.4" +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@octokit/auth-token@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.4.tgz#ee31c69b01d0378c12fd3ffe406030f3d94d3b56" @@ -8542,6 +8553,11 @@ dependencies: "@babel/runtime" "^7.12.5" +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -10873,7 +10889,7 @@ after-all-results@^2.0.0: resolved "https://registry.yarnpkg.com/after-all-results/-/after-all-results-2.0.0.tgz#6ac2fc202b500f88da8f4f5530cfa100f4c6a2d0" integrity sha1-asL8ICtQD4jaj09VMM+hAPTGotA= -agent-base@6: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -11234,6 +11250,14 @@ are-we-there-yet@^2.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +are-we-there-yet@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" + integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -11535,6 +11559,11 @@ async-cache@^1.1.0: dependencies: lru-cache "^4.0.0" +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + async-value-promise@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/async-value-promise/-/async-value-promise-1.1.1.tgz#68957819e3eace804f3b4b69477e2bd276c15378" @@ -12374,11 +12403,6 @@ btoa-lite@^1.0.0: resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= -buffer-builder@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/buffer-builder/-/buffer-builder-0.2.0.tgz#3322cd307d8296dab1f604618593b261a3fade8f" - integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg== - buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -12505,7 +12529,7 @@ cacache@^12.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^15.0.4, cacache@^15.0.5: +cacache@^15.0.4, cacache@^15.0.5, cacache@^15.2.0: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== @@ -12529,6 +12553,30 @@ cacache@^15.0.4, cacache@^15.0.5: tar "^6.0.2" unique-filename "^1.1.1" +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + cacache@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.0.tgz#17a9ecd6e1be2564ebe6cdca5f7cfed2bfeb6ddc" @@ -12948,9 +12996,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" + integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -14461,7 +14509,7 @@ debug@3.X, debug@^3.0.0, debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -15485,7 +15533,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.13: +encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -17263,7 +17311,7 @@ fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -17365,6 +17413,28 @@ gauge@^3.0.0: strip-ansi "^6.0.1" wide-align "^1.1.2" +gauge@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.2.tgz#c3777652f542b6ef62797246e8c7caddecb32cc7" + integrity sha512-aSPRm2CvA9R8QyU5eXMFPd+cYkyxLsXHd2l5/FOH2V/eml//M04G6KZOmTap07O1PvEwNcl2NndyLfK8g3QrKA== + dependencies: + ansi-regex "^5.0.1" + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + geckodriver@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-4.3.0.tgz#8586e80ddd23e5d5cd47382d9f6897051ca12ea3" @@ -17618,7 +17688,7 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@8.1.0, glob@^8.0.3: +glob@8.1.0, glob@^8.0.1, glob@^8.0.3: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -17652,6 +17722,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" @@ -17784,6 +17866,15 @@ globjoin@^0.1.4: resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + gonzales-pe@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" @@ -18441,7 +18532,7 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.4.0" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -18489,6 +18580,15 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -18548,7 +18648,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -18659,11 +18759,6 @@ immer@^9.0.15, immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== -immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== - import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -20319,6 +20414,11 @@ jquery@^3.5.0: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== +js-base64@^2.4.9: + version "2.5.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" + integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + js-beautify@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.3.tgz#c73fa10cf69d3dfa52d8ed624f23c64c0a6a94c1" @@ -21253,7 +21353,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@>4.17.4, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@>4.17.4, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.10: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -21422,7 +21522,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1: +lru-cache@^7.14.1, lru-cache@^7.7.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -21481,6 +21581,28 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^10.0.4: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + make-fetch-happen@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" @@ -21498,6 +21620,28 @@ make-fetch-happen@^13.0.0: promise-retry "^2.0.1" ssri "^10.0.0" +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -22104,7 +22248,7 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@~3.0.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -22146,6 +22290,28 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" +minipass-fetch@^1.3.2: + version "1.3.4" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.4.tgz#63f5af868a38746ca7b33b03393ddf8c291244fe" + integrity sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-fetch@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" @@ -22178,7 +22344,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1: +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -22202,7 +22368,7 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== -minizlib@^2.1.1, minizlib@^2.1.2: +minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -22577,7 +22743,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.18.0: +nan@^2.17.0, nan@^2.18.0: version "2.18.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== @@ -22658,7 +22824,7 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -negotiator@0.6.3, negotiator@^0.6.3: +negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -22825,6 +22991,22 @@ node-gyp@^10.0.1: tar "^6.1.2" which "^4.0.0" +node-gyp@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -22886,6 +23068,26 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-sass@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-8.0.0.tgz#c80d52148db0ce88610bcf1e1d112027393c13e1" + integrity sha512-jPzqCF2/e6JXw6r3VxfIqYc8tKQdkj5Z/BDATYyG6FL6b/LuYBNFGFVhus0mthcWifHm/JzBpKAd+3eXsWeK/A== + dependencies: + async-foreach "^0.1.3" + chalk "^4.1.2" + cross-spawn "^7.0.3" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + lodash "^4.17.15" + make-fetch-happen "^10.0.4" + meow "^9.0.0" + nan "^2.17.0" + node-gyp "^8.4.1" + sass-graph "^4.0.1" + stdout-stream "^1.4.0" + "true-case-path" "^2.2.1" + node-source-walk@^6.0.0, node-source-walk@^6.0.1, node-source-walk@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-6.0.2.tgz#ba81bc4bc0f6f05559b084bea10be84c3f87f211" @@ -22906,6 +23108,13 @@ nopt@^4.0.1, nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + nopt@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" @@ -22996,6 +23205,16 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" +npmlog@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.1.tgz#06f1344a174c06e8de9c6c70834cfba2964bba17" + integrity sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.0" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -23275,9 +23494,9 @@ onetime@^5.1.0, onetime@^5.1.2: mimic-fn "^2.1.0" open@^7.0.3: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + version "7.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.1.0.tgz#68865f7d3cb238520fa1225a63cf28bcf8368a1c" + integrity sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -26680,10 +26899,10 @@ rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.1, rxjs@^6.6.0, rxjs@^6.6.7: dependencies: tslib "^1.9.0" -rxjs@^7.0.0, rxjs@^7.4.0, rxjs@^7.5.5: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== +rxjs@^7.0.0, rxjs@^7.5.5: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: tslib "^2.1.0" @@ -26765,71 +26984,20 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sass-embedded-darwin-arm64@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.69.5.tgz#69e246d4a6875184a593906dfd7b84a21eb6eeb2" - integrity sha512-zVuXJzgT54t24E4QPP/iteHsw/cawZE8gAXGEm20cP2DKsIQBF7bvSTk0zzY0bS01YFtJviYM13HcGUe4q7/7w== - -sass-embedded-darwin-x64@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.69.5.tgz#82c2a659dafa93b54d2690f08f7aac9b2447c43f" - integrity sha512-HcA9YER3Ax7lMnHouxnIY462gnst5lNL56QXkZaTQmg9nH7oqR2bMfWbckEQL+mHIXGSM/QfX0aD59VOm5iKZw== - -sass-embedded-linux-arm64@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.69.5.tgz#8585bbcc6996ba04d8aa4216a2bf65de2e6592ea" - integrity sha512-HWCjdFSLGh0dMUNLNh+slc2j9koSZnfTEO9qQR6WEIuC+We6vYKJugGPo1V9pFbBeoW6VAJGYdlqsRPquteCZw== - -sass-embedded-linux-arm@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.69.5.tgz#ded653fe37d6b07d778c5f414cba5f28107dc438" - integrity sha512-m0NxVkrfcS3UsF33q0FgItMWIz/F1FZdfVZpjp+dP6qd0KLeTuoPUCh2GSize0DAU5T0Zj24b2mXeowDKv463g== - -sass-embedded-linux-ia32@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.69.5.tgz#61ad8b3b43be563f6fcd6ff04d0e121b195ecc2a" - integrity sha512-0taR6AJDb+eLOBTEMc1nfX2fI1hgRF9M+Hmv+wwGrxfBu/MkASk6fmR9B8MDw9hPHIqGVUkTVizjOh50O7nIKg== - -sass-embedded-linux-x64@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.69.5.tgz#3d490f520200d596b2b6072d6d3f4460b7114241" - integrity sha512-gN9yLTbKC0hUHukx4mdRs4V39WD719PM2GhWQBUA+3Z8qr9ywywi7LiU2atWrKESRF34V+eqF9lYiYVQxtTHZw== - -sass-embedded-win32-ia32@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.69.5.tgz#e84a053d25aec1176fac485bee65a384f39dfa9e" - integrity sha512-9OgSaufHP53b33gaH1Y5NZ/Im3druCHIQvLUEqJBCFuOzly47g/hZGrO+dBDiWgYGYKbSYI7Z4/PBtQoK5Vkxg== - -sass-embedded-win32-x64@1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.69.5.tgz#8d803e99cccc0e8105dde50e49a2fd7839e360ec" - integrity sha512-p1PsOJnpwXdPfiRbX6QdRa4PnL2QXPpIRy8fkeAZpQFYZ278ZIlwemC2MukKMVLcE3iQ5lBulbC8IYm91rod6Q== - -sass-embedded@^1.69.5: - version "1.69.5" - resolved "https://registry.yarnpkg.com/sass-embedded/-/sass-embedded-1.69.5.tgz#ae217d4b17b0fb07e5ed146917c9c9de0c4383c6" - integrity sha512-0YNcRcbSpgGd4AnE+mm3a3g4S97puFLIZ0cYJgbwdD4iGz/hiOzE+yh72XS+u1LMhE+pQfNeC9MNnRsc8n1yRg== - dependencies: - "@bufbuild/protobuf" "^1.0.0" - buffer-builder "^0.2.0" - immutable "^4.0.0" - rxjs "^7.4.0" - supports-color "^8.1.1" - varint "^6.0.0" - optionalDependencies: - sass-embedded-darwin-arm64 "1.69.5" - sass-embedded-darwin-x64 "1.69.5" - sass-embedded-linux-arm "1.69.5" - sass-embedded-linux-arm64 "1.69.5" - sass-embedded-linux-ia32 "1.69.5" - sass-embedded-linux-x64 "1.69.5" - sass-embedded-win32-ia32 "1.69.5" - sass-embedded-win32-x64 "1.69.5" - -sass-loader@^10.5.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.5.0.tgz#011c92ea529029e296aea37508e034b94f7dd2dc" - integrity sha512-VsU71W7VR6SChMJZUqtrfLeMSA8ns7QTHbnA7cfevtjb3c392mX93lr0Dmr4uU1ch5uIbEmfmHjdrDYcXXkQ7w== +sass-graph@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-4.0.1.tgz#2ff8ca477224d694055bf4093f414cf6cfad1d2e" + integrity sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA== + dependencies: + glob "^7.0.0" + lodash "^4.17.11" + scss-tokenizer "^0.4.3" + yargs "^17.2.1" + +sass-loader@^10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf" + integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ== dependencies: klona "^2.0.4" loader-utils "^2.0.0" @@ -26927,6 +27095,14 @@ screenfull@^5.0.0: resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.0.0.tgz#5c2010c0e84fd4157bf852877698f90b8cbe96f6" integrity sha512-yShzhaIoE9OtOhWVyBBffA6V98CDCoyHTsp8228blmqYy1Z5bddzE/4FPiJKlr8DVR4VBiiUyfPzIQPIYDkeMA== +scss-tokenizer@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz#1058400ee7d814d71049c29923d2b25e61dc026c" + integrity sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw== + dependencies: + js-base64 "^2.4.9" + source-map "^0.7.3" + secure-json-parse@^2.4.0: version "2.6.0" resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.6.0.tgz#95d89f84adf32d76ff7800e68a673b129fe918b0" @@ -27427,6 +27603,24 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +socks-proxy-agent@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87" + integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew== + dependencies: + agent-base "^6.0.2" + debug "^4.3.1" + socks "^2.6.1" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + socks-proxy-agent@^8.0.1, socks-proxy-agent@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" @@ -27436,7 +27630,7 @@ socks-proxy-agent@^8.0.1, socks-proxy-agent@^8.0.2: debug "^4.3.4" socks "^2.7.1" -socks@^2.7.1: +socks@^2.6.1, socks@^2.6.2, socks@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== @@ -27770,13 +27964,20 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -ssri@^8.0.1: +ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -27885,6 +28086,13 @@ stats-lite@^2.2.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + integrity sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s= + dependencies: + readable-stream "^2.0.1" + store2@^2.12.0: version "2.12.0" resolved "https://registry.yarnpkg.com/store2/-/store2-2.12.0.tgz#e1f1b7e1a59b6083b2596a8d067f6ee88fd4d3cf" @@ -29014,6 +29222,11 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86" integrity sha1-qf2LA5Swro//guBjOgo2zK1bX4Y= +"true-case-path@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" + integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== + ts-algebra@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-algebra/-/ts-algebra-1.2.0.tgz#f91c481207a770f0d14d055c376cbee040afdfc9" @@ -29458,6 +29671,13 @@ unique-filename@^1.1.1: dependencies: unique-slug "^2.0.0" +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -29472,6 +29692,13 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + unique-slug@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" @@ -29912,11 +30139,6 @@ variable-diff@1.1.0: chalk "^1.1.1" object-assign "^4.0.1" -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -30825,7 +31047,7 @@ which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -30839,7 +31061,7 @@ which@^4.0.0: dependencies: isexe "^3.1.1" -wide-align@^1.1.2: +wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==